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());