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:25 UTC
[syncope] branch master updated: Improving PlainSchemaDAO#hasAttrs
implementations
This is an automated email from the ASF dual-hosted git repository.
ilgrosso pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/syncope.git
The following commit(s) were added to refs/heads/master by this push:
new 7d5954d Improving PlainSchemaDAO#hasAttrs implementations
7d5954d is described below
commit 7d5954dc188b8f39ab67834dc11f9d1f8277e5ff
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} | 22 ++++++-------------
...SchemaDAO.java => PGJPAJSONPlainSchemaDAO.java} | 22 ++++++-------------
.../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(+), 52 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 c588549..9034af0 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
@@ -19,10 +19,13 @@
package org.apache.syncope.core.persistence.jpa.dao;
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) {
@@ -30,10 +33,15 @@ public class JPAJSONPlainSchemaDAO extends JPAPlainSchemaDAO {
return List.of();
}
- @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 70%
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 c588549..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,26 +18,18 @@
*/
package org.apache.syncope.core.persistence.jpa.dao;
-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 List.of();
- }
+ 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 70%
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 c588549..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,26 +18,18 @@
*/
package org.apache.syncope.core.persistence.jpa.dao;
-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 List.of();
- }
+ 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 d4b0495..1a7d556 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 89f9e0d..d4a22e9 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 50f6f4e..8bb728b 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;
@@ -110,10 +113,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 9059e59..293e5e9 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 c13cac9..fe9250c 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=${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/src/main/asciidoc/reference-guide/workingwithapachesyncope/systemadministration/dbms.adoc b/src/main/asciidoc/reference-guide/workingwithapachesyncope/systemadministration/dbms.adoc
index 30f102e..c1128ff 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
@@ -216,7 +216,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