syncope-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From ilgro...@apache.org
Subject [4/5] syncope git commit: [SYNCOPE-725] Refactoring completed
Date Fri, 06 Nov 2015 10:00:49 GMT
http://git-wip-us.apache.org/repos/asf/syncope/blob/eec66245/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAVirSchemaDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAVirSchemaDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAVirSchemaDAO.java
index d4bce14..aa38d77 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAVirSchemaDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAVirSchemaDAO.java
@@ -18,7 +18,6 @@
  */
 package org.apache.syncope.core.persistence.jpa.dao;
 
-import java.util.Collections;
 import java.util.List;
 import javax.persistence.TypedQuery;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
@@ -27,7 +26,6 @@ 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.Attr;
 import org.apache.syncope.core.persistence.api.entity.VirSchema;
 import org.apache.syncope.core.persistence.api.entity.resource.Provision;
 import org.apache.syncope.core.persistence.jpa.entity.JPAAnyUtilsFactory;
@@ -78,11 +76,6 @@ public class JPAVirSchemaDAO extends AbstractDAO<VirSchema, String> implements V
     }
 
     @Override
-    public <T extends Attr<VirSchema, ?>> List<T> findAttrs(final VirSchema schema, final Class<T> reference) {
-        return Collections.emptyList();
-    }
-
-    @Override
     public VirSchema save(final VirSchema virSchema) {
         return entityManager().merge(virSchema);
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/eec66245/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractAny.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractAny.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractAny.java
index 041c54f..ba02c45 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractAny.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractAny.java
@@ -21,7 +21,6 @@ package org.apache.syncope.core.persistence.jpa.entity;
 import org.apache.syncope.core.persistence.jpa.entity.resource.JPAExternalResource;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 import javax.persistence.Column;
@@ -34,23 +33,19 @@ import org.apache.commons.collections4.Predicate;
 import org.apache.commons.collections4.Transformer;
 import org.apache.syncope.core.persistence.api.entity.Any;
 import org.apache.syncope.core.persistence.api.entity.AnyTypeClass;
-import org.apache.syncope.core.persistence.api.entity.DerAttr;
 import org.apache.syncope.core.persistence.api.entity.DerSchema;
 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.Realm;
 import org.apache.syncope.core.persistence.api.entity.VirSchema;
-import org.apache.syncope.core.persistence.api.entity.anyobject.AMembership;
-import org.apache.syncope.core.persistence.api.entity.anyobject.AnyObject;
-import org.apache.syncope.core.persistence.api.entity.group.TypeExtension;
 import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
-import org.apache.syncope.core.persistence.api.entity.user.UMembership;
-import org.apache.syncope.core.persistence.api.entity.user.User;
+import org.apache.syncope.core.persistence.jpa.validation.entity.AnyCheck;
 
+@AnyCheck
 @MappedSuperclass
-public abstract class AbstractAny<P extends PlainAttr<?>, D extends DerAttr<?>>
+public abstract class AbstractAny<P extends PlainAttr<?>>
         extends AbstractAnnotatedEntity<Long>
-        implements Any<P, D> {
+        implements Any<P> {
 
     private static final long serialVersionUID = -2666540708092702810L;
 
@@ -114,18 +109,6 @@ public abstract class AbstractAny<P extends PlainAttr<?>, D extends DerAttr<?>>
         });
     }
 
-    @Override
-    public D getDerAttr(final String derSchemaName) {
-        return CollectionUtils.find(getDerAttrs(), new Predicate<D>() {
-
-            @Override
-            public boolean evaluate(final D derAttr) {
-                return derAttr != null && derAttr.getSchema() != null
-                        && derSchemaName.equals(derAttr.getSchema().getKey());
-            }
-        });
-    }
-
     protected abstract List<JPAExternalResource> internalGetResources();
 
     @Override
@@ -159,70 +142,8 @@ public abstract class AbstractAny<P extends PlainAttr<?>, D extends DerAttr<?>>
     private void populateAllowedSchemas(final Collection<? extends AnyTypeClass> anyTypeClasses) {
         for (AnyTypeClass anyTypeClass : anyTypeClasses) {
             allowedPlainSchemas.addAll(anyTypeClass.getPlainSchemas());
-        }
-
-        for (AnyTypeClass anyTypeClass : anyTypeClasses) {
             allowedDerSchemas.addAll(anyTypeClass.getDerSchemas());
-        }
-
-        for (AnyTypeClass anyTypeClass : anyTypeClasses) {
             allowedVirSchemas.addAll(anyTypeClass.getVirSchemas());
         }
     }
