You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by fm...@apache.org on 2015/09/10 14:37:51 UTC

[21/26] syncope git commit: [SYNCOPE-665] Implementation completed

http://git-wip-us.apache.org/repos/asf/syncope/blob/00988759/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/TaskDataBinderImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/TaskDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/TaskDataBinderImpl.java
index 2295753..32a095b 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/TaskDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/TaskDataBinderImpl.java
@@ -23,22 +23,19 @@ import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.Predicate;
 import org.apache.syncope.core.provisioning.api.data.TaskDataBinder;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.to.AbstractProvisioningTaskTO;
 import org.apache.syncope.common.lib.to.AbstractTaskTO;
 import org.apache.syncope.common.lib.to.AnyTO;
-import org.apache.syncope.common.lib.to.AttrTO;
 import org.apache.syncope.common.lib.to.PropagationTaskTO;
 import org.apache.syncope.common.lib.to.PushTaskTO;
-import org.apache.syncope.common.lib.to.GroupTO;
 import org.apache.syncope.common.lib.to.SchedTaskTO;
 import org.apache.syncope.common.lib.to.SyncTaskTO;
 import org.apache.syncope.common.lib.to.TaskExecTO;
-import org.apache.syncope.common.lib.to.UserTO;
 import org.apache.syncope.common.lib.types.ClientExceptionType;
 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.misc.TemplateUtils;
 import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
 import org.apache.syncope.core.persistence.api.dao.NotFoundException;
 import org.apache.syncope.core.persistence.api.dao.TaskExecDAO;
@@ -53,14 +50,14 @@ import org.apache.syncope.core.persistence.api.entity.task.TaskExec;
 import org.apache.syncope.core.persistence.api.entity.task.TaskUtils;
 import org.apache.syncope.core.provisioning.api.job.JobNamer;
 import org.apache.syncope.core.misc.spring.BeanUtils;
-import org.apache.syncope.core.misc.jexl.JexlUtils;
 import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
 import org.apache.syncope.core.persistence.api.dao.RealmDAO;
 import org.apache.syncope.core.persistence.api.entity.AnyType;
 import org.apache.syncope.core.persistence.api.entity.EntityFactory;
 import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
 import org.apache.syncope.core.persistence.api.entity.task.AnyFilter;
-import org.apache.syncope.core.persistence.api.entity.task.AnyTemplate;
+import org.apache.syncope.core.persistence.api.entity.AnyTemplate;
+import org.apache.syncope.core.persistence.api.entity.task.AnyTemplateSyncTask;
 import org.apache.syncope.core.provisioning.java.sync.PushJobDelegate;
 import org.apache.syncope.core.provisioning.java.sync.SyncJobDelegate;
 import org.quartz.Scheduler;
