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 2019/12/18 08:40:21 UTC

[syncope] branch 2_1_X updated: Improving PlainSchemaDAO#hasAttrs implementations

This is an automated email from the ASF dual-hosted git repository.

ilgrosso pushed a commit to branch 2_1_X
in repository https://gitbox.apache.org/repos/asf/syncope.git


The following commit(s) were added to refs/heads/2_1_X by this push:
     new ed2e627  Improving PlainSchemaDAO#hasAttrs implementations
ed2e627 is described below

commit ed2e62711ea2c8aee82bad7661700ef099b03c9a
Author: Francesco Chicchiriccò <il...@apache.org>
AuthorDate: Wed Dec 18 09:37:59 2019 +0100

    Improving PlainSchemaDAO#hasAttrs implementations
---
 ...DAO.java => AbstractJPAJSONPlainSchemaDAO.java} | 18 +++++++++++-----
 ...SchemaDAO.java => MyJPAJSONPlainSchemaDAO.java} | 23 ++++++--------------
 ...SchemaDAO.java => PGJPAJSONPlainSchemaDAO.java} | 23 ++++++--------------
 .../main/resources/myjson/persistence.properties   |  2 +-
 .../main/resources/pgjsonb/persistence.properties  |  2 +-
 .../persistence/jpa/dao/JPAPlainSchemaDAO.java     | 19 +++++++++-------
 .../persistence/jpa/inner/PlainSchemaTest.java     | 25 +++++++++++++++++++---
 .../main/resources/persistence.properties.myjson   |  2 +-
 .../main/resources/persistence.properties.pgjsonb  |  2 +-
 .../systemadministration/dbms.adoc                 |  4 ++--
 10 files changed, 66 insertions(+), 54 deletions(-)

diff --git a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAJSONPlainSchemaDAO.java b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractJPAJSONPlainSchemaDAO.java
similarity index 67%
copy from core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAJSONPlainSchemaDAO.java
copy to core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractJPAJSONPlainSchemaDAO.java
index e0695a1..0f4090d 100644
--- a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAJSONPlainSchemaDAO.java
+++ b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractJPAJSONPlainSchemaDAO.java
@@ -20,10 +20,13 @@ package org.apache.syncope.core.persistence.jpa.dao;
 
 import java.util.Collections;
 import java.util.List;
+import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.core.persistence.api.entity.PlainAttr;
 import org.apache.syncope.core.persistence.api.entity.PlainSchema;
+import org.apache.syncope.core.persistence.api.entity.anyobject.APlainAttr;
+import org.apache.syncope.core.persistence.api.entity.group.GPlainAttr;
 
