You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by il...@apache.org on 2023/02/21 12:16:42 UTC
[syncope] 03/03: [SYNCOPE-1731] Revisiting ManyToMany association between JPAAnyType and JPAAnyTypeClass (#412)
This is an automated email from the ASF dual-hosted git repository.
ilgrosso pushed a commit to branch 3_0_X
in repository https://gitbox.apache.org/repos/asf/syncope.git
commit 6be56158bceba16a13d5e3309201796313e788a8
Author: Francesco Chicchiriccò <il...@users.noreply.github.com>
AuthorDate: Tue Feb 21 13:06:05 2023 +0100
[SYNCOPE-1731] Revisiting ManyToMany association between JPAAnyType and JPAAnyTypeClass (#412)
---
.../apache/syncope/core/logic/AnyTypeLogic.java | 31 +++++++---------------
.../core/persistence/api/entity/AnyType.java | 4 +--
.../core/persistence/jpa/entity/JPAAnyType.java | 18 +++++--------
.../persistence/jpa/entity/JPAAnyTypeClass.java | 5 ----
.../java/data/AnyTypeDataBinderImpl.java | 9 +++----
5 files changed, 22 insertions(+), 45 deletions(-)
diff --git a/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/AnyTypeLogic.java b/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/AnyTypeLogic.java
index ece70043c7..3cff9d31d8 100644
--- a/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/AnyTypeLogic.java
+++ b/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/AnyTypeLogic.java
@@ -20,6 +20,7 @@ package org.apache.syncope.core.logic;
import java.lang.reflect.Method;
import java.util.List;
+import java.util.Optional;
import java.util.stream.Collectors;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
@@ -58,12 +59,8 @@ public class AnyTypeLogic extends AbstractTransactionalLogic<AnyTypeTO> {
@PreAuthorize("hasRole('" + IdRepoEntitlement.ANYTYPE_READ + "')")
@Transactional(readOnly = true)
public AnyTypeTO read(final String key) {
- AnyType anyType = anyTypeDAO.find(key);
- if (anyType == null) {
- LOG.error("Could not find anyType '" + key + '\'');
-
- throw new NotFoundException(key);
- }
+ AnyType anyType = Optional.ofNullable(anyTypeDAO.find(key)).
+ orElseThrow(() -> new NotFoundException("AnyType " + key));
return binder.getAnyTypeTO(anyType);
}
@@ -89,27 +86,18 @@ public class AnyTypeLogic extends AbstractTransactionalLogic<AnyTypeTO> {
}
@PreAuthorize("hasRole('" + IdRepoEntitlement.ANYTYPE_UPDATE + "')")
- public AnyTypeTO update(final AnyTypeTO anyTypeTO) {
- AnyType anyType = anyTypeDAO.find(anyTypeTO.getKey());
- if (anyType == null) {
- LOG.error("Could not find anyType '" + anyTypeTO.getKey() + '\'');
-
- throw new NotFoundException(anyTypeTO.getKey());
- }
+ public void update(final AnyTypeTO anyTypeTO) {
+ AnyType anyType = Optional.ofNullable(anyTypeDAO.find(anyTypeTO.getKey())).
+ orElseThrow(() -> new NotFoundException("AnyType " + anyTypeTO.getKey()));
binder.update(anyType, anyTypeTO);
-
- return binder.getAnyTypeTO(anyTypeDAO.save(anyType));
+ anyTypeDAO.save(anyType);
}
@PreAuthorize("hasRole('" + IdRepoEntitlement.ANYTYPE_DELETE + "')")
public AnyTypeTO delete(final String key) {
- AnyType anyType = anyTypeDAO.find(key);
- if (anyType == null) {
- LOG.error("Could not find anyType '" + key + '\'');
-
- throw new NotFoundException(key);
- }
+ AnyType anyType = Optional.ofNullable(anyTypeDAO.find(key)).
+ orElseThrow(() -> new NotFoundException("AnyType " + key));
Integer anyObjects = anyObjectDAO.countByType().get(anyType);
if (anyObjects != null && anyObjects > 0) {
@@ -156,5 +144,4 @@ public class AnyTypeLogic extends AbstractTransactionalLogic<AnyTypeTO> {
throw new UnresolvedReferenceException();
}
-
}
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/AnyType.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/AnyType.java
index 0d89facbdb..deaa087b76 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/AnyType.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/AnyType.java
@@ -18,7 +18,7 @@
*/
package org.apache.syncope.core.persistence.api.entity;
-import java.util.List;
+import java.util.Set;
import org.apache.syncope.common.lib.types.AnyTypeKind;
public interface AnyType extends ProvidedKeyEntity {
@@ -29,5 +29,5 @@ public interface AnyType extends ProvidedKeyEntity {
boolean add(AnyTypeClass anyTypeClass);
- List<? extends AnyTypeClass> getClasses();
+ Set<? extends AnyTypeClass> getClasses();
}
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyType.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyType.java
index 1af918d578..5dda39ac25 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyType.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyType.java
@@ -18,18 +18,16 @@
*/
package org.apache.syncope.core.persistence.jpa.entity;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.HashSet;
+import java.util.Set;
import javax.persistence.Cacheable;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
-import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
-import javax.persistence.UniqueConstraint;
import javax.validation.constraints.NotNull;
import org.apache.syncope.common.lib.types.AnyTypeKind;
import org.apache.syncope.core.persistence.api.entity.AnyType;
@@ -50,14 +48,12 @@ public class JPAAnyType extends AbstractProvidedKeyEntity implements AnyType {
@Enumerated(EnumType.STRING)
private AnyTypeKind kind;
- @ManyToMany(fetch = FetchType.EAGER)
+ @ManyToMany
@JoinTable(joinColumns =
@JoinColumn(name = "anyType_id", referencedColumnName = "id"),
inverseJoinColumns =
- @JoinColumn(name = "anyTypeClass_id", referencedColumnName = "id"),
- uniqueConstraints =
- @UniqueConstraint(columnNames = { "anyType_id", "anyTypeClass_id" }))
- private List<JPAAnyTypeClass> classes = new ArrayList<>();
+ @JoinColumn(name = "anyTypeClass_id", referencedColumnName = "id"))
+ private Set<JPAAnyTypeClass> classes = new HashSet<>();
@Override
public AnyTypeKind getKind() {
@@ -72,11 +68,11 @@ public class JPAAnyType extends AbstractProvidedKeyEntity implements AnyType {
@Override
public boolean add(final AnyTypeClass anyTypeClass) {
checkType(anyTypeClass, JPAAnyTypeClass.class);
- return classes.contains((JPAAnyTypeClass) anyTypeClass) || this.classes.add((JPAAnyTypeClass) anyTypeClass);
+ return classes.add((JPAAnyTypeClass) anyTypeClass);
}
@Override
- public List<? extends AnyTypeClass> getClasses() {
+ public Set<? extends AnyTypeClass> getClasses() {
return classes;
}
}
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyTypeClass.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyTypeClass.java
index 5fb64aa2fc..52ee93ea28 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyTypeClass.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyTypeClass.java
@@ -23,7 +23,6 @@ import java.util.List;
import javax.persistence.Cacheable;
import javax.persistence.Entity;
import javax.persistence.FetchType;
-import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import org.apache.syncope.core.persistence.api.entity.AnyTypeClass;
@@ -40,9 +39,6 @@ public class JPAAnyTypeClass extends AbstractProvidedKeyEntity implements AnyTyp
public static final String TABLE = "AnyTypeClass";
- @ManyToMany(fetch = FetchType.EAGER, mappedBy = "classes")
- private List<JPAAnyType> types = new ArrayList<>();
-
@OneToMany(fetch = FetchType.EAGER, mappedBy = "anyTypeClass")
private List<JPAPlainSchema> plainSchemas = new ArrayList<>();
@@ -84,5 +80,4 @@ public class JPAAnyTypeClass extends AbstractProvidedKeyEntity implements AnyTyp
public List<? extends VirSchema> getVirSchemas() {
return virSchemas;
}
-
}
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyTypeDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyTypeDataBinderImpl.java
index 57b7907afa..54db91e11e 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyTypeDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyTypeDataBinderImpl.java
@@ -90,8 +90,7 @@ public class AnyTypeDataBinderImpl implements AnyTypeDataBinder {
new TypeReference<Set<SyncopeGrantedAuthority>>() {
}));
- added.forEach(entitlement -> authorities.add(
- new SyncopeGrantedAuthority(entitlement, SyncopeConstants.ROOT_REALM)));
+ added.forEach(e -> authorities.add(new SyncopeGrantedAuthority(e, SyncopeConstants.ROOT_REALM)));
accessToken.setAuthorities(ENCRYPTOR.encode(
POJOHelper.serialize(authorities), CipherAlgorithm.AES).
@@ -120,15 +119,15 @@ public class AnyTypeDataBinderImpl implements AnyTypeDataBinder {
throw sce;
}
- anyType.getClasses().clear();
anyTypeTO.getClasses().forEach(anyTypeClassName -> {
AnyTypeClass anyTypeClass = anyTypeClassDAO.find(anyTypeClassName);
if (anyTypeClass == null) {
- LOG.debug("Invalid " + AnyTypeClass.class.getSimpleName() + " {}, ignoring...", anyTypeClassName);
+ LOG.debug("Invalid {} {}, ignoring...", AnyTypeClass.class.getSimpleName(), anyTypeClassName);
} else {
anyType.add(anyTypeClass);
}
});
+ anyType.getClasses().removeIf(c -> c == null || !anyTypeTO.getClasses().contains(c.getKey()));
}
@Override
@@ -137,7 +136,7 @@ public class AnyTypeDataBinderImpl implements AnyTypeDataBinder {
anyTypeDAO.delete(anyType.getKey());
- final Set<String> removed = EntitlementsHolder.getInstance().removeFor(deleted.getKey());
+ Set<String> removed = EntitlementsHolder.getInstance().removeFor(deleted.getKey());
if (!securityProperties.getAdminUser().equals(AuthContextUtils.getUsername())) {
AccessToken accessToken = accessTokenDAO.findByOwner(AuthContextUtils.getUsername());