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 2012/10/22 15:20:53 UTC

svn commit: r1400870 - in /incubator/syncope/trunk/core/src/main/java/org/apache/syncope/core: propagation/ConnectorFacadeProxy.java scheduling/SyncJob.java

Author: ilgrosso
Date: Mon Oct 22 13:20:53 2012
New Revision: 1400870

URL: http://svn.apache.org/viewvc?rev=1400870&view=rev
Log:
[SYNCOPE-186] More preliminary refactoring and cleaning

Modified:
    incubator/syncope/trunk/core/src/main/java/org/apache/syncope/core/propagation/ConnectorFacadeProxy.java
    incubator/syncope/trunk/core/src/main/java/org/apache/syncope/core/scheduling/SyncJob.java

Modified: incubator/syncope/trunk/core/src/main/java/org/apache/syncope/core/propagation/ConnectorFacadeProxy.java
URL: http://svn.apache.org/viewvc/incubator/syncope/trunk/core/src/main/java/org/apache/syncope/core/propagation/ConnectorFacadeProxy.java?rev=1400870&r1=1400869&r2=1400870&view=diff
==============================================================================
--- incubator/syncope/trunk/core/src/main/java/org/apache/syncope/core/propagation/ConnectorFacadeProxy.java (original)
+++ incubator/syncope/trunk/core/src/main/java/org/apache/syncope/core/propagation/ConnectorFacadeProxy.java Mon Oct 22 13:20:53 2012
@@ -256,13 +256,15 @@ public class ConnectorFacadeProxy {
     /**
      * Sync users from a connector instance.
      *
+     * @param objectClass ConnId's object class.
      * @param token to be passed to the underlying connector
      * @param handler to be used to handle deltas.
      */
-    public void sync(final SyncToken token, final SyncResultsHandler handler, final OperationOptions options) {
+    public void sync(final ObjectClass objectClass, final SyncToken token, final SyncResultsHandler handler,
+            final OperationOptions options) {
 
         if (activeConnInstance.getCapabilities().contains(ConnectorCapability.SYNC)) {
-            connector.sync(ObjectClass.ACCOUNT, token, handler, options);
+            connector.sync(objectClass, token, handler, options);
         } else {
             LOG.info("Sync was attempted, although the connector only has these capabilities: {}. No action.",
                     activeConnInstance.getCapabilities());
@@ -272,13 +274,14 @@ public class ConnectorFacadeProxy {
     /**
      * Read latest sync token from a connector instance.
      *
+     * @param objectClass ConnId's object class.
      * @return latest sync token
      */
-    public SyncToken getLatestSyncToken() {
+    public SyncToken getLatestSyncToken(final ObjectClass objectClass) {
         SyncToken result = null;
 
         if (activeConnInstance.getCapabilities().contains(ConnectorCapability.SYNC)) {
-            result = connector.getLatestSyncToken(ObjectClass.ACCOUNT);
+            result = connector.getLatestSyncToken(objectClass);
         } else {
             LOG.info("getLatestSyncToken was attempted, although the "
                     + "connector only has these capabilities: {}. No action.", activeConnInstance.getCapabilities());
@@ -296,7 +299,6 @@ public class ConnectorFacadeProxy {
      * @return ConnId's connector object for given uid
      */
     public ConnectorObject getObject(final ObjectClass objectClass, final Uid uid, final OperationOptions options) {
-
         return getObject(null, null, objectClass, uid, options);
     }
 
@@ -448,11 +450,7 @@ public class ConnectorFacadeProxy {
         try {
             for (ObjectClassInfo info : schema.getObjectClassInfo()) {
                 for (AttributeInfo attrInfo : info.getAttributeInfo()) {
-                    if (showall
-                            || (!Name.NAME.equals(attrInfo.getName())
-                            && !OperationalAttributes.PASSWORD_NAME.equals(attrInfo.getName()) && !OperationalAttributes.ENABLE_NAME.
-                            equals(attrInfo.getName()))) {
-
+                    if (showall || !isSpecialName(attrInfo.getName())) {
                         resourceSchemaNames.add(attrInfo.getName());
                     }
                 }
@@ -479,12 +477,6 @@ public class ConnectorFacadeProxy {
         connector.test();
     }
 
-    @Override
-    public String toString() {
-        return "ConnectorFacadeProxy{connector=" + connector + "capabitilies="
-                + activeConnInstance.getCapabilities() + '}';
-    }
-
     /**
      * Getter for active connector instance.
      *
@@ -562,4 +554,14 @@ public class ConnectorFacadeProxy {
 
         return value;
     }
+
+    private boolean isSpecialName(final String name) {
+        return (name.startsWith("__") && name.endsWith("__"));
+    }
+
+    @Override
+    public String toString() {
+        return "ConnectorFacadeProxy{"
+                + "connector=" + connector + "\n" + "capabitilies=" + activeConnInstance.getCapabilities() + '}';
+    }
 }

Modified: incubator/syncope/trunk/core/src/main/java/org/apache/syncope/core/scheduling/SyncJob.java
URL: http://svn.apache.org/viewvc/incubator/syncope/trunk/core/src/main/java/org/apache/syncope/core/scheduling/SyncJob.java?rev=1400870&r1=1400869&r2=1400870&view=diff
==============================================================================
--- incubator/syncope/trunk/core/src/main/java/org/apache/syncope/core/scheduling/SyncJob.java (original)
+++ incubator/syncope/trunk/core/src/main/java/org/apache/syncope/core/scheduling/SyncJob.java Mon Oct 22 13:20:53 2012
@@ -19,6 +19,7 @@
 package org.apache.syncope.core.scheduling;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
@@ -61,7 +62,6 @@ import org.apache.syncope.types.SyncPoli
 import org.apache.syncope.types.TraceLevel;
 import org.identityconnectors.framework.common.objects.Attribute;
 import org.identityconnectors.framework.common.objects.AttributeUtil;
-import org.identityconnectors.framework.common.objects.ConnectorObject;
 import org.identityconnectors.framework.common.objects.ObjectClass;
 import org.identityconnectors.framework.common.objects.OperationalAttributes;
 import org.identityconnectors.framework.common.objects.SyncDelta;
@@ -168,29 +168,70 @@ public class SyncJob extends AbstractTas
         // ---------------------------------
         // Get sync policy specification
         // ---------------------------------
-        final SyncPolicy policy = syncTask.getResource().getSyncPolicy();
-        final SyncPolicySpec policySpec = policy != null
-                ? (SyncPolicySpec) policy.getSpecification()
-                : null;
+        SyncPolicySpec policySpec = null;
+        if (syncTask.getResource().getSyncPolicy() != null) {
+            policySpec = (SyncPolicySpec) syncTask.getResource().getSyncPolicy().getSpecification();
+        }
         // ---------------------------------
 
         final List<Long> result = new ArrayList<Long>();
 
-        if (policySpec != null && !policySpec.getAlternativeSearchAttrs().isEmpty()) {
+        if (policySpec == null || policySpec.getAlternativeSearchAttrs().isEmpty()) {
+            SyncopeUser found;
+            List<SyncopeUser> users;
+
+            final SchemaMapping accountIdMap =
+                    SchemaMappingUtil.getAccountIdMapping(syncTask.getResource().getMappings());
+            switch (accountIdMap.getIntMappingType()) {
+                case Username:
+                    found = userDAO.find(uid);
+                    if (found != null) {
+                        result.add(found.getId());
+                    }
+                    break;
 
-            // search external attribute name/value
-            // about each specified name
-            final ConnectorObject object = delta.getObject();
+                case SyncopeUserId:
+                    found = userDAO.find(Long.parseLong(uid));
+                    if (found != null) {
+                        result.add(found.getId());
+                    }
+                    break;
+
+                case UserSchema:
+                    final UAttrValue value = new UAttrValue();
+                    value.setStringValue(uid);
+                    users = userDAO.findByAttrValue(accountIdMap.getIntAttrName(), value);
+                    for (SyncopeUser user : users) {
+                        result.add(user.getId());
+                    }
+                    break;
+
+                case UserDerivedSchema:
+                    try {
+                        users = userDAO.findByDerAttrValue(accountIdMap.getIntAttrName(), uid);
+                        for (SyncopeUser user : users) {
+                            result.add(user.getId());
+                        }
+                    } catch (InvalidSearchConditionException e) {
+                        LOG.error("Could not search for matching users", e);
+                    }
+                    break;
+
+                default:
+                    LOG.error("Invalid accountId type '{}'", accountIdMap.getIntMappingType());
+            }
+        } else {
+            // search for external attribute's name/value of each specified name
 
             final Map<String, Attribute> extValues = new HashMap<String, Attribute>();
 
             for (SchemaMapping mapping : syncTask.getResource().getMappings()) {
-                extValues.put(SchemaMappingUtil.getIntAttrName(mapping), object.getAttributeByName(SchemaMappingUtil
-                        .getExtAttrName(mapping)));
+                extValues.put(SchemaMappingUtil.getIntAttrName(mapping),
+                        delta.getObject().getAttributeByName(SchemaMappingUtil.getExtAttrName(mapping)));
             }
 
-            // search user by attributes specified into the policy
-            NodeCond searchCondition = null;
+            // search for user by attribute(s) specified in the policy
+            NodeCond searchCond = null;
 
             for (String schema : policySpec.getAlternativeSearchAttrs()) {
                 Attribute value = extValues.get(schema);
@@ -208,19 +249,16 @@ public class SyncJob extends AbstractTas
                 }
 
                 NodeCond nodeCond;
-
                 // just Username or SyncopeUserId can be selected to be used
                 if ("id".equalsIgnoreCase(schema) || "username".equalsIgnoreCase(schema)) {
-
-                    final SyncopeUserCond cond = new SyncopeUserCond();
+                    SyncopeUserCond cond = new SyncopeUserCond();
                     cond.setSchema(schema);
                     cond.setType(type);
                     cond.setExpression(expression);
 
                     nodeCond = NodeCond.getLeafCond(cond);
-
                 } else {
-                    final AttributeCond cond = new AttributeCond();
+                    AttributeCond cond = new AttributeCond();
                     cond.setSchema(schema);
                     cond.setType(type);
                     cond.setExpression(expression);
@@ -228,75 +266,26 @@ public class SyncJob extends AbstractTas
                     nodeCond = NodeCond.getLeafCond(cond);
                 }
 
-                searchCondition = searchCondition != null
-                        ? NodeCond.getAndCond(searchCondition, nodeCond)
-                        : nodeCond;
+                searchCond = searchCond == null
+                        ? nodeCond
+                        : NodeCond.getAndCond(searchCond, nodeCond);
             }
 
-            List<SyncopeUser> users = userSearchDAO.search(EntitlementUtil.getRoleIds(entitlementDAO.findAll()),
-                    searchCondition);
+            final List<SyncopeUser> users =
+                    userSearchDAO.search(EntitlementUtil.getRoleIds(entitlementDAO.findAll()), searchCond);
             for (SyncopeUser user : users) {
                 result.add(user.getId());
             }
-        } else {
-            final SyncopeUser found;
-            List<SyncopeUser> users;
-
-            final SchemaMapping accountIdMap = SchemaMappingUtil.getAccountIdMapping(syncTask.getResource()
-                    .getMappings());
-
-            switch (accountIdMap.getIntMappingType()) {
-                case Username:
-                    found = userDAO.find(uid);
-                    if (found != null) {
-                        result.add(found.getId());
-                    }
-                    break;
-
-                case SyncopeUserId:
-                    found = userDAO.find(Long.parseLong(uid));
-                    if (found != null) {
-                        result.add(found.getId());
-                    }
-                    break;
-
-                case UserSchema:
-                    final UAttrValue value = new UAttrValue();
-                    value.setStringValue(uid);
-                    users = userDAO.findByAttrValue(accountIdMap.getIntAttrName(), value);
-                    for (SyncopeUser user : users) {
-                        result.add(user.getId());
-                    }
-                    break;
-
-                case UserDerivedSchema:
-                    try {
-                        users = userDAO.findByDerAttrValue(accountIdMap.getIntAttrName(), uid);
-                        for (SyncopeUser user : users) {
-                            result.add(user.getId());
-                        }
-                    } catch (InvalidSearchConditionException e) {
-                        LOG.error("Could not search for matching users", e);
-                    }
-                    break;
-
-                default:
-                    LOG.error("Invalid accountId type '{}'", accountIdMap.getIntMappingType());
-            }
         }
 
         return result;
     }
 
-    /**
-     * Creates user and stores the result in parameter delta (!)
-     *
-     * @param delta
-     * @param dryRun
-     * @return
-     * @throws JobExecutionException
-     */
-    private SyncResult createUser(SyncDelta delta, final boolean dryRun) throws JobExecutionException {
+    private List<SyncResult> createUser(SyncDelta delta, final boolean dryRun) throws JobExecutionException {
+        if (!((SyncTask) task).isPerformCreate()) {
+            LOG.debug("SyncTask not configured for create");
+            return Collections.EMPTY_LIST;
+        }
 
         final SyncResult result = new SyncResult();
         result.setOperation(Operation.CREATE);
@@ -352,20 +341,21 @@ public class SyncJob extends AbstractTas
         }
 
         actions.after(delta, userTO, result);
-
-        return result;
+        return Collections.singletonList(result);
     }
 
-    private void updateUsers(SyncDelta delta, final List<Long> users, final boolean dryRun,
-            final List<SyncResult> results) throws JobExecutionException {
+    private List<SyncResult> updateUsers(SyncDelta delta, final List<Long> users, final boolean dryRun)
+            throws JobExecutionException {
 
         if (!((SyncTask) task).isPerformUpdate()) {
             LOG.debug("SyncTask not configured for update");
-            return;
+            return Collections.EMPTY_LIST;
         }
 
         LOG.debug("About to update {}", users);
 
+        List<SyncResult> results = new ArrayList<SyncResult>();
+
         for (Long userId : users) {
             final SyncResult result = new SyncResult();
             result.setOperation(Operation.UPDATE);
@@ -411,18 +401,22 @@ public class SyncJob extends AbstractTas
                 LOG.error("Not allowed to read user {}", userId, e);
             }
         }
+
+        return results;
     }
 
-    private void deleteUsers(SyncDelta delta, final List<Long> users, final boolean dryRun,
-            final List<SyncResult> results) throws JobExecutionException {
+    private List<SyncResult> deleteUsers(SyncDelta delta, final List<Long> users, final boolean dryRun)
+            throws JobExecutionException {
 
         if (!((SyncTask) task).isPerformDelete()) {
             LOG.debug("SyncTask not configured for delete");
-            return;
+            return Collections.EMPTY_LIST;
         }
 
         LOG.debug("About to delete {}", users);
 
+        List<SyncResult> results = new ArrayList<SyncResult>();
+
         for (Long userId : users) {
             try {
                 UserTO userTO = userDataBinder.getUserTO(userId);
@@ -463,6 +457,8 @@ public class SyncJob extends AbstractTas
                 LOG.error("Not allowed to read user {}", userId, e);
             }
         }
+
+        return results;
     }
 
     /**
@@ -535,8 +531,7 @@ public class SyncJob extends AbstractTas
             }
         }
 
-        // Summary, also to be included for FAILURE and ALL, so create it
-        // anyway.
+        // Summary, also to be included for FAILURE and ALL, so create it anyway.
         report.append("Users [created/failures]: ").append(created.size()).append('/').append(createdFailed.size())
                 .append(' ').append("[updated/failures]: ").append(updated.size()).append('/').append(
                 updatedFailed.size()).append(' ').append("[deleted/ failures]: ").append(deleted.size())
@@ -629,48 +624,24 @@ public class SyncJob extends AbstractTas
         try {
             final SyncPolicy syncPolicy = syncTask.getResource().getSyncPolicy();
 
-            final ConflictResolutionAction conflictResolutionAction = syncPolicy != null
-                    && syncPolicy.getSpecification() != null
-                    ? ((SyncPolicySpec) syncPolicy.getSpecification()).getConflictResolutionAction()
-                    : ConflictResolutionAction.IGNORE;
+            final ConflictResolutionAction resAct = syncPolicy == null || syncPolicy.getSpecification() == null
+                    ? ConflictResolutionAction.IGNORE
+                    : ((SyncPolicySpec) syncPolicy.getSpecification()).getConflictResolutionAction();
 
+            final SyncJobResultsHandler handler = new SyncJobResultsHandler(results, syncTask, resAct, dryRun);
             if (syncTask.isFullReconciliation()) {
-                connector.getAllObjects(ObjectClass.ACCOUNT, new SyncResultsHandler() {
-
-                    @Override
-                    public boolean handle(final SyncDelta delta) {
-                        try {
-                            results.addAll(handleDelta(syncTask, delta, conflictResolutionAction, dryRun));
-                            return true;
-                        } catch (JobExecutionException e) {
-                            LOG.error("Reconciliation failed", e);
-                            return false;
-                        }
-                    }
-                }, connector.getOperationOptions(syncTask.getResource()));
+                connector.getAllObjects(ObjectClass.ACCOUNT, handler,
+                        connector.getOperationOptions(syncTask.getResource()));
             } else {
-                connector.sync(syncTask.getResource().getSyncToken(), new SyncResultsHandler() {
-
-                    @Override
-                    public boolean handle(final SyncDelta delta) {
-                        try {
-
-                            results.addAll(handleDelta(syncTask, delta, conflictResolutionAction, dryRun));
-                            return true;
-                        } catch (JobExecutionException e) {
-                            LOG.error("Synchronization failed", e);
-                            return false;
-                        }
-                    }
-                }, connector.getOperationOptions(syncTask.getResource()));
+                connector.sync(ObjectClass.ACCOUNT, syncTask.getResource().getSyncToken(), handler,
+                        connector.getOperationOptions(syncTask.getResource()));
             }
 
             if (!dryRun && !syncTask.isFullReconciliation()) {
                 try {
                     ExternalResource resource = resourceDAO.find(syncTask.getResource().getName());
-                    resource.setSyncToken(connector.getLatestSyncToken());
+                    resource.setSyncToken(connector.getLatestSyncToken(ObjectClass.ACCOUNT));
                     resourceDAO.save(resource);
-
                 } catch (Exception e) {
                     throw new JobExecutionException("While updating SyncToken", e);
                 }
@@ -693,13 +664,13 @@ public class SyncJob extends AbstractTas
      *
      * @param syncTask sync task.
      * @param delta delta.
-     * @param conflictResolutionAction conflict resolution action.
+     * @param resAct conflict resolution action.
      * @param dryRun dry run.
      * @return list of synchronization results.
      * @throws JobExecutionException in case of synchronization failure.
      */
     protected final List<SyncResult> handleDelta(final SyncTask syncTask, final SyncDelta delta,
-            final ConflictResolutionAction conflictResolutionAction, final boolean dryRun) throws JobExecutionException {
+            final ConflictResolutionAction resAct, final boolean dryRun) throws JobExecutionException {
 
         final List<SyncResult> results = new ArrayList<SyncResult>();
 
@@ -710,29 +681,25 @@ public class SyncJob extends AbstractTas
         switch (delta.getDeltaType()) {
             case CREATE_OR_UPDATE:
                 if (users.isEmpty()) {
-                    if (syncTask.isPerformCreate()) {
-                        results.add(createUser(delta, dryRun));
-                    } else {
-                        LOG.debug("SyncTask not configured for create");
-                    }
+                    results.addAll(createUser(delta, dryRun));
                 } else if (users.size() == 1) {
-                    updateUsers(delta, users.subList(0, 1), dryRun, results);
+                    results.addAll(updateUsers(delta, users.subList(0, 1), dryRun));
                 } else {
-                    switch (conflictResolutionAction) {
+                    switch (resAct) {
                         case IGNORE:
                             LOG.error("More than one match {}", users);
                             break;
 
                         case FIRSTMATCH:
-                            updateUsers(delta, users.subList(0, 1), dryRun, results);
+                            results.addAll(updateUsers(delta, users.subList(0, 1), dryRun));
                             break;
 
                         case LASTMATCH:
-                            updateUsers(delta, users.subList(users.size() - 1, users.size()), dryRun, results);
+                            results.addAll(updateUsers(delta, users.subList(users.size() - 1, users.size()), dryRun));
                             break;
 
                         case ALL:
-                            updateUsers(delta, users, dryRun, results);
+                            results.addAll(updateUsers(delta, users, dryRun));
                             break;
 
                         default:
@@ -744,23 +711,23 @@ public class SyncJob extends AbstractTas
                 if (users.isEmpty()) {
                     LOG.debug("No match found for deletion");
                 } else if (users.size() == 1) {
-                    deleteUsers(delta, users, dryRun, results);
+                    results.addAll(deleteUsers(delta, users, dryRun));
                 } else {
-                    switch (conflictResolutionAction) {
+                    switch (resAct) {
                         case IGNORE:
                             LOG.error("More than one match {}", users);
                             break;
 
                         case FIRSTMATCH:
-                            deleteUsers(delta, users.subList(0, 1), dryRun, results);
+                            results.addAll(deleteUsers(delta, users.subList(0, 1), dryRun));
                             break;
 
                         case LASTMATCH:
-                            deleteUsers(delta, users.subList(users.size() - 1, users.size()), dryRun, results);
+                            results.addAll(deleteUsers(delta, users.subList(users.size() - 1, users.size()), dryRun));
                             break;
 
                         case ALL:
-                            deleteUsers(delta, users, dryRun, results);
+                            results.addAll(deleteUsers(delta, users, dryRun));
                             break;
 
                         default:
@@ -775,17 +742,44 @@ public class SyncJob extends AbstractTas
         return results;
     }
 
-    /**
-     * {@inheritDoc}
-     */
     @Override
     protected boolean hasToBeRegistered(final TaskExec execution) {
         SyncTask syncTask = (SyncTask) task;
 
-        // True if either failed and failures have to be registered, or if ALL
-        // has to be registered.
-        return (Status.valueOf(execution.getStatus()) == Status.FAILURE && syncTask.getResource().getSyncTraceLevel()
-                .ordinal() >= TraceLevel.FAILURES.ordinal())
+        // True if either failed and failures have to be registered, or if ALL has to be registered.
+        return (Status.valueOf(execution.getStatus()) == Status.FAILURE
+                && syncTask.getResource().getSyncTraceLevel().ordinal() >= TraceLevel.FAILURES.ordinal())
                 || syncTask.getResource().getSyncTraceLevel() == TraceLevel.ALL;
     }
+
+    private class SyncJobResultsHandler implements SyncResultsHandler {
+
+        private final Collection<SyncResult> results;
+
+        private final SyncTask syncTask;
+
+        private final ConflictResolutionAction resAct;
+
+        private final boolean dryRun;
+
+        public SyncJobResultsHandler(final Collection<SyncResult> results, final SyncTask syncTask,
+                final ConflictResolutionAction resAct, final boolean dryRun) {
+
+            this.results = results;
+            this.syncTask = syncTask;
+            this.resAct = resAct;
+            this.dryRun = dryRun;
+        }
+
+        @Override
+        public boolean handle(final SyncDelta delta) {
+            try {
+                results.addAll(handleDelta(syncTask, delta, resAct, dryRun));
+                return true;
+            } catch (JobExecutionException e) {
+                LOG.error("Synchronization failed", e);
+                return false;
+            }
+        }
+    }
 }