-public class JPAJSONPlainSchemaDAO extends JPAPlainSchemaDAO {
+abstract class AbstractJPAJSONPlainSchemaDAO extends JPAPlainSchemaDAO {
 
     @Override
     public <T extends PlainAttr<?>> List<T> findAttrs(final PlainSchema schema, final Class<T> reference) {
@@ -31,10 +34,15 @@ public class JPAJSONPlainSchemaDAO extends JPAPlainSchemaDAO {
         return Collections.emptyList();
     }
 
-    @Override
-    public <T extends PlainAttr<?>> boolean hasAttrs(final PlainSchema schema, final Class<T> plainAttrTable) {
-        // not possible
-        return true;
+    protected <T extends PlainAttr<?>> AnyTypeKind getAnyTypeKind(final Class<T> plainAttrClass) {
+        if (GPlainAttr.class.isAssignableFrom(plainAttrClass)) {
+            return AnyTypeKind.GROUP;
+        }
+        if (APlainAttr.class.isAssignableFrom(plainAttrClass)) {
+            return AnyTypeKind.ANY_OBJECT;
+        }
+
+        return AnyTypeKind.USER;
     }
 
     @Override
diff --git a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAJSONPlainSchemaDAO.java b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/MyJPAJSONPlainSchemaDAO.java
similarity index 68%
copy from core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAJSONPlainSchemaDAO.java
copy to core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/MyJPAJSONPlainSchemaDAO.java
index e0695a1..07c9969 100644
--- a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAJSONPlainSchemaDAO.java
+++ b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/MyJPAJSONPlainSchemaDAO.java
@@ -18,27 +18,18 @@
  */
 package org.apache.syncope.core.persistence.jpa.dao;
 
-import java.util.Collections;
-import java.util.List;
+import javax.persistence.Query;
 import org.apache.syncope.core.persistence.api.entity.PlainAttr;
 import org.apache.syncope.core.persistence.api.entity.PlainSchema;
 
-public class JPAJSONPlainSchemaDAO extends JPAPlainSchemaDAO {
+public class MyJPAJSONPlainSchemaDAO extends AbstractJPAJSONPlainSchemaDAO {
 
     @Override
-    public <T extends PlainAttr<?>> List<T> findAttrs(final PlainSchema schema, final Class<T> reference) {
-        // not possible
-        return Collections.emptyList();
-    }
+    public <T extends PlainAttr<?>> boolean hasAttrs(final PlainSchema schema, final Class<T> reference) {
+        Query query = entityManager().createNativeQuery(
+                "SELECT COUNT(id) FROM " + new SearchSupport(getAnyTypeKind(reference)).field().name
+                + " WHERE JSON_CONTAINS(plainAttrs, '[{\"schema\":\"" + schema.getKey() + "\"}]')");
 
-    @Override
-    public <T extends PlainAttr<?>> boolean hasAttrs(final PlainSchema schema, final Class<T> plainAttrTable) {
-        // not possible
-        return true;
-    }
-
-    @Override
-    protected void deleteAttrs(final PlainSchema schema) {
-        // nothing to do
+        return (long) query.getSingleResult() > 0;
     }
 }
diff --git a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAJSONPlainSchemaDAO.java b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/PGJPAJSONPlainSchemaDAO.java
similarity index 68%
rename from core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAJSONPlainSchemaDAO.java
rename to core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/PGJPAJSONPlainSchemaDAO.java
index e0695a1..77019a7 100644
--- a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAJSONPlainSchemaDAO.java
+++ b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/PGJPAJSONPlainSchemaDAO.java
@@ -18,27 +18,18 @@
  */
 package org.apache.syncope.core.persistence.jpa.dao;
 
-import java.util.Collections;
-import java.util.List;
+import javax.persistence.Query;
 import org.apache.syncope.core.persistence.api.entity.PlainAttr;
 import org.apache.syncope.core.persistence.api.entity.PlainSchema;
 
-public class JPAJSONPlainSchemaDAO extends JPAPlainSchemaDAO {
+public class PGJPAJSONPlainSchemaDAO extends AbstractJPAJSONPlainSchemaDAO {
 
     @Override
-    public <T extends PlainAttr<?>> List<T> findAttrs(final PlainSchema schema, final Class<T> reference) {
-        // not possible
-        return Collections.emptyList();
-    }
+    public <T extends PlainAttr<?>> boolean hasAttrs(final PlainSchema schema, final Class<T> reference) {
+        Query query = entityManager().createNativeQuery(
+                "SELECT COUNT(id) FROM " + new SearchSupport(getAnyTypeKind(reference)).field().name
+                + " WHERE plainAttrs @> '[{\"schema\":\"" + schema.getKey() + "\"}]'::jsonb");
 
-    @Override
-    public <T extends PlainAttr<?>> boolean hasAttrs(final PlainSchema schema, final Class<T> plainAttrTable) {
-        // not possible
-        return true;
-    }
-
-    @Override
-    protected void deleteAttrs(final PlainSchema schema) {
-        // nothing to do
+        return (long) query.getSingleResult() > 0;
     }
 }
diff --git a/core/persistence-jpa-json/src/main/resources/myjson/persistence.properties b/core/persistence-jpa-json/src/main/resources/myjson/persistence.properties
index 59be9e3..dc034b6 100644
--- a/core/persistence-jpa-json/src/main/resources/myjson/persistence.properties
+++ b/core/persistence-jpa-json/src/main/resources/myjson/persistence.properties
@@ -16,7 +16,7 @@
 # under the License.
 content.directory=${conf.directory}
 entity.factory=org.apache.syncope.core.persistence.jpa.entity.MyJPAJSONEntityFactory
-plainSchema.dao=org.apache.syncope.core.persistence.jpa.dao.JPAJSONPlainSchemaDAO
+plainSchema.dao=org.apache.syncope.core.persistence.jpa.dao.MyJPAJSONPlainSchemaDAO
 plainAttr.dao=org.apache.syncope.core.persistence.jpa.dao.JPAJSONPlainAttrDAO
 plainAttrValue.dao=org.apache.syncope.core.persistence.jpa.dao.JPAJSONPlainAttrValueDAO
 any.search.dao=org.apache.syncope.core.persistence.jpa.dao.MyJPAJSONAnySearchDAO
diff --git a/core/persistence-jpa-json/src/main/resources/pgjsonb/persistence.properties b/core/persistence-jpa-json/src/main/resources/pgjsonb/persistence.properties
index 0466756..8c7b40a 100644
--- a/core/persistence-jpa-json/src/main/resources/pgjsonb/persistence.properties
+++ b/core/persistence-jpa-json/src/main/resources/pgjsonb/persistence.properties
@@ -16,7 +16,7 @@
 # under the License.
 content.directory=${conf.directory}
 entity.factory=org.apache.syncope.core.persistence.jpa.entity.PGJPAJSONEntityFactory
-plainSchema.dao=org.apache.syncope.core.persistence.jpa.dao.JPAJSONPlainSchemaDAO
+plainSchema.dao=org.apache.syncope.core.persistence.jpa.dao.PGJPAJSONPlainSchemaDAO
 plainAttr.dao=org.apache.syncope.core.persistence.jpa.dao.JPAJSONPlainAttrDAO
 plainAttrValue.dao=org.apache.syncope.core.persistence.jpa.dao.JPAJSONPlainAttrValueDAO
 any.search.dao=org.apache.syncope.core.persistence.jpa.dao.PGJPAJSONAnySearchDAO
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPlainSchemaDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPlainSchemaDAO.java
index aebab3d..95318f4 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPlainSchemaDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPlainSchemaDAO.java
@@ -32,6 +32,9 @@ import org.apache.syncope.core.persistence.api.entity.AnyUtilsFactory;
 import org.apache.syncope.core.persistence.api.entity.Implementation;
 import org.apache.syncope.core.persistence.api.entity.PlainAttr;
 import org.apache.syncope.core.persistence.api.entity.PlainSchema;
+import org.apache.syncope.core.persistence.api.entity.anyobject.APlainAttr;
+import org.apache.syncope.core.persistence.api.entity.conf.CPlainAttr;
+import org.apache.syncope.core.persistence.api.entity.group.GPlainAttr;
 import org.apache.syncope.core.persistence.jpa.entity.JPAPlainSchema;
 import org.apache.syncope.core.persistence.jpa.entity.anyobject.JPAAPlainAttr;
 import org.apache.syncope.core.persistence.jpa.entity.group.JPAGPlainAttr;
@@ -108,10 +111,10 @@ public class JPAPlainSchemaDAO extends AbstractDAO<PlainSchema> implements Plain
     @Override
     public <T extends PlainAttr<?>> boolean hasAttrs(final PlainSchema schema, final Class<T> reference) {
         String plainAttrTable = getPlainAttrTable(reference);
-        Query query = entityManager()
-                .createNativeQuery("SELECT COUNT(" + plainAttrTable + ".id) FROM " + JPAPlainSchema.TABLE
-                        + " JOIN " + plainAttrTable + " ON " + JPAPlainSchema.TABLE + ".id = " + plainAttrTable
-                        + ".schema_id WHERE " + JPAPlainSchema.TABLE + ".id = ?1");
+        Query query = entityManager().createNativeQuery(
+                "SELECT COUNT(" + plainAttrTable + ".id) FROM " + JPAPlainSchema.TABLE
+                + " JOIN " + plainAttrTable + " ON " + JPAPlainSchema.TABLE + ".id = " + plainAttrTable
+                + ".schema_id WHERE " + JPAPlainSchema.TABLE + ".id = ?1");
         query.setParameter(1, schema.getKey());
 
         return (long) query.getSingleResult() > 0;
@@ -153,14 +156,14 @@ public class JPAPlainSchemaDAO extends AbstractDAO<PlainSchema> implements Plain
     }
 
     private <T extends PlainAttr<?>> String getPlainAttrTable(final Class<T> plainAttrClass) {
-        if (plainAttrClass.equals(JPAGPlainAttr.class)) {
+        if (GPlainAttr.class.isAssignableFrom(plainAttrClass)) {
             return JPAGPlainAttr.TABLE;
         }
-        if (plainAttrClass.equals(JPAAPlainAttr.class)) {
+        if (APlainAttr.class.isAssignableFrom(plainAttrClass)) {
             return JPAAPlainAttr.TABLE;
         }
-        if (plainAttrClass.equals(JPAUPlainAttr.class)) {
-            return JPAUPlainAttr.TABLE;
+        if (CPlainAttr.class.isAssignableFrom(plainAttrClass)) {
+            return JPAAPlainAttr.TABLE;
         }
         return JPAUPlainAttr.TABLE;
     }
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/PlainSchemaTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/PlainSchemaTest.java
index af2f90f..9a64989 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/PlainSchemaTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/PlainSchemaTest.java
@@ -36,6 +36,7 @@ import org.apache.syncope.core.persistence.api.dao.ImplementationDAO;
 import org.apache.syncope.core.persistence.api.dao.PlainSchemaDAO;
 import org.apache.syncope.core.persistence.api.entity.PlainSchema;
 import org.apache.syncope.core.persistence.api.entity.group.GPlainAttr;
+import org.apache.syncope.core.persistence.api.entity.user.UPlainAttr;
 import org.apache.syncope.core.persistence.jpa.AbstractTest;
 import org.junit.jupiter.api.Tag;
 import org.junit.jupiter.api.Test;
@@ -80,9 +81,27 @@ public class PlainSchemaTest extends AbstractTest {
         PlainSchema schema = plainSchemaDAO.find("icon");
         assertNotNull(schema);
 
-        List<GPlainAttr> attrs = plainSchemaDAO.findAttrs(schema, GPlainAttr.class);
-        assertNotNull(attrs);
-        assertFalse(attrs.isEmpty());
+        List<GPlainAttr> gattrs = plainSchemaDAO.findAttrs(schema, GPlainAttr.class);
+        assertNotNull(gattrs);
+        assertFalse(gattrs.isEmpty());
+
+        schema = plainSchemaDAO.find("aLong");
+        assertNotNull(schema);
+
+        List<UPlainAttr> uattrs = plainSchemaDAO.findAttrs(schema, UPlainAttr.class);
+        assertNotNull(uattrs);
+        assertTrue(uattrs.isEmpty());
+    }
+
+    @Test
+    public void hasAttrs() {
+        PlainSchema schema = plainSchemaDAO.find("icon");
+        assertNotNull(schema);
+        assertTrue(plainSchemaDAO.hasAttrs(schema, GPlainAttr.class));
+
+        schema = plainSchemaDAO.find("aLong");
+        assertNotNull(schema);
+        assertFalse(plainSchemaDAO.hasAttrs(schema, UPlainAttr.class));
     }
 
     @Test
diff --git a/docker/core/src/main/resources/persistence.properties.myjson b/docker/core/src/main/resources/persistence.properties.myjson
index 59be9e3..dc034b6 100644
--- a/docker/core/src/main/resources/persistence.properties.myjson
+++ b/docker/core/src/main/resources/persistence.properties.myjson
@@ -16,7 +16,7 @@
 # under the License.
 content.directory=${conf.directory}
 entity.factory=org.apache.syncope.core.persistence.jpa.entity.MyJPAJSONEntityFactory
-plainSchema.dao=org.apache.syncope.core.persistence.jpa.dao.JPAJSONPlainSchemaDAO
+plainSchema.dao=org.apache.syncope.core.persistence.jpa.dao.MyJPAJSONPlainSchemaDAO
 plainAttr.dao=org.apache.syncope.core.persistence.jpa.dao.JPAJSONPlainAttrDAO
 plainAttrValue.dao=org.apache.syncope.core.persistence.jpa.dao.JPAJSONPlainAttrValueDAO
 any.search.dao=org.apache.syncope.core.persistence.jpa.dao.MyJPAJSONAnySearchDAO
diff --git a/docker/core/src/main/resources/persistence.properties.pgjsonb b/docker/core/src/main/resources/persistence.properties.pgjsonb
index d323e29..01af076 100644
--- a/docker/core/src/main/resources/persistence.properties.pgjsonb
+++ b/docker/core/src/main/resources/persistence.properties.pgjsonb
@@ -16,7 +16,7 @@
 # under the License.
 content.directory=/etc/apache-syncope
 entity.factory=org.apache.syncope.core.persistence.jpa.entity.PGJPAJSONEntityFactory
-plainSchema.dao=org.apache.syncope.core.persistence.jpa.dao.JPAJSONPlainSchemaDAO
+plainSchema.dao=org.apache.syncope.core.persistence.jpa.dao.PGJPAJSONPlainSchemaDAO
 plainAttr.dao=org.apache.syncope.core.persistence.jpa.dao.JPAJSONPlainAttrDAO
 plainAttrValue.dao=org.apache.syncope.core.persistence.jpa.dao.JPAJSONPlainAttrValueDAO
 any.search.dao=org.apache.syncope.core.persistence.jpa.dao.PGJPAJSONAnySearchDAO
diff --git a/src/main/asciidoc/reference-guide/workingwithapachesyncope/systemadministration/dbms.adoc b/src/main/asciidoc/reference-guide/workingwithapachesyncope/systemadministration/dbms.adoc
index a427693..11c8bb5 100644
--- a/src/main/asciidoc/reference-guide/workingwithapachesyncope/systemadministration/dbms.adoc
+++ b/src/main/asciidoc/reference-guide/workingwithapachesyncope/systemadministration/dbms.adoc
@@ -83,7 +83,7 @@ In `persistence.properties`, replace as follows:
 
 ....
 entity.factory=org.apache.syncope.core.persistence.jpa.entity.PGJPAJSONEntityFactory
-plainSchema.dao=org.apache.syncope.core.persistence.jpa.dao.JPAJSONPlainSchemaDAO
+plainSchema.dao=org.apache.syncope.core.persistence.jpa.dao.PGJPAJSONPlainSchemaDAO
 plainAttr.dao=org.apache.syncope.core.persistence.jpa.dao.JPAJSONPlainAttrDAO
 plainAttrValue.dao=org.apache.syncope.core.persistence.jpa.dao.JPAJSONPlainAttrValueDAO
 any.search.dao=org.apache.syncope.core.persistence.jpa.dao.PGJPAJSONAnySearchDAO
@@ -217,7 +217,7 @@ In `persistence.properties`, replace as follows:
 
 ....
 entity.factory=org.apache.syncope.core.persistence.jpa.entity.MyJPAJSONEntityFactory
-plainSchema.dao=org.apache.syncope.core.persistence.jpa.dao.JPAJSONPlainSchemaDAO
+plainSchema.dao=org.apache.syncope.core.persistence.jpa.dao.MyJPAJSONPlainSchemaDAO
 plainAttr.dao=org.apache.syncope.core.persistence.jpa.dao.JPAJSONPlainAttrDAO
 plainAttrValue.dao=org.apache.syncope.core.persistence.jpa.dao.JPAJSONPlainAttrValueDAO
 any.search.dao=org.apache.syncope.core.persistence.jpa.dao.MyJPAJSONAnySearchDAO