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 2015/07/21 11:36:08 UTC

[1/3] syncope git commit: Cleanup

Repository: syncope
Updated Branches:
  refs/heads/SYNCOPE-652 93b2e3847 -> a6cf6a68f


Cleanup


Project: http://git-wip-us.apache.org/repos/asf/syncope/repo
Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/ef4069a9
Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/ef4069a9
Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/ef4069a9

Branch: refs/heads/SYNCOPE-652
Commit: ef4069a9adc0c47d1f29da6b1a700b59488761e2
Parents: 93b2e38
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Fri Jul 17 12:07:31 2015 +0200
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Fri Jul 17 12:07:31 2015 +0200

----------------------------------------------------------------------
 .../org/apache/syncope/core/misc/security/AuthContextUtils.java  | 1 -
 .../org/apache/syncope/core/persistence/jpa/inner/UserTest.java  | 4 ----
 2 files changed, 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/ef4069a9/core/misc/src/main/java/org/apache/syncope/core/misc/security/AuthContextUtils.java
----------------------------------------------------------------------
diff --git a/core/misc/src/main/java/org/apache/syncope/core/misc/security/AuthContextUtils.java b/core/misc/src/main/java/org/apache/syncope/core/misc/security/AuthContextUtils.java
index 980201a..932627d 100644
--- a/core/misc/src/main/java/org/apache/syncope/core/misc/security/AuthContextUtils.java
+++ b/core/misc/src/main/java/org/apache/syncope/core/misc/security/AuthContextUtils.java
@@ -69,7 +69,6 @@ public final class AuthContextUtils {
     public static String getDomain() {
         Authentication auth = SecurityContextHolder.getContext().getAuthentication();
 
-        
         String domainKey = auth != null && auth.getDetails() instanceof SyncopeAuthenticationDetails
                 ? SyncopeAuthenticationDetails.class.cast(auth.getDetails()).getDomain()
                 : null;

http://git-wip-us.apache.org/repos/asf/syncope/blob/ef4069a9/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/UserTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/UserTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/UserTest.java
index 1077239..a709638 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/UserTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/UserTest.java
@@ -70,10 +70,6 @@ public class UserTest extends AbstractTest {
         List<User> list = userDAO.findAll(SyncopeConstants.FULL_ADMIN_REALMS, 1, 2);
         assertEquals("did not get expected number of users", 2, list.size());
 
-        System.out.println("SSSSSSSSSSSSSSSSSS\n" + userDAO.findAll(SyncopeConstants.FULL_ADMIN_REALMS, -1, -1));
-        System.out.println("SSSSSSSSSSSSSSSSSS\n" + userDAO.findAll(SyncopeConstants.FULL_ADMIN_REALMS, 1,2));
-        System.out.println("SSSSSSSSSSSSSSSSSS\n" + userDAO.findAll(SyncopeConstants.FULL_ADMIN_REALMS, 2,2));
-
         // get second page
         list = userDAO.findAll(SyncopeConstants.FULL_ADMIN_REALMS, 2, 2);
         assertEquals("did not get expected number of users", 2, list.size());


[3/3] syncope git commit: [SYNCOPE-652] Cleaning up OpenJPA slices

Posted by il...@apache.org.
[SYNCOPE-652] Cleaning up OpenJPA slices


Project: http://git-wip-us.apache.org/repos/asf/syncope/repo
Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/a6cf6a68
Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/a6cf6a68
Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/a6cf6a68

Branch: refs/heads/SYNCOPE-652
Commit: a6cf6a68f443fde895282071c3f3ff275264a8e9
Parents: 0379272
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Tue Jul 21 11:35:52 2015 +0200
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Tue Jul 21 11:35:52 2015 +0200

----------------------------------------------------------------------
 .../syncope/common/lib/to/AbstractSchemaTO.java |  11 ++
 .../rest/api/service/AnyTypeClassService.java   |   2 +-
 .../apache/syncope/core/logic/SchemaLogic.java  |  33 ++--
 core/persistence-jpa/pom.xml                    |   4 -
 .../core/persistence/jpa/dao/AbstractDAO.java   |  38 +----
 .../persistence/jpa/dao/JPAAnyTypeClassDAO.java |  14 +-
 .../jpa/dao/JPAExternalResourceDAO.java         |   4 -
 .../persistence/jpa/entity/JPADerSchema.java    |   3 +-
 .../persistence/jpa/entity/JPAPlainSchema.java  |   3 +-
 .../persistence/jpa/entity/JPAVirSchema.java    |   3 +-
 .../jpa/slice/DomainDistributionPolicy.java     |  36 -----
 .../jpa/slice/DomainFinderTargetPolicy.java     |  38 -----
 .../jpa/slice/DomainQueryTargetPolicy.java      |  41 -----
 .../src/main/resources/persistence.properties   |   3 +-
 .../resources/persistenceContextEMFactory.xml   |  31 +---
 .../core/persistence/jpa/inner/TaskTest.java    |  27 ++++
 .../persistence/jpa/outer/AnyTypeClassTest.java |  36 +++++
 .../src/test/resources/persistence.properties   |   3 +-
 .../provisioning/api/data/SchemaDataBinder.java |  18 +--
 .../java/data/AnyTypeClassDataBinderImpl.java   |  27 +++-
 .../java/data/SchemaDataBinderImpl.java         | 155 ++++++++++++++-----
 .../fit/core/reference/AnyTypeClassITCase.java  |  24 ++-
 pom.xml                                         |  13 +-
 23 files changed, 292 insertions(+), 275 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/a6cf6a68/common/lib/src/main/java/org/apache/syncope/common/lib/to/AbstractSchemaTO.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/AbstractSchemaTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/AbstractSchemaTO.java
index afd6e6b..f426f8c 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/AbstractSchemaTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/AbstractSchemaTO.java
@@ -35,6 +35,8 @@ public abstract class AbstractSchemaTO extends AbstractBaseBean {
 
     private String key;
 
+    private String anyTypeClass;
+
     public String getKey() {
         return key;
     }
@@ -43,4 +45,13 @@ public abstract class AbstractSchemaTO extends AbstractBaseBean {
     public void setKey(final String key) {
         this.key = key;
     }
+
+    public String getAnyTypeClass() {
+        return anyTypeClass;
+    }
+
+    public void setAnyTypeClass(final String anyTypeClass) {
+        this.anyTypeClass = anyTypeClass;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/a6cf6a68/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/AnyTypeClassService.java
----------------------------------------------------------------------
diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/AnyTypeClassService.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/AnyTypeClassService.java
index 18bf1c4..43c3d23 100644
--- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/AnyTypeClassService.java
+++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/AnyTypeClassService.java
@@ -38,7 +38,7 @@ import org.apache.syncope.common.lib.to.AnyTypeClassTO;
 /**
  * REST operations for any type classes.
  */
-@Path("anyTypeClassClasses")
+@Path("anyTypeClasses")
 public interface AnyTypeClassService extends JAXRSService {
 
     /**

http://git-wip-us.apache.org/repos/asf/syncope/blob/a6cf6a68/core/logic/src/main/java/org/apache/syncope/core/logic/SchemaLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/SchemaLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/SchemaLogic.java
index befa8bf..3da4a76 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/SchemaLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/SchemaLogic.java
@@ -39,7 +39,6 @@ import org.apache.syncope.core.persistence.api.dao.NotFoundException;
 import org.apache.syncope.core.persistence.api.dao.PlainSchemaDAO;
 import org.apache.syncope.core.persistence.api.dao.VirSchemaDAO;
 import org.apache.syncope.core.persistence.api.entity.DerSchema;
-import org.apache.syncope.core.persistence.api.entity.EntityFactory;
 import org.apache.syncope.core.persistence.api.entity.PlainSchema;
 import org.apache.syncope.core.persistence.api.entity.VirSchema;
 import org.apache.syncope.core.provisioning.api.data.SchemaDataBinder;
@@ -62,9 +61,6 @@ public class SchemaLogic extends AbstractTransactionalLogic<AbstractSchemaTO> {
     @Autowired
     private SchemaDataBinder binder;
 
-    @Autowired
-    private EntityFactory entityFactory;
-
     private boolean doesSchemaExist(final SchemaType schemaType, final String name) {
         boolean found;
 
@@ -104,27 +100,19 @@ public class SchemaLogic extends AbstractTransactionalLogic<AbstractSchemaTO> {
         T created;
         switch (schemaType) {
             case VIRTUAL:
-                VirSchema virSchema = entityFactory.newEntity(VirSchema.class);
-                binder.create((VirSchemaTO) schemaTO, virSchema);
-                virSchema = virSchemaDAO.save(virSchema);
+                VirSchema virSchema = virSchemaDAO.save(binder.create((VirSchemaTO) schemaTO));
                 created = (T) binder.getVirSchemaTO(virSchema);
                 break;
 
             case DERIVED:
-                DerSchema derSchema = entityFactory.newEntity(DerSchema.class);
-                binder.create((DerSchemaTO) schemaTO, derSchema);
-                derSchema = derSchemaDAO.save(derSchema);
-
+                DerSchema derSchema = derSchemaDAO.save(binder.create((DerSchemaTO) schemaTO));
                 created = (T) binder.getDerSchemaTO(derSchema);
                 break;
 
             case PLAIN:
             default:
-                PlainSchema normalSchema = entityFactory.newEntity(PlainSchema.class);
-                binder.create((PlainSchemaTO) schemaTO, normalSchema);
-                normalSchema = plainSchemaDAO.save(normalSchema);
-
-                created = (T) binder.getPlainSchemaTO(normalSchema);
+                PlainSchema plainSchema = plainSchemaDAO.save(binder.create((PlainSchemaTO) schemaTO));
+                created = (T) binder.getPlainSchemaTO(plainSchema);
         }
         return created;
     }
@@ -241,8 +229,7 @@ public class SchemaLogic extends AbstractTransactionalLogic<AbstractSchemaTO> {
                     throw new NotFoundException("Virtual Schema '" + schemaTO.getKey() + "'");
                 }
 
-                binder.update((VirSchemaTO) schemaTO, virSchema);
-                virSchemaDAO.save(virSchema);
+                virSchemaDAO.save(binder.update((VirSchemaTO) schemaTO, virSchema));
                 break;
 
             case DERIVED:
@@ -251,19 +238,17 @@ public class SchemaLogic extends AbstractTransactionalLogic<AbstractSchemaTO> {
                     throw new NotFoundException("Derived schema '" + schemaTO.getKey() + "'");
                 }
 
-                binder.update((DerSchemaTO) schemaTO, derSchema);
-                derSchemaDAO.save(derSchema);
+                derSchemaDAO.save(binder.update((DerSchemaTO) schemaTO, derSchema));
                 break;
 
             case PLAIN:
             default:
-                PlainSchema schema = plainSchemaDAO.find(schemaTO.getKey());
-                if (schema == null) {
+                PlainSchema plainSchema = plainSchemaDAO.find(schemaTO.getKey());
+                if (plainSchema == null) {
                     throw new NotFoundException("Schema '" + schemaTO.getKey() + "'");
                 }
 
-                binder.update((PlainSchemaTO) schemaTO, schema);
-                plainSchemaDAO.save(schema);
+                plainSchemaDAO.save(binder.update((PlainSchemaTO) schemaTO, plainSchema));
         }
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/a6cf6a68/core/persistence-jpa/pom.xml
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/pom.xml b/core/persistence-jpa/pom.xml
index 0ab9e82..f60f3da 100644
--- a/core/persistence-jpa/pom.xml
+++ b/core/persistence-jpa/pom.xml
@@ -55,10 +55,6 @@ under the License.
       <groupId>org.apache.openjpa</groupId>
       <artifactId>openjpa-persistence-jdbc</artifactId>
     </dependency>
-    <dependency>
-      <groupId>org.apache.openjpa</groupId>
-      <artifactId>openjpa-slice</artifactId>
-    </dependency>
     
     <dependency>
       <groupId>org.apache.commons</groupId>

http://git-wip-us.apache.org/repos/asf/syncope/blob/a6cf6a68/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractDAO.java
index c2d5ae6..f4916c7 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractDAO.java
@@ -19,13 +19,10 @@
 package org.apache.syncope.core.persistence.jpa.dao;
 
 import java.util.List;
-import javax.persistence.CacheRetrieveMode;
-import javax.persistence.CacheStoreMode;
 import javax.persistence.EntityManager;
 import javax.persistence.PersistenceContext;
 import javax.persistence.PersistenceContextType;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.openjpa.slice.SlicePersistence;
 import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.core.persistence.api.dao.DAO;
 import org.apache.syncope.core.persistence.api.dao.search.OrderByClause;
@@ -41,38 +38,10 @@ public abstract class AbstractDAO<E extends Entity<KEY>, KEY> implements DAO<E,
 
     protected static final Logger LOG = LoggerFactory.getLogger(DAO.class);
 
-    private static final String CACHE_STORE_MODE = "javax.persistence.cache.storeMode";
-
-    private static final String CACHE_RETRIEVE_MODE = "javax.persistence.cache.retrieveMode";
-
     @Value("#{entityManager}")
     @PersistenceContext(type = PersistenceContextType.TRANSACTION)
     protected EntityManager entityManager;
 
-    protected CacheRetrieveMode getCacheRetrieveMode() {
-        return entityManager.getProperties().containsKey(CACHE_RETRIEVE_MODE)
-                ? (CacheRetrieveMode) entityManager.getProperties().get(CACHE_RETRIEVE_MODE)
-                : CacheRetrieveMode.BYPASS;
-    }
-
-    protected void setCacheRetrieveMode(final CacheRetrieveMode retrieveMode) {
-        if (retrieveMode != null) {
-            entityManager.getProperties().put(CACHE_RETRIEVE_MODE, retrieveMode);
-        }
-    }
-
-    protected CacheStoreMode getCacheStoreMode() {
-        return entityManager.getProperties().containsKey(CACHE_STORE_MODE)
-                ? (CacheStoreMode) entityManager.getProperties().get(CACHE_STORE_MODE)
-                : CacheStoreMode.BYPASS;
-    }
-
-    protected void setCacheStoreMode(final CacheStoreMode storeMode) {
-        if (storeMode != null) {
-            entityManager.getProperties().put(CACHE_STORE_MODE, storeMode);
-        }
-    }
-
     protected String toOrderByStatement(final Class<? extends Entity<KEY>> beanClass, final String prefix,
             final List<OrderByClause> orderByClauses) {
 
@@ -96,12 +65,7 @@ public abstract class AbstractDAO<E extends Entity<KEY>, KEY> implements DAO<E,
 
     @Override
     public String getDomain(final E entity) {
-        try {
-            return SlicePersistence.getSlice(entity);
-        } catch (Exception e) {
-            LOG.debug("While fetching slice for {}", entity, e);
-            return SyncopeConstants.MASTER_DOMAIN;
-        }
+        return SyncopeConstants.MASTER_DOMAIN;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/a6cf6a68/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyTypeClassDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyTypeClassDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyTypeClassDAO.java
index 3339c9a..58b547d 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyTypeClassDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyTypeClassDAO.java
@@ -63,7 +63,19 @@ public class JPAAnyTypeClassDAO extends AbstractDAO<AnyTypeClass, String> implem
 
     @Override
     public AnyTypeClass save(final AnyTypeClass anyTypeClass) {
-        return entityManager.merge(anyTypeClass);
+        AnyTypeClass merge = entityManager.merge(anyTypeClass);
+
+        for (PlainSchema schema : merge.getPlainSchemas()) {
+            schema.setAnyTypeClass(merge);
+        }
+        for (DerSchema schema : merge.getDerSchemas()) {
+            schema.setAnyTypeClass(merge);
+        }
+        for (VirSchema schema : merge.getVirSchemas()) {
+            schema.setAnyTypeClass(merge);
+        }
+
+        return merge;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/a6cf6a68/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAExternalResourceDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAExternalResourceDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAExternalResourceDAO.java
index 35a5b00..17553a2 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAExternalResourceDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAExternalResourceDAO.java
@@ -33,7 +33,6 @@ import org.apache.syncope.core.persistence.api.dao.GroupDAO;
 import org.apache.syncope.core.persistence.api.dao.TaskDAO;
 import org.apache.syncope.core.persistence.api.dao.UserDAO;
 import org.apache.syncope.core.persistence.api.entity.AccountPolicy;
-import org.apache.syncope.core.persistence.api.entity.AnyUtilsFactory;
 import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
 import org.apache.syncope.core.persistence.api.entity.resource.MappingItem;
 import org.apache.syncope.core.persistence.api.entity.Policy;
@@ -70,9 +69,6 @@ public class JPAExternalResourceDAO extends AbstractDAO<ExternalResource, String
     @Autowired
     private ConnectorRegistry connRegistry;
 
-    @Autowired
-    private AnyUtilsFactory anyUtilsFactory;
-
     @Override
     public ExternalResource find(final String name) {
         return entityManager.find(JPAExternalResource.class, name);

http://git-wip-us.apache.org/repos/asf/syncope/blob/a6cf6a68/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPADerSchema.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPADerSchema.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPADerSchema.java
index 62fc5d6..944afc4 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPADerSchema.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPADerSchema.java
@@ -21,6 +21,7 @@ package org.apache.syncope.core.persistence.jpa.entity;
 import javax.persistence.Cacheable;
 import javax.persistence.Column;
 import javax.persistence.Entity;
+import javax.persistence.FetchType;
 import javax.persistence.Id;
 import javax.persistence.OneToOne;
 import javax.persistence.Table;
@@ -42,7 +43,7 @@ public class JPADerSchema extends AbstractEntity<String> implements DerSchema {
     @Id
     private String name;
 
-    @OneToOne
+    @OneToOne(fetch = FetchType.EAGER)
     private JPAAnyTypeClass anyTypeClass;
 
     @Column(nullable = false)

http://git-wip-us.apache.org/repos/asf/syncope/blob/a6cf6a68/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAPlainSchema.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAPlainSchema.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAPlainSchema.java
index d4935e9..68eeacf 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAPlainSchema.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAPlainSchema.java
@@ -24,6 +24,7 @@ import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.EnumType;
 import javax.persistence.Enumerated;
+import javax.persistence.FetchType;
 import javax.persistence.Id;
 import javax.persistence.Lob;
 import javax.persistence.OneToOne;
@@ -54,7 +55,7 @@ public class JPAPlainSchema extends AbstractEntity<String> implements PlainSchem
     @Id
     private String name;
 
-    @OneToOne
+    @OneToOne(fetch = FetchType.EAGER)
     private JPAAnyTypeClass anyTypeClass;
 
     @Column(nullable = false)

http://git-wip-us.apache.org/repos/asf/syncope/blob/a6cf6a68/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAVirSchema.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAVirSchema.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAVirSchema.java
index d268aff..6c1dd73 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAVirSchema.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAVirSchema.java
@@ -21,6 +21,7 @@ package org.apache.syncope.core.persistence.jpa.entity;
 import javax.persistence.Basic;
 import javax.persistence.Cacheable;
 import javax.persistence.Entity;
+import javax.persistence.FetchType;
 import javax.persistence.Id;
 import javax.persistence.OneToOne;
 import javax.persistence.Table;
@@ -44,7 +45,7 @@ public class JPAVirSchema extends AbstractEntity<String> implements VirSchema {
     @Id
     private String name;
 
-    @OneToOne
+    @OneToOne(fetch = FetchType.EAGER)
     private JPAAnyTypeClass anyTypeClass;
 
     @Basic

http://git-wip-us.apache.org/repos/asf/syncope/blob/a6cf6a68/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/slice/DomainDistributionPolicy.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/slice/DomainDistributionPolicy.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/slice/DomainDistributionPolicy.java
deleted file mode 100644
index 2e61b06..0000000
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/slice/DomainDistributionPolicy.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.core.persistence.jpa.slice;
-
-import java.util.List;
-import org.apache.openjpa.slice.DistributionPolicy;
-import org.apache.syncope.common.lib.SyncopeConstants;
-import org.apache.syncope.core.misc.security.AuthContextUtils;
-import org.apache.syncope.core.persistence.api.entity.Domain;
-
-public class DomainDistributionPolicy implements DistributionPolicy {
-
-    @Override
-    public String distribute(final Object pc, final List<String> slices, final Object context) {
-        return (pc instanceof Domain)
-                ? SyncopeConstants.MASTER_DOMAIN
-                : AuthContextUtils.getDomain();
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/a6cf6a68/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/slice/DomainFinderTargetPolicy.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/slice/DomainFinderTargetPolicy.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/slice/DomainFinderTargetPolicy.java
deleted file mode 100644
index c6cad6e..0000000
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/slice/DomainFinderTargetPolicy.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.core.persistence.jpa.slice;
-
-import java.util.List;
-import org.apache.openjpa.slice.FinderTargetPolicy;
-import org.apache.syncope.common.lib.SyncopeConstants;
-import org.apache.syncope.core.misc.security.AuthContextUtils;
-import org.apache.syncope.core.persistence.jpa.entity.JPADomain;
-
-public class DomainFinderTargetPolicy implements FinderTargetPolicy {
-
-    @Override
-    public String[] getTargets(final Class<?> cls, final Object oid, final List<String> slices, final Object context) {
-        return new String[] {
-            JPADomain.class.equals(cls)
-            ? SyncopeConstants.MASTER_DOMAIN
-            : AuthContextUtils.getDomain()
-        };
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/a6cf6a68/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/slice/DomainQueryTargetPolicy.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/slice/DomainQueryTargetPolicy.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/slice/DomainQueryTargetPolicy.java
deleted file mode 100644
index 193ef2b..0000000
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/slice/DomainQueryTargetPolicy.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.core.persistence.jpa.slice;
-
-import java.util.List;
-import java.util.Map;
-import org.apache.openjpa.slice.QueryTargetPolicy;
-import org.apache.syncope.common.lib.SyncopeConstants;
-import org.apache.syncope.core.misc.security.AuthContextUtils;
-import org.apache.syncope.core.persistence.jpa.entity.JPADomain;
-
-public class DomainQueryTargetPolicy implements QueryTargetPolicy {
-
-    @Override
-    public String[] getTargets(final String query, final Map<Object, Object> params, final String language,
-            final List<String> slices, final Object context) {
-
-        return new String[] {
-            query.contains(JPADomain.class.getSimpleName())
-            ? SyncopeConstants.MASTER_DOMAIN
-            : AuthContextUtils.getDomain()
-        };
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/a6cf6a68/core/persistence-jpa/src/main/resources/persistence.properties
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/resources/persistence.properties b/core/persistence-jpa/src/main/resources/persistence.properties
index 054808d..57f1af0 100644
--- a/core/persistence-jpa/src/main/resources/persistence.properties
+++ b/core/persistence-jpa/src/main/resources/persistence.properties
@@ -26,4 +26,5 @@ jpa.orm=META-INF/spring-orm.xml
 quartz.jobstore=org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
 quartz.sql=tables_postgres.sql
 audit.sql=audit.sql
-database.schema=
\ No newline at end of file
+database.schema=
+

http://git-wip-us.apache.org/repos/asf/syncope/blob/a6cf6a68/core/persistence-jpa/src/main/resources/persistenceContextEMFactory.xml
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/resources/persistenceContextEMFactory.xml b/core/persistence-jpa/src/main/resources/persistenceContextEMFactory.xml
index d3a7e45..5983ca6 100644
--- a/core/persistence-jpa/src/main/resources/persistenceContextEMFactory.xml
+++ b/core/persistence-jpa/src/main/resources/persistenceContextEMFactory.xml
@@ -21,7 +21,7 @@ under the License.
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
                            http://www.springframework.org/schema/beans/spring-beans.xsd">
-  
+
   <bean id="entityManagerFactory"
         class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
     <property name="packagesToScan" value="org.apache.syncope.core.persistence.jpa.entity"/>
@@ -47,43 +47,22 @@ under the License.
     </property>
     <property name="jpaPropertyMap">
       <map>
-        <entry key="openjpa.Log" value="DefaultLevel=INFO, Runtime=TRACE, Tool=TRACE, SQL=TRACE"/>
-        
         <!--<entry key="openjpa.Log" value="SQL=TRACE"/>
         <entry key="openjpa.ConnectionFactoryProperties" 
         value="PrintParameters=true, PrettyPrint=true, PrettyPrintLineLength=80"/>-->
-        
+                                
         <entry key="openjpa.NontransactionalWrite" value="false"/>
         <entry key="openjpa.AutoDetach" value="close, commit, nontx-read, rollback"/>
 
         <entry key="openjpa.jdbc.SchemaFactory" value="native(ForeignKeys=true)"/>
         <entry key="openjpa.jdbc.MappingDefaults" 
                value="ForeignKeyDeleteAction=restrict, JoinForeignKeyDeleteAction=restrict"/>
-                        
+                
         <entry key="openjpa.DataCache" value="true"/>
-        <entry key="openjpa.QueryCache" value="false"/>
-        <entry key="openjpa.QueryCompilationCache" value="false"/>
+        <entry key="openjpa.QueryCache" value="true"/>
         <entry key="openjpa.RemoteCommitProvider" value="sjvm"/>
-        
-        <entry key="openjpa.BrokerFactory" value="slice"/>       
-        <entry key="openjpa.BrokerImpl" value="org.apache.openjpa.slice.DistributedBrokerImpl"/> 
-        <entry key="openjpa.slice.Lenient" value="false"/>
-        
-        <entry key="openjpa.slice.DistributionPolicy" 
-               value="org.apache.syncope.core.persistence.jpa.slice.DomainDistributionPolicy"/>
-        <entry key="openjpa.slice.QueryTargetPolicy" 
-               value="org.apache.syncope.core.persistence.jpa.slice.DomainQueryTargetPolicy"/>
-        <entry key="openjpa.slice.FinderTargetPolicy" 
-               value="org.apache.syncope.core.persistence.jpa.slice.DomainFinderTargetPolicy"/>
-
-        <entry key="openjpa.slice.Names" value="Master"/>        
-        <entry key="openjpa.slice.Master"  value="Master"/>
-        <entry key="openjpa.slice.Lenient" value="false"/>
-        
-        <entry key="openjpa.slice.Master.ConnectionFactory" value-ref="dataSource"/>
-        <entry key="openjpa.slice.Master.jdbc.DBDictionary" value="${jpa.dialect}"/>
       </map>
     </property>
   </bean>
 
-</beans>
+</beans>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/syncope/blob/a6cf6a68/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/TaskTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/TaskTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/TaskTest.java
index 4f4b02c..a3bfedd 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/TaskTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/TaskTest.java
@@ -22,7 +22,9 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
 
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -33,8 +35,10 @@ import org.apache.syncope.common.lib.types.TaskType;
 import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
 import org.apache.syncope.core.persistence.api.dao.TaskDAO;
 import org.apache.syncope.core.persistence.api.dao.UserDAO;
+import org.apache.syncope.core.persistence.api.dao.search.OrderByClause;
 import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
 import org.apache.syncope.core.persistence.api.entity.task.PropagationTask;
+import org.apache.syncope.core.persistence.api.entity.task.Task;
 import org.apache.syncope.core.persistence.api.entity.user.User;
 import org.apache.syncope.core.persistence.jpa.AbstractTest;
 import org.identityconnectors.framework.common.objects.Attribute;
@@ -63,6 +67,29 @@ public class TaskTest extends AbstractTest {
     }
 
     @Test
+    public void findPaginated() {
+        List<Task> tasks = taskDAO.findAll(1, 2, Collections.<OrderByClause>emptyList(), TaskType.PROPAGATION);
+        assertNotNull(tasks);
+        assertEquals(2, tasks.size());
+
+        for (Task task : tasks) {
+            assertNotNull(task);
+        }
+
+        tasks = taskDAO.findAll(2, 2, Collections.<OrderByClause>emptyList(), TaskType.PROPAGATION);
+        assertNotNull(tasks);
+        assertEquals(2, tasks.size());
+
+        for (Task task : tasks) {
+            assertNotNull(task);
+        }
+
+        tasks = taskDAO.findAll(1000, 2, Collections.<OrderByClause>emptyList(), TaskType.PROPAGATION);
+        assertNotNull(tasks);
+        assertTrue(tasks.isEmpty());
+    }
+
+    @Test
     public void findAll() {
         assertEquals(5, taskDAO.findAll(TaskType.PROPAGATION).size());
         assertEquals(1, taskDAO.findAll(TaskType.NOTIFICATION).size());

http://git-wip-us.apache.org/repos/asf/syncope/blob/a6cf6a68/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnyTypeClassTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnyTypeClassTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnyTypeClassTest.java
index 29b97a3..d0f0213 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnyTypeClassTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnyTypeClassTest.java
@@ -23,6 +23,8 @@ import static org.junit.Assert.assertNotNull;
 
 import static org.junit.Assert.assertTrue;
 
+import javax.persistence.EntityManager;
+import org.apache.syncope.common.lib.types.AttrSchemaType;
 import org.apache.syncope.core.persistence.api.dao.AnyTypeClassDAO;
 import org.apache.syncope.core.persistence.api.dao.PlainSchemaDAO;
 import org.apache.syncope.core.persistence.api.entity.AnyTypeClass;
@@ -41,6 +43,40 @@ public class AnyTypeClassTest extends AbstractTest {
     @Autowired
     private AnyTypeClassDAO anyTypeClassDAO;
 
+    @Autowired
+    private EntityManager entityManager;
+
+    @Test
+    public void create() {
+        PlainSchema newSchema = entityFactory.newEntity(PlainSchema.class);
+        newSchema.setKey("new_plain_schema");
+        newSchema.setType(AttrSchemaType.String);
+
+        plainSchemaDAO.save(newSchema);
+
+        plainSchemaDAO.flush();
+
+        newSchema = plainSchemaDAO.find(newSchema.getKey());
+        assertNotNull(newSchema);
+
+        AnyTypeClass newClass = entityFactory.newEntity(AnyTypeClass.class);
+        newClass.setKey("new class");
+        newClass.add(newSchema);
+
+        anyTypeClassDAO.save(newClass);
+
+        anyTypeClassDAO.flush();
+
+        newClass = anyTypeClassDAO.find(newClass.getKey());
+        assertNotNull(newClass);
+        assertEquals(1, newClass.getPlainSchemas().size());
+        assertEquals(newSchema, newClass.getPlainSchemas().get(0));
+        assertEquals(newClass, newClass.getPlainSchemas().get(0).getAnyTypeClass());
+
+        newSchema = plainSchemaDAO.find(newSchema.getKey());
+        assertNotNull(newSchema.getAnyTypeClass());
+    }
+
     @Test
     public void delete() {
         AnyTypeClass minimalUser = anyTypeClassDAO.find("minimal user");

http://git-wip-us.apache.org/repos/asf/syncope/blob/a6cf6a68/core/persistence-jpa/src/test/resources/persistence.properties
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/resources/persistence.properties b/core/persistence-jpa/src/test/resources/persistence.properties
index 6993a0b..31ea1b0 100644
--- a/core/persistence-jpa/src/test/resources/persistence.properties
+++ b/core/persistence-jpa/src/test/resources/persistence.properties
@@ -27,4 +27,5 @@ quartz.jobstore=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
 quartz.scheduler.idleWaitTime=5000
 quartz.sql=tables_h2.sql
 audit.sql=audit.sql
-database.schema=
\ No newline at end of file
+database.schema=
+

http://git-wip-us.apache.org/repos/asf/syncope/blob/a6cf6a68/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/SchemaDataBinder.java
----------------------------------------------------------------------
diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/SchemaDataBinder.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/SchemaDataBinder.java
index dcb8f9f..b185ca8 100644
--- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/SchemaDataBinder.java
+++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/SchemaDataBinder.java
@@ -27,22 +27,22 @@ import org.apache.syncope.core.persistence.api.entity.VirSchema;
 
 public interface SchemaDataBinder {
 
-    <T extends PlainSchema> void create(PlainSchemaTO schemaTO, T schema);
+    PlainSchema create(PlainSchemaTO schemaTO);
 
-    <T extends DerSchema> T create(DerSchemaTO derSchemaTO, T derSchema);
+    DerSchema create(DerSchemaTO schemaTO);
 
-    <T extends VirSchema> T create(VirSchemaTO virSchemaTO, T virSchema);
+    VirSchema create(VirSchemaTO schemaTO);
 
-    <T extends DerSchema> DerSchemaTO getDerSchemaTO(T derSchema);
+    DerSchemaTO getDerSchemaTO(DerSchema schema);
 
-    <T extends PlainSchema> PlainSchemaTO getPlainSchemaTO(T schema);
+    PlainSchemaTO getPlainSchemaTO(PlainSchema schema);
 
-    <T extends VirSchema> VirSchemaTO getVirSchemaTO(T virSchema);
+    VirSchemaTO getVirSchemaTO(VirSchema schema);
 
-    <T extends PlainSchema> void update(PlainSchemaTO schemaTO, T schema);
+    PlainSchema update(PlainSchemaTO schemaTO, PlainSchema schema);
 
-    <T extends DerSchema> T update(DerSchemaTO derSchemaTO, T derSchema);
+    DerSchema update(DerSchemaTO schemaTO, DerSchema derSchema);
 
-    <T extends VirSchema> T update(VirSchemaTO virSchemaTO, T virSchema);
+    VirSchema update(VirSchemaTO schemaTO, VirSchema virSchema);
 
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/a6cf6a68/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyTypeClassDataBinderImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyTypeClassDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyTypeClassDataBinderImpl.java
index 5917190..8a33e12 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyTypeClassDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyTypeClassDataBinderImpl.java
@@ -63,31 +63,46 @@ public class AnyTypeClassDataBinderImpl implements AnyTypeClassDataBinder {
             anyTypeClass.setKey(anyTypeClassTO.getKey());
         }
 
+        for (PlainSchema schema : plainSchemaDAO.findByAnyTypeClass(anyTypeClass)) {
+            schema.setAnyTypeClass(null);
+        }
+
         anyTypeClass.getPlainSchemas().clear();
         for (String schemaName : anyTypeClassTO.getPlainSchemas()) {
             PlainSchema schema = plainSchemaDAO.find(schemaName);
-            if (schema == null) {
-                LOG.debug("Invalid " + PlainSchema.class.getSimpleName() + "{}, ignoring...", schemaName);
+            if (schema == null || schema.getAnyTypeClass() != null) {
+                LOG.debug("Invalid or already in use" + PlainSchema.class.getSimpleName()
+                        + "{}, ignoring...", schemaName);
             } else {
                 anyTypeClass.add(schema);
             }
         }
 
+        for (DerSchema schema : derSchemaDAO.findByAnyTypeClass(anyTypeClass)) {
+            schema.setAnyTypeClass(null);
+        }
+
         anyTypeClass.getDerSchemas().clear();
         for (String schemaName : anyTypeClassTO.getDerSchemas()) {
             DerSchema schema = derSchemaDAO.find(schemaName);
-            if (schema == null) {
-                LOG.debug("Invalid " + DerSchema.class.getSimpleName() + "{}, ignoring...", schemaName);
+            if (schema == null || schema.getAnyTypeClass() != null) {
+                LOG.debug("Invalid or already in use" + DerSchema.class.getSimpleName()
+                        + "{}, ignoring...", schemaName);
             } else {
                 anyTypeClass.add(schema);
             }
         }
 
+        for (VirSchema schema : virSchemaDAO.findByAnyTypeClass(anyTypeClass)) {
+            schema.setAnyTypeClass(null);
+        }
+
         anyTypeClass.getVirSchemas().clear();
         for (String schemaName : anyTypeClassTO.getVirSchemas()) {
             VirSchema schema = virSchemaDAO.find(schemaName);
-            if (schema == null) {
-                LOG.debug("Invalid " + VirSchema.class.getSimpleName() + "{}, ignoring...", schemaName);
+            if (schema == null || schema.getAnyTypeClass() != null) {
+                LOG.debug("Invalid or already in use" + VirSchema.class.getSimpleName()
+                        + "{}, ignoring...", schemaName);
             } else {
                 anyTypeClass.add(schema);
             }

http://git-wip-us.apache.org/repos/asf/syncope/blob/a6cf6a68/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SchemaDataBinderImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SchemaDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SchemaDataBinderImpl.java
index f20a265..0794f8c 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SchemaDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SchemaDataBinderImpl.java
@@ -33,44 +33,88 @@ import org.apache.syncope.core.persistence.api.entity.PlainSchema;
 import org.apache.syncope.core.persistence.api.entity.VirSchema;
 import org.apache.syncope.core.misc.spring.BeanUtils;
 import org.apache.syncope.core.misc.jexl.JexlUtils;
+import org.apache.syncope.core.persistence.api.dao.AnyTypeClassDAO;
+import org.apache.syncope.core.persistence.api.dao.DerSchemaDAO;
+import org.apache.syncope.core.persistence.api.dao.VirSchemaDAO;
+import org.apache.syncope.core.persistence.api.entity.AnyTypeClass;
 import org.apache.syncope.core.persistence.api.entity.AnyUtils;
 import org.apache.syncope.core.persistence.api.entity.AnyUtilsFactory;
+import org.apache.syncope.core.persistence.api.entity.EntityFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 @Component
 public class SchemaDataBinderImpl implements SchemaDataBinder {
 
+    private static final Logger LOG = LoggerFactory.getLogger(SchemaDataBinder.class);
+
+    private static final String[] IGNORE_PROPERTIES = { "anyTypeClass" };
+
+    @Autowired
+    private AnyTypeClassDAO anyTypeClassDAO;
+
     @Autowired
-    private PlainSchemaDAO schemaDAO;
+    private PlainSchemaDAO plainSchemaDAO;
+
+    @Autowired
+    private DerSchemaDAO derSchemaDAO;
+
+    @Autowired
+    private VirSchemaDAO virSchemaDAO;
+
+    @Autowired
+    private EntityFactory entityFactory;
 
     @Autowired
     private AnyUtilsFactory anyUtilsFactory;
 
     // --------------- PLAIN -----------------
-    private <T extends PlainSchema> void fill(final T schema, final PlainSchemaTO schemaTO) {
+    private PlainSchema fill(final PlainSchema schema, final PlainSchemaTO schemaTO) {
         if (!JexlUtils.isExpressionValid(schemaTO.getMandatoryCondition())) {
             SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.InvalidValues);
             sce.getElements().add(schemaTO.getMandatoryCondition());
             throw sce;
         }
 
-        BeanUtils.copyProperties(schemaTO, schema);
+        BeanUtils.copyProperties(schemaTO, schema, IGNORE_PROPERTIES);
+
+        PlainSchema merged = plainSchemaDAO.save(schema);
+
+        if (schemaTO.getAnyTypeClass() != null
+                && (merged.getAnyTypeClass() == null
+                || !schemaTO.getAnyTypeClass().equals(merged.getAnyTypeClass().getKey()))) {
+
+            AnyTypeClass anyTypeClass = anyTypeClassDAO.find(schemaTO.getAnyTypeClass());
+            if (anyTypeClass == null) {
+                LOG.debug("Invalid " + AnyTypeClass.class.getSimpleName()
+                        + "{}, ignoring...", schemaTO.getAnyTypeClass());
+            } else {
+                anyTypeClass.add(merged);
+                merged.setAnyTypeClass(anyTypeClass);
+            }
+        } else if (schemaTO.getAnyTypeClass() == null && merged.getAnyTypeClass() != null) {
+            merged.getAnyTypeClass().remove(merged);
+            merged.setAnyTypeClass(null);
+        }
+
+        return merged;
     }
 
     @Override
-    public <T extends PlainSchema> void create(final PlainSchemaTO schemaTO, final T schema) {
-        fill(schema, schemaTO);
+    public PlainSchema create(final PlainSchemaTO schemaTO) {
+        return fill(entityFactory.newEntity(PlainSchema.class), schemaTO);
     }
 
     @Override
-    public <T extends PlainSchema> void update(final PlainSchemaTO schemaTO, final T schema) {
+    public PlainSchema update(final PlainSchemaTO schemaTO, final PlainSchema schema) {
         SyncopeClientCompositeException scce = SyncopeClientException.buildComposite();
 
         boolean hasAttrs = false;
         for (AnyTypeKind anyTypeKind : AnyTypeKind.values()) {
             AnyUtils anyUtils = anyUtilsFactory.getInstance(anyTypeKind);
-            hasAttrs |= schemaDAO.findAttrs(schema, anyUtils.plainAttrClass()).isEmpty();
+            hasAttrs |= plainSchemaDAO.findAttrs(schema, anyUtils.plainAttrClass()).isEmpty();
         }
 
         if (hasAttrs) {
@@ -92,30 +136,31 @@ public class SchemaDataBinderImpl implements SchemaDataBinder {
             throw scce;
         }
 
-        fill(schema, schemaTO);
+        return fill(schema, schemaTO);
     }
 
     @Override
-    public <T extends PlainSchema> PlainSchemaTO getPlainSchemaTO(final T schema) {
+    public PlainSchemaTO getPlainSchemaTO(final PlainSchema schema) {
         PlainSchemaTO schemaTO = new PlainSchemaTO();
-        BeanUtils.copyProperties(schema, schemaTO);
+        BeanUtils.copyProperties(schema, schemaTO, IGNORE_PROPERTIES);
+        schemaTO.setAnyTypeClass(schema.getAnyTypeClass() == null ? null : schema.getAnyTypeClass().getKey());
 
         return schemaTO;
     }
 
     // --------------- DERIVED -----------------
-    private <T extends DerSchema> T populate(final T derSchema, final DerSchemaTO derSchemaTO) {
+    private DerSchema fill(final DerSchema schema, final DerSchemaTO schemaTO) {
         SyncopeClientCompositeException scce = SyncopeClientException.buildComposite();
 
-        if (StringUtils.isBlank(derSchemaTO.getExpression())) {
+        if (StringUtils.isBlank(schemaTO.getExpression())) {
             SyncopeClientException requiredValuesMissing =
                     SyncopeClientException.build(ClientExceptionType.RequiredValuesMissing);
             requiredValuesMissing.getElements().add("expression");
 
             scce.addException(requiredValuesMissing);
-        } else if (!JexlUtils.isExpressionValid(derSchemaTO.getExpression())) {
+        } else if (!JexlUtils.isExpressionValid(schemaTO.getExpression())) {
             SyncopeClientException e = SyncopeClientException.build(ClientExceptionType.InvalidValues);
-            e.getElements().add(derSchemaTO.getExpression());
+            e.getElements().add(schemaTO.getExpression());
 
             scce.addException(e);
         }
@@ -124,51 +169,91 @@ public class SchemaDataBinderImpl implements SchemaDataBinder {
             throw scce;
         }
 
-        BeanUtils.copyProperties(derSchemaTO, derSchema);
+        BeanUtils.copyProperties(schemaTO, schema, IGNORE_PROPERTIES);
+
+        DerSchema merged = derSchemaDAO.save(schema);
+
+        if (schemaTO.getAnyTypeClass() != null
+                && (merged.getAnyTypeClass() == null
+                || !schemaTO.getAnyTypeClass().equals(merged.getAnyTypeClass().getKey()))) {
+
+            AnyTypeClass anyTypeClass = anyTypeClassDAO.find(schemaTO.getAnyTypeClass());
+            if (anyTypeClass == null) {
+                LOG.debug("Invalid " + AnyTypeClass.class.getSimpleName()
+                        + "{}, ignoring...", schemaTO.getAnyTypeClass());
+            } else {
+                anyTypeClass.add(merged);
+                merged.setAnyTypeClass(anyTypeClass);
+            }
+        } else if (schemaTO.getAnyTypeClass() == null && merged.getAnyTypeClass() != null) {
+            merged.getAnyTypeClass().remove(merged);
+            merged.setAnyTypeClass(null);
+        }
 
-        return derSchema;
+        return merged;
     }
 
     @Override
-    public <T extends DerSchema> T create(final DerSchemaTO derSchemaTO, final T derSchema) {
-        return populate(derSchema, derSchemaTO);
+    public DerSchema create(final DerSchemaTO schemaTO) {
+        return fill(entityFactory.newEntity(DerSchema.class), schemaTO);
     }
 
     @Override
-    public <T extends DerSchema> T update(final DerSchemaTO derSchemaTO, final T derSchema) {
-        return populate(derSchema, derSchemaTO);
+    public DerSchema update(final DerSchemaTO schemaTO, final DerSchema schema) {
+        return fill(schema, schemaTO);
     }
 
     @Override
-    public <T extends DerSchema> DerSchemaTO getDerSchemaTO(final T derSchema) {
-        DerSchemaTO derSchemaTO = new DerSchemaTO();
-        BeanUtils.copyProperties(derSchema, derSchemaTO);
+    public DerSchemaTO getDerSchemaTO(final DerSchema schema) {
+        DerSchemaTO schemaTO = new DerSchemaTO();
+        BeanUtils.copyProperties(schema, schemaTO, IGNORE_PROPERTIES);
+        schemaTO.setAnyTypeClass(schema.getAnyTypeClass() == null ? null : schema.getAnyTypeClass().getKey());
 
-        return derSchemaTO;
+        return schemaTO;
     }
 
     // --------------- VIRTUAL -----------------
-    private <T extends VirSchema> T fill(final T virSchema, final VirSchemaTO virSchemaTO) {
-        BeanUtils.copyProperties(virSchemaTO, virSchema);
+    private VirSchema fill(final VirSchema schema, final VirSchemaTO schemaTO) {
+        BeanUtils.copyProperties(schemaTO, schema, IGNORE_PROPERTIES);
+
+        VirSchema merged = virSchemaDAO.save(schema);
+
+        if (schemaTO.getAnyTypeClass() != null
+                && (merged.getAnyTypeClass() == null
+                || !schemaTO.getAnyTypeClass().equals(merged.getAnyTypeClass().getKey()))) {
+
+            AnyTypeClass anyTypeClass = anyTypeClassDAO.find(schemaTO.getAnyTypeClass());
+            if (anyTypeClass == null) {
+                LOG.debug("Invalid " + AnyTypeClass.class.getSimpleName()
+                        + "{}, ignoring...", schemaTO.getAnyTypeClass());
+            } else {
+                anyTypeClass.add(merged);
+                merged.setAnyTypeClass(anyTypeClass);
+            }
+        } else if (schemaTO.getAnyTypeClass() == null && merged.getAnyTypeClass() != null) {
+            merged.getAnyTypeClass().remove(merged);
+            merged.setAnyTypeClass(null);
+        }
 
-        return virSchema;
+        return merged;
     }
 
     @Override
-    public <T extends VirSchema> T create(final VirSchemaTO virSchemaTO, final T virSchema) {
-        return fill(virSchema, virSchemaTO);
+    public VirSchema create(final VirSchemaTO schemaTO) {
+        return fill(entityFactory.newEntity(VirSchema.class), schemaTO);
     }
 
     @Override
-    public <T extends VirSchema> T update(final VirSchemaTO virSchemaTO, final T virSchema) {
-        return fill(virSchema, virSchemaTO);
+    public VirSchema update(final VirSchemaTO schemaTO, final VirSchema schema) {
+        return fill(schema, schemaTO);
     }
 
     @Override
-    public <T extends VirSchema> VirSchemaTO getVirSchemaTO(final T virSchema) {
-        VirSchemaTO virSchemaTO = new VirSchemaTO();
-        BeanUtils.copyProperties(virSchema, virSchemaTO);
+    public VirSchemaTO getVirSchemaTO(final VirSchema schema) {
+        VirSchemaTO schemaTO = new VirSchemaTO();
+        BeanUtils.copyProperties(schema, schemaTO, IGNORE_PROPERTIES);
+        schemaTO.setAnyTypeClass(schema.getAnyTypeClass() == null ? null : schema.getAnyTypeClass().getKey());
 
-        return virSchemaTO;
+        return schemaTO;
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/a6cf6a68/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AnyTypeClassITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AnyTypeClassITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AnyTypeClassITCase.java
index 557f4b3..6e88c71 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AnyTypeClassITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AnyTypeClassITCase.java
@@ -21,6 +21,7 @@ package org.apache.syncope.fit.core.reference;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
@@ -28,6 +29,7 @@ import java.util.List;
 import javax.ws.rs.core.Response;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.to.AnyTypeClassTO;
+import org.apache.syncope.common.lib.to.DerSchemaTO;
 import org.apache.syncope.common.lib.to.PlainSchemaTO;
 import org.apache.syncope.common.lib.types.AttrSchemaType;
 import org.apache.syncope.common.lib.types.ClientExceptionType;
@@ -58,9 +60,21 @@ public class AnyTypeClassITCase extends AbstractITCase {
 
     @Test
     public void crud() {
+        // 1. create sample schemas
+        PlainSchemaTO plainSchema = new PlainSchemaTO();
+        plainSchema.setKey("new_plain_schema" + getUUIDString());
+        plainSchema.setType(AttrSchemaType.String);
+        plainSchema = createSchema(SchemaType.PLAIN, plainSchema);
+
+        DerSchemaTO derSchema = new DerSchemaTO();
+        derSchema.setKey("new_der_schema" + getUUIDString());
+        derSchema.setExpression(plainSchema.getKey() + " + '_' + derived_dx");
+        derSchema = createSchema(SchemaType.DERIVED, derSchema);
+
+        // 2. actual CRUD
         AnyTypeClassTO newClass = new AnyTypeClassTO();
         newClass.setKey("new class" + getUUIDString());
-        newClass.getPlainSchemas().add("firstname");
+        newClass.getPlainSchemas().add(plainSchema.getKey());
 
         Response response = anyTypeClassService.create(newClass);
         assertEquals(Response.Status.CREATED.getStatusCode(), response.getStatusInfo().getStatusCode());
@@ -71,7 +85,7 @@ public class AnyTypeClassITCase extends AbstractITCase {
         assertTrue(newClass.getDerSchemas().isEmpty());
         assertTrue(newClass.getVirSchemas().isEmpty());
 
-        newClass.getDerSchemas().add("cn");
+        newClass.getDerSchemas().add(derSchema.getKey());
         anyTypeClassService.update(newClass);
 
         newClass = anyTypeClassService.read(newClass.getKey());
@@ -80,6 +94,9 @@ public class AnyTypeClassITCase extends AbstractITCase {
         assertFalse(newClass.getDerSchemas().isEmpty());
         assertTrue(newClass.getVirSchemas().isEmpty());
 
+        assertEquals(newClass.getKey(), schemaService.read(SchemaType.PLAIN, plainSchema.getKey()).getAnyTypeClass());
+        assertEquals(newClass.getKey(), schemaService.read(SchemaType.DERIVED, derSchema.getKey()).getAnyTypeClass());
+
         anyTypeClassService.delete(newClass.getKey());
 
         try {
@@ -88,6 +105,9 @@ public class AnyTypeClassITCase extends AbstractITCase {
         } catch (SyncopeClientException e) {
             assertEquals(ClientExceptionType.NotFound, e.getType());
         }
+
+        assertNull(schemaService.read(SchemaType.PLAIN, plainSchema.getKey()).getAnyTypeClass());
+        assertNull(schemaService.read(SchemaType.DERIVED, derSchema.getKey()).getAnyTypeClass());
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/syncope/blob/a6cf6a68/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 95dc8e7..f30ec4f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -335,7 +335,7 @@ under the License.
     <spring.version>4.1.7.RELEASE</spring.version>
     <spring-security.version>4.0.1.RELEASE</spring-security.version>
 
-    <openjpa.version>2.4.1-SNAPSHOT</openjpa.version>
+    <openjpa.version>2.4.0</openjpa.version>
     <commons-dbcp.version>2.1</commons-dbcp.version>
     <hibernate-validator.version>5.1.3.Final</hibernate-validator.version>
 
@@ -533,11 +533,6 @@ under the License.
         <artifactId>openjpa-persistence-jdbc</artifactId>
         <version>${openjpa.version}</version>
       </dependency>
-      <dependency>
-        <groupId>org.apache.openjpa</groupId>
-        <artifactId>openjpa-slice</artifactId>
-        <version>${openjpa.version}</version>
-      </dependency>
     
       <dependency>
         <groupId>org.apache.commons</groupId>
@@ -1111,6 +1106,12 @@ under the License.
         </plugin>
         
         <plugin>
+          <groupId>org.apache.cxf</groupId>
+          <artifactId>cxf-java2wadl-plugin</artifactId>
+          <version>${cxf.version}</version>
+        </plugin>
+        
+        <plugin>
           <groupId>org.apache.openjpa</groupId>
           <artifactId>openjpa-maven-plugin</artifactId>
           <version>${openjpa.version}</version>


[2/3] syncope git commit: Fix as per CXF-6499

Posted by il...@apache.org.
Fix as per CXF-6499


Project: http://git-wip-us.apache.org/repos/asf/syncope/repo
Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/03792725
Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/03792725
Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/03792725

Branch: refs/heads/SYNCOPE-652
Commit: 03792725c6caebfab70c51b56a50246e866e9b72
Parents: ef4069a
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Fri Jul 17 15:27:14 2015 +0200
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Fri Jul 17 15:27:14 2015 +0200

----------------------------------------------------------------------
 core/rest-cxf/src/main/resources/restCXFContext.xml | 1 +
 1 file changed, 1 insertion(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/03792725/core/rest-cxf/src/main/resources/restCXFContext.xml
----------------------------------------------------------------------
diff --git a/core/rest-cxf/src/main/resources/restCXFContext.xml b/core/rest-cxf/src/main/resources/restCXFContext.xml
index 5818422..b26ed2e 100644
--- a/core/rest-cxf/src/main/resources/restCXFContext.xml
+++ b/core/rest-cxf/src/main/resources/restCXFContext.xml
@@ -85,6 +85,7 @@ under the License.
     <property name="useJaxbContextForQnames" value="true"/>
     <property name="ignoreMessageWriters" value="true"/>
     <property name="addResourceAndMethodIds" value="true"/>
+    <property name="usePathParamsToCompareOperations" value="false"/>
     <property name="javaDocPath" value="/WEB-INF/lib/syncope-common-rest-api-${syncope.version}-javadoc.jar"/>
   </bean>