@@ -99,50 +96,10 @@ public class TaskDataBinderImpl implements TaskDataBinder {
     private EntityFactory entityFactory;
 
     @Autowired
-    private SchedulerFactoryBean scheduler;
-
-    private void checkTemplateJEXL(final SyncTaskTO syncTaskTO) {
-        SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.InvalidSyncTask);
-
-        for (Map.Entry<String, AnyTO> entry : syncTaskTO.getTemplates().entrySet()) {
-            for (AttrTO attrTO : entry.getValue().getPlainAttrs()) {
-                if (!attrTO.getValues().isEmpty() && !JexlUtils.isExpressionValid(attrTO.getValues().get(0))) {
-                    sce.getElements().add("Invalid JEXL: " + attrTO.getValues().get(0));
-                }
-            }
-
-            for (AttrTO attrTO : entry.getValue().getVirAttrs()) {
-                if (!attrTO.getValues().isEmpty() && !JexlUtils.isExpressionValid(attrTO.getValues().get(0))) {
-                    sce.getElements().add("Invalid JEXL: " + attrTO.getValues().get(0));
-                }
-            }
-
-            if (entry.getValue() instanceof UserTO) {
-                UserTO template = (UserTO) entry.getValue();
-                if (StringUtils.isNotBlank(template.getUsername())
-                        && !JexlUtils.isExpressionValid(template.getUsername())) {
-
-                    sce.getElements().add("Invalid JEXL: " + template.getUsername());
-                }
-                if (StringUtils.isNotBlank(template.getPassword())
-                        && !JexlUtils.isExpressionValid(template.getPassword())) {
+    private TemplateUtils templateUtils;
 
-                    sce.getElements().add("Invalid JEXL: " + template.getPassword());
-                }
-            } else if (entry.getValue() instanceof GroupTO) {
-                GroupTO template = (GroupTO) entry.getValue();
-                if (StringUtils.isNotBlank(template.getName())
-                        && !JexlUtils.isExpressionValid(template.getName())) {
-
-                    sce.getElements().add("Invalid JEXL: " + template.getName());
-                }
-            }
-        }
-
-        if (!sce.isEmpty()) {
-            throw sce;
-        }
-    }
+    @Autowired
+    private SchedulerFactoryBean scheduler;
 
     private void fill(final ProvisioningTask task, final AbstractProvisioningTaskTO taskTO) {
         if (task instanceof PushTask && taskTO instanceof PushTaskTO) {
@@ -193,15 +150,15 @@ public class TaskDataBinderImpl implements TaskDataBinder {
                     ? UnmatchingRule.PROVISION : syncTaskTO.getUnmatchingRule());
 
             // validate JEXL expressions from templates and proceed if fine
-            checkTemplateJEXL(syncTaskTO);
+            templateUtils.check(syncTaskTO.getTemplates(), ClientExceptionType.InvalidSyncTask);
             for (Map.Entry<String, AnyTO> entry : syncTaskTO.getTemplates().entrySet()) {
                 AnyType type = anyTypeDAO.find(entry.getKey());
                 if (type == null) {
                     LOG.debug("Invalid AnyType {} specified, ignoring...", entry.getKey());
                 } else {
-                    AnyTemplate anyTemplate = syncTask.getTemplate(type);
+                    AnyTemplateSyncTask anyTemplate = syncTask.getTemplate(type);
                     if (anyTemplate == null) {
-                        anyTemplate = entityFactory.newEntity(AnyTemplate.class);
+                        anyTemplate = entityFactory.newEntity(AnyTemplateSyncTask.class);
                         anyTemplate.setAnyType(type);
                         anyTemplate.setSyncTask(syncTask);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/00988759/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java
index 5589fa8..ca801f0 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java
@@ -161,9 +161,7 @@ public class UserDataBinderImpl extends AbstractAnyDataBinder implements UserDat
             AnyObject anyObject = anyObjectDAO.find(relationshipTO.getRightKey());
 
             if (anyObject == null) {
-                if (LOG.isDebugEnabled()) {
-                    LOG.debug("Ignoring invalid anyObject " + relationshipTO.getRightKey());
-                }
+                LOG.debug("Ignoring invalid anyObject " + relationshipTO.getRightKey());
             } else {
                 URelationship relationship = null;
                 if (user.getKey() != null) {
@@ -184,9 +182,7 @@ public class UserDataBinderImpl extends AbstractAnyDataBinder implements UserDat
             Group group = groupDAO.find(membershipTO.getRightKey());
 
             if (group == null) {
-                if (LOG.isDebugEnabled()) {
-                    LOG.debug("Ignoring invalid group " + membershipTO.getGroupName());
-                }
+                LOG.debug("Ignoring invalid group " + membershipTO.getGroupName());
             } else {
                 UMembership membership = null;
                 if (user.getKey() != null) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/00988759/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/AbstractSyncResultHandler.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/AbstractSyncResultHandler.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/AbstractSyncResultHandler.java
index c69a0d6..a97a3ca 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/AbstractSyncResultHandler.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/AbstractSyncResultHandler.java
@@ -36,7 +36,6 @@ import org.apache.syncope.core.provisioning.api.sync.SyncActions;
 import org.apache.syncope.core.misc.security.DelegatedAdministrationException;
 import org.apache.syncope.core.persistence.api.entity.AnyUtils;
 import org.apache.syncope.core.persistence.api.entity.resource.Provision;
-import org.apache.syncope.core.provisioning.api.AnyTransformer;
 import org.apache.syncope.core.provisioning.api.sync.IgnoreProvisionException;
 import org.apache.syncope.core.provisioning.api.sync.ProvisioningResult;
 import org.apache.syncope.core.provisioning.api.sync.SyncopeSyncResultHandler;
@@ -53,9 +52,6 @@ public abstract class AbstractSyncResultHandler extends AbstractSyncopeResultHan
     @Autowired
     protected SyncUtils syncUtilities;
 
-    @Autowired
-    protected AnyTransformer anyTransformer;
-
     protected abstract String getName(AnyTO anyTO);
 
     protected abstract AnyTO doCreate(AnyTO anyTO, SyncDelta delta, ProvisioningResult result);
@@ -115,22 +111,17 @@ public abstract class AbstractSyncResultHandler extends AbstractSyncopeResultHan
         result.setOperation(ResourceOperation.CREATE);
         result.setAnyType(provision.getAnyType().getKey());
         result.setStatus(ProvisioningResult.Status.SUCCESS);
-
-        // Any transformation (if configured)
-        AnyTO transformed = anyTransformer.transform(anyTO);
-        LOG.debug("Transformed: {}", transformed);
-
-        result.setName(getName(transformed));
+        result.setName(getName(anyTO));
 
         if (profile.isDryRun()) {
             result.setKey(0L);
         } else {
             SyncDelta actionedDelta = delta;
             for (SyncActions action : profile.getActions()) {
-                actionedDelta = action.beforeAssign(this.getProfile(), actionedDelta, transformed);
+                actionedDelta = action.beforeAssign(this.getProfile(), actionedDelta, anyTO);
             }
 
-            create(transformed, actionedDelta, UnmatchingRule.toEventName(UnmatchingRule.ASSIGN), result);
+            create(anyTO, actionedDelta, UnmatchingRule.toEventName(UnmatchingRule.ASSIGN), result);
         }
 
         return Collections.singletonList(result);
@@ -147,26 +138,21 @@ public abstract class AbstractSyncResultHandler extends AbstractSyncopeResultHan
 
         AnyTO anyTO = connObjectUtils.getAnyTO(delta.getObject(), profile.getTask(), provision, anyUtils);
 
-        // Any transformation (if configured)
-        AnyTO transformed = anyTransformer.transform(anyTO);
-        LOG.debug("Transformed: {}", transformed);
-
         ProvisioningResult result = new ProvisioningResult();
         result.setOperation(ResourceOperation.CREATE);
         result.setAnyType(provision.getAnyType().getKey());
         result.setStatus(ProvisioningResult.Status.SUCCESS);
-
-        result.setName(getName(transformed));
+        result.setName(getName(anyTO));
 
         if (profile.isDryRun()) {
             result.setKey(0L);
         } else {
             SyncDelta actionedDelta = delta;
             for (SyncActions action : profile.getActions()) {
-                actionedDelta = action.beforeProvision(this.getProfile(), actionedDelta, transformed);
+                actionedDelta = action.beforeProvision(this.getProfile(), actionedDelta, anyTO);
             }
 
-            create(transformed, actionedDelta, UnmatchingRule.toEventName(UnmatchingRule.PROVISION), result);
+            create(anyTO, actionedDelta, UnmatchingRule.toEventName(UnmatchingRule.PROVISION), result);
         }
 
         return Collections.<ProvisioningResult>singletonList(result);
@@ -264,10 +250,6 @@ public abstract class AbstractSyncResultHandler extends AbstractSyncopeResultHan
                                 provision,
                                 getAnyUtils());
 
-                        // Attribute value transformation (if configured)
-                        AnyMod actual = anyTransformer.transform(anyMod);
-                        LOG.debug("Transformed: {}", actual);
-
                         for (SyncActions action : profile.getActions()) {
                             workingDelta = action.beforeUpdate(this.getProfile(), workingDelta, before, anyMod);
                         }

http://git-wip-us.apache.org/repos/asf/syncope/blob/00988759/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/DBPasswordSyncActions.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/DBPasswordSyncActions.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/DBPasswordSyncActions.java
index 5615876..ad08a92 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/DBPasswordSyncActions.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/DBPasswordSyncActions.java
@@ -59,10 +59,10 @@ public class DBPasswordSyncActions extends DefaultSyncActions {
 
     @Transactional(readOnly = true)
     @Override
-    public <T extends AnyTO> SyncDelta beforeProvision(
+    public <A extends AnyTO> SyncDelta beforeProvision(
             final ProvisioningProfile<?, ?> profile,
             final SyncDelta delta,
-            final T any) throws JobExecutionException {
+            final A any) throws JobExecutionException {
 
         if (any instanceof UserTO) {
             String password = ((UserTO) any).getPassword();
@@ -74,11 +74,11 @@ public class DBPasswordSyncActions extends DefaultSyncActions {
 
     @Transactional(readOnly = true)
     @Override
-    public <T extends AnyTO, K extends AnyMod> SyncDelta beforeUpdate(
+    public <A extends AnyTO, M extends AnyMod> SyncDelta beforeUpdate(
             final ProvisioningProfile<?, ?> profile,
             final SyncDelta delta,
-            final T any,
-            final K anyMod) throws JobExecutionException {
+            final A any,
+            final M anyMod) throws JobExecutionException {
 
         if (anyMod instanceof UserMod) {
             String modPassword = ((UserMod) anyMod).getPassword();
@@ -123,10 +123,10 @@ public class DBPasswordSyncActions extends DefaultSyncActions {
 
     @Transactional(readOnly = true)
     @Override
-    public <T extends AnyTO> void after(
+    public <A extends AnyTO> void after(
             final ProvisioningProfile<?, ?> profile,
             final SyncDelta delta,
-            final T any,
+            final A any,
             final ProvisioningResult result) throws JobExecutionException {
 
         if (any instanceof UserTO && encodedPassword != null && cipher != null) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/00988759/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/DefaultPushActions.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/DefaultPushActions.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/DefaultPushActions.java
index 14da889..a99b3e5 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/DefaultPushActions.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/DefaultPushActions.java
@@ -34,58 +34,58 @@ public abstract class DefaultPushActions implements PushActions {
     }
 
     @Override
-    public <T extends Any<?, ?, ?>> T beforeAssign(final ProvisioningProfile<?, ?> profile, final T any)
+    public <A extends Any<?, ?, ?>> A beforeAssign(final ProvisioningProfile<?, ?> profile, final A any)
             throws JobExecutionException {
 
         return any;
     }
 
     @Override
-    public <T extends Any<?, ?, ?>> T beforeProvision(final ProvisioningProfile<?, ?> profile, final T any)
+    public <A extends Any<?, ?, ?>> A beforeProvision(final ProvisioningProfile<?, ?> profile, final A any)
             throws JobExecutionException {
 
         return any;
     }
 
     @Override
-    public <T extends Any<?, ?, ?>> T beforeLink(final ProvisioningProfile<?, ?> profile, final T any)
+    public <A extends Any<?, ?, ?>> A beforeLink(final ProvisioningProfile<?, ?> profile, final A any)
             throws JobExecutionException {
 
         return any;
     }
 
     @Override
-    public <T extends Any<?, ?, ?>> T beforeUnassign(final ProvisioningProfile<?, ?> profile, final T any)
+    public <A extends Any<?, ?, ?>> A beforeUnassign(final ProvisioningProfile<?, ?> profile, final A any)
             throws JobExecutionException {
 
         return any;
     }
 
     @Override
-    public <T extends Any<?, ?, ?>> T beforeDeprovision(final ProvisioningProfile<?, ?> profile, final T any)
+    public <A extends Any<?, ?, ?>> A beforeDeprovision(final ProvisioningProfile<?, ?> profile, final A any)
             throws JobExecutionException {
 
         return any;
     }
 
     @Override
-    public <T extends Any<?, ?, ?>> T beforeUnlink(final ProvisioningProfile<?, ?> profile, final T any)
+    public <A extends Any<?, ?, ?>> A beforeUnlink(final ProvisioningProfile<?, ?> profile, final A any)
             throws JobExecutionException {
 
         return any;
     }
 
     @Override
-    public <T extends Any<?, ?, ?>> void onError(
-            final ProvisioningProfile<?, ?> profile, final T any, final ProvisioningResult result,
+    public <A extends Any<?, ?, ?>> void onError(
+            final ProvisioningProfile<?, ?> profile, final A any, final ProvisioningResult result,
             final Exception error) throws JobExecutionException {
 
         // do nothing
     }
 
     @Override
-    public <T extends Any<?, ?, ?>> void after(
-            final ProvisioningProfile<?, ?> profile, final T any, final ProvisioningResult result)
+    public <A extends Any<?, ?, ?>> void after(
+            final ProvisioningProfile<?, ?> profile, final A any, final ProvisioningResult result)
             throws JobExecutionException {
 
         // do nothing

http://git-wip-us.apache.org/repos/asf/syncope/blob/00988759/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/DefaultSyncActions.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/DefaultSyncActions.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/DefaultSyncActions.java
index 29d7662..668584b 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/DefaultSyncActions.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/DefaultSyncActions.java
@@ -36,66 +36,66 @@ public abstract class DefaultSyncActions implements SyncActions {
     }
 
     @Override
-    public <T extends AnyTO, K extends AnyMod> SyncDelta beforeUpdate(
+    public <A extends AnyTO, M extends AnyMod> SyncDelta beforeUpdate(
             final ProvisioningProfile<?, ?> profile,
             final SyncDelta delta,
-            final T any,
-            final K anyMod) throws JobExecutionException {
+            final A any,
+            final M anyMod) throws JobExecutionException {
 
         return delta;
     }
 
     @Override
-    public <T extends AnyTO> SyncDelta beforeDelete(
-            final ProvisioningProfile<?, ?> profile, final SyncDelta delta, final T any)
+    public <A extends AnyTO> SyncDelta beforeDelete(
+            final ProvisioningProfile<?, ?> profile, final SyncDelta delta, final A any)
             throws JobExecutionException {
 
         return delta;
     }
 
     @Override
-    public <T extends AnyTO> SyncDelta beforeAssign(
-            final ProvisioningProfile<?, ?> profile, final SyncDelta delta, final T any)
+    public <A extends AnyTO> SyncDelta beforeAssign(
+            final ProvisioningProfile<?, ?> profile, final SyncDelta delta, final A any)
             throws JobExecutionException {
 
         return delta;
     }
 
     @Override
-    public <T extends AnyTO> SyncDelta beforeProvision(
-            final ProvisioningProfile<?, ?> profile, final SyncDelta delta, final T any)
+    public <A extends AnyTO> SyncDelta beforeProvision(
+            final ProvisioningProfile<?, ?> profile, final SyncDelta delta, final A any)
             throws JobExecutionException {
 
         return delta;
     }
 
     @Override
-    public <T extends AnyTO> SyncDelta beforeLink(
-            final ProvisioningProfile<?, ?> profile, final SyncDelta delta, final T any)
+    public <A extends AnyTO> SyncDelta beforeLink(
+            final ProvisioningProfile<?, ?> profile, final SyncDelta delta, final A any)
             throws JobExecutionException {
 
         return delta;
     }
 
     @Override
-    public <T extends AnyTO> SyncDelta beforeUnassign(
-            final ProvisioningProfile<?, ?> profile, final SyncDelta delta, final T any)
+    public <A extends AnyTO> SyncDelta beforeUnassign(
+            final ProvisioningProfile<?, ?> profile, final SyncDelta delta, final A any)
             throws JobExecutionException {
 
         return delta;
     }
 
     @Override
-    public <T extends AnyTO> SyncDelta beforeDeprovision(
-            final ProvisioningProfile<?, ?> profile, final SyncDelta delta, final T any)
+    public <A extends AnyTO> SyncDelta beforeDeprovision(
+            final ProvisioningProfile<?, ?> profile, final SyncDelta delta, final A any)
             throws JobExecutionException {
 
         return delta;
     }
 
     @Override
-    public <T extends AnyTO> SyncDelta beforeUnlink(
-            final ProvisioningProfile<?, ?> profile, final SyncDelta delta, final T any)
+    public <A extends AnyTO> SyncDelta beforeUnlink(
+            final ProvisioningProfile<?, ?> profile, final SyncDelta delta, final A any)
             throws JobExecutionException {
 
         return delta;
@@ -108,8 +108,8 @@ public abstract class DefaultSyncActions implements SyncActions {
     }
 
     @Override
-    public <T extends AnyTO> void after(
-            final ProvisioningProfile<?, ?> profile, final SyncDelta delta, final T any,
+    public <A extends AnyTO> void after(
+            final ProvisioningProfile<?, ?> profile, final SyncDelta delta, final A any,
             final ProvisioningResult result)
             throws JobExecutionException {
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/00988759/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/LDAPMembershipSyncActions.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/LDAPMembershipSyncActions.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/LDAPMembershipSyncActions.java
index 873232f..cf4fb17 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/LDAPMembershipSyncActions.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/LDAPMembershipSyncActions.java
@@ -129,9 +129,9 @@ public class LDAPMembershipSyncActions extends DefaultSyncActions {
      * {@inheritDoc}
      */
     @Override
-    public <T extends AnyTO, K extends AnyMod> SyncDelta beforeUpdate(
+    public <A extends AnyTO, M extends AnyMod> SyncDelta beforeUpdate(
             final ProvisioningProfile<?, ?> profile,
-            final SyncDelta delta, final T any, final K anyMod) throws JobExecutionException {
+            final SyncDelta delta, final A any, final M anyMod) throws JobExecutionException {
 
         if (any instanceof GroupTO) {
             // search for all users assigned to given group
@@ -293,10 +293,10 @@ public class LDAPMembershipSyncActions extends DefaultSyncActions {
      * {@inheritDoc}
      */
     @Override
-    public <T extends AnyTO> void after(
+    public <A extends AnyTO> void after(
             final ProvisioningProfile<?, ?> profile,
             final SyncDelta delta,
-            final T any,
+            final A any,
             final ProvisioningResult result) throws JobExecutionException {
 
         if (!(profile.getTask() instanceof SyncTask)) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/00988759/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/LDAPPasswordSyncActions.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/LDAPPasswordSyncActions.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/LDAPPasswordSyncActions.java
index 32f660e..b35e42f 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/LDAPPasswordSyncActions.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/LDAPPasswordSyncActions.java
@@ -53,10 +53,10 @@ public class LDAPPasswordSyncActions extends DefaultSyncActions {
 
     @Transactional(readOnly = true)
     @Override
-    public <T extends AnyTO> SyncDelta beforeProvision(
+    public <A extends AnyTO> SyncDelta beforeProvision(
             final ProvisioningProfile<?, ?> profile,
             final SyncDelta delta,
-            final T any) throws JobExecutionException {
+            final A any) throws JobExecutionException {
 
         if (any instanceof UserTO) {
             String password = ((UserTO) any).getPassword();
@@ -68,11 +68,11 @@ public class LDAPPasswordSyncActions extends DefaultSyncActions {
 
     @Transactional(readOnly = true)
     @Override
-    public <T extends AnyTO, K extends AnyMod> SyncDelta beforeUpdate(
+    public <A extends AnyTO, M extends AnyMod> SyncDelta beforeUpdate(
             final ProvisioningProfile<?, ?> profile,
             final SyncDelta delta,
-            final T any,
-            final K anyMod) throws JobExecutionException {
+            final A any,
+            final M anyMod) throws JobExecutionException {
 
         if (anyMod instanceof UserMod) {
             String modPassword = ((UserMod) anyMod).getPassword();
@@ -101,10 +101,10 @@ public class LDAPPasswordSyncActions extends DefaultSyncActions {
 
     @Transactional(readOnly = true)
     @Override
-    public <T extends AnyTO> void after(
+    public <A extends AnyTO> void after(
             final ProvisioningProfile<?, ?> profile,
             final SyncDelta delta,
-            final T any,
+            final A any,
             final ProvisioningResult result) throws JobExecutionException {
 
         if (any instanceof UserTO && encodedPassword != null && cipher != null) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/00988759/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/SyncJobDelegate.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/SyncJobDelegate.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/SyncJobDelegate.java
index 3b9dc70..3f19afc 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/SyncJobDelegate.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/SyncJobDelegate.java
@@ -107,7 +107,7 @@ public class SyncJobDelegate extends AbstractProvisioningJobDelegate<SyncTask> {
 
                 actions.add(syncActions);
             } catch (Exception e) {
-                LOG.info("Class '{}' not found", className, e);
+                LOG.warn("Class '{}' not found", className, e);
             }
         }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/00988759/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/DoubleValueAnyTransformer.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/DoubleValueAnyTransformer.java b/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/DoubleValueAnyTransformer.java
deleted file mode 100644
index b92d976..0000000
--- a/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/DoubleValueAnyTransformer.java
+++ /dev/null
@@ -1,75 +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.fit.core.reference;
-
-import java.util.ArrayList;
-import java.util.List;
-import org.apache.syncope.common.lib.mod.AnyMod;
-import org.apache.syncope.common.lib.mod.AttrMod;
-import org.apache.syncope.common.lib.to.AnyTO;
-import org.apache.syncope.common.lib.to.AttrTO;
-import org.apache.syncope.core.provisioning.api.AnyTransformer;
-
-/**
- * Class for integration tests: transform (by making it double) any attribute value for defined schema.
- */
-public class DoubleValueAnyTransformer implements AnyTransformer {
-
-    private static final String NAME = "makeItDouble";
-
-    @Override
-    public <T extends AnyTO> T transform(final T input) {
-        for (AttrTO attr : input.getPlainAttrs()) {
-            if (NAME.equals(attr.getSchema())) {
-                List<String> values = new ArrayList<>(attr.getValues().size());
-                for (String value : attr.getValues()) {
-                    try {
-                        values.add(String.valueOf(2 * Long.valueOf(value)));
-                    } catch (NumberFormatException e) {
-                        // ignore
-                    }
-                }
-                attr.getValues().clear();
-                attr.getValues().addAll(values);
-            }
-        }
-
-        return input;
-    }
-
-    @Override
-    public <T extends AnyMod> T transform(final T input) {
-        for (AttrMod attr : input.getPlainAttrsToUpdate()) {
-            if (NAME.equals(attr.getSchema())) {
-                List<String> values = new ArrayList<>(attr.getValuesToBeAdded().size());
-                for (String value : attr.getValuesToBeAdded()) {
-                    try {
-                        values.add(String.valueOf(2 * Long.valueOf(value)));
-                    } catch (NumberFormatException e) {
-                        // ignore
-                    }
-                }
-                attr.getValuesToBeAdded().clear();
-                attr.getValuesToBeAdded().addAll(values);
-            }
-        }
-
-        return input;
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/00988759/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/DoubleValueLogicActions.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/DoubleValueLogicActions.java b/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/DoubleValueLogicActions.java
new file mode 100644
index 0000000..1544969
--- /dev/null
+++ b/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/DoubleValueLogicActions.java
@@ -0,0 +1,75 @@
+/*
+ * 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.fit.core.reference;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.syncope.common.lib.mod.AnyMod;
+import org.apache.syncope.common.lib.mod.AttrMod;
+import org.apache.syncope.common.lib.to.AnyTO;
+import org.apache.syncope.common.lib.to.AttrTO;
+import org.apache.syncope.core.provisioning.java.DefaultLogicActions;
+
+/**
+ * Class for integration tests: transform (by making it double) any attribute value for defined schema.
+ */
+public class DoubleValueLogicActions extends DefaultLogicActions {
+
+    private static final String NAME = "makeItDouble";
+
+    @Override
+    public <A extends AnyTO> A beforeCreate(final A input) {
+        for (AttrTO attr : input.getPlainAttrs()) {
+            if (NAME.equals(attr.getSchema())) {
+                List<String> values = new ArrayList<>(attr.getValues().size());
+                for (String value : attr.getValues()) {
+                    try {
+                        values.add(String.valueOf(2 * Long.valueOf(value)));
+                    } catch (NumberFormatException e) {
+                        // ignore
+                    }
+                }
+                attr.getValues().clear();
+                attr.getValues().addAll(values);
+            }
+        }
+
+        return input;
+    }
+
+    @Override
+    public <M extends AnyMod> M beforeUpdate(final M input) {
+        for (AttrMod attr : input.getPlainAttrsToUpdate()) {
+            if (NAME.equals(attr.getSchema())) {
+                List<String> values = new ArrayList<>(attr.getValuesToBeAdded().size());
+                for (String value : attr.getValuesToBeAdded()) {
+                    try {
+                        values.add(String.valueOf(2 * Long.valueOf(value)));
+                    } catch (NumberFormatException e) {
+                        // ignore
+                    }
+                }
+                attr.getValuesToBeAdded().clear();
+                attr.getValuesToBeAdded().addAll(values);
+            }
+        }
+
+        return input;
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/00988759/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/TestSyncActions.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/TestSyncActions.java b/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/TestSyncActions.java
index 8974c82..9852612 100644
--- a/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/TestSyncActions.java
+++ b/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/TestSyncActions.java
@@ -38,8 +38,8 @@ public class TestSyncActions extends DefaultSyncActions {
     private int counter = 0;
 
     @Override
-    public <T extends AnyTO> SyncDelta beforeProvision(
-            final ProvisioningProfile<?, ?> profile, final SyncDelta delta, final T any)
+    public <A extends AnyTO> SyncDelta beforeProvision(
+            final ProvisioningProfile<?, ?> profile, final SyncDelta delta, final A any)
             throws JobExecutionException {
 
         AttrTO attrTO = null;
@@ -61,8 +61,8 @@ public class TestSyncActions extends DefaultSyncActions {
     }
 
     @Override
-    public <T extends AnyTO> SyncDelta beforeAssign(
-            final ProvisioningProfile<?, ?> profile, final SyncDelta delta, final T any)
+    public <A extends AnyTO> SyncDelta beforeAssign(
+            final ProvisioningProfile<?, ?> profile, final SyncDelta delta, final A any)
             throws JobExecutionException {
 
         if (any instanceof UserTO && "test2".equals(UserTO.class.cast(any).getUsername())) {
@@ -73,11 +73,11 @@ public class TestSyncActions extends DefaultSyncActions {
     }
 
     @Override
-    public <T extends AnyTO, K extends AnyMod> SyncDelta beforeUpdate(
+    public <A extends AnyTO, M extends AnyMod> SyncDelta beforeUpdate(
             final ProvisioningProfile<?, ?> profile,
             final SyncDelta delta,
-            final T any,
-            final K anyMod) throws JobExecutionException {
+            final A any,
+            final M anyMod) throws JobExecutionException {
 
         anyMod.getPlainAttrsToRemove().add("fullname");
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/00988759/fit/core-reference/src/main/resources/logic.properties
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/main/resources/logic.properties b/fit/core-reference/src/main/resources/logic.properties
index 7ff308d..4af398a 100644
--- a/fit/core-reference/src/main/resources/logic.properties
+++ b/fit/core-reference/src/main/resources/logic.properties
@@ -14,5 +14,4 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-anyTransformer=org.apache.syncope.fit.core.reference.DoubleValueAnyTransformer
 logicInvocationHandler=org.apache.syncope.core.logic.LogicInvocationHandler

http://git-wip-us.apache.org/repos/asf/syncope/blob/00988759/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/UserITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/UserITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/UserITCase.java
index 375f0d7..ccb24ab 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/UserITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/UserITCase.java
@@ -491,12 +491,12 @@ public class UserITCase extends AbstractITCase {
 
         userTO = createUser(userTO);
 
-        long id = userTO.getKey();
+        long key = userTO.getKey();
 
-        userTO = deleteUser(id);
+        userTO = deleteUser(key);
 
         assertNotNull(userTO);
-        assertEquals(id, userTO.getKey());
+        assertEquals(key, userTO.getKey());
         assertTrue(userTO.getPlainAttrs().isEmpty());
 
         // check for propagation result
@@ -2070,7 +2070,13 @@ public class UserITCase extends AbstractITCase {
 
     @Test
     public void issueSYNCOPE420() {
+        RealmTO realm = realmService.list("/even/two").iterator().next();
+        assertNotNull(realm);
+        realm.getActionsClassNames().add(DoubleValueLogicActions.class.getName());
+        realmService.update(realm);
+
         UserTO userTO = getUniqueSampleTO("syncope420@syncope.apache.org");
+        userTO.setRealm(realm.getFullPath());
         userTO.getPlainAttrs().add(attrTO("makeItDouble", "3"));
 
         userTO = createUser(userTO);

http://git-wip-us.apache.org/repos/asf/syncope/blob/00988759/installer/src/main/java/org/apache/syncope/installer/processes/BaseProcess.java
----------------------------------------------------------------------
diff --git a/installer/src/main/java/org/apache/syncope/installer/processes/BaseProcess.java b/installer/src/main/java/org/apache/syncope/installer/processes/BaseProcess.java
index c1846cc..6c691cc 100644
--- a/installer/src/main/java/org/apache/syncope/installer/processes/BaseProcess.java
+++ b/installer/src/main/java/org/apache/syncope/installer/processes/BaseProcess.java
@@ -18,8 +18,6 @@
  */
 package org.apache.syncope.installer.processes;
 
-import static org.apache.syncope.installer.processes.ArchetypeProcess.PROPERTIES;
-
 import com.izforge.izpack.panels.process.AbstractUIProcessHandler;
 import java.io.IOException;
 import java.io.InputStream;