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;
+ }
+ }
+ }
}