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 2013/01/03 17:29:00 UTC

svn commit: r1428455 - in /syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core: persistence/beans/ persistence/beans/user/ policy/ propagation/ rest/controller/ util/ workflow/

Author: ilgrosso
Date: Thu Jan  3 16:29:00 2013
New Revision: 1428455

URL: http://svn.apache.org/viewvc?rev=1428455&view=rev
Log:
[SYNCOPE-260] Alternative, less intrusive fix

Removed:
    syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/persistence/beans/Attributable.java
Modified:
    syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/persistence/beans/AbstractAttr.java
    syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/persistence/beans/AbstractAttributable.java
    syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/persistence/beans/user/UAttr.java
    syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/policy/AccountPolicyEnforcer.java
    syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/propagation/PropagationManager.java
    syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/rest/controller/UserController.java
    syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/util/SchemaMappingUtil.java
    syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/workflow/ActivitiUserWorkflowAdapter.java
    syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/workflow/NoOpUserWorkflowAdapter.java

Modified: syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/persistence/beans/AbstractAttr.java
URL: http://svn.apache.org/viewvc/syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/persistence/beans/AbstractAttr.java?rev=1428455&r1=1428454&r2=1428455&view=diff
==============================================================================
--- syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/persistence/beans/AbstractAttr.java (original)
+++ syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/persistence/beans/AbstractAttr.java Thu Jan  3 16:29:00 2013
@@ -74,13 +74,13 @@ public abstract class AbstractAttr exten
 
     public List<String> getValuesAsStrings() {
         List<String> result;
-        if (getUniqueValue() != null) {
-            result = Collections.singletonList(getUniqueValue().getValueAsString());
-        } else {
+        if (getUniqueValue() == null) {
             result = new ArrayList<String>(getValues().size());
             for (AbstractAttrValue attributeValue : getValues()) {
                 result.add(attributeValue.getValueAsString());
             }
+        } else {
+            result = Collections.singletonList(getUniqueValue().getValueAsString());
         }
 
         return result;

Modified: syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/persistence/beans/AbstractAttributable.java
URL: http://svn.apache.org/viewvc/syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/persistence/beans/AbstractAttributable.java?rev=1428455&r1=1428454&r2=1428455&view=diff
==============================================================================
--- syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/persistence/beans/AbstractAttributable.java (original)
+++ syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/persistence/beans/AbstractAttributable.java Thu Jan  3 16:29:00 2013
@@ -21,10 +21,11 @@ package org.apache.syncope.core.persiste
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
-public abstract class AbstractAttributable extends AbstractBaseBean implements Attributable {
+public abstract class AbstractAttributable extends AbstractBaseBean {
 
     private static final long serialVersionUID = -4801685541488201119L;
 
@@ -41,13 +42,11 @@ public abstract class AbstractAttributab
     }
 
     public <T extends AbstractDerAttr> T getDerivedAttribute(final String derivedSchemaName) {
-
         T result = null;
-        T derivedAttribute;
-        for (Iterator<? extends AbstractDerAttr> itor = getDerivedAttributes().iterator(); result == null
-                && itor.hasNext();) {
+        for (Iterator<? extends AbstractDerAttr> itor = getDerivedAttributes().iterator();
+                result == null && itor.hasNext();) {
 
-            derivedAttribute = (T) itor.next();
+            T derivedAttribute = (T) itor.next();
             if (derivedAttribute.getDerivedSchema() != null
                     && derivedSchemaName.equals(derivedAttribute.getDerivedSchema().getName())) {
 
@@ -59,14 +58,11 @@ public abstract class AbstractAttributab
     }
 
     public <T extends AbstractVirAttr> T getVirtualAttribute(final String virtualSchemaName) {
-
         T result = null;
-        T virtualAttribute;
-        for (Iterator<? extends AbstractVirAttr> itor = getVirtualAttributes().iterator(); result == null
-                && itor.hasNext();) {
-
-            virtualAttribute = (T) itor.next();
+        for (Iterator<? extends AbstractVirAttr> itor = getVirtualAttributes().iterator();
+                result == null && itor.hasNext();) {
 
+            T virtualAttribute = (T) itor.next();
             if (virtualAttribute.getVirtualSchema() != null
                     && virtualSchemaName.equals(virtualAttribute.getVirtualSchema().getName())) {
 
@@ -81,7 +77,7 @@ public abstract class AbstractAttributab
         final Map<AbstractSchema, AbstractAttr> map = new HashMap<AbstractSchema, AbstractAttr>();
 
         for (AbstractAttr attr : getAttributes()) {
-            map.put((AbstractSchema) attr.getSchema(), attr);
+            map.put(attr.getSchema(), attr);
         }
 
         return map;
@@ -91,7 +87,7 @@ public abstract class AbstractAttributab
         final Map<AbstractDerSchema, AbstractDerAttr> map = new HashMap<AbstractDerSchema, AbstractDerAttr>();
 
         for (AbstractDerAttr attr : getDerivedAttributes()) {
-            map.put((AbstractDerSchema) attr.getDerivedSchema(), attr);
+            map.put(attr.getDerivedSchema(), attr);
         }
 
         return map;
@@ -101,12 +97,38 @@ public abstract class AbstractAttributab
         final Map<AbstractVirSchema, AbstractVirAttr> map = new HashMap<AbstractVirSchema, AbstractVirAttr>();
 
         for (AbstractVirAttr attr : getVirtualAttributes()) {
-            map.put((AbstractVirSchema) attr.getVirtualSchema(), attr);
+            map.put(attr.getVirtualSchema(), attr);
         }
 
         return map;
     }
 
+    public abstract Long getId();
+
+    public abstract <T extends AbstractAttr> boolean addAttribute(T attribute);
+
+    public abstract <T extends AbstractAttr> boolean removeAttribute(T attribute);
+
+    public abstract List<? extends AbstractAttr> getAttributes();
+
+    public abstract void setAttributes(List<? extends AbstractAttr> attributes);
+
+    public abstract <T extends AbstractDerAttr> boolean addDerivedAttribute(T derivedAttribute);
+
+    public abstract <T extends AbstractDerAttr> boolean removeDerivedAttribute(T derivedAttribute);
+
+    public abstract List<? extends AbstractDerAttr> getDerivedAttributes();
+
+    public abstract void setDerivedAttributes(List<? extends AbstractDerAttr> derivedAttributes);
+
+    public abstract <T extends AbstractVirAttr> boolean addVirtualAttribute(T virtualAttributes);
+
+    public abstract <T extends AbstractVirAttr> boolean removeVirtualAttribute(T virtualAttribute);
+
+    public abstract List<? extends AbstractVirAttr> getVirtualAttributes();
+
+    public abstract void setVirtualAttributes(List<? extends AbstractVirAttr> virtualAttributes);
+
     protected abstract Set<ExternalResource> resources();
 
     public boolean addResource(final ExternalResource resource) {

Modified: syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/persistence/beans/user/UAttr.java
URL: http://svn.apache.org/viewvc/syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/persistence/beans/user/UAttr.java?rev=1428455&r1=1428454&r2=1428455&view=diff
==============================================================================
--- syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/persistence/beans/user/UAttr.java (original)
+++ syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/persistence/beans/user/UAttr.java Thu Jan  3 16:29:00 2013
@@ -29,9 +29,9 @@ import javax.persistence.ManyToOne;
 import javax.persistence.OneToMany;
 import javax.persistence.OneToOne;
 import javax.validation.Valid;
-import org.apache.syncope.core.persistence.beans.AbstractAttributable;
 import org.apache.syncope.core.persistence.beans.AbstractAttr;
 import org.apache.syncope.core.persistence.beans.AbstractAttrValue;
+import org.apache.syncope.core.persistence.beans.AbstractAttributable;
 import org.apache.syncope.core.persistence.beans.AbstractSchema;
 
 /**

Modified: syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/policy/AccountPolicyEnforcer.java
URL: http://svn.apache.org/viewvc/syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/policy/AccountPolicyEnforcer.java?rev=1428455&r1=1428454&r2=1428455&view=diff
==============================================================================
--- syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/policy/AccountPolicyEnforcer.java (original)
+++ syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/policy/AccountPolicyEnforcer.java Thu Jan  3 16:29:00 2013
@@ -18,12 +18,10 @@
  */
 package org.apache.syncope.core.policy;
 
+import java.util.AbstractMap.SimpleEntry;
 import java.util.List;
 import java.util.Map;
 import java.util.regex.Pattern;
-import org.apache.commons.collections.keyvalue.DefaultMapEntry;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
 import org.apache.syncope.client.to.UserTO;
 import org.apache.syncope.core.persistence.beans.PropagationTask;
 import org.apache.syncope.core.persistence.beans.user.SyncopeUser;
@@ -33,6 +31,8 @@ import org.apache.syncope.core.workflow.
 import org.apache.syncope.core.workflow.WorkflowResult;
 import org.apache.syncope.types.AccountPolicySpec;
 import org.apache.syncope.types.PolicyType;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
 
 @Component
 public class AccountPolicyEnforcer extends PolicyEnforcer<AccountPolicySpec, SyncopeUser> {
@@ -117,8 +117,9 @@ public class AccountPolicyEnforcer exten
                 // propagate suspension if and only if it is required by policy
                 if (policy.isPropagateSuspension()) {
                     final List<PropagationTask> tasks = propagationManager
-                            .getUpdateTaskIds(new WorkflowResult<Map.Entry<Long, Boolean>>(new DefaultMapEntry(updated
-                                    .getResult(), Boolean.FALSE), updated.getPropByRes(), updated.getPerformedTasks()));
+                            .getUpdateTaskIds(new WorkflowResult<Map.Entry<Long, Boolean>>(
+                            new SimpleEntry<Long, Boolean>(updated.getResult(), Boolean.FALSE),
+                            updated.getPropByRes(), updated.getPerformedTasks()));
 
                     propagationManager.execute(tasks);
                 }

Modified: syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/propagation/PropagationManager.java
URL: http://svn.apache.org/viewvc/syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/propagation/PropagationManager.java?rev=1428455&r1=1428454&r2=1428455&view=diff
==============================================================================
--- syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/propagation/PropagationManager.java (original)
+++ syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/propagation/PropagationManager.java Thu Jan  3 16:29:00 2013
@@ -19,11 +19,8 @@
 package org.apache.syncope.core.propagation;
 
 import java.io.PrintWriter;
-import java.io.Serializable;
 import java.io.StringWriter;
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.Method;
-import java.lang.reflect.Proxy;
+import java.util.AbstractMap.SimpleEntry;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Date;
@@ -31,17 +28,14 @@ import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
-import java.util.Map.Entry;
 import java.util.Set;
 import javassist.NotFoundException;
-import org.apache.commons.collections.keyvalue.DefaultMapEntry;
 import org.apache.syncope.client.mod.AttributeMod;
 import org.apache.syncope.client.to.AttributeTO;
 import org.apache.syncope.core.init.ConnInstanceLoader;
 import org.apache.syncope.core.persistence.beans.AbstractAttrValue;
+import org.apache.syncope.core.persistence.beans.AbstractAttributable;
 import org.apache.syncope.core.persistence.beans.AbstractSchema;
-import org.apache.syncope.core.persistence.beans.AbstractVirAttr;
-import org.apache.syncope.core.persistence.beans.Attributable;
 import org.apache.syncope.core.persistence.beans.ExternalResource;
 import org.apache.syncope.core.persistence.beans.PropagationTask;
 import org.apache.syncope.core.persistence.beans.SchemaMapping;
@@ -181,14 +175,14 @@ public class PropagationManager {
 
         final PropagationByResource propByRes = wfResult.getPropByRes();
         if (propByRes == null || propByRes.isEmpty()) {
-            return Collections.emptyList();
+            return Collections.<PropagationTask>emptyList();
         }
 
         if (syncResourceNames != null) {
             propByRes.get(PropagationOperation.CREATE).removeAll(syncResourceNames);
         }
 
-        return provision(user, password, wfResult.getResult().getValue(), false, propByRes);
+        return provision(user, password, null, null, wfResult.getResult().getValue(), false, propByRes);
     }
 
     /**
@@ -263,8 +257,8 @@ public class PropagationManager {
 
         SyncopeUser user = getSyncopeUser(wfResult.getResult().getKey());
 
-        return getUpdateTaskIds(user, wfResult.getPropByRes(), password, vAttrsToBeRemoved, vAttrsToBeUpdated, wfResult.
-                getResult().getValue(), syncResourceNames);
+        return getUpdateTaskIds(user, wfResult.getPropByRes(), password, vAttrsToBeRemoved, vAttrsToBeUpdated,
+                wfResult.getResult().getValue(), syncResourceNames);
     }
 
     private List<PropagationTask> getUpdateTaskIds(final SyncopeUser user, final PropagationByResource propByRes,
@@ -273,15 +267,15 @@ public class PropagationManager {
             throws NotFoundException {
 
         PropagationByResource localPropByRes = userDataBinder.fillVirtual(user, vAttrsToBeRemoved == null
-                ? Collections.EMPTY_SET
+                ? Collections.<String>emptySet()
                 : vAttrsToBeRemoved, vAttrsToBeUpdated == null
-                ? Collections.EMPTY_SET
+                ? Collections.<AttributeMod>emptySet()
                 : vAttrsToBeUpdated, AttributableUtil.getInstance(AttributableType.USER));
 
-        if (propByRes != null && !propByRes.isEmpty()) {
-            localPropByRes.merge(propByRes);
-        } else {
+        if (propByRes == null || propByRes.isEmpty()) {
             localPropByRes.addAll(PropagationOperation.UPDATE, user.getResourceNames());
+        } else {
+            localPropByRes.merge(propByRes);
         }
 
         if (syncResourceNames != null) {
@@ -290,15 +284,15 @@ public class PropagationManager {
             localPropByRes.get(PropagationOperation.DELETE).removeAll(syncResourceNames);
         }
 
-        // Provide a proxy handler in order to take into consideration all the info about virtual attributes to
-        // be removed/updated as well.
-
-        final Attributable handleObject = (Attributable) Proxy.newProxyInstance(
-                Attributable.class.getClassLoader(),
-                new Class<?>[]{Attributable.class, Serializable.class},
-                new AttributableHandler(user, vAttrsToBeRemoved, vAttrsToBeUpdated));
+        Map<String, AttributeMod> vAttrsToBeUpdatedMap = null;
+        if (vAttrsToBeUpdated != null) {
+            vAttrsToBeUpdatedMap = new HashMap<String, AttributeMod>();
+            for (AttributeMod attrMod : vAttrsToBeUpdated) {
+                vAttrsToBeUpdatedMap.put(attrMod.getSchema(), attrMod);
+            }
+        }
 
-        return provision(handleObject, password, enable, false, localPropByRes);
+        return provision(user, password, vAttrsToBeRemoved, vAttrsToBeUpdatedMap, enable, false, localPropByRes);
     }
 
     /**
@@ -337,7 +331,7 @@ public class PropagationManager {
             propByRes.get(PropagationOperation.DELETE).remove(syncResourceName);
         }
 
-        return provision(user, null, false, true, propByRes);
+        return provision(user, null, null, null, false, true, propByRes);
     }
 
     /**
@@ -349,47 +343,52 @@ public class PropagationManager {
      * @return account link + prepare attributes
      * @throws ClassNotFoundException if schema type for given mapping does not exists in current class loader
      */
-    private Map.Entry<String, Attribute> prepareAttribute(
-            final SchemaMapping mapping, final Attributable user, final String password)
-            throws ClassNotFoundException {
-
-        // Retrieve attributable ...
-        final Attributable attributable = user instanceof Proxy
-                ? ((AttributableHandler) Proxy.getInvocationHandler(user)).getObject()
-                : user;
+    private Map.Entry<String, Attribute> prepareAttribute(final SchemaMapping mapping, final SyncopeUser user,
+            final String password, final Set<String> vAttrsToBeRemoved,
+            final Map<String, AttributeMod> vAttrsToBeUpdated) throws ClassNotFoundException {
 
-        final List<Attributable> attributables = new ArrayList<Attributable>();
+        final List<AbstractAttributable> attributables = new ArrayList<AbstractAttributable>();
 
         switch (mapping.getIntMappingType().getAttributableType()) {
             case USER:
                 attributables.addAll(Collections.singleton(user));
                 break;
             case ROLE:
-                final List<Membership> memberships = ((SyncopeUser) attributable).getMemberships();
+                final List<Membership> memberships = user.getMemberships();
                 for (Membership membership : memberships) {
                     attributables.add(membership.getSyncopeRole());
                 }
                 break;
             case MEMBERSHIP:
-                attributables.addAll(((SyncopeUser) attributable).getMemberships());
+                attributables.addAll(user.getMemberships());
                 break;
             default:
         }
 
-        final Entry<AbstractSchema, List<AbstractAttrValue>> entry =
-                SchemaMappingUtil.getIntValues(mapping, attributables, password, schemaDAO);
+        final List<AbstractAttrValue> values =
+                SchemaMappingUtil.getIntValues(mapping, attributables, password, vAttrsToBeRemoved, vAttrsToBeUpdated);
 
-        final List<AbstractAttrValue> values = entry.getValue();
-        final AbstractSchema schema = entry.getKey();
-        final SchemaType schemaType = schema == null ? SchemaType.String : schema.getType();
+        AbstractSchema schema = null;
+        final SchemaType schemaType;
+        switch (mapping.getIntMappingType()) {
+            case UserSchema:
+            case RoleSchema:
+            case MembershipSchema:
+                schema = schemaDAO.find(mapping.getIntAttrName(),
+                        SchemaMappingUtil.getIntMappingTypeClass(mapping.getIntMappingType()));
+                schemaType = schema == null ? SchemaType.String : schema.getType();
+                break;
+
+            default:
+                schemaType = SchemaType.String;
+        }
 
         final String extAttrName = SchemaMappingUtil.getExtAttrName(mapping);
 
         LOG.debug("Define mapping for: "
                 + "\n* ExtAttrName " + extAttrName
                 + "\n* is accountId " + mapping.isAccountid()
-                + "\n* is password " + (mapping.isPassword() || mapping.getIntMappingType().equals(
-                IntMappingType.Password))
+                + "\n* is password " + (mapping.isPassword() || mapping.getIntMappingType() == IntMappingType.Password)
                 + "\n* mandatory condition " + mapping.getMandatoryCondition()
                 + "\n* Schema " + mapping.getIntAttrName()
                 + "\n* IntMappingType " + mapping.getIntMappingType().toString()
@@ -406,24 +405,25 @@ public class PropagationManager {
             }
         }
 
-        Map.Entry<String, Attribute> res;
+        Map.Entry<String, Attribute> result;
 
         if (mapping.isAccountid()) {
-            res = new DefaultMapEntry(objValues.iterator().next().toString(), null);
+            result = new SimpleEntry<String, Attribute>(objValues.iterator().next().toString(), null);
         } else if (mapping.isPassword()) {
-            res = new DefaultMapEntry(null,
+            result = new SimpleEntry<String, Attribute>(null,
                     AttributeBuilder.buildPassword(objValues.iterator().next().toString().toCharArray()));
         } else {
             if (schema != null && schema.isMultivalue()) {
-                res = new DefaultMapEntry(null, AttributeBuilder.build(extAttrName, objValues));
+                result = new SimpleEntry<String, Attribute>(null,
+                        AttributeBuilder.build(extAttrName, objValues));
             } else {
-                res = new DefaultMapEntry(null, objValues.isEmpty()
+                result = new SimpleEntry<String, Attribute>(null, objValues.isEmpty()
                         ? AttributeBuilder.build(extAttrName)
                         : AttributeBuilder.build(extAttrName, objValues.iterator().next()));
             }
         }
 
-        return res;
+        return result;
     }
 
     /**
@@ -435,16 +435,12 @@ public class PropagationManager {
      * @param resource target resource
      * @return account link + prepared attributes
      */
-    private Map.Entry<String, Set<Attribute>> prepareAttributes(final Attributable user, final String password,
+    private Map.Entry<String, Set<Attribute>> prepareAttributes(final SyncopeUser user, final String password,
+            final Set<String> vAttrsToBeRemoved, final Map<String, AttributeMod> vAttrsToBeUpdated,
             final Boolean enable, final ExternalResource resource) {
 
-        // Retrieve attributable ...
-        final Attributable attributable = user instanceof Proxy
-                ? ((AttributableHandler) Proxy.getInvocationHandler(user)).getObject()
-                : user;
-
         LOG.debug("Preparing resource attributes for {} on resource {} with attributes {}",
-                new Object[]{attributable, resource, attributable.getAttributes()});
+                new Object[]{user, resource, user.getAttributes()});
 
         Set<Attribute> attributes = new HashSet<Attribute>();
         String accountId = null;
@@ -454,15 +450,15 @@ public class PropagationManager {
             LOG.debug("Processing schema {}", SchemaMappingUtil.getIntAttrName(mapping));
 
             try {
-                preparedAttribute = prepareAttribute(mapping, user, password);
+                preparedAttribute = prepareAttribute(mapping, user, password, vAttrsToBeRemoved, vAttrsToBeUpdated);
 
                 if (preparedAttribute.getKey() != null) {
                     accountId = preparedAttribute.getKey();
                 }
 
                 if (preparedAttribute.getValue() != null) {
-                    final Attribute alreadyAdded =
-                            AttributeUtil.find(preparedAttribute.getValue().getName(), attributes);
+                    final Attribute alreadyAdded = AttributeUtil.find(preparedAttribute.getValue().getName(),
+                            attributes);
 
                     if (alreadyAdded == null) {
                         attributes.add(preparedAttribute.getValue());
@@ -488,7 +484,7 @@ public class PropagationManager {
         }
 
         // Evaluate AccountLink expression
-        String evalAccountLink = jexlUtil.evaluate(resource.getAccountLink(), (SyncopeUser) attributable);
+        String evalAccountLink = jexlUtil.evaluate(resource.getAccountLink(), user);
 
         // AccountId must be propagated. It could be a simple attribute for
         // the target resource or the key (depending on the accountLink)
@@ -509,7 +505,7 @@ public class PropagationManager {
             attributes.add(AttributeBuilder.buildEnabled(enable));
         }
 
-        return new DefaultMapEntry(accountId, attributes);
+        return new SimpleEntry<String, Set<Attribute>>(accountId, attributes);
     }
 
     /**
@@ -517,23 +513,18 @@ public class PropagationManager {
      *
      * @param user user to be provisioned
      * @param password cleartext password to be provisioned
+     * @param vAttrsToBeRemoved virtual attributes to be removed
+     * @param vAttrsToBeUpdated virtual attributes to be added
      * @param enable whether user must be enabled or not
      * @param deleteOnResource whether user must be deleted anyway from external resource or not
      * @param propByRes operation to be performed per resource
      * @return list of propagation tasks created
      */
-    protected List<PropagationTask> provision(
-            final Attributable user,
-            final String password,
-            final Boolean enable,
-            final boolean deleteOnResource, final PropagationByResource propByRes) {
-
-        // Retrieve attributable ...
-        final Attributable attributable = user instanceof Proxy
-                ? ((AttributableHandler) Proxy.getInvocationHandler(user)).getObject()
-                : user;
+    protected List<PropagationTask> provision(final SyncopeUser user, final String password,
+            final Set<String> vAttrsToBeRemoved, final Map<String, AttributeMod> vAttrsToBeUpdated,
+            final Boolean enable, final boolean deleteOnResource, final PropagationByResource propByRes) {
 
-        LOG.debug("Provisioning with user {}:\n{}", attributable, propByRes);
+        LOG.debug("Provisioning with user {}:\n{}", user, propByRes);
 
         // Avoid duplicates - see javadoc
         propByRes.purge();
@@ -553,14 +544,14 @@ public class PropagationManager {
                 PropagationTask task = new PropagationTask();
                 task.setResource(resource);
                 if (!deleteOnResource) {
-                    task.setSyncopeUser((SyncopeUser) attributable);
+                    task.setSyncopeUser(user);
                 }
                 task.setPropagationOperation(operation);
                 task.setPropagationMode(resource.getPropagationMode());
                 task.setOldAccountId(propByRes.getOldAccountId(resource.getName()));
 
-                Map.Entry<String, Set<Attribute>> preparedAttrs = prepareAttributes(user, password, enable, resource);
-
+                Map.Entry<String, Set<Attribute>> preparedAttrs = prepareAttributes(user, password,
+                        vAttrsToBeRemoved, vAttrsToBeUpdated, enable, resource);
                 task.setAccountId(preparedAttrs.getKey());
                 task.setAttributes(preparedAttrs.getValue());
 
@@ -748,18 +739,19 @@ public class PropagationManager {
                             LOG.debug("{} not found on external resource: ignoring delete", task.getAccountId());
                         } else {
                             /*
-                             * We must choose here whether to a. actually delete the provided user from the external
-                             * resource b. just update the provided user data onto the external resource
+                             * We must choose here whether to
+                             *  a. actually delete the provided user from the external resource
+                             *  b. just update the provided user data onto the external resource
                              *
                              * (a) happens when either there is no user associated with the PropagationTask (this takes
                              * place when the task is generated via UserController.delete()) or the provided updated
                              * user hasn't the current resource assigned (when the task is generated via
                              * UserController.update()).
                              *
-                             * (b) happens when the provided updated user does have the current resource assigned (when
-                             * the task is generated via UserController.update()): this basically means that before such
-                             * update, this user used to have the current resource assigned by more than one mean (for
-                             * example, two different memberships with the same resource).
+                             * (b) happens when the provided updated user does have the current resource assigned
+                             * (when the task is generated via UserController.update()): this basically means that
+                             * before such update, this user used to have the current resource assigned by more than
+                             * one mean (for example, two different memberships with the same resource).
                              */
 
                             SyncopeUser user = null;
@@ -892,57 +884,4 @@ public class PropagationManager {
             return null;
         }
     }
-
-    public static class AttributableHandler implements InvocationHandler {
-
-        private Attributable object;
-
-        private Set<String> vAttrsToBeRemoved;
-
-        private Map<String, AttributeMod> vAttrsToBeUpdated;
-
-        public AttributableHandler(
-                final Attributable object,
-                final Set<String> vAttrsToBeRemoved,
-                final Set<AttributeMod> vAttrsToBeUpdated) {
-            this.object = object;
-            this.vAttrsToBeRemoved = vAttrsToBeRemoved;
-
-            if (vAttrsToBeUpdated != null) {
-                this.vAttrsToBeUpdated = new HashMap<String, AttributeMod>(vAttrsToBeUpdated.size());
-
-                for (AttributeMod attrMod : vAttrsToBeUpdated) {
-                    this.vAttrsToBeUpdated.put(attrMod.getSchema(), attrMod);
-                }
-            } else {
-                this.vAttrsToBeUpdated = Collections.EMPTY_MAP;
-            }
-        }
-
-        @Override
-        public Object invoke(final Object proxy, final Method method, final Object[] args)
-                throws Throwable {
-            if ("getVirtualAttribute".equals(method.getName()) && args.length == 1 && (args[0] instanceof String)) {
-                final AbstractVirAttr attr = object.getVirtualAttribute((String) args[0]);
-
-                if (vAttrsToBeUpdated.containsKey((String) args[0])) {
-                    attr.setValues(vAttrsToBeUpdated.get((String) args[0]).getValuesToBeAdded());
-                } else if (vAttrsToBeRemoved.contains((String) args[0])) {
-                    if (attr != null) {
-                        attr.getValues().clear();
-                    }
-                } else {
-                    throw new RuntimeException("Virtual attribute has not to be updated");
-                }
-
-                return attr;
-            } else {
-                return method.invoke(object, args);
-            }
-        }
-
-        public Attributable getObject() {
-            return object;
-        }
-    }
 }

Modified: syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/rest/controller/UserController.java
URL: http://svn.apache.org/viewvc/syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/rest/controller/UserController.java?rev=1428455&r1=1428454&r2=1428455&view=diff
==============================================================================
--- syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/rest/controller/UserController.java (original)
+++ syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/rest/controller/UserController.java Thu Jan  3 16:29:00 2013
@@ -18,6 +18,7 @@
  */
 package org.apache.syncope.core.rest.controller;
 
+import java.util.AbstractMap.SimpleEntry;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
@@ -25,7 +26,6 @@ import java.util.Map;
 import java.util.Set;
 import javassist.NotFoundException;
 import javax.servlet.http.HttpServletResponse;
-import org.apache.commons.collections.keyvalue.DefaultMapEntry;
 import org.apache.syncope.client.mod.UserMod;
 import org.apache.syncope.client.search.NodeCond;
 import org.apache.syncope.client.to.MembershipTO;
@@ -540,7 +540,8 @@ public class UserController {
         WorkflowResult<Long> updated = wfAdapter.execute(userTO, taskId);
 
         List<PropagationTask> tasks = propagationManager.getUpdateTaskIds(new WorkflowResult<Map.Entry<Long, Boolean>>(
-                new DefaultMapEntry(updated.getResult(), null), updated.getPropByRes(), updated.getPerformedTasks()));
+                new SimpleEntry<Long, Boolean>(updated.getResult(), null),
+                updated.getPropByRes(), updated.getPerformedTasks()));
 
         propagationManager.execute(tasks);
 
@@ -610,8 +611,8 @@ public class UserController {
                 getAuthentication().getName());
 
         List<PropagationTask> tasks = propagationManager.getUpdateTaskIds(new WorkflowResult<Map.Entry<Long, Boolean>>(
-                new DefaultMapEntry(updated.getResult().getKey(), Boolean.TRUE), updated.getPropByRes(), updated.
-                getPerformedTasks()), updated.getResult().getValue(), null, null);
+                new SimpleEntry<Long, Boolean>(updated.getResult().getKey(), Boolean.TRUE),
+                updated.getPropByRes(), updated.getPerformedTasks()), updated.getResult().getValue(), null, null);
         propagationManager.execute(tasks);
 
         final UserTO savedTO = dataBinder.getUserTO(updated.getResult().getKey());

Modified: syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/util/SchemaMappingUtil.java
URL: http://svn.apache.org/viewvc/syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/util/SchemaMappingUtil.java?rev=1428455&r1=1428454&r2=1428455&view=diff
==============================================================================
--- syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/util/SchemaMappingUtil.java (original)
+++ syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/util/SchemaMappingUtil.java Thu Jan  3 16:29:00 2013
@@ -18,7 +18,6 @@
  */
 package org.apache.syncope.core.util;
 
-import java.lang.reflect.Proxy;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -27,14 +26,12 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import org.apache.commons.collections.keyvalue.DefaultMapEntry;
+import org.apache.syncope.client.mod.AttributeMod;
 import org.apache.syncope.core.persistence.beans.AbstractAttr;
 import org.apache.syncope.core.persistence.beans.AbstractAttrValue;
 import org.apache.syncope.core.persistence.beans.AbstractAttributable;
 import org.apache.syncope.core.persistence.beans.AbstractDerAttr;
-import org.apache.syncope.core.persistence.beans.AbstractSchema;
 import org.apache.syncope.core.persistence.beans.AbstractVirAttr;
-import org.apache.syncope.core.persistence.beans.Attributable;
 import org.apache.syncope.core.persistence.beans.SchemaMapping;
 import org.apache.syncope.core.persistence.beans.membership.MDerSchema;
 import org.apache.syncope.core.persistence.beans.membership.MSchema;
@@ -47,21 +44,18 @@ import org.apache.syncope.core.persisten
 import org.apache.syncope.core.persistence.beans.user.UDerSchema;
 import org.apache.syncope.core.persistence.beans.user.USchema;
 import org.apache.syncope.core.persistence.beans.user.UVirSchema;
-import org.apache.syncope.core.persistence.dao.SchemaDAO;
-import org.apache.syncope.core.propagation.PropagationManager.AttributableHandler;
 import org.apache.syncope.types.IntMappingType;
 import org.identityconnectors.framework.common.objects.OperationalAttributes;
 import org.identityconnectors.framework.common.objects.Uid;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import sun.security.util.Password;
 
 public class SchemaMappingUtil {
 
     /**
      * Logger.
      */
-    protected static final Logger LOG = LoggerFactory.getLogger(SchemaMappingUtil.class);
+    private static final Logger LOG = LoggerFactory.getLogger(SchemaMappingUtil.class);
 
     public static String getExtAttrName(final SchemaMapping mapping) {
         final String name;
@@ -136,35 +130,35 @@ public class SchemaMappingUtil {
      * @param mapping mapping.
      * @param attributables list of attributables.
      * @param password password.
-     * @return schema and attribute values.
+     * @return attribute values.
      */
-    public static Map.Entry<AbstractSchema, List<AbstractAttrValue>> getIntValues(final SchemaMapping mapping,
-            final List<Attributable> attributables, final String password, final SchemaDAO schemaDAO) {
+    public static List<AbstractAttrValue> getIntValues(final SchemaMapping mapping,
+            final List<AbstractAttributable> attributables, final String password,
+            final Set<String> vAttrsToBeRemoved, final Map<String, AttributeMod> vAttrsToBeUpdated) {
 
         LOG.debug("Get attributes for '{}' and mapping type '{}'", attributables, mapping.getIntMappingType());
 
-        AbstractSchema schema = null;
-
         List<AbstractAttrValue> values = new ArrayList<AbstractAttrValue>();
 
         switch (mapping.getIntMappingType()) {
             case UserSchema:
             case RoleSchema:
             case MembershipSchema:
-                schema = schemaDAO.find(mapping.getIntAttrName(), SchemaMappingUtil.getIntMappingTypeClass(mapping.
-                        getIntMappingType()));
-
-                for (Attributable attributable : attributables) {
+                for (AbstractAttributable attributable : attributables) {
                     final AbstractAttr attr = attributable.getAttribute(mapping.getIntAttrName());
-
-                    if (attr != null && attr.getValues() != null) {
-                        values.addAll(schema.isUniqueConstraint()
-                                ? Collections.singletonList(attr.getUniqueValue()) : attr.getValues());
+                    if (attr != null) {
+                        if (attr.getUniqueValue() != null) {
+                            values.add(attr.getUniqueValue());
+                        } else if (attr.getValues() != null) {
+                            values.addAll(attr.getValues());
+                        }
                     }
 
-                    LOG.debug("Retrieved attribute {}" + "\n* IntAttrName {}" + "\n* IntMappingType {}"
-                            + "\n* Attribute values {}", new Object[]{attr, mapping.getIntAttrName(),
-                                mapping.getIntMappingType(), values});
+                    LOG.debug("Retrieved attribute {}"
+                            + "\n* IntAttrName {}"
+                            + "\n* IntMappingType {}"
+                            + "\n* Attribute values {}",
+                            attr, mapping.getIntAttrName(), mapping.getIntMappingType(), values);
                 }
 
                 break;
@@ -172,28 +166,39 @@ public class SchemaMappingUtil {
             case UserVirtualSchema:
             case RoleVirtualSchema:
             case MembershipVirtualSchema:
-
-                for (Attributable attributable : attributables) {
+                for (AbstractAttributable attributable : attributables) {
                     AbstractVirAttr virAttr = attributable.getVirtualAttribute(mapping.getIntAttrName());
-
-                    if (virAttr != null && virAttr.getValues() != null) {
-                        for (String value : virAttr.getValues()) {
-                            AbstractAttrValue attrValue = new UAttrValue();
-                            attrValue.setStringValue(value);
-                            values.add(attrValue);
+                    if (virAttr != null) {
+                        if (virAttr.getValues() != null) {
+                            for (String value : virAttr.getValues()) {
+                                AbstractAttrValue attrValue = new UAttrValue();
+                                attrValue.setStringValue(value);
+                                values.add(attrValue);
+                            }
+                        }
+                        if (vAttrsToBeRemoved != null && vAttrsToBeUpdated != null) {
+                            if (vAttrsToBeUpdated.containsKey(mapping.getIntAttrName())) {
+                                virAttr.setValues(vAttrsToBeUpdated.get(mapping.getIntAttrName()).getValuesToBeAdded());
+                            } else if (vAttrsToBeRemoved.contains(mapping.getIntAttrName())) {
+                                virAttr.getValues().clear();
+                            } else {
+                                throw new RuntimeException("Virtual attribute has not to be updated");
+                            }
                         }
                     }
 
-                    LOG.debug("Retrieved virtual attribute {}" + "\n* IntAttrName {}" + "\n* IntMappingType {}"
-                            + "\n* Attribute values {}", new Object[]{virAttr, mapping.getIntAttrName(),
-                                mapping.getIntMappingType(), values});
+                    LOG.debug("Retrieved virtual attribute {}"
+                            + "\n* IntAttrName {}"
+                            + "\n* IntMappingType {}"
+                            + "\n* Attribute values {}",
+                            virAttr, mapping.getIntAttrName(), mapping.getIntMappingType(), values);
                 }
                 break;
 
             case UserDerivedSchema:
             case RoleDerivedSchema:
             case MembershipDerivedSchema:
-                for (Attributable attributable : attributables) {
+                for (AbstractAttributable attributable : attributables) {
                     AbstractDerAttr derAttr = attributable.getDerivedAttribute(mapping.getIntAttrName());
 
                     if (derAttr != null) {
@@ -202,26 +207,24 @@ public class SchemaMappingUtil {
                         values.add(attrValue);
                     }
 
-                    LOG.debug("Retrieved attribute {}" + "\n* IntAttrName {}" + "\n* IntMappingType {}"
-                            + "\n* Attribute values {}", new Object[]{derAttr, mapping.getIntAttrName(),
-                                mapping.getIntMappingType(), values});
+                    LOG.debug("Retrieved derived attribute {}"
+                            + "\n* IntAttrName {}"
+                            + "\n* IntMappingType {}"
+                            + "\n* Attribute values {}",
+                            derAttr, mapping.getIntAttrName(), mapping.getIntMappingType(), values);
                 }
                 break;
 
             case Username:
-                for (Attributable attributable : attributables) {
+                for (AbstractAttributable attributable : attributables) {
                     AbstractAttrValue attrValue = new UAttrValue();
-                    SyncopeUser user = attributable instanceof Proxy?
-                            (SyncopeUser)((AttributableHandler)Proxy.getInvocationHandler(attributable)).getObject():
-                            (SyncopeUser)attributable;
-                     
-                    attrValue.setStringValue(user.getUsername());
+                    attrValue.setStringValue(((SyncopeUser) attributable).getUsername());
                     values.add(attrValue);
                 }
                 break;
 
             case SyncopeUserId:
-                for (Attributable attributable : attributables) {
+                for (AbstractAttributable attributable : attributables) {
                     AbstractAttrValue attrValue = new UAttrValue();
                     attrValue.setStringValue(attributable.getId().toString());
                     values.add(attrValue);
@@ -241,67 +244,9 @@ public class SchemaMappingUtil {
             default:
         }
 
-        LOG.debug("Retrived values '{}'", values);
-
-        return new DefaultMapEntry(schema, values);
-    }
-
-    public static List<String> getIntValueAsStrings(
-            final AbstractAttributable attributable, final SchemaMapping mapping) {
-        return getIntValueAsStrings(attributable, mapping, null);
-    }
-
-    public static List<String> getIntValueAsStrings(
-            final AbstractAttributable attributable, final SchemaMapping mapping, String clearPassword) {
-
-        List<String> value = new ArrayList<String>();
-
-        if (mapping != null) {
-            switch (mapping.getIntMappingType()) {
-                case Username:
-                    if (!(attributable instanceof SyncopeUser)) {
-                        throw new ClassCastException("mappingtype is Username, but attributable is not SyncopeUser: "
-                                + attributable.getClass().getName());
-                    }
-                    value.add(((SyncopeUser) attributable).getUsername());
-                    break;
-                case Password:
-                    if (clearPassword != null) {
-                        value.add(clearPassword);
-                    }
-                    break;
-                case UserSchema:
-                case RoleSchema:
-                case MembershipSchema:
-                    AbstractAttr abstractAttr = attributable.getAttribute(mapping.getIntAttrName());
-                    if (abstractAttr != null && abstractAttr.getValues() != null) {
-                        value.addAll(abstractAttr.getValuesAsStrings());
-                    }
-                    break;
-                case UserVirtualSchema:
-                case RoleVirtualSchema:
-                case MembershipVirtualSchema:
-                    AbstractVirAttr abstractVirAttr = attributable.getVirtualAttribute(mapping.getIntAttrName());
-                    if (abstractVirAttr != null && abstractVirAttr.getValues() != null) {
-                        value.addAll(abstractVirAttr.getValues());
-                    }
-                    break;
-                case UserDerivedSchema:
-                case RoleDerivedSchema:
-                case MembershipDerivedSchema:
-                    AbstractDerAttr abstractDerAttr = attributable.getDerivedAttribute(mapping.getIntAttrName());
-                    if (abstractDerAttr != null) {
-                        String abstractDerAttrValue = abstractDerAttr.getValue(attributable.getAttributes());
-                        if (abstractDerAttrValue != null) {
-                            value.add(abstractDerAttrValue);
-                        }
-                    }
-                    break;
-                default:
-            }
-        }
+        LOG.debug("Retrieved values '{}'", values);
 
-        return value;
+        return values;
     }
 
     /**
@@ -372,30 +317,15 @@ public class SchemaMappingUtil {
      * Get accountId internal value.
      *
      * @param attributable attributable.
-     * @param mappings collection of SchemaMapping.
-     * @return accountId internal value.
-     */
-    public static String getAccountIdValue(final AbstractAttributable attributable,
-            final Collection<SchemaMapping> mappings) {
-
-        final List<String> values = getIntValueAsStrings(attributable, getAccountIdMapping(mappings));
-        return values == null || values.isEmpty()
-                ? null
-                : values.get(0);
-    }
-
-    /**
-     * Get accountId internal value.
-     *
-     * @param attributable attributable.
-     * @param mappings accountId mapping.
+     * @param mapping accountId mapping.
      * @return accountId internal value.
      */
     public static String getAccountIdValue(final AbstractAttributable attributable, final SchemaMapping mapping) {
-        final List<String> values = getIntValueAsStrings(attributable, mapping);
+        List<AbstractAttrValue> values = getIntValues(
+                mapping, Collections.<AbstractAttributable>singletonList(attributable), null, null, null);
         return values == null || values.isEmpty()
                 ? null
-                : values.get(0);
+                : values.get(0).getValueAsString();
     }
 
     public static class SchemaMappingsWrapper {

Modified: syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/workflow/ActivitiUserWorkflowAdapter.java
URL: http://svn.apache.org/viewvc/syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/workflow/ActivitiUserWorkflowAdapter.java?rev=1428455&r1=1428454&r2=1428455&view=diff
==============================================================================
--- syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/workflow/ActivitiUserWorkflowAdapter.java (original)
+++ syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/workflow/ActivitiUserWorkflowAdapter.java Thu Jan  3 16:29:00 2013
@@ -28,6 +28,7 @@ import java.io.StringWriter;
 import java.io.Writer;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.AbstractMap.SimpleEntry;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -53,7 +54,6 @@ import org.activiti.engine.history.Histo
 import org.activiti.engine.repository.ProcessDefinition;
 import org.activiti.engine.runtime.ProcessInstance;
 import org.activiti.engine.task.Task;
-import org.apache.commons.collections.keyvalue.DefaultMapEntry;
 import org.apache.commons.lang.StringUtils;
 import org.apache.syncope.client.mod.UserMod;
 import org.apache.syncope.client.to.UserTO;
@@ -251,7 +251,8 @@ public class ActivitiUserWorkflowAdapter
             }
         }
 
-        return new WorkflowResult<Map.Entry<Long, Boolean>>(new DefaultMapEntry(user.getId(), propagateEnable),
+        return new WorkflowResult<Map.Entry<Long, Boolean>>(
+                new SimpleEntry<Long, Boolean>(user.getId(), propagateEnable),
                 propByRes, getPerformedTasks(user));
     }
 
@@ -324,8 +325,8 @@ public class ActivitiUserWorkflowAdapter
 
         Boolean propagateEnable = (Boolean) runtimeService.getVariable(user.getWorkflowId(), PROPAGATE_ENABLE);
 
-        return new WorkflowResult<Map.Entry<Long, Boolean>>(new DefaultMapEntry(updated.getId(), propagateEnable),
-                propByRes, task);
+        return new WorkflowResult<Map.Entry<Long, Boolean>>(new SimpleEntry<Long, Boolean>(updated.getId(),
+                propagateEnable), propByRes, task);
     }
 
     @Override
@@ -599,7 +600,7 @@ public class ActivitiUserWorkflowAdapter
             }
         }
 
-        return new DefaultMapEntry(task, formData);
+        return new SimpleEntry<Task, TaskFormData>(task, formData);
     }
 
     @Override
@@ -667,7 +668,8 @@ public class ActivitiUserWorkflowAdapter
             clearPassword = decrypt(encryptedPwd);
         }
 
-        return new WorkflowResult<Map.Entry<Long, String>>(new DefaultMapEntry(updated.getId(), clearPassword),
+        return new WorkflowResult<Map.Entry<Long, String>>(
+                new SimpleEntry<Long, String>(updated.getId(), clearPassword),
                 propByRes, postTasks);
     }
 }

Modified: syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/workflow/NoOpUserWorkflowAdapter.java
URL: http://svn.apache.org/viewvc/syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/workflow/NoOpUserWorkflowAdapter.java?rev=1428455&r1=1428454&r2=1428455&view=diff
==============================================================================
--- syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/workflow/NoOpUserWorkflowAdapter.java (original)
+++ syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/workflow/NoOpUserWorkflowAdapter.java Thu Jan  3 16:29:00 2013
@@ -18,12 +18,12 @@
  */
 package org.apache.syncope.core.workflow;
 
+import java.util.AbstractMap.SimpleEntry;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import javassist.NotFoundException;
-import org.apache.commons.collections.keyvalue.DefaultMapEntry;
 import org.apache.syncope.client.mod.UserMod;
 import org.apache.syncope.client.to.UserTO;
 import org.apache.syncope.client.to.WorkflowDefinitionTO;
@@ -82,8 +82,8 @@ public class NoOpUserWorkflowAdapter ext
         final PropagationByResource propByRes = new PropagationByResource();
         propByRes.set(PropagationOperation.CREATE, user.getResourceNames());
 
-        return new WorkflowResult<Map.Entry<Long, Boolean>>(new DefaultMapEntry(user.getId(), propagateEnable),
-                propByRes, "create");
+        return new WorkflowResult<Map.Entry<Long, Boolean>>(new SimpleEntry<Long, Boolean>(user.getId(),
+                propagateEnable), propByRes, "create");
     }
 
     @Override
@@ -108,8 +108,8 @@ public class NoOpUserWorkflowAdapter ext
 
         SyncopeUser updated = userDAO.save(user);
 
-        return new WorkflowResult<Map.Entry<Long, Boolean>>(new DefaultMapEntry(updated.getId(), true), propByRes,
-                "update");
+        return new WorkflowResult<Map.Entry<Long, Boolean>>(new SimpleEntry<Long, Boolean>(updated.getId(), true),
+                propByRes, "update");
     }
 
     @Override