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 2016/03/28 11:58:36 UTC

[1/3] syncope git commit: Upgrading Camel and CXF

Repository: syncope
Updated Branches:
  refs/heads/master 91c5103dc -> 9f1a67440


Upgrading Camel and CXF


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

Branch: refs/heads/master
Commit: b2e07eb707c36366876910fb97ca43c0d94b601e
Parents: 91c5103
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Sun Mar 27 17:48:57 2016 +0200
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Sun Mar 27 17:48:57 2016 +0200

----------------------------------------------------------------------
 .../persistence-jpa/src/test/resources/domains/MasterContent.xml | 4 ++--
 pom.xml                                                          | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/b2e07eb7/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/resources/domains/MasterContent.xml b/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
index 9a9696f..44e82b8 100644
--- a/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
+++ b/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
@@ -106,7 +106,7 @@ under the License.
   
   <!-- sample policies -->
   <PullPolicy id="1" description="a pull policy" type="PULL" 
-              specification='{"conflictResolutionAction":"IGNORE"'/>
+              specification='{"conflictResolutionAction":"IGNORE"}'/>
   <PasswordPolicy id="2" description="a password policy" type="PASSWORD" 
                   historyLength="1" allowNullPassword="1"/> 
   <PasswordRuleConfInstance id="2" passwordPolicy_id="2"
@@ -1014,7 +1014,7 @@ under the License.
                        template='{"@class":"org.apache.syncope.common.lib.to.UserTO","creator":null,"creationDate":null,"lastModifier":null,"lastChangeDate":null,"key":0,"type":"USER","realm":null,"status":null,"password":null,"token":null,"tokenExpireTime":null,"username":null,"lastLoginDate":null,"changePwdDate":null,"failedLogins":null,"securityQuestion":null,"securityAnswer":null,"auxClasses":[],"derAttrs":[],"virAttrs":[{"schema":"virtualReadOnly","readonly":true,"values":[""]}],"resources":["resource-ldap"],"roles":[],"dynRoles":[],"relationships":[],"memberships":[],"dynGroups":[],"plainAttrs":[]}'/>
   <AnyTemplatePullTask id="2" pullTask_id="11" anyType_name="GROUP"
                        template='{"@class":"org.apache.syncope.common.lib.to.GroupTO","creator":null,"creationDate":null,"lastModifier":null,"lastChangeDate":null,"key":0,"type":"GROUP","realm":null,"status":null,"name":null,"userOwner":null,"groupOwner":null,"udynMembershipCond":null,"auxClasses":[],"derAttrs":[],"virAttrs":[],"resources":[],"plainAttrs":[{"schema":"show","readonly":false,"values":["true"]}]}'/>
-  <PullTask_actionsClassNames PullTask_id="11" actionClassName="org.apache.syncope.core.provisioning.java.pushpull.LDAPMembershipPullActions"/>
+  <PullTask_actionsClassNames pullTask_id="11" actionClassName="org.apache.syncope.core.provisioning.java.pushpull.LDAPMembershipPullActions"/>
   <Task DTYPE="PullTask" type="PULL" id="12" name="VirAttrCache test" resource_name="resource-csv"
         destinationRealm_id="1" performCreate="0" performUpdate="1" performDelete="0" pullStatus="0" pullMode="FULL_RECONCILIATION"
         unmatchingRule="PROVISION" matchingRule="UPDATE" active="1"/>

http://git-wip-us.apache.org/repos/asf/syncope/blob/b2e07eb7/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 69b2110..7ee16c3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -327,9 +327,9 @@ under the License.
     <connid.ldap.version>1.5.0</connid.ldap.version>
     <connid.ad.version>1.3.0</connid.ad.version>
 
-    <cxf.version>3.1.5</cxf.version>
+    <cxf.version>3.1.6</cxf.version>
 
-    <camel.version>2.16.2</camel.version>	
+    <camel.version>2.17.0</camel.version>	
 
     <jackson.version>2.7.3</jackson.version>
 


[3/3] syncope git commit: Internal JPA refactoring: removing Task#getType

Posted by il...@apache.org.
Internal JPA refactoring: removing Task#getType


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

Branch: refs/heads/master
Commit: 9f1a674403871ae36b6c90ecf2531fac68e2f4ca
Parents: 31fea77
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Mon Mar 28 11:58:24 2016 +0200
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Mon Mar 28 11:58:24 2016 +0200

----------------------------------------------------------------------
 .../core/persistence/api/entity/task/Task.java  |  3 --
 .../core/persistence/jpa/dao/JPATaskDAO.java    | 22 +++++---
 .../entity/task/AbstractProvisioningTask.java   | 13 ++---
 .../jpa/entity/task/AbstractTask.java           | 13 -----
 .../jpa/entity/task/JPANotificationTask.java    |  2 -
 .../jpa/entity/task/JPAPropagationTask.java     |  6 ---
 .../jpa/entity/task/JPAPullTask.java            |  8 ---
 .../jpa/entity/task/JPAPushTask.java            |  8 ---
 .../jpa/entity/task/JPASchedTask.java           |  6 ---
 .../test/resources/domains/MasterContent.xml    | 56 ++++++++++----------
 10 files changed, 47 insertions(+), 90 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/9f1a6744/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/task/Task.java
----------------------------------------------------------------------
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/task/Task.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/task/Task.java
index 7d2c9f6..630daa9 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/task/Task.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/task/Task.java
@@ -19,13 +19,10 @@
 package org.apache.syncope.core.persistence.api.entity.task;
 
 import java.util.List;