-
-    private void populateAllowedSchemas() {
-        synchronized (this) {
-            if (allowedPlainSchemas == null) {
-                allowedPlainSchemas = new HashSet<>();
-            } else {
-                allowedPlainSchemas.clear();
-            }
-            if (allowedDerSchemas == null) {
-                allowedDerSchemas = new HashSet<>();
-            } else {
-                allowedDerSchemas.clear();
-            }
-            if (allowedVirSchemas == null) {
-                allowedVirSchemas = new HashSet<>();
-            } else {
-                allowedVirSchemas.clear();
-            }
-
-            populateAllowedSchemas(getType().getClasses());
-            populateAllowedSchemas(getAuxClasses());
-            if (this instanceof User) {
-                for (UMembership memb : ((User) this).getMemberships()) {
-                    for (TypeExtension typeExtension : memb.getRightEnd().getTypeExtensions()) {
-                        populateAllowedSchemas(typeExtension.getAuxClasses());
-                    }
-                }
-            }
-            if (this instanceof AnyObject) {
-                for (AMembership memb : ((AnyObject) this).getMemberships()) {
-                    for (TypeExtension typeExtension : memb.getRightEnd().getTypeExtensions()) {
-                        populateAllowedSchemas(typeExtension.getAuxClasses());
-                    }
-                }
-            }
-        }
-    }
-
-    @Override
-    public Set<PlainSchema> getAllowedPlainSchemas() {
-        populateAllowedSchemas();
-        return allowedPlainSchemas;
-    }
-
-    @Override
-    public Set<DerSchema> getAllowedDerSchemas() {
-        populateAllowedSchemas();
-        return allowedDerSchemas;
-    }
-
-    @Override
-    public Set<VirSchema> getAllowedVirSchemas() {
-        populateAllowedSchemas();
-        return allowedVirSchemas;
-    }
-
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/eec66245/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractAttr.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractAttr.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractAttr.java
deleted file mode 100644
index 694b18f..0000000
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractAttr.java
+++ /dev/null
@@ -1,60 +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.entity;
-
-import java.util.Collections;
-import java.util.Set;
-import org.apache.syncope.core.persistence.api.dao.UnallowedSchemaException;
-import org.apache.syncope.core.persistence.api.entity.Any;
-import org.apache.syncope.core.persistence.api.entity.Attr;
-import org.apache.syncope.core.persistence.api.entity.DerSchema;
-import org.apache.syncope.core.persistence.api.entity.PlainSchema;
-import org.apache.syncope.core.persistence.api.entity.Schema;
-import org.apache.syncope.core.persistence.api.entity.VirSchema;
-
-public abstract class AbstractAttr<S extends Schema, O extends Any<?, ?>>
-        extends AbstractEntity<Long> implements Attr<S, O> {
-
-    private static final long serialVersionUID = -7722134717360731874L;
-
-    @SuppressWarnings("unchecked")
-    private Set<S> getAllowedSchemas(final O any) {
-        Set<S> result = Collections.emptySet();
-
-        if (getSchema() instanceof PlainSchema) {
-            result = (Set<S>) any.getAllowedPlainSchemas();
-        } else if (getSchema() instanceof DerSchema) {
-            result = (Set<S>) any.getAllowedDerSchemas();
-        } else if (getSchema() instanceof VirSchema) {
-            result = (Set<S>) any.getAllowedVirSchemas();
-        }
-
-        return result;
-    }
-
-    protected void checkSchema(final S schema) {
-        if (schema == null || getOwner() == null) {
-            throw new IllegalStateException("First set owner then schema and finally add values");
-        }
-
-        if (!getAllowedSchemas(getOwner()).contains(schema)) {
-            throw new UnallowedSchemaException(schema.getKey());
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/eec66245/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractDerAttr.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractDerAttr.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractDerAttr.java
deleted file mode 100644
index 59f390d..0000000
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractDerAttr.java
+++ /dev/null
@@ -1,62 +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.entity;
-
-import java.util.Collection;
-import javax.persistence.Column;
-import javax.persistence.FetchType;
-import javax.persistence.ManyToOne;
-import javax.persistence.MappedSuperclass;
-import org.apache.syncope.core.persistence.api.entity.DerAttr;
-import org.apache.syncope.core.persistence.api.entity.PlainAttr;
-import org.apache.syncope.core.misc.jexl.JexlUtils;
-import org.apache.syncope.core.persistence.api.entity.Any;
-import org.apache.syncope.core.persistence.api.entity.DerSchema;
-
-@MappedSuperclass
-public abstract class AbstractDerAttr<O extends Any<?, ?>>
-        extends AbstractAttr<DerSchema, O> implements DerAttr<O> {
-
-    private static final long serialVersionUID = 4740924251090424771L;
-
-    @ManyToOne(fetch = FetchType.EAGER)
-    @Column(name = "schema_name")
-    private JPADerSchema schema;
-
-    @Override
-    public DerSchema getSchema() {
-        return schema;
-    }
-
-    @Override
-    public void setSchema(final DerSchema schema) {
-        checkType(schema, JPADerSchema.class);
-        this.schema = (JPADerSchema) schema;
-        checkSchema(this.schema);
-    }
-
-    /**
-     * @param attributes the set of attributes against which evaluate this derived attribute
-     * @return the value of this derived attribute
-     */
-    @Override
-    public String getValue(final Collection<? extends PlainAttr<?>> attributes) {
-        return JexlUtils.evaluate(getSchema().getExpression(), getOwner(), attributes);
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/eec66245/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractDynMembership.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractDynMembership.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractDynMembership.java
index c7110d5..0b77dac 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractDynMembership.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractDynMembership.java
@@ -24,7 +24,7 @@ import org.apache.syncope.core.persistence.api.entity.Any;
 import org.apache.syncope.core.persistence.api.entity.DynMembership;
 
 @MappedSuperclass
-public abstract class AbstractDynMembership<A extends Any<?, ?>>
+public abstract class AbstractDynMembership<A extends Any<?>>
         extends AbstractEntity<Long> implements DynMembership<A> {
 
     private static final long serialVersionUID = 921821654690948787L;

http://git-wip-us.apache.org/repos/asf/syncope/blob/eec66245/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractPlainAttr.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractPlainAttr.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractPlainAttr.java
index fdd257e..f892a8d 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractPlainAttr.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractPlainAttr.java
@@ -25,6 +25,7 @@ import javax.persistence.Column;
 import javax.persistence.FetchType;
 import javax.persistence.ManyToOne;
 import javax.persistence.MappedSuperclass;
+import javax.validation.constraints.NotNull;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.Transformer;
 import org.apache.syncope.core.persistence.api.entity.Any;
@@ -37,11 +38,11 @@ import org.apache.syncope.core.persistence.jpa.validation.entity.PlainAttrCheck;
 
 @MappedSuperclass
 @PlainAttrCheck
-public abstract class AbstractPlainAttr<O extends Any<?, ?>>
-        extends AbstractAttr<PlainSchema, O> implements PlainAttr<O> {
+public abstract class AbstractPlainAttr<O extends Any<?>> extends AbstractEntity<Long> implements PlainAttr<O> {
 
     private static final long serialVersionUID = -9115431608821806124L;
 
+    @NotNull
     @ManyToOne(fetch = FetchType.EAGER)
     @Column(name = "schema_name")
     protected JPAPlainSchema schema;
@@ -55,13 +56,20 @@ public abstract class AbstractPlainAttr<O extends Any<?, ?>>
     public void setSchema(final PlainSchema schema) {
         checkType(schema, JPAPlainSchema.class);
         this.schema = (JPAPlainSchema) schema;
-        checkSchema(this.schema);
     }
 
     protected abstract boolean addForMultiValue(PlainAttrValue attrValue);
 
+    private void checkNonNullSchema() {
+        if (schema == null) {
+            throw new IllegalStateException("First set owner then schema and finally add values");
+        }
+    }
+
     @Override
     public void add(final String value, final PlainAttrValue attrValue) {
+        checkNonNullSchema();
+
         attrValue.setAttr(this);
         getSchema().getValidator().validate(value, attrValue);
 
@@ -77,6 +85,8 @@ public abstract class AbstractPlainAttr<O extends Any<?, ?>>
 
     @Override
     public void add(final String value, final AnyUtils anyUtils) {
+        checkNonNullSchema();
+
         PlainAttrValue attrValue;
         if (getSchema().isUniqueConstraint()) {
             attrValue = anyUtils.newPlainAttrUniqueValue();

http://git-wip-us.apache.org/repos/asf/syncope/blob/eec66245/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyUtils.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyUtils.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyUtils.java
index 7de2fbe..22c632a 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyUtils.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyUtils.java
@@ -18,38 +18,55 @@
  */
 package org.apache.syncope.core.persistence.jpa.entity;
 
+import java.util.HashSet;
+import java.util.Set;
 import org.apache.syncope.common.lib.to.AnyObjectTO;
 import org.apache.syncope.common.lib.to.AnyTO;
 import org.apache.syncope.common.lib.to.GroupTO;
 import org.apache.syncope.common.lib.to.UserTO;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.IntMappingType;
+import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO;
+import org.apache.syncope.core.persistence.api.dao.GroupDAO;
+import org.apache.syncope.core.persistence.api.dao.UserDAO;
 import org.apache.syncope.core.persistence.api.entity.Any;
 import org.apache.syncope.core.persistence.api.entity.AnyUtils;
-import org.apache.syncope.core.persistence.api.entity.DerAttr;
 import org.apache.syncope.core.persistence.api.entity.PlainAttr;
 import org.apache.syncope.core.persistence.api.entity.PlainAttrValue;
-import org.apache.syncope.core.persistence.jpa.entity.anyobject.JPAADerAttr;
+import org.apache.syncope.core.persistence.api.entity.Schema;
+import org.apache.syncope.core.persistence.api.entity.anyobject.AnyObject;
+import org.apache.syncope.core.persistence.api.entity.group.Group;
+import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
+import org.apache.syncope.core.persistence.api.entity.user.User;
 import org.apache.syncope.core.persistence.jpa.entity.anyobject.JPAAPlainAttr;
 import org.apache.syncope.core.persistence.jpa.entity.anyobject.JPAAPlainAttrUniqueValue;
 import org.apache.syncope.core.persistence.jpa.entity.anyobject.JPAAPlainAttrValue;
 import org.apache.syncope.core.persistence.jpa.entity.anyobject.JPAAnyObject;
-import org.apache.syncope.core.persistence.jpa.entity.group.JPAGDerAttr;
 import org.apache.syncope.core.persistence.jpa.entity.group.JPAGPlainAttr;
 import org.apache.syncope.core.persistence.jpa.entity.group.JPAGPlainAttrUniqueValue;
 import org.apache.syncope.core.persistence.jpa.entity.group.JPAGPlainAttrValue;
 import org.apache.syncope.core.persistence.jpa.entity.group.JPAGroup;
-import org.apache.syncope.core.persistence.jpa.entity.user.JPAUDerAttr;
 import org.apache.syncope.core.persistence.jpa.entity.user.JPAUPlainAttr;
 import org.apache.syncope.core.persistence.jpa.entity.user.JPAUPlainAttrUniqueValue;
 import org.apache.syncope.core.persistence.jpa.entity.user.JPAUPlainAttrValue;
 import org.apache.syncope.core.persistence.jpa.entity.user.JPAUser;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
 
 @SuppressWarnings({ "unchecked", "rawtypes" })
 public class JPAAnyUtils implements AnyUtils {
 
     private final AnyTypeKind anyTypeKind;
 
+    @Autowired
+    private UserDAO userDAO;
+
+    @Autowired
+    private GroupDAO groupDAO;
+
+    @Autowired
+    private AnyObjectDAO anyObjectDAO;
+
     protected JPAAnyUtils(final AnyTypeKind typeKind) {
         this.anyTypeKind = typeKind;
     }
@@ -60,7 +77,7 @@ public class JPAAnyUtils implements AnyUtils {
     }
 
     @Override
-    public <T extends Any<?, ?>> Class<T> anyClass() {
+    public <T extends Any<?>> Class<T> anyClass() {
         Class result;
 
         switch (anyTypeKind) {
@@ -216,52 +233,6 @@ public class JPAAnyUtils implements AnyUtils {
     }
 
     @Override
-    public <T extends DerAttr<?>> Class<T> derAttrClass() {
-        Class result = null;
-
-        switch (anyTypeKind) {
-            case USER:
-                result = JPAUDerAttr.class;
-                break;
-
-            case GROUP:
-                result = JPAGDerAttr.class;
-                break;
-
-            case ANY_OBJECT:
-                result = JPAADerAttr.class;
-                break;
-
-            default:
-        }
-
-        return result;
-    }
-
-    @Override
-    public <T extends DerAttr<?>> T newDerAttr() {
-        T result = null;
-
-        switch (anyTypeKind) {
-            case USER:
-                result = (T) new JPAUDerAttr();
-                break;
-
-            case GROUP:
-                result = (T) new JPAGDerAttr();
-                break;
-
-            case ANY_OBJECT:
-                result = (T) new JPAADerAttr();
-                break;
-
-            default:
-        }
-
-        return result;
-    }
-
-    @Override
     public IntMappingType plainIntMappingType() {
         IntMappingType result = null;
 
@@ -352,4 +323,36 @@ public class JPAAnyUtils implements AnyUtils {
 
         return result;
     }
+
+    @Transactional(readOnly = true)
+    @Override
+    public Set<ExternalResource> getAllResources(final Any<?> any) {
+        Set<ExternalResource> resources = new HashSet<>();
+
+        if (any instanceof User) {
+            resources.addAll(userDAO.findAllResources((User) any));
+        } else if (any instanceof Group) {
+            resources.addAll(((Group) any).getResources());
+        } else if (any instanceof AnyObject) {
+            resources.addAll(anyObjectDAO.findAllResources((AnyObject) any));
+        }
+
+        return resources;
+    }
+
+    @Transactional(readOnly = true)
+    @Override
+    public <S extends Schema> Set<S> getAllowedSchemas(final Any<?> any, final Class<S> reference) {
+        Set<S> schemas = new HashSet<>();
+
+        if (any instanceof User) {
+            schemas.addAll(userDAO.findAllowedSchemas((User) any, reference));
+        } else if (any instanceof Group) {
+            schemas.addAll(groupDAO.findAllowedSchemas((Group) any, reference));
+        } else if (any instanceof AnyObject) {
+            schemas.addAll(anyObjectDAO.findAllowedSchemas((AnyObject) any, reference));
+        }
+
+        return schemas;
+    }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/eec66245/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyUtilsFactory.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyUtilsFactory.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyUtilsFactory.java
index 38e08b4..6aaf62d 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyUtilsFactory.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyUtilsFactory.java
@@ -18,7 +18,10 @@
  */
 package org.apache.syncope.core.persistence.jpa.entity;
 
+import java.util.HashMap;
+import java.util.Map;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
+import org.apache.syncope.core.misc.spring.ApplicationContextProvider;
 import org.apache.syncope.core.persistence.api.entity.Any;
 import org.apache.syncope.core.persistence.api.entity.AnyUtils;
 import org.apache.syncope.core.persistence.api.entity.AnyUtilsFactory;
@@ -30,18 +33,25 @@ import org.springframework.stereotype.Component;
 @Component
 public class JPAAnyUtilsFactory implements AnyUtilsFactory {
 
+    private final Map<AnyTypeKind, AnyUtils> instances = new HashMap<>(3);
+
     @Override
     public AnyUtils getInstance(final AnyTypeKind anyTypeKind) {
-        return new JPAAnyUtils(anyTypeKind);
-    }
+        AnyUtils instance;
+        synchronized (instances) {
+            instance = instances.get(anyTypeKind);
+            if (instance == null) {
+                instance = new JPAAnyUtils(anyTypeKind);
+                ApplicationContextProvider.getBeanFactory().autowireBean(instance);
+                instances.put(anyTypeKind, instance);
+            }
+        }
 
-    @Override
-    public AnyUtils getInstance(final String anyTypeKind) {
-        return new JPAAnyUtils(AnyTypeKind.valueOf(anyTypeKind));
+        return instance;
     }
 
     @Override
-    public AnyUtils getInstance(final Any<?, ?> any) {
+    public AnyUtils getInstance(final Any<?> any) {
         AnyTypeKind type = null;
         if (any instanceof User) {
             type = AnyTypeKind.USER;
@@ -55,7 +65,7 @@ public class JPAAnyUtilsFactory implements AnyUtilsFactory {
             throw new IllegalArgumentException("Any type not supported: " + any.getClass().getName());
         }
 
-        return new JPAAnyUtils(type);
+        return getInstance(type);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/eec66245/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAEntityFactory.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAEntityFactory.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAEntityFactory.java
index 372e062..a31392f 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAEntityFactory.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAEntityFactory.java
@@ -60,7 +60,6 @@ import org.apache.syncope.core.persistence.api.entity.conf.CPlainAttr;
 import org.apache.syncope.core.persistence.api.entity.conf.CPlainAttrUniqueValue;
 import org.apache.syncope.core.persistence.api.entity.conf.CPlainAttrValue;
 import org.apache.syncope.core.persistence.api.entity.conf.Conf;
-import org.apache.syncope.core.persistence.api.entity.group.GDerAttr;
 import org.apache.syncope.core.persistence.api.entity.group.GPlainAttr;
 import org.apache.syncope.core.persistence.api.entity.group.GPlainAttrUniqueValue;
 import org.apache.syncope.core.persistence.api.entity.group.GPlainAttrValue;
@@ -77,7 +76,6 @@ import org.apache.syncope.core.persistence.api.entity.task.SchedTask;
 import org.apache.syncope.core.persistence.api.entity.task.SyncTask;
 import org.apache.syncope.core.persistence.api.entity.task.TaskExec;
 import org.apache.syncope.core.persistence.api.entity.user.SecurityQuestion;
-import org.apache.syncope.core.persistence.api.entity.user.UDerAttr;
 import org.apache.syncope.core.persistence.api.entity.user.UDynGroupMembership;
 import org.apache.syncope.core.persistence.api.entity.user.UMembership;
 import org.apache.syncope.core.persistence.api.entity.user.UPlainAttr;
@@ -96,7 +94,6 @@ import org.apache.syncope.core.persistence.jpa.entity.conf.JPACPlainAttr;
 import org.apache.syncope.core.persistence.jpa.entity.conf.JPACPlainAttrUniqueValue;
 import org.apache.syncope.core.persistence.jpa.entity.conf.JPACPlainAttrValue;
 import org.apache.syncope.core.persistence.jpa.entity.conf.JPAConf;
-import org.apache.syncope.core.persistence.jpa.entity.group.JPAGDerAttr;
 import org.apache.syncope.core.persistence.jpa.entity.group.JPAGPlainAttr;
 import org.apache.syncope.core.persistence.jpa.entity.group.JPAGPlainAttrUniqueValue;
 import org.apache.syncope.core.persistence.jpa.entity.group.JPAGPlainAttrValue;
@@ -112,7 +109,6 @@ import org.apache.syncope.core.persistence.jpa.entity.task.JPAPushTask;
 import org.apache.syncope.core.persistence.jpa.entity.task.JPASchedTask;
 import org.apache.syncope.core.persistence.jpa.entity.task.JPASyncTask;
 import org.apache.syncope.core.persistence.jpa.entity.task.JPATaskExec;
-import org.apache.syncope.core.persistence.jpa.entity.user.JPAUDerAttr;
 import org.apache.syncope.core.persistence.jpa.entity.user.JPAUDynGroupMembership;
 import org.apache.syncope.core.persistence.jpa.entity.user.JPAUMembership;
 import org.apache.syncope.core.persistence.jpa.entity.user.JPAUPlainAttr;
@@ -194,8 +190,6 @@ public class JPAEntityFactory implements EntityFactory {
             result = (T) new JPAUPlainAttrUniqueValue();
         } else if (reference.equals(DerSchema.class)) {
             result = (T) new JPADerSchema();
-        } else if (reference.equals(UDerAttr.class)) {
-            result = (T) new JPAUDerAttr();
         } else if (reference.equals(VirSchema.class)) {
             result = (T) new JPAVirSchema();
         } else if (reference.equals(Mapping.class)) {
@@ -208,8 +202,6 @@ public class JPAEntityFactory implements EntityFactory {
             result = (T) new JPAGPlainAttrValue();
         } else if (reference.equals(GPlainAttrUniqueValue.class)) {
             result = (T) new JPAGPlainAttrUniqueValue();
-        } else if (reference.equals(GDerAttr.class)) {
-            result = (T) new JPAGDerAttr();
         } else if (reference.equals(CPlainAttr.class)) {
             result = (T) new JPACPlainAttr();
         } else if (reference.equals(CPlainAttrValue.class)) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/eec66245/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAADerAttr.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAADerAttr.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAADerAttr.java
deleted file mode 100644
index 1525de9..0000000
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAADerAttr.java
+++ /dev/null
@@ -1,59 +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.entity.anyobject;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.ManyToOne;
-import javax.persistence.Table;
-import org.apache.syncope.core.persistence.api.entity.anyobject.ADerAttr;
-import org.apache.syncope.core.persistence.api.entity.anyobject.AnyObject;
-import org.apache.syncope.core.persistence.jpa.entity.AbstractDerAttr;
-
-@Entity
-@Table(name = JPAADerAttr.TABLE)
-public class JPAADerAttr extends AbstractDerAttr<AnyObject> implements ADerAttr {
-
-    private static final long serialVersionUID = 5828533701103533330L;
-
-    public static final String TABLE = "ADerAttr";
-
-    @Id
-    private Long id;
-
-    @ManyToOne
-    private JPAAnyObject owner;
-
-    @Override
-    public Long getKey() {
-        return id;
-    }
-
-    @Override
-    public AnyObject getOwner() {
-        return owner;
-    }
-
-    @Override
-    public void setOwner(final AnyObject owner) {
-        checkType(owner, JPAAnyObject.class);
-        this.owner = (JPAAnyObject) owner;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/eec66245/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAAnyObject.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAAnyObject.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAAnyObject.java
index 9d69735..10ba2fb 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAAnyObject.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAAnyObject.java
@@ -33,12 +33,12 @@ import javax.persistence.ManyToOne;
 import javax.persistence.OneToMany;
 import javax.persistence.Table;
 import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.Predicate;
 import org.apache.syncope.core.persistence.api.entity.AnyType;
 import org.apache.syncope.core.persistence.api.entity.AnyTypeClass;
 import org.apache.syncope.core.persistence.api.entity.RelationshipType;
-import org.apache.syncope.core.persistence.api.entity.anyobject.ADerAttr;
 import org.apache.syncope.core.persistence.api.entity.anyobject.AMembership;
 import org.apache.syncope.core.persistence.api.entity.anyobject.APlainAttr;
 import org.apache.syncope.core.persistence.api.entity.anyobject.ARelationship;
@@ -51,7 +51,7 @@ import org.apache.syncope.core.persistence.jpa.entity.resource.JPAExternalResour
 @Entity
 @Table(name = JPAAnyObject.TABLE)
 @Cacheable
-public class JPAAnyObject extends AbstractAny<APlainAttr, ADerAttr> implements AnyObject {
+public class JPAAnyObject extends AbstractAny<APlainAttr> implements AnyObject {
 
     private static final long serialVersionUID = 9063766472970643492L;
 
@@ -60,6 +60,7 @@ public class JPAAnyObject extends AbstractAny<APlainAttr, ADerAttr> implements A
     @Id
     private Long id;
 
+    @NotNull
     @ManyToOne(fetch = FetchType.EAGER, optional = false)
     private JPAAnyType type;
 
@@ -67,10 +68,6 @@ public class JPAAnyObject extends AbstractAny<APlainAttr, ADerAttr> implements A
     @Valid
     private List<JPAAPlainAttr> plainAttrs = new ArrayList<>();
 
-    @OneToMany(cascade = CascadeType.ALL, mappedBy = "owner")
-    @Valid
-    private List<JPAADerAttr> derAttrs = new ArrayList<>();
-
     @ManyToMany(fetch = FetchType.EAGER)
     @JoinTable(joinColumns =
             @JoinColumn(name = "anyObject_id"),
@@ -127,23 +124,6 @@ public class JPAAnyObject extends AbstractAny<APlainAttr, ADerAttr> implements A
     }
 
     @Override
-    public boolean add(final ADerAttr attr) {
-        checkType(attr, JPAADerAttr.class);
-        return derAttrs.add((JPAADerAttr) attr);
-    }
-
-    @Override
-    public boolean remove(final ADerAttr attr) {
-        checkType(attr, JPAADerAttr.class);
-        return derAttrs.remove((JPAADerAttr) attr);
-    }
-
-    @Override
-    public List<? extends ADerAttr> getDerAttrs() {
-        return derAttrs;
-    }
-
-    @Override
     protected List<JPAExternalResource> internalGetResources() {
         return resources;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/eec66245/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/conf/JPAConf.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/conf/JPAConf.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/conf/JPAConf.java
index ac5616a..b481fb0 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/conf/JPAConf.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/conf/JPAConf.java
@@ -21,7 +21,6 @@ package org.apache.syncope.core.persistence.jpa.entity.conf;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
-import java.util.Set;
 import javax.persistence.Cacheable;
 import javax.persistence.CascadeType;
 import javax.persistence.Entity;
@@ -33,11 +32,7 @@ import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.Predicate;
 import org.apache.syncope.core.persistence.api.entity.AnyType;
 import org.apache.syncope.core.persistence.api.entity.AnyTypeClass;
-import org.apache.syncope.core.persistence.api.entity.DerAttr;
-import org.apache.syncope.core.persistence.api.entity.DerSchema;
-import org.apache.syncope.core.persistence.api.entity.PlainSchema;
 import org.apache.syncope.core.persistence.api.entity.Realm;
-import org.apache.syncope.core.persistence.api.entity.VirSchema;
 import org.apache.syncope.core.persistence.api.entity.conf.CPlainAttr;
 import org.apache.syncope.core.persistence.api.entity.conf.Conf;
 import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
@@ -99,26 +94,6 @@ public class JPAConf extends AbstractAnnotatedEntity<Long> implements Conf {
     }
 
     @Override
-    public boolean add(final DerAttr<?> attr) {
-        return false;
-    }
-
-    @Override
-    public boolean remove(final DerAttr<?> derAttr) {
-        return false;
-    }
-
-    @Override
-    public DerAttr<?> getDerAttr(final String derSchemaName) {
-        return null;
-    }
-
-    @Override
-    public List<? extends DerAttr<?>> getDerAttrs() {
-        return Collections.emptyList();
-    }
-
-    @Override
     public boolean add(final ExternalResource resource) {
         return false;
     }
@@ -192,19 +167,4 @@ public class JPAConf extends AbstractAnnotatedEntity<Long> implements Conf {
     public void setType(final AnyType type) {
         // nothing to do
     }
-
-    @Override
-    public Set<PlainSchema> getAllowedPlainSchemas() {
-        return Collections.emptySet();
-    }
-
-    @Override
-    public Set<DerSchema> getAllowedDerSchemas() {
-        return Collections.emptySet();
-    }
-
-    @Override
-    public Set<VirSchema> getAllowedVirSchemas() {
-        return Collections.emptySet();
-    }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/eec66245/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAGDerAttr.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAGDerAttr.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAGDerAttr.java
deleted file mode 100644
index 73911f8..0000000
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAGDerAttr.java
+++ /dev/null
@@ -1,59 +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.entity.group;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.ManyToOne;
-import javax.persistence.Table;
-import org.apache.syncope.core.persistence.api.entity.group.GDerAttr;
-import org.apache.syncope.core.persistence.api.entity.group.Group;
-import org.apache.syncope.core.persistence.jpa.entity.AbstractDerAttr;
-
-@Entity
-@Table(name = JPAGDerAttr.TABLE)
-public class JPAGDerAttr extends AbstractDerAttr<Group> implements GDerAttr {
-
-    private static final long serialVersionUID = 8007080005675899946L;
-
-    public static final String TABLE = "GDerAttr";
-
-    @Id
-    private Long id;
-
-    @ManyToOne
-    private JPAGroup owner;
-
-    @Override
-    public Long getKey() {
-        return id;
-    }
-
-    @Override
-    public Group getOwner() {
-        return owner;
-    }
-
-    @Override
-    public void setOwner(final Group owner) {
-        checkType(owner, JPAGroup.class);
-        this.owner = (JPAGroup) owner;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/eec66245/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAGroup.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAGroup.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAGroup.java
index 2fb84b5..d41ef3a 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAGroup.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAGroup.java
@@ -42,7 +42,6 @@ import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
 import org.apache.syncope.core.persistence.api.entity.AnyType;
 import org.apache.syncope.core.persistence.api.entity.AnyTypeClass;
 import org.apache.syncope.core.persistence.api.entity.anyobject.ADynGroupMembership;
-import org.apache.syncope.core.persistence.api.entity.group.GDerAttr;
 import org.apache.syncope.core.persistence.api.entity.group.GPlainAttr;
 import org.apache.syncope.core.persistence.api.entity.group.Group;
 import org.apache.syncope.core.persistence.api.entity.group.TypeExtension;
@@ -60,7 +59,7 @@ import org.apache.syncope.core.persistence.jpa.entity.user.JPAUser;
 @Table(name = JPAGroup.TABLE)
 @Cacheable
 @GroupCheck
-public class JPAGroup extends AbstractAny<GPlainAttr, GDerAttr> implements Group {
+public class JPAGroup extends AbstractAny<GPlainAttr> implements Group {
 
     private static final long serialVersionUID = -5281258853142421875L;
 
@@ -83,10 +82,6 @@ public class JPAGroup extends AbstractAny<GPlainAttr, GDerAttr> implements Group
     @Valid
     private List<JPAGPlainAttr> plainAttrs = new ArrayList<>();
 
-    @OneToMany(cascade = CascadeType.ALL, mappedBy = "owner")
-    @Valid
-    private List<JPAGDerAttr> derAttrs = new ArrayList<>();
-
     @ManyToMany(fetch = FetchType.EAGER)
     @JoinTable(joinColumns =
             @JoinColumn(name = "group_id"),
@@ -183,23 +178,6 @@ public class JPAGroup extends AbstractAny<GPlainAttr, GDerAttr> implements Group
     }
 
     @Override
-    public boolean add(final GDerAttr attr) {
-        checkType(attr, JPAGDerAttr.class);
-        return derAttrs.add((JPAGDerAttr) attr);
-    }
-
-    @Override
-    public boolean remove(final GDerAttr attr) {
-        checkType(attr, JPAGDerAttr.class);
-        return derAttrs.remove((JPAGDerAttr) attr);
-    }
-
-    @Override
-    public List<? extends GDerAttr> getDerAttrs() {
-        return derAttrs;
-    }
-
-    @Override
     public ADynGroupMembership getADynMembership() {
         return aDynMembership;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/eec66245/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUDerAttr.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUDerAttr.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUDerAttr.java
deleted file mode 100644
index 754fd59..0000000
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUDerAttr.java
+++ /dev/null
@@ -1,59 +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.entity.user;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.ManyToOne;
-import javax.persistence.Table;
-import org.apache.syncope.core.persistence.api.entity.user.UDerAttr;
-import org.apache.syncope.core.persistence.api.entity.user.User;
-import org.apache.syncope.core.persistence.jpa.entity.AbstractDerAttr;
-
-@Entity
-@Table(name = JPAUDerAttr.TABLE)
-public class JPAUDerAttr extends AbstractDerAttr<User> implements UDerAttr {
-
-    private static final long serialVersionUID = 4723044452807292060L;
-
-    public static final String TABLE = "UDerAttr";
-
-    @Id
-    private Long id;
-
-    @ManyToOne
-    private JPAUser owner;
-
-    @Override
-    public Long getKey() {
-        return id;
-    }
-
-    @Override
-    public User getOwner() {
-        return owner;
-    }
-
-    @Override
-    public void setOwner(final User owner) {
-        checkType(owner, JPAUser.class);
-        this.owner = (JPAUser) owner;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/eec66245/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUser.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUser.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUser.java
index 9ba4fea..26fd229 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUser.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUser.java
@@ -52,7 +52,6 @@ import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.Predicate;
 import org.apache.syncope.common.lib.types.CipherAlgorithm;
 import org.apache.syncope.core.persistence.api.entity.user.SecurityQuestion;
-import org.apache.syncope.core.persistence.api.entity.user.UDerAttr;
 import org.apache.syncope.core.persistence.api.entity.user.UPlainAttr;
 import org.apache.syncope.core.persistence.api.entity.user.User;
 import org.apache.syncope.core.persistence.jpa.entity.resource.JPAExternalResource;
@@ -74,7 +73,7 @@ import org.apache.syncope.core.persistence.jpa.entity.JPARole;
 @Entity
 @Table(name = JPAUser.TABLE)
 @Cacheable
-public class JPAUser extends AbstractAny<UPlainAttr, UDerAttr> implements User {
+public class JPAUser extends AbstractAny<UPlainAttr> implements User {
 
     private static final long serialVersionUID = -3905046855521446823L;
 
@@ -100,10 +99,6 @@ public class JPAUser extends AbstractAny<UPlainAttr, UDerAttr> implements User {
     @Valid
     private List<JPAUPlainAttr> plainAttrs = new ArrayList<>();
 
-    @OneToMany(cascade = CascadeType.ALL, mappedBy = "owner")
-    @Valid
-    private List<JPAUDerAttr> derAttrs = new ArrayList<>();
-
     private String workflowId;
 
     @Column(nullable = true)
@@ -300,23 +295,6 @@ public class JPAUser extends AbstractAny<UPlainAttr, UDerAttr> implements User {
     }
 
     @Override
-    public boolean add(final UDerAttr attr) {
-        checkType(attr, JPAUDerAttr.class);
-        return derAttrs.add((JPAUDerAttr) attr);
-    }
-
-    @Override
-    public boolean remove(final UDerAttr attr) {
-        checkType(attr, JPAUDerAttr.class);
-        return derAttrs.remove((JPAUDerAttr) attr);
-    }
-
-    @Override
-    public List<? extends UDerAttr> getDerAttrs() {
-        return derAttrs;
-    }
-
-    @Override
     public String getWorkflowId() {
         return workflowId;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/eec66245/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/validation/entity/AnyCheck.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/validation/entity/AnyCheck.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/validation/entity/AnyCheck.java
new file mode 100644
index 0000000..57a84e7
--- /dev/null
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/validation/entity/AnyCheck.java
@@ -0,0 +1,41 @@
+/*
+ * 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.validation.entity;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+
+@Target({ ElementType.TYPE })
+@Retention(RetentionPolicy.RUNTIME)
+@Constraint(validatedBy = AnyValidator.class)
+@Documented
+public @interface AnyCheck {
+
+    String message() default "{org.apache.syncope.core.persistence.validation.any}";
+
+    Class<?>[] groups() default {};
+
+    Class<? extends Payload>[] payload() default {};
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/eec66245/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/validation/entity/AnyValidator.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/validation/entity/AnyValidator.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/validation/entity/AnyValidator.java
new file mode 100644
index 0000000..fb28c4e
--- /dev/null
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/validation/entity/AnyValidator.java
@@ -0,0 +1,63 @@
+/*
+ * 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.validation.entity;
+
+import java.util.Collection;
+import javax.validation.ConstraintValidatorContext;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.Transformer;
+import org.apache.syncope.common.lib.types.EntityViolationType;
+import org.apache.syncope.core.persistence.api.entity.Any;
+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.conf.Conf;
+import org.apache.syncope.core.persistence.jpa.entity.JPAAnyUtilsFactory;
+
+@SuppressWarnings("rawtypes")
+public class AnyValidator extends AbstractValidator<AnyCheck, Any> {
+
+    @Override
+    public boolean isValid(final Any any, final ConstraintValidatorContext context) {
+        context.disableDefaultConstraintViolation();
+
+        if (!(any instanceof Conf)) {
+            Collection<String> allowedPlainSchemas = CollectionUtils.collect(new JPAAnyUtilsFactory().
+                    getInstance(any.getType().getKind()).getAllowedSchemas(any, PlainSchema.class),
+                    new Transformer<PlainSchema, String>() {
+
+                @Override
+                public String transform(final PlainSchema schema) {
+                    return schema.getKey();
+                }
+            });
+
+            for (PlainAttr<?> attr : ((Any<?>) any).getPlainAttrs()) {
+                if (attr != null && !allowedPlainSchemas.contains(attr.getSchema().getKey())) {
+                    context.buildConstraintViolationWithTemplate(
+                            getTemplate(EntityViolationType.InvalidPlainSchema,
+                                    attr.getSchema().getKey() + " not allowed for this instance")).
+                            addPropertyNode("plainAttrs").addConstraintViolation();
+                    return false;
+                }
+            }
+        }
+
+        return true;
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/eec66245/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/validation/entity/EntityValidationListener.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/validation/entity/EntityValidationListener.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/validation/entity/EntityValidationListener.java
index f1df70c..0b60c5e 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/validation/entity/EntityValidationListener.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/validation/entity/EntityValidationListener.java
@@ -28,7 +28,6 @@ import org.apache.syncope.core.persistence.api.attrvalue.validation.InvalidEntit
 import org.apache.syncope.core.misc.spring.ApplicationContextProvider;
 import org.apache.syncope.core.persistence.api.entity.AnnotatedEntity;
 import org.apache.syncope.core.persistence.api.entity.Any;
-import org.apache.syncope.core.persistence.api.entity.Attr;
 import org.apache.syncope.core.persistence.api.entity.Entity;
 import org.apache.syncope.core.persistence.api.entity.Policy;
 import org.apache.syncope.core.persistence.api.entity.Schema;
@@ -59,7 +58,6 @@ public class EntityValidationListener {
                 if (!Entity.class.equals(interf)
                         && !AnnotatedEntity.class.equals(interf)
                         && !Schema.class.equals(interf)
-                        && !Attr.class.equals(interf)
                         && !Task.class.equals(interf)
                         && !Policy.class.equals(interf)
                         && !Any.class.equals(interf)

http://git-wip-us.apache.org/repos/asf/syncope/blob/eec66245/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/validation/entity/ExternalResourceValidator.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/validation/entity/ExternalResourceValidator.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/validation/entity/ExternalResourceValidator.java
index e7f3a85..d328eac 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/validation/entity/ExternalResourceValidator.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/validation/entity/ExternalResourceValidator.java
@@ -66,6 +66,20 @@ public class ExternalResourceValidator extends AbstractValidator<ExternalResourc
             return false;
         }
 
+        if (item.getIntMappingType() == IntMappingType.AnyObjectDerivedSchema
+                || item.getIntMappingType() == IntMappingType.GroupDerivedSchema
+                || item.getIntMappingType() == IntMappingType.UserDerivedSchema) {
+
+            if (item.getPurpose() != MappingPurpose.PROPAGATION) {
+                context.buildConstraintViolationWithTemplate(
+                        getTemplate(EntityViolationType.InvalidMapping,
+                                " - only " + MappingPurpose.PROPAGATION.name() + " allowed for derived")).
+                        addPropertyNode("purpose").addConstraintViolation();
+
+                return false;
+            }
+        }
+
         if (item.getIntMappingType() == IntMappingType.AnyObjectVirtualSchema
                 || item.getIntMappingType() == IntMappingType.GroupVirtualSchema
                 || item.getIntMappingType() == IntMappingType.UserVirtualSchema) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/eec66245/core/persistence-jpa/src/main/resources/META-INF/spring-orm-oracle.xml
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/resources/META-INF/spring-orm-oracle.xml b/core/persistence-jpa/src/main/resources/META-INF/spring-orm-oracle.xml
index 5ddee8c..15ff3aa 100644
--- a/core/persistence-jpa/src/main/resources/META-INF/spring-orm-oracle.xml
+++ b/core/persistence-jpa/src/main/resources/META-INF/spring-orm-oracle.xml
@@ -312,31 +312,6 @@ under the License.
     </attributes>
   </entity>
 
-  <entity class="org.apache.syncope.core.persistence.jpa.entity.anyobject.JPAADerAttr">
-    <attributes>
-      <id name="id">
-        <generated-value generator="SEQ_ADerAttr" strategy="TABLE"/>
-        <table-generator name="SEQ_ADerAttr" pk-column-value="SEQ_ADerAttr" initial-value="1000"/>
-      </id>
-    </attributes>
-  </entity>
-  <entity class="org.apache.syncope.core.persistence.jpa.entity.user.JPAUDerAttr">
-    <attributes>
-      <id name="id">
-        <generated-value generator="SEQ_UDerAttr" strategy="TABLE"/>
-        <table-generator name="SEQ_UDerAttr" pk-column-value="SEQ_UDerAttr" initial-value="1000"/>
-      </id>
-    </attributes>
-  </entity>
-  <entity class="org.apache.syncope.core.persistence.jpa.entity.group.JPAGDerAttr">
-    <attributes>
-      <id name="id">
-        <generated-value generator="SEQ_GDerAttr" strategy="TABLE"/>
-        <table-generator name="SEQ_GDerAttr" pk-column-value="SEQ_GDerAttr" initial-value="1000"/>
-      </id>
-    </attributes>
-  </entity>
-
   <entity class="org.apache.syncope.core.persistence.jpa.entity.JPAAnyTemplateRealm">
     <attributes>
       <id name="id">

http://git-wip-us.apache.org/repos/asf/syncope/blob/eec66245/core/persistence-jpa/src/main/resources/META-INF/spring-orm-sqlserver.xml
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/resources/META-INF/spring-orm-sqlserver.xml b/core/persistence-jpa/src/main/resources/META-INF/spring-orm-sqlserver.xml
index 5ddee8c..15ff3aa 100644
--- a/core/persistence-jpa/src/main/resources/META-INF/spring-orm-sqlserver.xml
+++ b/core/persistence-jpa/src/main/resources/META-INF/spring-orm-sqlserver.xml
@@ -312,31 +312,6 @@ under the License.
     </attributes>
   </entity>
 
-  <entity class="org.apache.syncope.core.persistence.jpa.entity.anyobject.JPAADerAttr">
-    <attributes>
-      <id name="id">
-        <generated-value generator="SEQ_ADerAttr" strategy="TABLE"/>
-        <table-generator name="SEQ_ADerAttr" pk-column-value="SEQ_ADerAttr" initial-value="1000"/>
-      </id>
-    </attributes>
-  </entity>
-  <entity class="org.apache.syncope.core.persistence.jpa.entity.user.JPAUDerAttr">
-    <attributes>
-      <id name="id">
-        <generated-value generator="SEQ_UDerAttr" strategy="TABLE"/>
-        <table-generator name="SEQ_UDerAttr" pk-column-value="SEQ_UDerAttr" initial-value="1000"/>
-      </id>
-    </attributes>
-  </entity>
-  <entity class="org.apache.syncope.core.persistence.jpa.entity.group.JPAGDerAttr">
-    <attributes>
-      <id name="id">
-        <generated-value generator="SEQ_GDerAttr" strategy="TABLE"/>
-        <table-generator name="SEQ_GDerAttr" pk-column-value="SEQ_GDerAttr" initial-value="1000"/>
-      </id>
-    </attributes>
-  </entity>
-
   <entity class="org.apache.syncope.core.persistence.jpa.entity.JPAAnyTemplateRealm">
     <attributes>
       <id name="id">

http://git-wip-us.apache.org/repos/asf/syncope/blob/eec66245/core/persistence-jpa/src/main/resources/META-INF/spring-orm.xml
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/resources/META-INF/spring-orm.xml b/core/persistence-jpa/src/main/resources/META-INF/spring-orm.xml
index f4f2b07..aeb24ee 100644
--- a/core/persistence-jpa/src/main/resources/META-INF/spring-orm.xml
+++ b/core/persistence-jpa/src/main/resources/META-INF/spring-orm.xml
@@ -359,31 +359,6 @@ under the License.
       </id>
     </attributes>
   </entity>
-
-  <entity class="org.apache.syncope.core.persistence.jpa.entity.anyobject.JPAADerAttr">
-    <attributes>
-      <id name="id">
-        <generated-value generator="SEQ_ADerAttr" strategy="TABLE"/>
-        <table-generator name="SEQ_ADerAttr" pk-column-value="SEQ_ADerAttr" initial-value="1000"/>
-      </id>
-    </attributes>
-  </entity>
-  <entity class="org.apache.syncope.core.persistence.jpa.entity.user.JPAUDerAttr">
-    <attributes>
-      <id name="id">
-        <generated-value generator="SEQ_UDerAttr" strategy="TABLE"/>
-        <table-generator name="SEQ_UDerAttr" pk-column-value="SEQ_UDerAttr" initial-value="1000"/>
-      </id>
-    </attributes>
-  </entity>
-  <entity class="org.apache.syncope.core.persistence.jpa.entity.group.JPAGDerAttr">
-    <attributes>
-      <id name="id">
-        <generated-value generator="SEQ_GDerAttr" strategy="TABLE"/>
-        <table-generator name="SEQ_GDerAttr" pk-column-value="SEQ_GDerAttr" initial-value="1000"/>
-      </id>
-    </attributes>
-  </entity>
   
   <entity class="org.apache.syncope.core.persistence.jpa.entity.JPAAnyTemplateRealm">
     <attributes>

http://git-wip-us.apache.org/repos/asf/syncope/blob/eec66245/core/persistence-jpa/src/main/resources/indexes.xml
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/resources/indexes.xml b/core/persistence-jpa/src/main/resources/indexes.xml
index a2d4c62..3807b35 100644
--- a/core/persistence-jpa/src/main/resources/indexes.xml
+++ b/core/persistence-jpa/src/main/resources/indexes.xml
@@ -64,9 +64,5 @@ under the License.
   <entry key="GPlainAttr_owner_id_index">CREATE INDEX GPlainAttr_owner_id_index on GPlainAttr(owner_id)</entry>
   <entry key="APlainAttr_owner_id_index">CREATE INDEX APlainAttr_owner_id_index on APlainAttr(owner_id)</entry>
 
-  <entry key="UDerAttr_owner_id_index">CREATE INDEX UDerAttr_owner_id_index on UDerAttr(owner_id)</entry>
-  <entry key="GDerAttr_owner_id_index">CREATE INDEX GDerAttr_owner_id_index on GDerAttr(owner_id)</entry>
-  <entry key="ADerAttr_owner_id_index">CREATE INDEX ADerAttr_owner_id_index on ADerAttr(owner_id)</entry>
-
   <entry key="Task_executedIndex">CREATE INDEX Task_executedIndex ON Task(executed)</entry>
 </properties>

http://git-wip-us.apache.org/repos/asf/syncope/blob/eec66245/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ConfTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ConfTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ConfTest.java
index 38332b6..c361614 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ConfTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ConfTest.java
@@ -83,6 +83,7 @@ public class ConfTest extends AbstractTest {
 
         // 2. create conf
         CPlainAttr newConf = entityFactory.newEntity(CPlainAttr.class);
+        newConf.setOwner(confDAO.get());
         newConf.setSchema(useless);
         add(newConf, "2014-06-20");
         confDAO.save(newConf);

http://git-wip-us.apache.org/repos/asf/syncope/blob/eec66245/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/DerAttrTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/DerAttrTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/DerAttrTest.java
deleted file mode 100644
index 3fb15b7..0000000
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/DerAttrTest.java
+++ /dev/null
@@ -1,220 +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.inner;
-
-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.List;
-import org.apache.syncope.core.persistence.api.dao.AnyTypeClassDAO;
-import org.apache.syncope.core.persistence.api.dao.DerAttrDAO;
-import org.apache.syncope.core.persistence.api.dao.DerSchemaDAO;
-import org.apache.syncope.core.persistence.api.dao.GroupDAO;
-import org.apache.syncope.core.persistence.api.dao.UserDAO;
-import org.apache.syncope.core.persistence.api.entity.AnyTypeClass;
-import org.apache.syncope.core.persistence.api.entity.DerSchema;
-import org.apache.syncope.core.persistence.api.entity.group.GDerAttr;
-import org.apache.syncope.core.persistence.api.entity.group.GPlainAttrValue;
-import org.apache.syncope.core.persistence.api.entity.group.Group;
-import org.apache.syncope.core.persistence.api.entity.user.UDerAttr;
-import org.apache.syncope.core.persistence.api.entity.user.UPlainAttrValue;
-import org.apache.syncope.core.persistence.api.entity.user.User;
-import org.apache.syncope.core.persistence.jpa.AbstractTest;
-import org.junit.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.transaction.annotation.Transactional;
-
-@Transactional("Master")
-public class DerAttrTest extends AbstractTest {
-
-    @Autowired
-    private DerAttrDAO derAttrDAO;
-
-    @Autowired
-    private UserDAO userDAO;
-
-    @Autowired
-    private GroupDAO groupDAO;
-
-    @Autowired
-    private DerSchemaDAO derSchemaDAO;
-
-    @Autowired
-    private AnyTypeClassDAO anyTypeClassDAO;
-
-    @Test
-    public void findAll() {
-        List<UDerAttr> list = derAttrDAO.findAll(UDerAttr.class);
-        assertEquals("did not get expected number of derived attributes ", 2, list.size());
-    }
-
-    @Test
-    public void findById() {
-        UDerAttr attribute = derAttrDAO.find(100L, UDerAttr.class);
-        assertNotNull("did not find expected attribute schema", attribute);
-    }
-
-    @Test
-    public void saveUDerAttribute() {
-        DerSchema cnSchema = derSchemaDAO.find("cn");
-        assertNotNull(cnSchema);
-
-        User owner = userDAO.find(3L);
-        assertNotNull("did not get expected user", owner);
-
-        UDerAttr derAttr = entityFactory.newEntity(UDerAttr.class);
-        derAttr.setOwner(owner);
-        derAttr.setSchema(cnSchema);
-
-        derAttr = derAttrDAO.save(derAttr);
-
-        UDerAttr actual = derAttrDAO.find(derAttr.getKey(), UDerAttr.class);
-        assertNotNull("expected save to work", actual);
-        assertEquals(derAttr, actual);
-
-        UPlainAttrValue firstname = owner.getPlainAttr("firstname").getValues().iterator().next();
-        UPlainAttrValue surname = owner.getPlainAttr("surname").getValues().iterator().next();
-
-        assertEquals(surname.getValue() + ", " + firstname.getValue(), derAttr.getValue(owner.getPlainAttrs()));
-    }
-
-    @Test
-    public void saveGDerAttribute() {
-        DerSchema schema = derSchemaDAO.find("rderiveddata");
-        assertNotNull(schema);
-
-        Group owner = groupDAO.find(1L);
-        assertNotNull("did not get expected user", owner);
-
-        GDerAttr derAttr = entityFactory.newEntity(GDerAttr.class);
-        derAttr.setOwner(owner);
-        derAttr.setSchema(schema);
-
-        derAttr = derAttrDAO.save(derAttr);
-
-        GDerAttr actual = derAttrDAO.find(derAttr.getKey(), GDerAttr.class);
-        assertNotNull("expected save to work", actual);
-        assertEquals(derAttr, actual);
-
-        GPlainAttrValue sx = owner.getPlainAttr("rderived_sx").getValues().iterator().next();
-        GPlainAttrValue dx = owner.getPlainAttr("rderived_dx").getValues().iterator().next();
-
-        assertEquals(sx.getValue() + "-" + dx.getValue(), derAttr.getValue(owner.getPlainAttrs()));
-    }
-
-    @Test
-    public void delete() {
-        UDerAttr attribute = derAttrDAO.find(100L, UDerAttr.class);
-        String schemaName = attribute.getSchema().getKey();
-
-        derAttrDAO.delete(attribute.getKey(), UDerAttr.class);
-
-        UDerAttr actual = derAttrDAO.find(100L, UDerAttr.class);
-        assertNull("delete did not work", actual);
-
-        DerSchema attributeSchema = derSchemaDAO.find(schemaName);
-        assertNotNull("user derived attribute schema deleted when deleting values", attributeSchema);
-    }
-
-    @Test
-    public void issueSYNCOPE134User() {
-        AnyTypeClass other = anyTypeClassDAO.find("other");
-
-        DerSchema sderived = entityFactory.newEntity(DerSchema.class);
-        sderived.setKey("sderived");
-        sderived.setExpression("status + ' - ' + username + ' - ' + creationDate + '[' + failedLogins + ']'");
-
-        sderived = derSchemaDAO.save(sderived);
-
-        derSchemaDAO.flush();
-
-        other.add(sderived);
-        sderived.setAnyTypeClass(other);
-
-        derSchemaDAO.flush();
-
-        sderived = derSchemaDAO.find("sderived");
-        assertNotNull("expected save to work", sderived);
-        assertEquals(other, sderived.getAnyTypeClass());
-
-        User owner = userDAO.find(3L);
-        assertNotNull("did not get expected user", owner);
-        owner.add(other);
-
-        UDerAttr derAttr = entityFactory.newEntity(UDerAttr.class);
-        derAttr.setOwner(owner);
-        derAttr.setSchema(sderived);
-
-        derAttr = derAttrDAO.save(derAttr);
-        derAttrDAO.flush();
-
-        derAttr = derAttrDAO.find(derAttr.getKey(), UDerAttr.class);
-        assertNotNull("expected save to work", derAttr);
-
-        String value = derAttr.getValue(owner.getPlainAttrs());
-        assertNotNull(value);
-        assertFalse(value.isEmpty());
-        assertTrue(value.startsWith("active - vivaldi - 2010-10-20"));
-        assertTrue(value.endsWith("[0]"));
-    }
-
-    @Test
-    public void issueSYNCOPE134Group() {
-        AnyTypeClass genericMembership = anyTypeClassDAO.find("generic membership");
-
-        DerSchema sderived = entityFactory.newEntity(DerSchema.class);
-        sderived.setKey("sderived");
-        sderived.setExpression("name");
-
-        sderived = derSchemaDAO.save(sderived);
-
-        derSchemaDAO.flush();
-
-        genericMembership.add(sderived);
-        sderived.setAnyTypeClass(genericMembership);
-
-        derSchemaDAO.flush();
-
-        sderived = derSchemaDAO.find("sderived");
-        assertNotNull("expected save to work", sderived);
-        assertEquals(genericMembership, sderived.getAnyTypeClass());
-
-        Group owner = groupDAO.find(7L);
-        assertNotNull("did not get expected group", owner);
-        owner.add(genericMembership);
-
-        GDerAttr derAttr = entityFactory.newEntity(GDerAttr.class);
-        derAttr.setOwner(owner);
-        derAttr.setSchema(sderived);
-
-        derAttr = derAttrDAO.save(derAttr);
-        derAttrDAO.flush();
-
-        derAttr = derAttrDAO.find(derAttr.getKey(), GDerAttr.class);
-        assertNotNull("expected save to work", derAttr);
-
-        String value = derAttr.getValue(owner.getPlainAttrs());
-        assertNotNull(value);
-        assertFalse(value.isEmpty());
-        assertTrue(value.startsWith("managingDirector"));
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/eec66245/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/DerSchemaTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/DerSchemaTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/DerSchemaTest.java
index abe3de3..7907381 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/DerSchemaTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/DerSchemaTest.java
@@ -43,7 +43,7 @@ public class DerSchemaTest extends AbstractTest {
     @Test
     public void findAll() {
         List<DerSchema> list = derSchemaDAO.findAll();
-        assertEquals(9, list.size());
+        assertEquals(10, list.size());
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/syncope/blob/eec66245/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ResourceTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ResourceTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ResourceTest.java
index be37d88..3cc3efa 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ResourceTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ResourceTest.java
@@ -338,7 +338,7 @@ public class ResourceTest extends AbstractTest {
         item.setIntAttrName("mderiveddata");
         item.setExtAttrName("mderiveddata");
         item.setIntMappingType(IntMappingType.AnyObjectDerivedSchema);
-        item.setPurpose(MappingPurpose.BOTH);
+        item.setPurpose(MappingPurpose.PROPAGATION);
         mapping.add(item);
 
         // save the resource

http://git-wip-us.apache.org/repos/asf/syncope/blob/eec66245/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/DerSchemaTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/DerSchemaTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/DerSchemaTest.java
deleted file mode 100644
index f4529f8..0000000
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/DerSchemaTest.java
+++ /dev/null
@@ -1,57 +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.outer;
-
-import static org.junit.Assert.assertNull;
-
-import org.apache.syncope.core.persistence.api.dao.DerAttrDAO;
-import org.apache.syncope.core.persistence.api.dao.DerSchemaDAO;
-import org.apache.syncope.core.persistence.api.dao.UserDAO;
-import org.apache.syncope.core.persistence.api.entity.DerSchema;
-import org.apache.syncope.core.persistence.api.entity.user.UDerAttr;
-import org.apache.syncope.core.persistence.jpa.AbstractTest;
-import org.junit.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.transaction.annotation.Transactional;
-
-@Transactional("Master")
-public class DerSchemaTest extends AbstractTest {
-
-    @Autowired
-    private UserDAO userDAO;
-
-    @Autowired
-    private DerSchemaDAO derSchemaDAO;
-
-    @Autowired
-    private DerAttrDAO derAttrDAO;
-
-    @Test
-    public void test() {
-        DerSchema schema = derSchemaDAO.find("cn");
-
-        derSchemaDAO.delete(schema.getKey());
-
-        derSchemaDAO.flush();
-
-        assertNull(derSchemaDAO.find(schema.getKey()));
-        assertNull(derAttrDAO.find(100L, UDerAttr.class));
-        assertNull(userDAO.find(3L).getDerAttr(schema.getKey()));
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/eec66245/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/PlainAttrTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/PlainAttrTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/PlainAttrTest.java
index 82147a2..331c4ca 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/PlainAttrTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/PlainAttrTest.java
@@ -19,29 +19,12 @@
 package org.apache.syncope.core.persistence.jpa.outer;
 
 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 org.apache.syncope.common.lib.SyncopeConstants;
-import org.apache.syncope.common.lib.types.AnyTypeKind;
-import org.apache.syncope.common.lib.types.AttrSchemaType;
-import org.apache.syncope.common.lib.types.CipherAlgorithm;
-import org.apache.syncope.core.persistence.api.dao.AnyTypeClassDAO;
-import org.apache.syncope.core.persistence.api.dao.DerAttrDAO;
-import org.apache.syncope.core.persistence.api.dao.DerSchemaDAO;
 import org.apache.syncope.core.persistence.api.dao.PlainAttrDAO;
 import org.apache.syncope.core.persistence.api.dao.PlainAttrValueDAO;
-import org.apache.syncope.core.persistence.api.dao.PlainSchemaDAO;
-import org.apache.syncope.core.persistence.api.dao.UserDAO;
-import org.apache.syncope.core.persistence.api.entity.AnyTypeClass;
-import org.apache.syncope.core.persistence.api.entity.DerSchema;
-import org.apache.syncope.core.persistence.api.entity.PlainSchema;
-import org.apache.syncope.core.persistence.api.entity.user.UDerAttr;
 import org.apache.syncope.core.persistence.api.entity.user.UPlainAttr;
 import org.apache.syncope.core.persistence.api.entity.user.UPlainAttrValue;
-import org.apache.syncope.core.persistence.api.entity.user.User;
 import org.apache.syncope.core.persistence.jpa.AbstractTest;
 import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -54,23 +37,8 @@ public class PlainAttrTest extends AbstractTest {
     private PlainAttrDAO plainAttrDAO;
 
     @Autowired
-    private DerAttrDAO derAttrDAO;
-
-    @Autowired
     private PlainAttrValueDAO plainAttrValueDAO;
 
-    @Autowired
-    private PlainSchemaDAO plainSchemaDAO;
-
-    @Autowired
-    private DerSchemaDAO derSchemaDAO;
-
-    @Autowired
-    private UserDAO userDAO;
-
-    @Autowired
-    private AnyTypeClassDAO anyTypeClassDAO;
-
     @Test
     public void deleteAttribute() {
         plainAttrDAO.delete(117L, UPlainAttr.class);
@@ -95,85 +63,4 @@ public class PlainAttrTest extends AbstractTest {
         UPlainAttr attribute = plainAttrDAO.find(104L, UPlainAttr.class);
         assertEquals(attribute.getValues().size(), attributeValueNumber - 1);
     }
-
-    @Test
-    public void checkForEnumType() {
-        User user = userDAO.find(1L);
-        user.setPassword("password123", CipherAlgorithm.SHA);
-        assertNotNull(user);
-
-        AnyTypeClass other = anyTypeClassDAO.find("other");
-
-        PlainSchema color = entityFactory.newEntity(PlainSchema.class);
-        color.setType(AttrSchemaType.Enum);
-        color.setKey("color");
-        color.setEnumerationValues("red" + SyncopeConstants.ENUM_VALUES_SEPARATOR + "yellow");
-
-        color = plainSchemaDAO.save(color);
-
-        other.add(color);
-        color.setAnyTypeClass(other);
-
-        plainSchemaDAO.flush();
-
-        color = plainSchemaDAO.find("color");
-        assertNotNull("expected save to work", color);
-        assertEquals(other, color.getAnyTypeClass());
-
-        UPlainAttr attr = entityFactory.newEntity(UPlainAttr.class);
-        attr.setOwner(user);
-        attr.setSchema(color);
-        attr.add("yellow", anyUtilsFactory.getInstance(AnyTypeKind.USER));
-        user.add(attr);
-
-        userDAO.save(user);
-        userDAO.flush();
-
-        user = userDAO.find(1L);
-        assertNotNull(user);
-        assertNotNull(user.getPlainAttr(color.getKey()));
-        assertNotNull(user.getPlainAttr(color.getKey()).getValues());
-        assertEquals(user.getPlainAttr(color.getKey()).getValues().size(), 1);
-    }
-
-    @Test
-    public void derAttrFromSpecialAttrs() {
-        AnyTypeClass other = anyTypeClassDAO.find("other");
-
-        DerSchema sderived = entityFactory.newEntity(DerSchema.class);
-        sderived.setKey("sderived");
-        sderived.setExpression("username + ' - ' + creationDate + '[' + failedLogins + ']'");
-
-        sderived = derSchemaDAO.save(sderived);
-
-        derSchemaDAO.flush();
-
-        other.add(sderived);
-        sderived.setAnyTypeClass(other);
-
-        derSchemaDAO.flush();
-
-        sderived = derSchemaDAO.find("sderived");
-        assertNotNull("expected save to work", sderived);
-        assertEquals(other, sderived.getAnyTypeClass());
-
-        User owner = userDAO.find(3L);
-        assertNotNull("did not get expected user", owner);
-
-        UDerAttr derAttr = entityFactory.newEntity(UDerAttr.class);
-        derAttr.setOwner(owner);
-        derAttr.setSchema(sderived);
-
-        derAttr = derAttrDAO.save(derAttr);
-        derAttrDAO.flush();
-
-        derAttr = derAttrDAO.find(derAttr.getKey(), UDerAttr.class);
-        assertNotNull("expected save to work", derAttr);
-
-        String value = derAttr.getValue(owner.getPlainAttrs());
-        assertNotNull(value);
-        assertFalse(value.isEmpty());
-        assertTrue(value.startsWith("vivaldi - 2010-10-20"));
-        assertTrue(value.endsWith("[0]"));
-    }
 }


Mime
View raw message