-import org.apache.syncope.common.lib.types.TaskType;
 import org.apache.syncope.core.persistence.api.entity.Entity;
 
 public interface Task extends Entity<Long> {
 
-    TaskType getType();
-
     boolean add(TaskExec exec);
 
     List<? extends TaskExec> getExecs();

http://git-wip-us.apache.org/repos/asf/syncope/blob/9f1a6744/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPATaskDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPATaskDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPATaskDAO.java
index c9ef66a..3a16b8e 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPATaskDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPATaskDAO.java
@@ -23,6 +23,7 @@ import java.util.List;
 import javax.persistence.Query;
 import org.apache.commons.collections4.Closure;
 import org.apache.commons.collections4.IterableUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.TaskType;
 import org.apache.syncope.core.persistence.api.dao.TaskDAO;
@@ -81,9 +82,18 @@ public class JPATaskDAO extends AbstractDAO<Task, Long> implements TaskDAO {
     }
 
     private <T extends Task> StringBuilder buildFindAllQuery(final TaskType type) {
-        return new StringBuilder("SELECT t FROM ").
+        StringBuilder builder = new StringBuilder("SELECT t FROM ").
                 append(getEntityReference(type).getSimpleName()).
-                append(" t WHERE t.type=:type ");
+                append(" t WHERE ");
+        if (type == TaskType.SCHEDULED) {
+            builder.append("t.id NOT IN (SELECT t.id FROM ").append(JPAPushTask.class.getSimpleName()).append(" t) ").
+                    append("AND ").
+                    append("t.id NOT IN (SELECT t.id FROM ").append(JPAPullTask.class.getSimpleName()).append(" t)");
+        } else {
+            builder.append("1=1");
+        }
+
+        return builder.append(' ');
     }
 
     @Override
@@ -99,7 +109,6 @@ public class JPATaskDAO extends AbstractDAO<Task, Long> implements TaskDAO {
         queryString.append("ORDER BY t.id DESC");
 
         Query query = entityManager().createQuery(queryString.toString());
-        query.setParameter("type", type);
         return query.getResultList();
     }
 
@@ -172,7 +181,6 @@ public class JPATaskDAO extends AbstractDAO<Task, Long> implements TaskDAO {
                 append(toOrderByStatement(getEntityReference(type), orderByClauses));
 
         Query query = entityManager().createQuery(queryString.toString());
-        query.setParameter("type", type);
         if (resource != null) {
             query.setParameter("resource", resource);
         }
@@ -201,10 +209,8 @@ public class JPATaskDAO extends AbstractDAO<Task, Long> implements TaskDAO {
 
         StringBuilder queryString = buildFindAllQuery(type, resource, anyTypeKind, anyTypeKey);
 
-        Query query = entityManager().createQuery(queryString.toString().replace(
-                "SELECT t",
-                "SELECT COUNT(t)"));
-        query.setParameter("type", type);
+        Query query = entityManager().createQuery(StringUtils.replaceOnce(
+                queryString.toString(), "SELECT t", "SELECT COUNT(t)"));
         if (resource != null) {
             query.setParameter("resource", resource);
         }

http://git-wip-us.apache.org/repos/asf/syncope/blob/9f1a6744/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/AbstractProvisioningTask.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/AbstractProvisioningTask.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/AbstractProvisioningTask.java
index b2e2b61..53bc673 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/AbstractProvisioningTask.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/AbstractProvisioningTask.java
@@ -27,7 +27,6 @@ import javax.validation.constraints.Max;
 import javax.validation.constraints.Min;
 import javax.validation.constraints.NotNull;
 import org.apache.syncope.common.lib.types.MatchingRule;
-import org.apache.syncope.common.lib.types.TaskType;
 import org.apache.syncope.common.lib.types.UnmatchingRule;
 import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
 import org.apache.syncope.core.persistence.api.entity.task.ProvisioningTask;
@@ -80,16 +79,14 @@ public abstract class AbstractProvisioningTask extends JPASchedTask implements P
     @Enumerated(EnumType.STRING)
     protected MatchingRule matchingRule;
 
-    public AbstractProvisioningTask(final TaskType type, final String jobDelegateClassName) {
-        super();
-
-        this.type = type;
-        super.setJobDelegateClassName(jobDelegateClassName);
+    @Override
+    public String getJobDelegateClassName() {
+        return null;
     }
 
     @Override
-    public void setJobDelegateClassName(final String jobClassName) {
-        // fixed to PullJob, cannot be changed
+    public void setJobDelegateClassName(final String jobDelegateClassName) {
+        // fixed, cannot be changed
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/9f1a6744/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/AbstractTask.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/AbstractTask.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/AbstractTask.java
index 4d67941..403ee77 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/AbstractTask.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/AbstractTask.java
@@ -24,15 +24,11 @@ import java.util.List;
 import javax.persistence.CascadeType;
 import javax.persistence.DiscriminatorColumn;
 import javax.persistence.Entity;
-import javax.persistence.EnumType;
-import javax.persistence.Enumerated;
 import javax.persistence.Id;
 import javax.persistence.Inheritance;
 import javax.persistence.InheritanceType;
 import javax.persistence.OneToMany;
 import javax.persistence.Table;
-import javax.validation.constraints.NotNull;
-import org.apache.syncope.common.lib.types.TaskType;
 import org.apache.syncope.core.persistence.api.entity.task.Task;
 import org.apache.syncope.core.persistence.api.entity.task.TaskExec;
 import org.apache.syncope.core.persistence.jpa.entity.AbstractEntity;
@@ -50,10 +46,6 @@ public abstract class AbstractTask extends AbstractEntity<Long> implements Task
     @Id
     private Long id;
 
-    @NotNull
-    @Enumerated(EnumType.STRING)
-    protected TaskType type;
-
     @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "task")
     private List<JPATaskExec> executions = new ArrayList<>();
 
@@ -63,11 +55,6 @@ public abstract class AbstractTask extends AbstractEntity<Long> implements Task
     }
 
     @Override
-    public TaskType getType() {
-        return type;
-    }
-
-    @Override
     public boolean add(final TaskExec exec) {
         checkType(exec, JPATaskExec.class);
         return exec != null && !executions.contains((JPATaskExec) exec) && executions.add((JPATaskExec) exec);

http://git-wip-us.apache.org/repos/asf/syncope/blob/9f1a6744/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPANotificationTask.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPANotificationTask.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPANotificationTask.java
index e1a2456..1dd8d9a 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPANotificationTask.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPANotificationTask.java
@@ -35,7 +35,6 @@ import javax.persistence.Lob;
 import javax.validation.constraints.Max;
 import javax.validation.constraints.Min;
 import javax.validation.constraints.NotNull;
-import org.apache.syncope.common.lib.types.TaskType;
 import org.apache.syncope.common.lib.types.TraceLevel;
 import org.apache.syncope.core.persistence.api.entity.task.NotificationTask;
 
@@ -78,7 +77,6 @@ public class JPANotificationTask extends AbstractTask implements NotificationTas
     public JPANotificationTask() {
         super();
 
-        type = TaskType.NOTIFICATION;
         recipients = new HashSet<>();
         executed = getBooleanAsInteger(false);
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/9f1a6744/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPropagationTask.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPropagationTask.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPropagationTask.java
index 1be6b9b..bf86077 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPropagationTask.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPropagationTask.java
@@ -30,7 +30,6 @@ import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.ResourceOperation;
-import org.apache.syncope.common.lib.types.TaskType;
 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.jpa.validation.entity.PropagationTaskCheck;
@@ -79,11 +78,6 @@ public class JPAPropagationTask extends AbstractTask implements PropagationTask
 
     private Long anyKey;
 
-    public JPAPropagationTask() {
-        super();
-        type = TaskType.PROPAGATION;
-    }
-
     /**
      * ExternalResource to which the propagation happens.
      */

http://git-wip-us.apache.org/repos/asf/syncope/blob/9f1a6744/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPullTask.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPullTask.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPullTask.java
index e97b3c6..7dca06c 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPullTask.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPullTask.java
@@ -38,7 +38,6 @@ import javax.validation.constraints.NotNull;
 import org.apache.commons.collections4.IterableUtils;
 import org.apache.commons.collections4.Predicate;
 import org.apache.syncope.common.lib.types.PullMode;
-import org.apache.syncope.common.lib.types.TaskType;
 import org.apache.syncope.core.persistence.api.entity.AnyType;
 import org.apache.syncope.core.persistence.api.entity.Realm;
 import org.apache.syncope.core.persistence.api.entity.AnyTemplate;
@@ -71,13 +70,6 @@ public class JPAPullTask extends AbstractProvisioningTask implements PullTask {
     @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER, mappedBy = "pullTask")
     private List<JPAAnyTemplatePullTask> templates = new ArrayList<>();
 
-    /**
-     * Default constructor.
-     */
-    public JPAPullTask() {
-        super(TaskType.PULL, null);
-    }
-
     @Override
     public PullMode getPullMode() {
         return pullMode;

http://git-wip-us.apache.org/repos/asf/syncope/blob/9f1a6744/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPushTask.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPushTask.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPushTask.java
index c6677e0..1afb4ee 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPushTask.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPushTask.java
@@ -33,7 +33,6 @@ import javax.persistence.JoinColumn;
 import javax.persistence.OneToMany;
 import org.apache.commons.collections4.IterableUtils;
 import org.apache.commons.collections4.Predicate;
-import org.apache.syncope.common.lib.types.TaskType;
 import org.apache.syncope.core.persistence.api.entity.AnyType;
 import org.apache.syncope.core.persistence.api.entity.task.PushTask;
 import org.apache.syncope.core.persistence.api.entity.task.PushTaskAnyFilter;
@@ -54,13 +53,6 @@ public class JPAPushTask extends AbstractProvisioningTask implements PushTask {
     @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER, mappedBy = "pushTask")
     private List<JPAPushTaskAnyFilter> filters = new ArrayList<>();
 
-    /**
-     * Default constructor.
-     */
-    public JPAPushTask() {
-        super(TaskType.PUSH, null);
-    }
-
     @Override
     public Set<String> getActionsClassNames() {
         return actionsClassNames;

http://git-wip-us.apache.org/repos/asf/syncope/blob/9f1a6744/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPASchedTask.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPASchedTask.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPASchedTask.java
index c487560..f51c078 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPASchedTask.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPASchedTask.java
@@ -27,7 +27,6 @@ import javax.persistence.TemporalType;
 import javax.validation.constraints.Max;
 import javax.validation.constraints.Min;
 import javax.validation.constraints.NotNull;
-import org.apache.syncope.common.lib.types.TaskType;
 import org.apache.syncope.core.persistence.api.entity.task.SchedTask;
 import org.apache.syncope.core.persistence.jpa.validation.entity.SchedTaskCheck;
 
@@ -56,11 +55,6 @@ public class JPASchedTask extends AbstractTask implements SchedTask {
     @Max(1)
     private Integer active;
 
-    public JPASchedTask() {
-        super();
-        this.type = TaskType.SCHEDULED;
-    }
-
     @Override
     public Date getStartAt() {
         return startAt;

http://git-wip-us.apache.org/repos/asf/syncope/blob/9f1a6744/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/resources/domains/MasterContent.xml b/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
index 24e3894..4505541 100644
--- a/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
+++ b/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
@@ -963,45 +963,45 @@ under the License.
                intAttrName="location" intMappingType="AnyObjectPlainSchema"
                mandatoryCondition="false" connObjectKey="0" password="0" purpose="BOTH"/>
     
-  <Task DTYPE="PropagationTask" type="PROPAGATION" id="1" operation="UPDATE"
+  <Task DTYPE="PropagationTask" id="1" operation="UPDATE"
         objectClassName="__ACCOUNT__" resource_name="ws-target-resource-2" anyTypeKind="USER" anyKey="1"
         attributes='[{"name":"__PASSWORD__","value":[{"readOnly":false,"disposed":false,"encryptedBytes":"m9nh2US0Sa6m+cXccCq0Xw==","base64SHA1Hash":"GFJ69qfjxEOdrmt+9q+0Cw2uz60="}]},{"name":"__NAME__","value":["userId"],"nameValue":"userId"},{"name":"fullname","value":["fullname"]},{"name":"type","value":["type"]}]'/>
   <TaskExec id="1" task_id="1" startDate="2015-12-17 09:40:00.506" endDate="2015-12-17 09:42:00.506" status="SUCCESS"/>
-  <Task DTYPE="PropagationTask" type="PROPAGATION" id="2" operation="CREATE"
+  <Task DTYPE="PropagationTask" id="2" operation="CREATE"
         objectClassName="__ACCOUNT__" resource_name="ws-target-resource-2" anyTypeKind="USER" anyKey="1"
         attributes='[{"name":"__PASSWORD__","value":[{"readOnly":false,"disposed":false,"encryptedBytes":"m9nh2US0Sa6m+cXccCq0Xw==","base64SHA1Hash":"GFJ69qfjxEOdrmt+9q+0Cw2uz60="}]},{"name":"__NAME__","value":["userId"],"nameValue":"userId"},{"name":"fullname","value":["fullname"]},{"name":"type","value":["type"]}]'/>
-  <Task DTYPE="PropagationTask" type="PROPAGATION" id="3" operation="DELETE"
+  <Task DTYPE="PropagationTask" id="3" operation="DELETE"
         objectClassName="__ACCOUNT__" resource_name="ws-target-resource-2" anyTypeKind="USER" anyKey="1"
         attributes='[{"name":"__PASSWORD__","value":[{"readOnly":false,"disposed":false,"encryptedBytes":"m9nh2US0Sa6m+cXccCq0Xw==","base64SHA1Hash":"GFJ69qfjxEOdrmt+9q+0Cw2uz60="}]},{"name":"__NAME__","value":["userId"],"nameValue":"userId"},{"name":"type","value":["type"]}]'/>
-  <Task DTYPE="PullTask" type="PULL" id="4" name="CSV (update matching; assign unmatching)" resource_name="resource-csv"
+  <Task DTYPE="PullTask" id="4" name="CSV (update matching; assign unmatching)" resource_name="resource-csv"
         destinationRealm_id="1" performCreate="1" performUpdate="1" performDelete="1" pullStatus="1"
         pullMode="INCREMENTAL" unmatchingRule="ASSIGN" matchingRule="UPDATE" active="1"/>
   <AnyTemplatePullTask id="41" pullTask_id="4" anyType_name="USER"
                        template='{"@class":"org.apache.syncope.common.lib.to.UserTO","creator":null,"creationDate":null,"lastModifier":null,"lastChangeDate":null,"key":0,"type":"USER","realm":null,"status":null,"password":null,"token":null,"tokenExpireTime":null,"username":null,"lastLoginDate":null,"changePwdDate":null,"failedLogins":null,"securityQuestion":null,"securityAnswer":null,"auxClasses":["csv"],"derAttrs":[{"schema":"cn","readonly":false,"values":[""]}],"virAttrs":[],"resources":["resource-testdb"],"relationships":[],"memberships":[{"leftType":null,"leftKey":0,"rightType":"GROUP","rightKey":8,"groupName":null}],"dynGroups":[],"roles":[],"dynRoles":[],"plainAttrs":[{"schema":"ctype","readonly":false,"values":["email == &apos;test8@syncope.apache.org&apos;? &apos;TYPE_8&apos;: &apos;TYPE_OTHER&apos;"]}]}'/>
   <AnyTemplatePullTask id="42" pullTask_id="4" anyType_name="GROUP"
                        template='{"@class":"org.apache.syncope.common.lib.to.GroupTO","creator":null,"creationDate":null,"lastModifier":null,"lastChangeDate":null,"key":0,"type":"GROUP","realm":null,"status":null,"name":null,"userOwner":null,"groupOwner":null,"udynMembershipCond":null,"auxClasses":[],"derAttrs":[],"virAttrs":[],"resources":[],"plainAttrs":[]}'/>
-  <Task DTYPE="SchedTask" type="SCHEDULED" id="5" name="SampleJob Task"  active="1"
+  <Task DTYPE="SchedTask" id="5" name="SampleJob Task"  active="1"
         jobDelegateClassName="org.apache.syncope.fit.core.reference.TestSampleJobDelegate" cronExpression="0 0 0 1 * ?"/>
-  <Task DTYPE="PropagationTask" type="PROPAGATION" id="6" operation="UPDATE"
+  <Task DTYPE="PropagationTask" id="6" operation="UPDATE"
         objectClassName="__ACCOUNT__" resource_name="ws-target-resource-nopropagation" anyTypeKind="USER" anyKey="1"
         attributes='[{"name":"__PASSWORD__","value":[{"readOnly":false,"disposed":false,"encryptedBytes":"m9nh2US0Sa6m+cXccCq0Xw==","base64SHA1Hash":"GFJ69qfjxEOdrmt+9q+0Cw2uz60="}]},{"name":"__NAME__","value":["userId"],"nameValue":"userId"},{"name":"fullname","value":["fullname"]},{"name":"type","value":["type"]}]'/>
   <TaskExec id="6" task_id="6" startDate="2015-12-17 09:40:00.506" endDate="2015-12-17 09:42:00.506" status="SUCCESS"/>
-  <Task DTYPE="PullTask" type="PULL" id="7" name="TestDB Task" resource_name="resource-testdb"
+  <Task DTYPE="PullTask" id="7" name="TestDB Task" resource_name="resource-testdb"
         destinationRealm_id="1" performCreate="1" performUpdate="1" performDelete="0" pullStatus="1" pullMode="FULL_RECONCILIATION"
         unmatchingRule="PROVISION" matchingRule="UPDATE" active="1"/>
   <AnyTemplatePullTask id="71" pullTask_id="7" anyType_name="USER"
                        template='{"@class":"org.apache.syncope.common.lib.to.UserTO","creator":null,"creationDate":null,"lastModifier":null,"lastChangeDate":null,"key":0,"type":"USER","realm":null,"status":null,"password":null,"token":null,"tokenExpireTime":null,"username":null,"lastLoginDate":null,"changePwdDate":null,"failedLogins":null,"securityQuestion":null,"securityAnswer":null,"auxClasses":[],"derAttrs":[],"virAttrs":[],"resources":[],"relationships":[],"memberships":[],"dynGroups":[],"roles":[],"dynRoles":[],"plainAttrs":[{"schema":"ctype","readonly":false,"values":["&apos;type a&apos;"]},{"schema":"userId","readonly":false,"values":["&apos;reconciled@syncope.apache.org&apos;"]},{"schema":"fullname","readonly":false,"values":["&apos;reconciled fullname&apos;"]},{"schema":"surname","readonly":false,"values":["&apos;surname&apos;"]}]}'/>
   <AnyTemplatePullTask id="72" pullTask_id="7" anyType_name="GROUP"
                        template='{"@class":"org.apache.syncope.common.lib.to.GroupTO","creator":null,"creationDate":null,"lastModifier":null,"lastChangeDate":null,"key":0,"type":"GROUP","realm":null,"status":null,"name":null,"userOwner":null,"groupOwner":null,"udynMembershipCond":null,"auxClasses":[],"derAttrs":[],"virAttrs":[],"resources":[],"plainAttrs":[]}'/>
-  <Task DTYPE="NotificationTask" type="NOTIFICATION" id="8" sender="admin@prova.org" subject="Notification for PULLOPE-81" 
+  <Task DTYPE="NotificationTask" id="8" sender="admin@prova.org" subject="Notification for PULLOPE-81" 
         textBody="NOTIFICATION-81" htmlBody="NOTIFICATION-81" traceLevel="ALL"/>
-  <Task DTYPE="PullTask" type="PULL" id="9" name="TestDB2 Task" resource_name="resource-testdb2"
+  <Task DTYPE="PullTask" id="9" name="TestDB2 Task" resource_name="resource-testdb2"
         destinationRealm_id="1" performCreate="1" performUpdate="1" performDelete="0" pullStatus="1" pullMode="FULL_RECONCILIATION"
         unmatchingRule="PROVISION" matchingRule="UPDATE" active="1"/>
-  <Task DTYPE="PullTask" type="PULL" id="10" name="TestDB Pull Task" resource_name="resource-db-pull"
+  <Task DTYPE="PullTask" id="10" name="TestDB Pull Task" resource_name="resource-db-pull"
         destinationRealm_id="1" pullMode="FULL_RECONCILIATION" performCreate="1" performDelete="1" performUpdate="1" pullStatus="0"
         unmatchingRule="PROVISION" matchingRule="UPDATE" active="1"/>
-  <Task DTYPE="PullTask" type="PULL" id="11" name="LDAP Pull Task" resource_name="resource-ldap"
+  <Task DTYPE="PullTask" id="11" name="LDAP Pull Task" resource_name="resource-ldap"
         destinationRealm_id="1" pullMode="FULL_RECONCILIATION" performCreate="1" performDelete="1" performUpdate="1" pullStatus="0"
         unmatchingRule="PROVISION" matchingRule="UPDATE" active="1"/>
   <AnyTemplatePullTask id="1" pullTask_id="11" anyType_name="USER"
@@ -1009,81 +1009,81 @@ under the License.
   <AnyTemplatePullTask id="2" pullTask_id="11" anyType_name="GROUP"
                        template='{"@class":"org.apache.syncope.common.lib.to.GroupTO","creator":null,"creationDate":null,"lastModifier":null,"lastChangeDate":null,"key":0,"type":"GROUP","realm":null,"status":null,"name":null,"userOwner":null,"groupOwner":null,"udynMembershipCond":null,"auxClasses":[],"derAttrs":[],"virAttrs":[],"resources":[],"plainAttrs":[{"schema":"show","readonly":false,"values":["true"]}]}'/>
   <PullTask_actionsClassNames pullTask_id="11" actionClassName="org.apache.syncope.core.provisioning.java.pushpull.LDAPMembershipPullActions"/>
-  <Task DTYPE="PullTask" type="PULL" id="12" name="VirAttrCache test" resource_name="resource-csv"
+  <Task DTYPE="PullTask" id="12" name="VirAttrCache test" resource_name="resource-csv"
         destinationRealm_id="1" performCreate="0" performUpdate="1" performDelete="0" pullStatus="0" pullMode="FULL_RECONCILIATION"
         unmatchingRule="PROVISION" matchingRule="UPDATE" active="1"/>
-  <Task DTYPE="PushTask" type="PUSH" id="13" name="Export on resource-testdb2" resource_name="resource-testdb2"
+  <Task DTYPE="PushTask" id="13" name="Export on resource-testdb2" resource_name="resource-testdb2"
         performCreate="1" performUpdate="1" performDelete="1" pullStatus="1"         
         unmatchingRule="ASSIGN" matchingRule="IGNORE" active="1"/>  
   <PushTaskAnyFilter id="131" anyType_name="USER" pushTask_id="13" fiql="surname==Vivaldi"/>
   <PushTaskAnyFilter id="132" anyType_name="GROUP" pushTask_id="13" fiql="name==_NO_ONE_"/>
-  <Task DTYPE="PushTask" type="PUSH" id="14" name="Export on resource-testdb2" resource_name="resource-testdb2"
+  <Task DTYPE="PushTask" id="14" name="Export on resource-testdb2" resource_name="resource-testdb2"
         performCreate="1" performUpdate="1" performDelete="1" pullStatus="1"         
         unmatchingRule="PROVISION" matchingRule="IGNORE" active="1"/>
   <PushTaskAnyFilter id="141" anyType_name="USER" pushTask_id="14" fiql="surname==Bellini"/>
   <PushTaskAnyFilter id="142" anyType_name="GROUP" pushTask_id="14" fiql="name==_NO_ONE_"/>
-  <Task DTYPE="PushTask" type="PUSH" id="15" name="Export on resource-testdb2" resource_name="resource-testdb2"
+  <Task DTYPE="PushTask" id="15" name="Export on resource-testdb2" resource_name="resource-testdb2"
         performCreate="1" performUpdate="1" performDelete="1" pullStatus="1"        
         unmatchingRule="UNLINK" matchingRule="IGNORE" active="1"/>
   <PushTaskAnyFilter id="151" anyType_name="USER" pushTask_id="15" fiql="surname==Puccini"/>
   <PushTaskAnyFilter id="152" anyType_name="GROUP" pushTask_id="15" fiql="name==_NO_ONE_"/>
-  <Task DTYPE="PushTask" type="PUSH" id="16" name="Export on resource-testdb2" resource_name="resource-testdb2"
+  <Task DTYPE="PushTask" id="16" name="Export on resource-testdb2" resource_name="resource-testdb2"
         performCreate="1" performUpdate="1" performDelete="1" pullStatus="1"         
         unmatchingRule="IGNORE" matchingRule="IGNORE" active="1"/>
   <PushTaskAnyFilter id="161" anyType_name="USER" pushTask_id="16" fiql="surname==Verdi"/>
   <PushTaskAnyFilter id="162" anyType_name="GROUP" pushTask_id="16" fiql="name==_NO_ONE_"/>
-  <Task DTYPE="PushTask" type="PUSH" id="17" name="Export on resource-testdb2" resource_name="resource-testdb2"
+  <Task DTYPE="PushTask" id="17" name="Export on resource-testdb2" resource_name="resource-testdb2"
         performCreate="1" performUpdate="1" performDelete="1" pullStatus="1"        
         unmatchingRule="ASSIGN" matchingRule="UPDATE" active="1"/>
   <PushTaskAnyFilter id="171" anyType_name="USER" pushTask_id="17" fiql="username==_NO_ONE_"/>
   <PushTaskAnyFilter id="172" anyType_name="GROUP" pushTask_id="17" fiql="name==_NO_ONE_"/>
-  <Task DTYPE="PushTask" type="PUSH" id="18" name="Export on resource-testdb2" resource_name="resource-testdb2"
+  <Task DTYPE="PushTask" id="18" name="Export on resource-testdb2" resource_name="resource-testdb2"
         performCreate="1" performUpdate="1" performDelete="1" pullStatus="1"        
         unmatchingRule="IGNORE" matchingRule="DEPROVISION" active="1"/>
   <PushTaskAnyFilter id="181" anyType_name="USER" pushTask_id="18" fiql="surname==Verdi"/>
   <PushTaskAnyFilter id="182" anyType_name="GROUP" pushTask_id="18" fiql="name==_NO_ONE_"/>
-  <Task DTYPE="PushTask" type="PUSH" id="19" name="Export on resource-testdb2" resource_name="resource-testdb2"
+  <Task DTYPE="PushTask" id="19" name="Export on resource-testdb2" resource_name="resource-testdb2"
         performCreate="1" performUpdate="1" performDelete="1" pullStatus="1"        
         unmatchingRule="IGNORE" matchingRule="UNASSIGN" active="1"/>
   <PushTaskAnyFilter id="191" anyType_name="USER" pushTask_id="19" fiql="surname==Rossini"/>
   <PushTaskAnyFilter id="192" anyType_name="GROUP" pushTask_id="19" fiql="name==_NO_ONE_"/>
-  <Task DTYPE="PushTask" type="PUSH" id="20" name="Export on resource-testdb2" resource_name="resource-testdb2"
+  <Task DTYPE="PushTask" id="20" name="Export on resource-testdb2" resource_name="resource-testdb2"
         performCreate="1" performUpdate="1" performDelete="1" pullStatus="1"        
         unmatchingRule="IGNORE" matchingRule="LINK" active="1"/>
   <PushTaskAnyFilter id="201" anyType_name="USER" pushTask_id="20" fiql="surname==Verdi"/>
   <PushTaskAnyFilter id="202" anyType_name="GROUP" pushTask_id="20" fiql="name==_NO_ONE_"/>
-  <Task DTYPE="PushTask" type="PUSH" id="21" name="Export on resource-testdb2" resource_name="resource-testdb2"
+  <Task DTYPE="PushTask" id="21" name="Export on resource-testdb2" resource_name="resource-testdb2"
         performCreate="1" performUpdate="1" performDelete="1" pullStatus="1"        
         unmatchingRule="IGNORE" matchingRule="UNLINK" active="1"/>
   <PushTaskAnyFilter id="211" anyType_name="USER" pushTask_id="21" fiql="surname==Verdi"/>
   <PushTaskAnyFilter id="212" anyType_name="GROUP" pushTask_id="21" fiql="name==_NO_ONE_"/>
-  <Task DTYPE="PushTask" type="PUSH" id="22" name="Export on resource-testdb2" resource_name="resource-testdb2"
+  <Task DTYPE="PushTask" id="22" name="Export on resource-testdb2" resource_name="resource-testdb2"
         performCreate="1" performUpdate="1" performDelete="1" pullStatus="1"        
         unmatchingRule="IGNORE" matchingRule="UPDATE"  active="1"/>
   <PushTaskAnyFilter id="221" anyType_name="USER" pushTask_id="22" fiql="surname==Verdi"/>
   <PushTaskAnyFilter id="222" anyType_name="GROUP" pushTask_id="22" fiql="name==_NO_ONE_"/>
-  <Task DTYPE="PushTask" type="PUSH" id="23" name="Export on resource-ldap" resource_name="resource-ldap"
+  <Task DTYPE="PushTask" id="23" name="Export on resource-ldap" resource_name="resource-ldap"
         performCreate="1" performUpdate="1" performDelete="1" pullStatus="1"        
         unmatchingRule="ASSIGN" matchingRule="UNLINK" active="1"/>
   <PushTaskAnyFilter id="231" anyType_name="USER" pushTask_id="23" fiql="username==_NO_ONE_"/>
   <PushTaskAnyFilter id="232" anyType_name="GROUP" pushTask_id="23" fiql="name==citizen"/>
-  <Task DTYPE="PullTask" type="PULL" id="24" name="CSV Task (update matching; provision unmatching)" resource_name="resource-csv"
+  <Task DTYPE="PullTask" id="24" name="CSV Task (update matching; provision unmatching)" resource_name="resource-csv"
         destinationRealm_id="1" performCreate="1" performUpdate="1" performDelete="1" pullStatus="1" pullMode="INCREMENTAL"
         unmatchingRule="PROVISION" matchingRule="UPDATE" active="1"/>
   <AnyTemplatePullTask id="3" pullTask_id="24" anyType_name="USER"
                        template='{"@class":"org.apache.syncope.common.lib.to.UserTO","creator":null,"creationDate":null,"lastModifier":null,"lastChangeDate":null,"key":0,"type":"USER","realm":null,"status":null,"password":null,"token":null,"tokenExpireTime":null,"username":null,"lastLoginDate":null,"changePwdDate":null,"failedLogins":null,"securityQuestion":null,"securityAnswer":null,"auxClasses":[],"derAttrs":[],"virAttrs":[],"resources":["resource-testdb"],"roles":[],"dynRoles":[],"relationships":[],"memberships":[],"dynGroups":[],"plainAttrs":[{"schema":"firstname","readonly":false,"values":[""]},{"schema":"userId","readonly":false,"values":["&apos;test&apos;"]},{"schema":"fullname","readonly":false,"values":["&apos;test&apos;"]},{"schema":"surname","readonly":false,"values":["&apos;test&apos;"]}]}'/>
   <AnyTemplatePullTask id="4" pullTask_id="24" anyType_name="GROUP"
                        template='{"@class":"org.apache.syncope.common.lib.to.GroupTO","creator":null,"creationDate":null,"lastModifier":null,"lastChangeDate":null,"key":0,"type":"GROUP","realm":null,"status":null,"name":null,"userOwner":null,"groupOwner":null,"udynMembershipCond":null,"auxClasses":[],"derAttrs":[],"virAttrs":[],"resources":[],"plainAttrs":[]}'/>
-  <Task DTYPE="PullTask" type="PULL" id="25" name="CSV (unlink matching; ignore unmatching)" resource_name="resource-csv"
+  <Task DTYPE="PullTask" id="25" name="CSV (unlink matching; ignore unmatching)" resource_name="resource-csv"
         destinationRealm_id="1" performCreate="1" performUpdate="1" performDelete="1" pullStatus="1" pullMode="INCREMENTAL"
         unmatchingRule="IGNORE" matchingRule="UNLINK" active="1"/>
-  <Task DTYPE="PullTask" type="PULL" id="26" name="CSV (ignore matching; assign unmatching)" resource_name="resource-csv"
+  <Task DTYPE="PullTask" id="26" name="CSV (ignore matching; assign unmatching)" resource_name="resource-csv"
         destinationRealm_id="1" performCreate="1" performUpdate="1" performDelete="1" pullStatus="1" pullMode="INCREMENTAL"
         unmatchingRule="ASSIGN" matchingRule="IGNORE" active="1"/>
-  <Task DTYPE="PropagationTask" type="PROPAGATION" id="27" operation="CREATE"
+  <Task DTYPE="PropagationTask" id="27" operation="CREATE"
         objectClassName="__ACCOUNT__" resource_name="resource-testdb" anyTypeKind="USER" anyKey="1"
         attributes='[{"name":"__PASSWORD__","value":[{"readOnly":false,"disposed":false,"encryptedBytes":"m9nh2US0Sa6m+cXccCq0Xw==","base64SHA1Hash":"GFJ69qfjxEOdrmt+9q+0Cw2uz60="}]},{"name":"__NAME__","value":["userId"],"nameValue":"userId"},{"name":"fullname","value":["fullname"]},{"name":"type","value":["type"]}]'/>
-  <Task DTYPE="PullTask" type="PULL" id="28" name="Scripted SQL" resource_name="resource-db-scripted"
+  <Task DTYPE="PullTask" id="28" name="Scripted SQL" resource_name="resource-db-scripted"
         destinationRealm_id="1" performCreate="1" performUpdate="1" performDelete="1" pullStatus="0" pullMode="INCREMENTAL"
         unmatchingRule="PROVISION" matchingRule="UPDATE" active="1"/>
 


[2/3] syncope git commit: Internal JPA refactoring: removing Policy#getType

Posted by il...@apache.org.
Internal JPA refactoring: removing Policy#getType


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

Branch: refs/heads/master
Commit: 31fea77bf445480af866ead354ceb4b72576dd9b
Parents: b2e07eb
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Mon Mar 28 10:08:24 2016 +0200
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Mon Mar 28 10:08:24 2016 +0200

----------------------------------------------------------------------
 .../commands/policy/PolicyResultManager.java    |  33 +--
 .../common/lib/policy/AbstractPolicyTO.java     |  17 --
 .../common/lib/policy/AccountPolicyTO.java      |   5 -
 .../common/lib/policy/PasswordPolicyTO.java     |   5 -
 .../syncope/common/lib/policy/PolicyType.java   |  43 ----
 .../syncope/common/lib/policy/PullPolicyTO.java |   5 -
 .../syncope/common/lib/types/PolicyType.java    |  43 ++++
 .../apache/syncope/core/logic/PolicyLogic.java  |  51 ++---
 .../apache/syncope/core/logic/SyncopeLogic.java |   7 +-
 .../api/dao/ExternalResourceDAO.java            |   3 +-
 .../core/persistence/api/dao/PolicyDAO.java     |   3 +-
 .../core/persistence/api/entity/Policy.java     |   4 -
 .../jpa/dao/JPAExternalResourceDAO.java         |  32 ++-
 .../persistence/jpa/dao/JPAPlainAttrDAO.java    |   4 +-
 .../jpa/dao/JPAPlainAttrValueDAO.java           |   6 +-
 .../persistence/jpa/dao/JPAPlainSchemaDAO.java  |   2 +-
 .../core/persistence/jpa/dao/JPAPolicyDAO.java  |  40 ++--
 .../core/persistence/jpa/dao/JPARealmDAO.java   |   9 +-
 .../jpa/entity/policy/AbstractPolicy.java       |  12 -
 .../jpa/entity/policy/JPAAccountPolicy.java     |   6 -
 .../jpa/entity/policy/JPAPasswordPolicy.java    |   6 -
 .../jpa/entity/policy/JPAPullPolicy.java        |   6 -
 .../jpa/entity/policy/JPAPushPolicy.java        |   6 -
 .../core/persistence/jpa/inner/PolicyTest.java  |   5 +-
 .../test/resources/domains/MasterContent.xml    |  24 +-
 .../provisioning/api/data/PolicyDataBinder.java |   4 +-
 .../java/data/PolicyDataBinderImpl.java         | 225 +++++++++----------
 .../rest/cxf/service/PolicyServiceImpl.java     |  20 +-
 .../apache/syncope/fit/core/PolicyITCase.java   |   2 -
 29 files changed, 250 insertions(+), 378 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/31fea77b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/policy/PolicyResultManager.java
----------------------------------------------------------------------
diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/policy/PolicyResultManager.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/policy/PolicyResultManager.java
index d0432f3..e933128 100644
--- a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/policy/PolicyResultManager.java
+++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/policy/PolicyResultManager.java
@@ -32,27 +32,14 @@ public class PolicyResultManager extends CommonsResultManager {
     public void printPolicies(final LinkedList<AbstractPolicyTO> policyTOs) {
         System.out.println("");
         for (AbstractPolicyTO policyTO : policyTOs) {
-            if (!policyTOs.isEmpty()) {
-                final PolicyType policyType = policyTO.getType();
-                switch (policyType) {
-                    case ACCOUNT:
-                        printAccountPolicy((AccountPolicyTO) policyTO);
-                        break;
-                    case PASSWORD:
-                        printPasswordPolicy((PasswordPolicyTO) policyTO);
-                        break;
-                    case PUSH:
-                        System.out.println(policyTO);
-                        break;
-                    case PULL:
-                        printPullPolicy((PullPolicyTO) policyTO);
-                        break;
-                    default:
-                        break;
-                }
+            if (policyTO instanceof AccountPolicyTO) {
+                printAccountPolicy((AccountPolicyTO) policyTO);
+            } else if (policyTO instanceof PasswordPolicyTO) {
+                printPasswordPolicy((PasswordPolicyTO) policyTO);
+            } else if (policyTO instanceof PullPolicyTO) {
+                printPullPolicy((PullPolicyTO) policyTO);
             }
         }
-
     }
 
     public void printPoliciesByType(final String policyTypeString, final LinkedList<AbstractPolicyTO> policyTOs) {
@@ -86,7 +73,7 @@ public class PolicyResultManager extends CommonsResultManager {
 
     public void printAccountPolicy(final AccountPolicyTO policyTO) {
         System.out.println(" > KEY: " + policyTO.getKey());
-        System.out.println("    type: " + policyTO.getType().name());
+        System.out.println("    type: " + policyTO.getClass().getSimpleName());
         System.out.println("    description: " + policyTO.getDescription());
         System.out.println("    resources : " + policyTO.getUsedByResources().toString());
         System.out.println("    realms : " + policyTO.getUsedByRealms().toString());
@@ -99,20 +86,20 @@ public class PolicyResultManager extends CommonsResultManager {
 
     public void printPasswordPolicy(final PasswordPolicyTO policyTO) {
         System.out.println(" > KEY: " + policyTO.getKey());
-        System.out.println("    type: " + policyTO.getType().name());
+        System.out.println("    type: " + policyTO.getClass().getSimpleName());
         System.out.println("    description: " + policyTO.getDescription());
         System.out.println("    resources : " + policyTO.getUsedByResources().toString());
         System.out.println("    realms : " + policyTO.getUsedByRealms().toString());
         System.out.println("    history lenght : " + policyTO.getHistoryLength());
         System.out.println("    allow null password : " + policyTO.isAllowNullPassword());
         System.out.println("    RULES : ");
-        System.out.println("       > class : " + ((PasswordPolicyTO) policyTO).getRuleConfs());
+        System.out.println("       > class : " + policyTO.getRuleConfs());
         System.out.println("");
     }
 
     public void printPullPolicy(final PullPolicyTO policyTO) {
         System.out.println(" > KEY: " + policyTO.getKey());
-        System.out.println("    type: " + policyTO.getType().name());
+        System.out.println("    type: " + policyTO.getClass().getSimpleName());
         System.out.println("    description: " + policyTO.getDescription());
         System.out.println("    resources : " + policyTO.getUsedByResources().toString());
         System.out.println("    realms : " + policyTO.getUsedByRealms().toString());

http://git-wip-us.apache.org/repos/asf/syncope/blob/31fea77b/common/lib/src/main/java/org/apache/syncope/common/lib/policy/AbstractPolicyTO.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/policy/AbstractPolicyTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/policy/AbstractPolicyTO.java
index 34f824f..69564ac 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/policy/AbstractPolicyTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/policy/AbstractPolicyTO.java
@@ -29,7 +29,6 @@ import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlSeeAlso;
 import javax.xml.bind.annotation.XmlType;
 import org.apache.syncope.common.lib.AbstractBaseBean;
-import org.apache.syncope.common.lib.types.PolicyType;
 
 @XmlRootElement(name = "abstractPolicy")
 @XmlType
@@ -43,22 +42,10 @@ public abstract class AbstractPolicyTO extends AbstractBaseBean {
 
     private String description;
 
-    private final PolicyType type;
-
     private final List<String> usedByResources = new ArrayList<>();
 
     private final List<String> usedByRealms = new ArrayList<>();
 
-    private AbstractPolicyTO() {
-        super();
-        throw new UnsupportedOperationException("No-arg constructor is just to keep JAXB from complaining");
-    }
-
-    protected AbstractPolicyTO(final PolicyType type) {
-        super();
-        this.type = type;
-    }
-
     public long getKey() {
         return key;
     }
@@ -76,10 +63,6 @@ public abstract class AbstractPolicyTO extends AbstractBaseBean {
         this.description = description;
     }
 
-    public PolicyType getType() {
-        return type;
-    }
-
     @XmlElementWrapper(name = "usedByResources")
     @XmlElement(name = "resource")
     @JsonProperty("usedByResources")

http://git-wip-us.apache.org/repos/asf/syncope/blob/31fea77b/common/lib/src/main/java/org/apache/syncope/common/lib/policy/AccountPolicyTO.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/policy/AccountPolicyTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/policy/AccountPolicyTO.java
index b1e1049..63b78a9 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/policy/AccountPolicyTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/policy/AccountPolicyTO.java
@@ -25,7 +25,6 @@ import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlElementWrapper;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
-import org.apache.syncope.common.lib.types.PolicyType;
 
 @XmlRootElement(name = "accountPolicy")
 @XmlType
@@ -41,10 +40,6 @@ public class AccountPolicyTO extends AbstractPolicyTO {
 
     private final List<String> resources = new ArrayList<>();
 
-    public AccountPolicyTO() {
-        super(PolicyType.ACCOUNT);
-    }
-
     public boolean isPropagateSuspension() {
         return propagateSuspension;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/31fea77b/common/lib/src/main/java/org/apache/syncope/common/lib/policy/PasswordPolicyTO.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/policy/PasswordPolicyTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/policy/PasswordPolicyTO.java
index 49c73a3..20f238a 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/policy/PasswordPolicyTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/policy/PasswordPolicyTO.java
@@ -25,7 +25,6 @@ import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlElementWrapper;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
-import org.apache.syncope.common.lib.types.PolicyType;
 
 @XmlRootElement(name = "passwordPolicy")
 @XmlType
@@ -39,10 +38,6 @@ public class PasswordPolicyTO extends AbstractPolicyTO {
 
     private final List<AbstractPasswordRuleConf> ruleConfs = new ArrayList<>();
 
-    public PasswordPolicyTO() {
-        super(PolicyType.PASSWORD);
-    }
-
     public boolean isAllowNullPassword() {
         return allowNullPassword;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/31fea77b/common/lib/src/main/java/org/apache/syncope/common/lib/policy/PolicyType.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/policy/PolicyType.java b/common/lib/src/main/java/org/apache/syncope/common/lib/policy/PolicyType.java
deleted file mode 100644
index ea429c2..0000000
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/policy/PolicyType.java
+++ /dev/null
@@ -1,43 +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.common.lib.types;
-
-import javax.xml.bind.annotation.XmlEnum;
-
-@XmlEnum
-public enum PolicyType {
-
-    /**
-     * How username values should look like.
-     */
-    ACCOUNT,
-    /**
-     * How password values should look like.
-     */
-    PASSWORD,
-    /**
-     * For handling conflicts resolution during pull.
-     */
-    PULL,
-    /**
-     * For handling conflicts resolution during push.
-     */
-    PUSH;
-
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/31fea77b/common/lib/src/main/java/org/apache/syncope/common/lib/policy/PullPolicyTO.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/policy/PullPolicyTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/policy/PullPolicyTO.java
index 91c8e8b..2618e43 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/policy/PullPolicyTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/policy/PullPolicyTO.java
@@ -20,7 +20,6 @@ package org.apache.syncope.common.lib.policy;
 
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
-import org.apache.syncope.common.lib.types.PolicyType;
 
 @XmlRootElement(name = "pullPolicy")
 @XmlType
@@ -30,10 +29,6 @@ public class PullPolicyTO extends AbstractPolicyTO {
 
     private PullPolicySpec specification;
 
-    public PullPolicyTO() {
-        super(PolicyType.PULL);
-    }
-
     public PullPolicySpec getSpecification() {
         return specification;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/31fea77b/common/lib/src/main/java/org/apache/syncope/common/lib/types/PolicyType.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/types/PolicyType.java b/common/lib/src/main/java/org/apache/syncope/common/lib/types/PolicyType.java
new file mode 100644
index 0000000..ea429c2
--- /dev/null
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/types/PolicyType.java
@@ -0,0 +1,43 @@
+/*
+ * 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.common.lib.types;
+
+import javax.xml.bind.annotation.XmlEnum;
+
+@XmlEnum
+public enum PolicyType {
+
+    /**
+     * How username values should look like.
+     */
+    ACCOUNT,
+    /**
+     * How password values should look like.
+     */
+    PASSWORD,
+    /**
+     * For handling conflicts resolution during pull.
+     */
+    PULL,
+    /**
+     * For handling conflicts resolution during push.
+     */
+    PUSH;
+
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/31fea77b/core/logic/src/main/java/org/apache/syncope/core/logic/PolicyLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/PolicyLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/PolicyLogic.java
index 76c0d66..7452138 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/PolicyLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/PolicyLogic.java
@@ -25,9 +25,6 @@ import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.Transformer;
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.syncope.common.lib.policy.AbstractPolicyTO;
-import org.apache.syncope.common.lib.policy.AccountPolicyTO;
-import org.apache.syncope.common.lib.policy.PasswordPolicyTO;
-import org.apache.syncope.common.lib.policy.PullPolicyTO;
 import org.apache.syncope.common.lib.types.PolicyType;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
 import org.apache.syncope.core.persistence.api.dao.NotFoundException;
@@ -35,11 +32,12 @@ import org.apache.syncope.core.persistence.api.dao.PolicyDAO;
 import org.apache.syncope.core.persistence.api.entity.policy.AccountPolicy;
 import org.apache.syncope.core.persistence.api.entity.policy.PasswordPolicy;
 import org.apache.syncope.core.persistence.api.entity.Policy;
+import org.apache.syncope.core.persistence.api.entity.policy.PullPolicy;
+import org.apache.syncope.core.persistence.api.entity.policy.PushPolicy;
 import org.apache.syncope.core.provisioning.api.data.PolicyDataBinder;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.stereotype.Component;
-import org.apache.syncope.core.persistence.api.entity.policy.PullPolicy;
 
 @Component
 public class PolicyLogic extends AbstractTransactionalLogic<AbstractPolicyTO> {
@@ -52,48 +50,35 @@ public class PolicyLogic extends AbstractTransactionalLogic<AbstractPolicyTO> {
 
     @PreAuthorize("hasRole('" + StandardEntitlement.POLICY_CREATE + "')")
     public <T extends AbstractPolicyTO> T create(final T policyTO) {
-        return binder.getPolicyTO(policyDAO.save(binder.getPolicy(null, policyTO)));
-    }
-
-    private <T extends AbstractPolicyTO, K extends Policy> T update(final T policyTO, final K policy) {
-        binder.getPolicy(policy, policyTO);
-        K savedPolicy = policyDAO.save(policy);
-        return binder.getPolicyTO(savedPolicy);
+        return binder.getPolicyTO(policyDAO.save(binder.create(policyTO)));
     }
 
     @PreAuthorize("hasRole('" + StandardEntitlement.POLICY_UPDATE + "')")
-    public PasswordPolicyTO update(final PasswordPolicyTO policyTO) {
+    public AbstractPolicyTO update(final AbstractPolicyTO policyTO) {
         Policy policy = policyDAO.find(policyTO.getKey());
-        if (!(policy instanceof PasswordPolicy)) {
-            throw new NotFoundException("PasswordPolicy with key " + policyTO.getKey());
-        }
-
-        return update(policyTO, policy);
+        return binder.getPolicyTO(policyDAO.save(binder.update(policy, policyTO)));
     }
 
-    @PreAuthorize("hasRole('" + StandardEntitlement.POLICY_UPDATE + "')")
-    public AccountPolicyTO update(final AccountPolicyTO policyTO) {
-        Policy policy = policyDAO.find(policyTO.getKey());
-        if (!(policy instanceof AccountPolicy)) {
-            throw new NotFoundException("AccountPolicy with key " + policyTO.getKey());
-        }
+    private Class<? extends Policy> getPolicyClass(final PolicyType policyType) {
+        switch (policyType) {
+            case ACCOUNT:
+                return AccountPolicy.class;
 
-        return update(policyTO, policy);
-    }
+            case PASSWORD:
+                return PasswordPolicy.class;
 
-    @PreAuthorize("hasRole('" + StandardEntitlement.POLICY_UPDATE + "')")
-    public PullPolicyTO update(final PullPolicyTO policyTO) {
-        Policy policy = policyDAO.find(policyTO.getKey());
-        if (!(policy instanceof PullPolicy)) {
-            throw new NotFoundException(PullPolicy.class.getSimpleName() + " with key " + policyTO.getKey());
-        }
+            case PULL:
+                return PullPolicy.class;
 
-        return update(policyTO, policy);
+            case PUSH:
+            default:
+                return PushPolicy.class;
+        }
     }
 
     @PreAuthorize("hasRole('" + StandardEntitlement.POLICY_LIST + "')")
     public <T extends AbstractPolicyTO> List<T> list(final PolicyType type) {
-        return CollectionUtils.collect(policyDAO.find(type), new Transformer<Policy, T>() {
+        return CollectionUtils.collect(policyDAO.find(getPolicyClass(type)), new Transformer<Policy, T>() {
 
             @Override
             public T transform(final Policy input) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/31fea77b/core/logic/src/main/java/org/apache/syncope/core/logic/SyncopeLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/SyncopeLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/SyncopeLogic.java
index af8d1e1..dbec17e 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/SyncopeLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/SyncopeLogic.java
@@ -33,7 +33,6 @@ import org.apache.syncope.common.lib.AbstractBaseBean;
 import org.apache.syncope.common.lib.info.NumbersInfo;
 import org.apache.syncope.common.lib.info.SystemInfo;
 import org.apache.syncope.common.lib.info.PlatformInfo;
-import org.apache.syncope.common.lib.types.PolicyType;
 import org.apache.syncope.common.lib.types.TaskType;
 import org.apache.syncope.core.spring.security.PasswordGenerator;
 import org.apache.syncope.core.persistence.api.ImplementationLookup;
@@ -50,6 +49,8 @@ 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.VirSchemaDAO;
 import org.apache.syncope.core.persistence.api.entity.AnyType;
+import org.apache.syncope.core.persistence.api.entity.policy.AccountPolicy;
+import org.apache.syncope.core.persistence.api.entity.policy.PasswordPolicy;
 import org.apache.syncope.core.provisioning.api.AnyObjectProvisioningManager;
 import org.apache.syncope.core.provisioning.api.ConnIdBundleManager;
 import org.apache.syncope.core.provisioning.api.GroupProvisioningManager;
@@ -279,9 +280,9 @@ public class SyncopeLogic extends AbstractLogic<AbstractBaseBean> {
         numbersInfo.getConfCompleteness().put(
                 NumbersInfo.ConfItem.RESOURCE, numbersInfo.getTotalResources() > 0);
         numbersInfo.getConfCompleteness().put(
-                NumbersInfo.ConfItem.ACCOUNT_POLICY, !policyDAO.find(PolicyType.ACCOUNT).isEmpty());
+                NumbersInfo.ConfItem.ACCOUNT_POLICY, !policyDAO.find(AccountPolicy.class).isEmpty());
         numbersInfo.getConfCompleteness().put(
-                NumbersInfo.ConfItem.PASSWORD_POLICY, !policyDAO.find(PolicyType.PASSWORD).isEmpty());
+                NumbersInfo.ConfItem.PASSWORD_POLICY, !policyDAO.find(PasswordPolicy.class).isEmpty());
         numbersInfo.getConfCompleteness().put(
                 NumbersInfo.ConfItem.NOTIFICATION, !notificationDAO.findAll().isEmpty());
         numbersInfo.getConfCompleteness().put(

http://git-wip-us.apache.org/repos/asf/syncope/blob/31fea77b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/ExternalResourceDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/ExternalResourceDAO.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/ExternalResourceDAO.java
index 35e9689..6c443e8 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/ExternalResourceDAO.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/ExternalResourceDAO.java
@@ -20,7 +20,6 @@ package org.apache.syncope.core.persistence.api.dao;
 
 import java.util.List;
 import org.apache.syncope.common.lib.types.IntMappingType;
-import org.apache.syncope.common.lib.types.PolicyType;
 import org.apache.syncope.core.persistence.api.entity.Policy;
 import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
 import org.apache.syncope.core.persistence.api.entity.resource.Provision;
@@ -35,7 +34,7 @@ public interface ExternalResourceDAO extends DAO<ExternalResource, String> {
 
     List<ExternalResource> findByPolicy(Policy policy);
 
-    List<ExternalResource> findWithoutPolicy(PolicyType type);
+    List<ExternalResource> findWithoutPolicy(Class<? extends Policy> policyClass);
 
     List<ExternalResource> findAll();
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/31fea77b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/PolicyDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/PolicyDAO.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/PolicyDAO.java
index a27f1c0..aa41223 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/PolicyDAO.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/PolicyDAO.java
@@ -19,7 +19,6 @@
 package org.apache.syncope.core.persistence.api.dao;
 
 import java.util.List;
-import org.apache.syncope.common.lib.types.PolicyType;
 import org.apache.syncope.core.persistence.api.entity.policy.AccountPolicy;
 import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
 import org.apache.syncope.core.persistence.api.entity.Policy;
@@ -28,7 +27,7 @@ public interface PolicyDAO extends DAO<Policy, Long> {
 
     <T extends Policy> T find(Long key);
 
-    <T extends Policy> List<T> find(PolicyType type);
+    <T extends Policy> List<T> find(Class<T> reference);
 
     List<AccountPolicy> findByResource(ExternalResource resource);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/31fea77b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/Policy.java
----------------------------------------------------------------------
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/Policy.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/Policy.java
index d02de0a..39d91ce 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/Policy.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/Policy.java
@@ -18,13 +18,9 @@
  */
 package org.apache.syncope.core.persistence.api.entity;
 
-import org.apache.syncope.common.lib.types.PolicyType;
-
 public interface Policy extends Entity<Long> {
 
     String getDescription();
 
-    PolicyType getType();
-
     void setDescription(String description);
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/31fea77b/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 44c6e08..be02327 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
@@ -24,7 +24,6 @@ import java.util.Set;
 import javax.persistence.Query;
 import javax.persistence.TypedQuery;
 import org.apache.syncope.common.lib.types.IntMappingType;
-import org.apache.syncope.common.lib.types.PolicyType;
 import org.apache.syncope.common.lib.types.TaskType;
 import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO;
 import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
@@ -41,6 +40,8 @@ import org.apache.syncope.core.persistence.api.entity.Policy;
 import org.apache.syncope.core.persistence.api.entity.VirSchema;
 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.policy.PasswordPolicy;
+import org.apache.syncope.core.persistence.api.entity.policy.PullPolicy;
 import org.apache.syncope.core.persistence.api.entity.resource.Provision;
 import org.apache.syncope.core.persistence.api.entity.user.User;
 import org.apache.syncope.core.persistence.jpa.entity.resource.JPAMappingItem;
@@ -93,41 +94,34 @@ public class JPAExternalResourceDAO extends AbstractDAO<ExternalResource, String
         return entityManager().find(JPAProvision.class, key);
     }
 
-    private StringBuilder getByPolicyQuery(final PolicyType type) {
+    private StringBuilder getByPolicyQuery(final Class<? extends Policy> policyClass) {
         StringBuilder query = new StringBuilder("SELECT e FROM ").
                 append(JPAExternalResource.class.getSimpleName()).
                 append(" e WHERE e.");
-        switch (type) {
-            case ACCOUNT:
-                query.append("accountPolicy");
-                break;
 
-            case PASSWORD:
-                query.append("passwordPolicy");
-                break;
-
-            case PULL:
-                query.append("pullPolicy");
-                break;
-
-            default:
-                break;
+        if (AccountPolicy.class.isAssignableFrom(policyClass)) {
+            query.append("accountPolicy");
+        } else if (PasswordPolicy.class.isAssignableFrom(policyClass)) {
+            query.append("passwordPolicy");
+        } else if (PullPolicy.class.isAssignableFrom(policyClass)) {
+            query.append("pullPolicy");
         }
+
         return query;
     }
 
     @Override
     public List<ExternalResource> findByPolicy(final Policy policy) {
         TypedQuery<ExternalResource> query = entityManager().createQuery(
-                getByPolicyQuery(policy.getType()).append(" = :policy").toString(), ExternalResource.class);
+                getByPolicyQuery(policy.getClass()).append(" = :policy").toString(), ExternalResource.class);
         query.setParameter("policy", policy);
         return query.getResultList();
     }
 
     @Override
-    public List<ExternalResource> findWithoutPolicy(final PolicyType type) {
+    public List<ExternalResource> findWithoutPolicy(final Class<? extends Policy> policyClass) {
         TypedQuery<ExternalResource> query = entityManager().createQuery(
-                getByPolicyQuery(type).append(" IS NULL").toString(), ExternalResource.class);
+                getByPolicyQuery(policyClass).append(" IS NULL").toString(), ExternalResource.class);
         return query.getResultList();
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/31fea77b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPlainAttrDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPlainAttrDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPlainAttrDAO.java
index 2afbe15..0d17176 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPlainAttrDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPlainAttrDAO.java
@@ -35,7 +35,7 @@ import org.springframework.stereotype.Repository;
 @Repository
 public class JPAPlainAttrDAO extends AbstractDAO<PlainAttr<?>, Long> implements PlainAttrDAO {
 
-    public <T extends PlainAttr<?>> Class<? extends AbstractPlainAttr<?>> getJPAEntityReference(
+    public <T extends PlainAttr<?>> Class<? extends AbstractPlainAttr<?>> getEntityReference(
             final Class<T> reference) {
 
         return CPlainAttr.class.isAssignableFrom(reference)
@@ -51,7 +51,7 @@ public class JPAPlainAttrDAO extends AbstractDAO<PlainAttr<?>, Long> implements
 
     @Override
     public <T extends PlainAttr<?>> T find(final Long key, final Class<T> reference) {
-        return reference.cast(entityManager().find(getJPAEntityReference(reference), key));
+        return reference.cast(entityManager().find(getEntityReference(reference), key));
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/31fea77b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPlainAttrValueDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPlainAttrValueDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPlainAttrValueDAO.java
index 4b414be..62a25de 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPlainAttrValueDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPlainAttrValueDAO.java
@@ -46,7 +46,7 @@ import org.springframework.stereotype.Repository;
 public class JPAPlainAttrValueDAO extends AbstractDAO<PlainAttrValue, Long> implements PlainAttrValueDAO {
 
     @SuppressWarnings("unchecked")
-    private <T extends PlainAttrValue> Class<? extends AbstractPlainAttrValue> getJPAEntityReference(
+    private <T extends PlainAttrValue> Class<? extends AbstractPlainAttrValue> getEntityReference(
             final Class<T> reference) {
 
         return AbstractPlainAttrValue.class.isAssignableFrom(reference)
@@ -72,13 +72,13 @@ public class JPAPlainAttrValueDAO extends AbstractDAO<PlainAttrValue, Long> impl
 
     @Override
     public <T extends PlainAttrValue> T find(final Long key, final Class<T> reference) {
-        return reference.cast(entityManager().find(getJPAEntityReference(reference), key));
+        return reference.cast(entityManager().find(getEntityReference(reference), key));
     }
 
     @Override
     public <T extends PlainAttrValue> List<T> findAll(final Class<T> reference) {
         TypedQuery<T> query = entityManager().createQuery(
-                "SELECT e FROM " + getJPAEntityReference(reference).getSimpleName() + " e", reference);
+                "SELECT e FROM " + getEntityReference(reference).getSimpleName() + " e", reference);
         return query.getResultList();
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/31fea77b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPlainSchemaDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPlainSchemaDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPlainSchemaDAO.java
index 61b3dbd..8e9edcc 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPlainSchemaDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPlainSchemaDAO.java
@@ -74,7 +74,7 @@ public class JPAPlainSchemaDAO extends AbstractDAO<PlainSchema, String> implemen
     @Override
     public <T extends PlainAttr<?>> List<T> findAttrs(final PlainSchema schema, final Class<T> reference) {
         TypedQuery<T> query = entityManager().createQuery(
-                "SELECT e FROM " + ((JPAPlainAttrDAO) plainAttrDAO).getJPAEntityReference(reference).getSimpleName()
+                "SELECT e FROM " + ((JPAPlainAttrDAO) plainAttrDAO).getEntityReference(reference).getSimpleName()
                 + " e WHERE e.schema=:schema", reference);
         query.setParameter("schema", schema);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/31fea77b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPolicyDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPolicyDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPolicyDAO.java
index 4b89f8c..db216be 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPolicyDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPolicyDAO.java
@@ -19,9 +19,7 @@
 package org.apache.syncope.core.persistence.jpa.dao;
 
 import java.util.List;
-import javax.persistence.Query;
 import javax.persistence.TypedQuery;
-import org.apache.syncope.common.lib.types.PolicyType;
 import org.apache.syncope.core.persistence.api.dao.PolicyDAO;
 import org.apache.syncope.core.persistence.api.dao.RealmDAO;
 import org.apache.syncope.core.persistence.api.entity.policy.AccountPolicy;
@@ -29,8 +27,13 @@ import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
 import org.apache.syncope.core.persistence.api.entity.policy.PasswordPolicy;
 import org.apache.syncope.core.persistence.api.entity.Policy;
 import org.apache.syncope.core.persistence.api.entity.Realm;
+import org.apache.syncope.core.persistence.api.entity.policy.PullPolicy;
+import org.apache.syncope.core.persistence.api.entity.policy.PushPolicy;
 import org.apache.syncope.core.persistence.jpa.entity.policy.AbstractPolicy;
 import org.apache.syncope.core.persistence.jpa.entity.policy.JPAAccountPolicy;
+import org.apache.syncope.core.persistence.jpa.entity.policy.JPAPasswordPolicy;
+import org.apache.syncope.core.persistence.jpa.entity.policy.JPAPullPolicy;
+import org.apache.syncope.core.persistence.jpa.entity.policy.JPAPushPolicy;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Repository;
 
@@ -40,27 +43,30 @@ public class JPAPolicyDAO extends AbstractDAO<Policy, Long> implements PolicyDAO
     @Autowired
     private RealmDAO realmDAO;
 
-    @Override
+    private <T extends Policy> Class<? extends AbstractPolicy> getEntityReference(final Class<T> reference) {
+        return AccountPolicy.class.isAssignableFrom(reference)
+                ? JPAAccountPolicy.class
+                : PasswordPolicy.class.isAssignableFrom(reference)
+                ? JPAPasswordPolicy.class
+                : PullPolicy.class.isAssignableFrom(reference)
+                ? JPAPullPolicy.class
+                : PushPolicy.class.isAssignableFrom(reference)
+                ? JPAPushPolicy.class
+                : null;
+    }
+
     @SuppressWarnings("unchecked")
+    @Override
     public <T extends Policy> T find(final Long key) {
-        final Query query = entityManager().createQuery(
-                "SELECT e FROM " + AbstractPolicy.class.getSimpleName() + " e WHERE e.id=:id");
-        query.setParameter("id", key);
-
-        List<T> result = query.getResultList();
-        return result.isEmpty()
-                ? null
-                : result.iterator().next();
+        return (T) entityManager().find(AbstractPolicy.class, key);
     }
 
     @Override
-    @SuppressWarnings("unchecked")
-    public <T extends Policy> List<T> find(final PolicyType type) {
-        final Query query = entityManager().createQuery(
-                "SELECT e FROM " + AbstractPolicy.class.getSimpleName() + " e WHERE e.type=:type");
-        query.setParameter("type", type);
+    public <T extends Policy> List<T> find(final Class<T> reference) {
+        TypedQuery<T> query = entityManager().createQuery(
+                "SELECT e FROM " + getEntityReference(reference).getSimpleName() + " e", reference);
 
-        return (List<T>) query.getResultList();
+        return query.getResultList();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/31fea77b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARealmDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARealmDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARealmDAO.java
index 5100de8..d0a4782 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARealmDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARealmDAO.java
@@ -27,7 +27,6 @@ import org.apache.commons.collections4.IterableUtils;
 import org.apache.commons.collections4.Predicate;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.common.lib.SyncopeConstants;
-import org.apache.syncope.common.lib.types.PolicyType;
 import org.apache.syncope.core.persistence.api.dao.MalformedPathException;
 import org.apache.syncope.core.persistence.api.dao.RealmDAO;
 import org.apache.syncope.core.persistence.api.dao.RoleDAO;
@@ -35,6 +34,8 @@ import org.apache.syncope.core.persistence.api.entity.policy.AccountPolicy;
 import org.apache.syncope.core.persistence.api.entity.Policy;
 import org.apache.syncope.core.persistence.api.entity.Realm;
 import org.apache.syncope.core.persistence.api.entity.Role;
+import org.apache.syncope.core.persistence.api.entity.policy.PasswordPolicy;
+import org.apache.syncope.core.persistence.api.entity.policy.PullPolicy;
 import org.apache.syncope.core.persistence.jpa.entity.JPARealm;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Repository;
@@ -102,9 +103,9 @@ public class JPARealmDAO extends AbstractDAO<Realm, Long> implements RealmDAO {
         List<Realm> result = new ArrayList<>();
 
         for (Realm child : findChildren(realm)) {
-            if ((policy.getType() == PolicyType.ACCOUNT
+            if ((policy instanceof AccountPolicy
                     && child.getAccountPolicy() == null || policy.equals(child.getAccountPolicy()))
-                    || (policy.getType() == PolicyType.PASSWORD
+                    || (policy instanceof PasswordPolicy
                     && child.getPasswordPolicy() == null || policy.equals(child.getPasswordPolicy()))) {
 
                 result.add(child);
@@ -117,7 +118,7 @@ public class JPARealmDAO extends AbstractDAO<Realm, Long> implements RealmDAO {
 
     @Override
     public <T extends Policy> List<Realm> findByPolicy(final T policy) {
-        if (policy.getType() == PolicyType.PULL) {
+        if (PullPolicy.class.isAssignableFrom(policy.getClass())) {
             return Collections.<Realm>emptyList();
         }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/31fea77b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/AbstractPolicy.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/AbstractPolicy.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/AbstractPolicy.java
index 843bbcd..5b72758 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/AbstractPolicy.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/AbstractPolicy.java
@@ -19,13 +19,10 @@
 package org.apache.syncope.core.persistence.jpa.entity.policy;
 
 import javax.persistence.Entity;
-import javax.persistence.EnumType;
-import javax.persistence.Enumerated;
 import javax.persistence.Id;
 import javax.persistence.Inheritance;
 import javax.persistence.InheritanceType;
 import javax.validation.constraints.NotNull;
-import org.apache.syncope.common.lib.types.PolicyType;
 import org.apache.syncope.core.persistence.api.entity.Policy;
 import org.apache.syncope.core.persistence.jpa.entity.AbstractEntity;
 
@@ -41,10 +38,6 @@ public abstract class AbstractPolicy extends AbstractEntity<Long> implements Pol
     @NotNull
     private String description;
 
-    @NotNull
-    @Enumerated(EnumType.STRING)
-    protected PolicyType type;
-
     @Override
     public Long getKey() {
         return id;
@@ -59,9 +52,4 @@ public abstract class AbstractPolicy extends AbstractEntity<Long> implements Pol
     public void setDescription(final String description) {
         this.description = description;
     }
-
-    @Override
-    public PolicyType getType() {
-        return type;
-    }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/31fea77b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAAccountPolicy.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAAccountPolicy.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAAccountPolicy.java
index 146b127..f65adb4 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAAccountPolicy.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAAccountPolicy.java
@@ -36,7 +36,6 @@ import javax.validation.constraints.Min;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.Transformer;
 import org.apache.syncope.common.lib.policy.AccountRuleConf;
-import org.apache.syncope.common.lib.types.PolicyType;
 import org.apache.syncope.core.provisioning.api.utils.EntityUtils;
 import org.apache.syncope.core.persistence.api.entity.policy.AccountPolicy;
 import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
@@ -70,11 +69,6 @@ public class JPAAccountPolicy extends AbstractPolicy implements AccountPolicy {
             @JoinColumn(name = "resource_name"))
     private Set<JPAExternalResource> resources = new HashSet<>();
 
-    public JPAAccountPolicy() {
-        super();
-        this.type = PolicyType.ACCOUNT;
-    }
-
     @Override
     public boolean isPropagateSuspension() {
         return isBooleanAsInteger(propagateSuspension);

http://git-wip-us.apache.org/repos/asf/syncope/blob/31fea77b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAPasswordPolicy.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAPasswordPolicy.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAPasswordPolicy.java
index b6013fd..ba70562 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAPasswordPolicy.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAPasswordPolicy.java
@@ -31,7 +31,6 @@ import javax.validation.constraints.Min;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.Transformer;
 import org.apache.syncope.common.lib.policy.PasswordRuleConf;
-import org.apache.syncope.common.lib.types.PolicyType;
 import org.apache.syncope.core.persistence.api.entity.policy.PasswordPolicy;
 
 @Entity
@@ -52,11 +51,6 @@ public class JPAPasswordPolicy extends AbstractPolicy implements PasswordPolicy
     @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER, mappedBy = "passwordPolicy")
     private List<JPAPasswordRuleConfInstance> ruleConfs = new ArrayList<>();
 
-    public JPAPasswordPolicy() {
-        super();
-        this.type = PolicyType.PASSWORD;
-    }
-
     @Override
     public boolean isAllowNullPassword() {
         return isBooleanAsInteger(allowNullPassword);

http://git-wip-us.apache.org/repos/asf/syncope/blob/31fea77b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAPullPolicy.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAPullPolicy.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAPullPolicy.java
index c408b43..e5fb20f 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAPullPolicy.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAPullPolicy.java
@@ -22,7 +22,6 @@ import javax.persistence.Entity;
 import javax.persistence.Lob;
 import javax.persistence.Table;
 import org.apache.syncope.common.lib.policy.PullPolicySpec;
-import org.apache.syncope.common.lib.types.PolicyType;
 import org.apache.syncope.core.provisioning.api.serialization.POJOHelper;
 import org.apache.syncope.core.persistence.api.entity.policy.PullPolicy;
 
@@ -37,11 +36,6 @@ public class JPAPullPolicy extends AbstractPolicy implements PullPolicy {
     @Lob
     private String specification;
 
-    public JPAPullPolicy() {
-        super();
-        this.type = PolicyType.PULL;
-    }
-
     @Override
     public PullPolicySpec getSpecification() {
         return POJOHelper.deserialize(specification, PullPolicySpec.class);

http://git-wip-us.apache.org/repos/asf/syncope/blob/31fea77b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAPushPolicy.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAPushPolicy.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAPushPolicy.java
index 7b0c1ef..dcdfc1d 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAPushPolicy.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAPushPolicy.java
@@ -21,7 +21,6 @@ package org.apache.syncope.core.persistence.jpa.entity.policy;
 import javax.persistence.Entity;
 import javax.persistence.Lob;
 import javax.persistence.Table;
-import org.apache.syncope.common.lib.types.PolicyType;
 import org.apache.syncope.common.lib.policy.PushPolicySpec;
 import org.apache.syncope.core.provisioning.api.serialization.POJOHelper;
 import org.apache.syncope.core.persistence.api.entity.policy.PushPolicy;
@@ -37,11 +36,6 @@ public class JPAPushPolicy extends AbstractPolicy implements PushPolicy {
     @Lob
     private String specification;
 
-    public JPAPushPolicy() {
-        super();
-        this.type = PolicyType.PUSH;
-    }
-
     @Override
     public PushPolicySpec getSpecification() {
         return POJOHelper.deserialize(specification, PushPolicySpec.class);

http://git-wip-us.apache.org/repos/asf/syncope/blob/31fea77b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/PolicyTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/PolicyTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/PolicyTest.java
index 426a3de..a3be9bb 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/PolicyTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/PolicyTest.java
@@ -28,7 +28,6 @@ import java.util.List;
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.policy.DefaultPasswordRuleConf;
-import org.apache.syncope.common.lib.types.PolicyType;
 import org.apache.syncope.common.lib.policy.PullPolicySpec;
 import org.apache.syncope.core.provisioning.api.serialization.POJOHelper;
 import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
@@ -76,7 +75,7 @@ public class PolicyTest extends AbstractTest {
 
     @Test
     public void findByType() {
-        List<? extends Policy> policies = policyDAO.find(PolicyType.PULL);
+        List<PullPolicy> policies = policyDAO.find(PullPolicy.class);
         assertNotNull("findById did not work", policies);
         assertFalse(policies.isEmpty());
     }
@@ -99,7 +98,6 @@ public class PolicyTest extends AbstractTest {
         policy = policyDAO.save(policy);
 
         assertNotNull(policy);
-        assertEquals(PolicyType.PULL, policy.getType());
         assertEquals(pullURuleName,
                 policy.getSpecification().getCorrelationRules().get(anyTypeDAO.findUser().getKey()));
         assertEquals(pullGRuleName,
@@ -120,7 +118,6 @@ public class PolicyTest extends AbstractTest {
         policy = policyDAO.save(policy);
 
         assertNotNull(policy);
-        assertEquals(PolicyType.PASSWORD, policy.getType());
         assertEquals(((DefaultPasswordRuleConf) policy.getRuleConfs().get(1)).getMaxLength(), 8);
         assertEquals(((DefaultPasswordRuleConf) policy.getRuleConfs().get(1)).getMinLength(), 6);
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/31fea77b/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/resources/domains/MasterContent.xml b/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
index 44e82b8..24e3894 100644
--- a/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
+++ b/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
@@ -105,34 +105,28 @@ under the License.
                mandatoryCondition="false" multivalue="1" uniqueConstraint="0" readonly="0"/>
   
   <!-- sample policies -->
-  <PullPolicy id="1" description="a pull policy" type="PULL" 
-              specification='{"conflictResolutionAction":"IGNORE"}'/>
-  <PasswordPolicy id="2" description="a password policy" type="PASSWORD" 
-                  historyLength="1" allowNullPassword="1"/> 
+  <PullPolicy id="1" description="a pull policy" specification='{"conflictResolutionAction":"IGNORE"}'/>
+  <PasswordPolicy id="2" description="a password policy" historyLength="1" allowNullPassword="1"/> 
   <PasswordRuleConfInstance id="2" passwordPolicy_id="2"
                             serializedInstance='{"@class":"org.apache.syncope.common.lib.policy.DefaultPasswordRuleConf","maxLength":0,"minLength":8,"nonAlphanumericRequired":false,"alphanumericRequired":false,"digitRequired":false,"lowercaseRequired":false,"uppercaseRequired":false,"mustStartWithDigit":false,"mustntStartWithDigit":false,"mustEndWithDigit":false,"mustntEndWithDigit":false,"mustStartWithNonAlpha":false,"mustStartWithAlpha":false,"mustntStartWithNonAlpha":false,"mustntStartWithAlpha":false,"mustEndWithNonAlpha":false,"mustEndWithAlpha":false,"mustntEndWithNonAlpha":false,"mustntEndWithAlpha":false,"wordsNotPermitted":[],"schemasNotPermitted":[],"prefixesNotPermitted":["notpermitted1","notpermitted2"],"suffixesNotPermitted":[]}'/>
-  <PullPolicy id="3" description="pull policy 2" type="PULL" 
+  <PullPolicy id="3" description="pull policy 2"
               specification='{"conflictResolutionAction":"ALL","correlationRules":{"USER":"[\"username\",\"firstname\"]"}}'/>
-  <PasswordPolicy id="4" description="sample password policy" type="PASSWORD"
-                  historyLength="0"  allowNullPassword="1"/> 
+  <PasswordPolicy id="4" description="sample password policy" historyLength="0"  allowNullPassword="1"/> 
   <PasswordRuleConfInstance id="4" passwordPolicy_id="4"
                             serializedInstance='{"@class":"org.apache.syncope.common.lib.policy.DefaultPasswordRuleConf","maxLength":0,"minLength":10,"nonAlphanumericRequired":false,"alphanumericRequired":false,"digitRequired":true,"lowercaseRequired":false,"uppercaseRequired":false,"mustStartWithDigit":false,"mustntStartWithDigit":false,"mustEndWithDigit":false,"mustntEndWithDigit":false,"mustStartWithNonAlpha":false,"mustStartWithAlpha":false,"mustntStartWithNonAlpha":false,"mustntStartWithAlpha":false,"mustEndWithNonAlpha":false,"mustEndWithAlpha":false,"mustntEndWithNonAlpha":false,"mustntEndWithAlpha":false,"wordsNotPermitted":[],"schemasNotPermitted":[],"prefixesNotPermitted":["notpermitted1","notpermitted2"],"suffixesNotPermitted":[]}'/>
-  <AccountPolicy id="5" description="an account policy" type="ACCOUNT"
+  <AccountPolicy id="5" description="an account policy"
                  propagateSuspension="0" maxAuthenticationAttempts="0"/>
   <AccountRuleConfInstance id="5" accountPolicy_id="5"
                            serializedInstance='{"@class":"org.apache.syncope.common.lib.policy.DefaultAccountRuleConf","maxLength":0,"minLength":0,"pattern":null,"allUpperCase":false,"allLowerCase":false,"wordsNotPermitted":[],"schemasNotPermitted":[],"prefixesNotPermitted":[],"suffixesNotPermitted":[]}'/>
-  <AccountPolicy id="6" description="sample account policy" type="ACCOUNT"
+  <AccountPolicy id="6" description="sample account policy"
                  propagateSuspension="0" maxAuthenticationAttempts="3"/>
   <AccountRuleConfInstance id="6" accountPolicy_id="6"
                            serializedInstance='{"@class":"org.apache.syncope.common.lib.policy.DefaultAccountRuleConf","maxLength":0,"minLength":4,"pattern":null,"allUpperCase":false,"allLowerCase":false,"wordsNotPermitted":[],"schemasNotPermitted":[],"prefixesNotPermitted":["notpermitted1","notpermitted2"],"suffixesNotPermitted":[]}'/>
-  <PullPolicy id="7" description="pull policy 1" type="PULL" 
-              specification='{"conflictResolutionAction":"IGNORE"}'/>
-  <PasswordPolicy id="8" description="sample password policy" type="PASSWORD"
-                  historyLength="0" allowNullPassword="0"/> 
+  <PullPolicy id="7" description="pull policy 1" specification='{"conflictResolutionAction":"IGNORE"}'/>
+  <PasswordPolicy id="8" description="sample password policy" historyLength="0" allowNullPassword="0"/> 
   <PasswordRuleConfInstance id="8" passwordPolicy_id="8"
                             serializedInstance='{"@class":"org.apache.syncope.common.lib.policy.DefaultPasswordRuleConf","maxLength":0,"minLength":10,"nonAlphanumericRequired":true,"alphanumericRequired":false,"digitRequired":true,"lowercaseRequired":true,"uppercaseRequired":true,"mustStartWithDigit":true,"mustntStartWithDigit":false,"mustEndWithDigit":true,"mustntEndWithDigit":false,"mustStartWithNonAlpha":false,"mustStartWithAlpha":false,"mustntStartWithNonAlpha":false,"mustntStartWithAlpha":false,"mustEndWithNonAlpha":false,"mustEndWithAlpha":false,"mustntEndWithNonAlpha":false,"mustntEndWithAlpha":false,"wordsNotPermitted":[],"schemasNotPermitted":[],"prefixesNotPermitted":["notpermitted1","notpermitted2"],"suffixesNotPermitted":[]}'/>
-  <PullPolicy id="9" description="pull policy for java rule" type="PULL" 
-              specification='{"conflictResolutionAction":"IGNORE"}'/>
+  <PullPolicy id="9" description="pull policy for java rule" specification='{"conflictResolutionAction":"IGNORE"}'/>
 
   <RelationshipType name="inclusion" description="Models the act that an object is included in another"/>
   <RelationshipType name="neighborhood"/>

http://git-wip-us.apache.org/repos/asf/syncope/blob/31fea77b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/PolicyDataBinder.java
----------------------------------------------------------------------
diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/PolicyDataBinder.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/PolicyDataBinder.java
index 10ac492..cea03df 100644
--- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/PolicyDataBinder.java
+++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/PolicyDataBinder.java
@@ -23,7 +23,9 @@ import org.apache.syncope.core.persistence.api.entity.Policy;
 
 public interface PolicyDataBinder {
 
-    <T extends Policy> T getPolicy(T policy, AbstractPolicyTO policyTO);
+    <T extends Policy> T create(AbstractPolicyTO policyTO);
+
+    <T extends Policy> T update(T policy, AbstractPolicyTO policyTO);
 
     <T extends AbstractPolicyTO> T getPolicyTO(Policy policy);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/31fea77b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/PolicyDataBinderImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/PolicyDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/PolicyDataBinderImpl.java
index 92149c3..625f88d 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/PolicyDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/PolicyDataBinderImpl.java
@@ -57,135 +57,134 @@ public class PolicyDataBinderImpl implements PolicyDataBinder {
     @Autowired
     private EntityFactory entityFactory;
 
-    @SuppressWarnings("unchecked")
-    @Override
-    public <T extends AbstractPolicyTO> T getPolicyTO(final Policy policy) {
-        T policyTO;
-        switch (policy.getType()) {
-            case PASSWORD:
-                PasswordPolicy passwordPolicy = PasswordPolicy.class.cast(policy);
-                PasswordPolicyTO passwordPolicyTO = new PasswordPolicyTO();
-                policyTO = (T) passwordPolicyTO;
-
-                passwordPolicyTO.setAllowNullPassword(passwordPolicy.isAllowNullPassword());
-                passwordPolicyTO.setHistoryLength(passwordPolicy.getHistoryLength());
-
-                passwordPolicyTO.getRuleConfs().clear();
-                for (PasswordRuleConf ruleConf : passwordPolicy.getRuleConfs()) {
-                    passwordPolicyTO.getRuleConfs().add((AbstractPasswordRuleConf) ruleConf);
-                }
-                break;
-
-            case ACCOUNT:
-                AccountPolicy accountPolicy = AccountPolicy.class.cast(policy);
-                AccountPolicyTO accountPolicyTO = new AccountPolicyTO();
-                policyTO = (T) accountPolicyTO;
+    private void throwInvalidPolicy(final Policy policy, final AbstractPolicyTO policyTO) {
+        SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.InvalidPolicy);
+        sce.getElements().add(String.format("Cannot update %s from %s",
+                policy.getClass().getSimpleName(), policyTO.getClass().getSimpleName()));
+        throw sce;
+    }
 
-                accountPolicyTO.setMaxAuthenticationAttempts(accountPolicy.getMaxAuthenticationAttempts());
-                accountPolicyTO.setPropagateSuspension(accountPolicy.isPropagateSuspension());
+    @SuppressWarnings("unchecked")
+    private <T extends Policy> T getPolicy(final T policy, final AbstractPolicyTO policyTO) {
+        T result = policy;
 
-                accountPolicyTO.getRuleConfs().clear();
-                for (AccountRuleConf ruleConf : accountPolicy.getRuleConfs()) {
-                    accountPolicyTO.getRuleConfs().add((AbstractAccountRuleConf) ruleConf);
+        if (policyTO instanceof PasswordPolicyTO) {
+            if (result == null) {
+                result = (T) entityFactory.newEntity(PasswordPolicy.class);
+            } else if (!(policyTO instanceof PasswordPolicyTO)) {
+                throwInvalidPolicy(policy, policyTO);
+            }
+
+            PasswordPolicy passwordPolicy = PasswordPolicy.class.cast(result);
+            PasswordPolicyTO passwordPolicyTO = PasswordPolicyTO.class.cast(policyTO);
+
+            passwordPolicy.setAllowNullPassword(passwordPolicyTO.isAllowNullPassword());
+            passwordPolicy.setHistoryLength(passwordPolicyTO.getHistoryLength());
+
+            passwordPolicy.removeAllRuleConfs();
+            for (PasswordRuleConf conf : passwordPolicyTO.getRuleConfs()) {
+                passwordPolicy.add(conf);
+            }
+        } else if (policyTO instanceof AccountPolicyTO) {
+            if (result == null) {
+                result = (T) entityFactory.newEntity(AccountPolicy.class);
+            } else if (!(policyTO instanceof AccountPolicyTO)) {
+                throwInvalidPolicy(policy, policyTO);
+            }
+
+            AccountPolicy accountPolicy = AccountPolicy.class.cast(result);
+            AccountPolicyTO accountPolicyTO = AccountPolicyTO.class.cast(policyTO);
+
+            accountPolicy.setMaxAuthenticationAttempts(accountPolicyTO.getMaxAuthenticationAttempts());
+            accountPolicy.setPropagateSuspension(accountPolicyTO.isPropagateSuspension());
+
+            accountPolicy.removeAllRuleConfs();
+            for (AccountRuleConf conf : accountPolicyTO.getRuleConfs()) {
+                accountPolicy.add(conf);
+            }
+
+            accountPolicy.getResources().clear();
+            for (String resourceName : accountPolicyTO.getResources()) {
+                ExternalResource resource = resourceDAO.find(resourceName);
+                if (resource == null) {
+                    LOG.debug("Ignoring invalid resource {} ", resourceName);
+                } else {
+                    accountPolicy.add(resource);
                 }
+            }
+        } else if (policyTO instanceof PullPolicyTO) {
+            if (result == null) {
+                result = (T) entityFactory.newEntity(PullPolicy.class);
+            } else if (!(policyTO instanceof PullPolicyTO)) {
+                throwInvalidPolicy(policy, policyTO);
+            }
+
+            ((PullPolicy) result).setSpecification(((PullPolicyTO) policyTO).getSpecification());
+        }
 
-                accountPolicyTO.getResources().addAll(accountPolicy.getResourceNames());
-                break;
-
-            case PULL:
-            default:
-                policyTO = (T) new PullPolicyTO();
-                ((PullPolicyTO) policyTO).setSpecification(((PullPolicy) policy).getSpecification());
+        if (result != null) {
+            result.setDescription(policyTO.getDescription());
         }
 
-        policyTO.setKey(policy.getKey());
-        policyTO.setDescription(policy.getDescription());
+        return result;
+    }
 
-        for (ExternalResource resource : resourceDAO.findByPolicy(policy)) {
-            policyTO.getUsedByResources().add(resource.getKey());
-        }
-        for (Realm realm : realmDAO.findByPolicy(policy)) {
-            policyTO.getUsedByRealms().add(realm.getFullPath());
-        }
+    @Override
+    public <T extends Policy> T create(final AbstractPolicyTO policyTO) {
+        return getPolicy(null, policyTO);
+    }
 
-        return policyTO;
+    @Override
+    public <T extends Policy> T update(final T policy, final AbstractPolicyTO policyTO) {
+        return getPolicy(policy, policyTO);
     }
 
     @SuppressWarnings("unchecked")
     @Override
-    public <T extends Policy> T getPolicy(final T policy, final AbstractPolicyTO policyTO) {
-        if (policy != null && policy.getType() != policyTO.getType()) {
-            SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.InvalidPolicy);
-            sce.getElements().add(String.format("Cannot update %s from %s", policy.getType(), policyTO.getType()));
-            throw sce;
+    public <T extends AbstractPolicyTO> T getPolicyTO(final Policy policy) {
+        T policyTO = null;
+
+        if (policy instanceof PasswordPolicy) {
+            PasswordPolicy passwordPolicy = PasswordPolicy.class.cast(policy);
+            PasswordPolicyTO passwordPolicyTO = new PasswordPolicyTO();
+            policyTO = (T) passwordPolicyTO;
+
+            passwordPolicyTO.setAllowNullPassword(passwordPolicy.isAllowNullPassword());
+            passwordPolicyTO.setHistoryLength(passwordPolicy.getHistoryLength());
+
+            for (PasswordRuleConf ruleConf : passwordPolicy.getRuleConfs()) {
+                passwordPolicyTO.getRuleConfs().add((AbstractPasswordRuleConf) ruleConf);
+            }
+        } else if (policy instanceof AccountPolicy) {
+            AccountPolicy accountPolicy = AccountPolicy.class.cast(policy);
+            AccountPolicyTO accountPolicyTO = new AccountPolicyTO();
+            policyTO = (T) accountPolicyTO;
+
+            accountPolicyTO.setMaxAuthenticationAttempts(accountPolicy.getMaxAuthenticationAttempts());
+            accountPolicyTO.setPropagateSuspension(accountPolicy.isPropagateSuspension());
+
+            for (AccountRuleConf ruleConf : accountPolicy.getRuleConfs()) {
+                accountPolicyTO.getRuleConfs().add((AbstractAccountRuleConf) ruleConf);
+            }
+
+            accountPolicyTO.getResources().addAll(accountPolicy.getResourceNames());
+        } else if (policy instanceof PullPolicy) {
+            policyTO = (T) new PullPolicyTO();
+            ((PullPolicyTO) policyTO).setSpecification(((PullPolicy) policy).getSpecification());
         }
 
-        T result = policy;
-        switch (policyTO.getType()) {
-            case PASSWORD:
-                if (!(policyTO instanceof PasswordPolicyTO)) {
-                    throw new ClassCastException("Expected " + PasswordPolicyTO.class.getName()
-                            + ", found " + policyTO.getClass().getName());
-                }
-                if (result == null) {
-                    result = (T) entityFactory.newEntity(PasswordPolicy.class);
-                }
-                PasswordPolicy passwordPolicy = PasswordPolicy.class.cast(result);
-                PasswordPolicyTO passwordPolicyTO = PasswordPolicyTO.class.cast(policyTO);
-
-                passwordPolicy.setAllowNullPassword(passwordPolicyTO.isAllowNullPassword());
-                passwordPolicy.setHistoryLength(passwordPolicyTO.getHistoryLength());
-
-                passwordPolicy.removeAllRuleConfs();
-                for (PasswordRuleConf conf : passwordPolicyTO.getRuleConfs()) {
-                    passwordPolicy.add(conf);
-                }
-                break;
-
-            case ACCOUNT:
-                if (!(policyTO instanceof AccountPolicyTO)) {
-                    throw new ClassCastException("Expected " + AccountPolicyTO.class.getName()
-                            + ", found " + policyTO.getClass().getName());
-                }
-                if (result == null) {
-                    result = (T) entityFactory.newEntity(AccountPolicy.class);
-                }
-                AccountPolicy accountPolicy = AccountPolicy.class.cast(result);
-                AccountPolicyTO accountPolicyTO = AccountPolicyTO.class.cast(policyTO);
-
-                accountPolicy.setMaxAuthenticationAttempts(accountPolicyTO.getMaxAuthenticationAttempts());
-                accountPolicy.setPropagateSuspension(accountPolicyTO.isPropagateSuspension());
+        if (policyTO != null) {
+            policyTO.setKey(policy.getKey());
+            policyTO.setDescription(policy.getDescription());
 
-                accountPolicy.removeAllRuleConfs();
-                for (AccountRuleConf conf : accountPolicyTO.getRuleConfs()) {
-                    accountPolicy.add(conf);
-                }
-
-                accountPolicy.getResources().clear();
-                for (String resourceName : accountPolicyTO.getResources()) {
-                    ExternalResource resource = resourceDAO.find(resourceName);
-                    if (resource == null) {
-                        LOG.debug("Ignoring invalid resource {} ", resourceName);
-                    } else {
-                        accountPolicy.add(resource);
-                    }
-                }
-                break;
-
-            case PULL:
-            default:
-                if (!(policyTO instanceof PullPolicyTO)) {
-                    throw new ClassCastException("Expected " + PullPolicyTO.class.getName()
-                            + ", found " + policyTO.getClass().getName());
-                }
-                if (result == null) {
-                    result = (T) entityFactory.newEntity(PullPolicy.class);
-                }
-                ((PullPolicy) result).setSpecification(((PullPolicyTO) policyTO).getSpecification());
+            for (ExternalResource resource : resourceDAO.findByPolicy(policy)) {
+                policyTO.getUsedByResources().add(resource.getKey());
+            }
+            for (Realm realm : realmDAO.findByPolicy(policy)) {
+                policyTO.getUsedByRealms().add(realm.getFullPath());
+            }
         }
 
-        result.setDescription(policyTO.getDescription());
-
-        return result;
+        return policyTO;
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/31fea77b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/PolicyServiceImpl.java
----------------------------------------------------------------------
diff --git a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/PolicyServiceImpl.java b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/PolicyServiceImpl.java
index 2e7be27..95fe255 100644
--- a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/PolicyServiceImpl.java
+++ b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/PolicyServiceImpl.java
@@ -22,9 +22,6 @@ import java.net.URI;
 import java.util.List;
 import javax.ws.rs.core.Response;
 import org.apache.syncope.common.lib.policy.AbstractPolicyTO;
-import org.apache.syncope.common.lib.policy.AccountPolicyTO;
-import org.apache.syncope.common.lib.policy.PasswordPolicyTO;
-import org.apache.syncope.common.lib.policy.PullPolicyTO;
 import org.apache.syncope.common.lib.types.PolicyType;
 import org.apache.syncope.common.rest.api.RESTHeaders;
 import org.apache.syncope.common.rest.api.service.PolicyService;
@@ -64,21 +61,6 @@ public class PolicyServiceImpl extends AbstractServiceImpl implements PolicyServ
 
     @Override
     public void update(final AbstractPolicyTO policyTO) {
-        switch (policyTO.getType()) {
-            case ACCOUNT:
-                logic.update((AccountPolicyTO) policyTO);
-                break;
-
-            case PASSWORD:
-                logic.update((PasswordPolicyTO) policyTO);
-                break;
-
-            case PULL:
-                logic.update((PullPolicyTO) policyTO);
-                break;
-
-            default:
-                break;
-        }
+        logic.update(policyTO);
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/31fea77b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PolicyITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PolicyITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PolicyITCase.java
index 10f0f56..6df4935 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PolicyITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PolicyITCase.java
@@ -113,7 +113,6 @@ public class PolicyITCase extends AbstractITCase {
         PullPolicyTO policyTO = createPolicy(policy);
 
         assertNotNull(policyTO);
-        assertEquals(PolicyType.PULL, policyTO.getType());
         assertEquals(TestPullRule.class.getName(),
                 policyTO.getSpecification().getCorrelationRules().get(AnyTypeKind.USER.name()));
     }
@@ -137,7 +136,6 @@ public class PolicyITCase extends AbstractITCase {
         policy = policyService.read(policy.getKey());
 
         assertNotNull(policy);
-        assertEquals(PolicyType.PASSWORD, policy.getType());
         assertEquals(22, ((DefaultPasswordRuleConf) policy.getRuleConfs().get(0)).getMaxLength());
         assertEquals(8, ((DefaultPasswordRuleConf) policy.getRuleConfs().get(0)).getMinLength());
     }