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 2015/10/26 10:55:33 UTC

[1/4] syncope git commit: [SYNCOPE-714] Preliminary changes + small refactoring of ConnectorService

Repository: syncope
Updated Branches:
  refs/heads/master 7f584fb59 -> 1347c1081


[SYNCOPE-714] Preliminary changes + small refactoring of ConnectorService


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

Branch: refs/heads/master
Commit: 934398172f91b1128a0d3bac12c4a0ac2e1dea55
Parents: 7f584fb
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Fri Oct 23 11:04:39 2015 +0200
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Mon Oct 26 08:26:45 2015 +0100

----------------------------------------------------------------------
 .../console/panels/ResourceConnConfPanel.java   |  2 +-
 .../console/rest/ConnectorRestClient.java       | 23 +----------
 .../rest/api/service/ConnectorService.java      | 36 ++++++------------
 .../syncope/core/logic/ConnectorLogic.java      | 40 ++++++++++----------
 .../java/data/ConnInstanceDataBinderImpl.java   |  9 +++--
 .../rest/cxf/service/ConnectorServiceImpl.java  | 34 ++---------------
 .../fit/core/reference/ConnectorITCase.java     | 12 +++---
 7 files changed, 50 insertions(+), 106 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/93439817/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceConnConfPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceConnConfPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceConnConfPanel.java
index 1b536c4..246e0eb 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceConnConfPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceConnConfPanel.java
@@ -116,7 +116,7 @@ public class ResourceConnConfPanel extends Panel {
         List<ConnConfProperty> props = new ArrayList<>();
         Long connectorKey = resourceTO.getConnector();
         if (connectorKey != null && connectorKey > 0) {
-            for (ConnConfProperty property : restClient.getConnectorProperties(connectorKey)) {
+            for (ConnConfProperty property : restClient.read(connectorKey).getConfiguration()) {
                 if (property.isOverridable()) {
                     props.add(property);
                 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/93439817/client/console/src/main/java/org/apache/syncope/client/console/rest/ConnectorRestClient.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/rest/ConnectorRestClient.java b/client/console/src/main/java/org/apache/syncope/client/console/rest/ConnectorRestClient.java
index d3d18c8..8c84993 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/rest/ConnectorRestClient.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/rest/ConnectorRestClient.java
@@ -108,24 +108,6 @@ public class ConnectorRestClient extends BaseRestClient {
         return bundles;
     }
 
-    /**
-     * Get all configuration properties for the given connector instance.
-     *
-     * @param connectorId the connector id
-     * @return List of ConnConfProperty, or an empty list in case none found
-     */
-    public List<ConnConfProperty> getConnectorProperties(final Long connectorId) {
-        List<ConnConfProperty> properties = null;
-
-        try {
-            properties = getService(ConnectorService.class).getConfigurationProperties(connectorId);
-        } catch (SyncopeClientException e) {
-            LOG.error("While getting connector configuration properties", e);
-        }
-
-        return properties;
-    }
-
     private Set<ConnConfProperty> filterProperties(final Set<ConnConfProperty> properties) {
         Set<ConnConfProperty> newProperties = new HashSet<>();
 
@@ -185,8 +167,7 @@ public class ConnectorRestClient extends BaseRestClient {
     public List<String> getSchemaNames(final ConnInstanceTO connectorTO) {
         List<String> schemaNames = new ArrayList<>();
         try {
-            List<PlainSchemaTO> response = getService(ConnectorService.class).
-                    getSchemaNames(connectorTO.getKey(), connectorTO, false);
+            List<PlainSchemaTO> response = getService(ConnectorService.class).buildSchemaNames(connectorTO, false);
             for (PlainSchemaTO schema : response) {
                 schemaNames.add(schema.getKey());
             }
@@ -203,7 +184,7 @@ public class ConnectorRestClient extends BaseRestClient {
     public List<ConnIdObjectClass> getSupportedObjectClasses(final ConnInstanceTO connectorTO) {
         List<ConnIdObjectClass> result = Collections.emptyList();
         try {
-            result = getService(ConnectorService.class).getSupportedObjectClasses(connectorTO.getKey(), connectorTO);
+            result = getService(ConnectorService.class).buildSupportedObjectClasses(connectorTO);
         } catch (Exception e) {
             LOG.error("While getting supported object classes", e);
         }

http://git-wip-us.apache.org/repos/asf/syncope/blob/93439817/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ConnectorService.java
----------------------------------------------------------------------
diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ConnectorService.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ConnectorService.java
index 686d373..ea63718 100644
--- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ConnectorService.java
+++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ConnectorService.java
@@ -37,7 +37,6 @@ import org.apache.syncope.common.lib.to.BulkActionResult;
 import org.apache.syncope.common.lib.to.ConnBundleTO;
 import org.apache.syncope.common.lib.to.ConnInstanceTO;
 import org.apache.syncope.common.lib.to.PlainSchemaTO;
-import org.apache.syncope.common.lib.types.ConnConfProperty;
 import org.apache.syncope.common.lib.wrap.ConnIdObjectClass;
 
 /**
@@ -58,47 +57,36 @@ public interface ConnectorService extends JAXRSService {
     List<ConnBundleTO> getBundles(@QueryParam("lang") String lang);
 
     /**
-     * Returns configuration for given connector instance.
+     * Builds the list of schema names managed by the connector bundle matching the given connector instance key, with
+     * the provided configuration.
      *
-     * @param key connector instance key to read configuration from
-     * @return configuration for given connector instance
-     */
-    @GET
-    @Path("{key}/configuration")
-    @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
-    List<ConnConfProperty> getConfigurationProperties(@NotNull @PathParam("key") Long key);
-
-    /**
-     * Returns schema names for connector bundle matching the given connector instance key.
-     *
-     * @param key connector instance key to be used for schema lookup
-     * @param connInstanceTO connector instance object to provide special configuration properties
+     * @param connInstanceTO connector instance object providing configuration properties
      * @param includeSpecial if set to true, special schema names (like '__PASSWORD__') will be included;
      * default is false
-     * @return schema names for connector bundle matching the given connector instance key
+     * @return schema names for the connector bundle matching the given connector instance key, with the provided
+     * configuration
      */
     @POST
     @Path("{key}/schemaNames")
     @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
     @Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
-    List<PlainSchemaTO> getSchemaNames(@NotNull @PathParam("key") Long key,
+    List<PlainSchemaTO> buildSchemaNames(
             @NotNull ConnInstanceTO connInstanceTO,
             @QueryParam("includeSpecial") @DefaultValue("false") boolean includeSpecial);
 
     /**
-     * Returns supported object classes for connector bundle matching the given connector instance key.
+     * Builds the list of supported ConnId object classes for the connector bundle matching the given connector instance
+     * key, with the provided configuration.
      *
-     * @param key connector instance key to be used for schema lookup
-     * @param connInstanceTO connector instance object to provide special configuration properties
-     * @return supported object classes for connector bundle matching the given connector instance key
+     * @param connInstanceTO connector instance object providing configuration properties
+     * @return supported object classes for the connector bundle matching the given connector instance key, with the
+     * provided configuration
      */
     @POST
     @Path("{key}/supportedObjectClasses")
     @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
     @Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
-    List<ConnIdObjectClass> getSupportedObjectClasses(
-            @NotNull @PathParam("key") Long key,
-            @NotNull ConnInstanceTO connInstanceTO);
+    List<ConnIdObjectClass> buildSupportedObjectClasses(@NotNull ConnInstanceTO connInstanceTO);
 
     /**
      * Returns connector instance with matching key.

http://git-wip-us.apache.org/repos/asf/syncope/blob/93439817/core/logic/src/main/java/org/apache/syncope/core/logic/ConnectorLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/ConnectorLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/ConnectorLogic.java
index 870a4d0..cc6aaed 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/ConnectorLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/ConnectorLogic.java
@@ -33,6 +33,7 @@ import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.to.ConnBundleTO;
 import org.apache.syncope.common.lib.to.ConnInstanceTO;
+import org.apache.syncope.common.lib.to.PlainSchemaTO;
 import org.apache.syncope.common.lib.types.ClientExceptionType;
 import org.apache.syncope.common.lib.types.ConnConfProperty;
 import org.apache.syncope.common.lib.types.Entitlement;
@@ -204,7 +205,7 @@ public class ConnectorLogic extends AbstractTransactionalLogic<ConnInstanceTO> {
 
     @PreAuthorize("hasRole('" + Entitlement.CONNECTOR_READ + "')")
     @Transactional(readOnly = true)
-    public List<String> getSchemaNames(final ConnInstanceTO connInstanceTO, final boolean includeSpecial) {
+    public List<PlainSchemaTO> buildSchemaNames(final ConnInstanceTO connInstanceTO, final boolean includeSpecial) {
         ConnInstance connInstance = connInstanceDAO.find(connInstanceTO.getKey());
         if (connInstance == null) {
             throw new NotFoundException("Connector '" + connInstanceTO.getKey() + "'");
@@ -217,12 +218,22 @@ public class ConnectorLogic extends AbstractTransactionalLogic<ConnInstanceTO> {
         // We cannot use Spring bean because this method could be used during resource definition or modification:
         // bean couldn't exist or couldn't be updated.
         // This is the reason why we should take a "not mature" connector facade proxy to ask for schema names.
-        return new ArrayList<>(connFactory.createConnector(connInstance, conf).getSchemaNames(includeSpecial));
+        Set<String> schemaNames = connFactory.createConnector(connInstance, conf).getSchemaNames(includeSpecial);
+
+        return CollectionUtils.collect(schemaNames, new Transformer<String, PlainSchemaTO>() {
+
+            @Override
+            public PlainSchemaTO transform(final String name) {
+                PlainSchemaTO schemaTO = new PlainSchemaTO();
+                schemaTO.setKey(name);
+                return schemaTO;
+            }
+        }, new ArrayList<PlainSchemaTO>());
     }
 
     @PreAuthorize("hasRole('" + Entitlement.CONNECTOR_READ + "')")
     @Transactional(readOnly = true)
-    public List<String> getSupportedObjectClasses(final ConnInstanceTO connInstanceTO) {
+    public List<String> buildSupportedObjectClasses(final ConnInstanceTO connInstanceTO) {
         ConnInstance connInstance = connInstanceDAO.find(connInstanceTO.getKey());
         if (connInstance == null) {
             throw new NotFoundException("Connector '" + connInstanceTO.getKey() + "'");
@@ -237,24 +248,13 @@ public class ConnectorLogic extends AbstractTransactionalLogic<ConnInstanceTO> {
         // This is the reason why we should take a "not mature" connector facade proxy to ask for object classes.
         Set<ObjectClass> objectClasses = connFactory.createConnector(connInstance, conf).getSupportedObjectClasses();
 
-        List<String> result = new ArrayList<>(objectClasses.size());
-        for (ObjectClass objectClass : objectClasses) {
-            result.add(objectClass.getObjectClassValue());
-        }
-
-        return result;
-    }
-
-    @PreAuthorize("hasRole('" + Entitlement.CONNECTOR_READ + "')")
-    @Transactional(readOnly = true)
-    public List<ConnConfProperty> getConfigurationProperties(final Long connInstanceKey) {
-
-        ConnInstance connInstance = connInstanceDAO.find(connInstanceKey);
-        if (connInstance == null) {
-            throw new NotFoundException("Connector '" + connInstanceKey + "'");
-        }
+        return CollectionUtils.collect(objectClasses, new Transformer<ObjectClass, String>() {
 
-        return new ArrayList<>(connInstance.getConfiguration());
+            @Override
+            public String transform(final ObjectClass objectClass) {
+                return objectClass.getObjectClassValue();
+            }
+        }, new ArrayList<String>());
     }
 
     @PreAuthorize("hasRole('" + Entitlement.CONNECTOR_READ + "')")

http://git-wip-us.apache.org/repos/asf/syncope/blob/93439817/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ConnInstanceDataBinderImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ConnInstanceDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ConnInstanceDataBinderImpl.java
index 3666d8f..7c28b66 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ConnInstanceDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ConnInstanceDataBinderImpl.java
@@ -58,13 +58,14 @@ public class ConnInstanceDataBinderImpl implements ConnInstanceDataBinder {
     private EntityFactory entityFactory;
 
     @Override
-    public Set<ConnConfProperty> mergeConnConfProperties(final Set<ConnConfProperty> primary,
+    public Set<ConnConfProperty> mergeConnConfProperties(
+            final Set<ConnConfProperty> primary,
             final Set<ConnConfProperty> secondary) {
 
-        final Set<ConnConfProperty> conf = new HashSet<>();
+        Set<ConnConfProperty> conf = new HashSet<>();
 
         // to be used to control managed prop (needed by overridden mechanism)
-        final Set<String> propertyNames = new HashSet<>();
+        Set<String> propertyNames = new HashSet<>();
 
         // get overridden connector configuration properties
         for (ConnConfProperty prop : primary) {
@@ -232,7 +233,7 @@ public class ConnInstanceDataBinderImpl implements ConnInstanceDataBinder {
                 property = new ConnConfProperty();
                 connInstanceTO.getConfiguration().add(property);
             }
-            
+
             property.setSchema(schema);
         }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/93439817/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/ConnectorServiceImpl.java
----------------------------------------------------------------------
diff --git a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/ConnectorServiceImpl.java b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/ConnectorServiceImpl.java
index a970827..ac0694d 100644
--- a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/ConnectorServiceImpl.java
+++ b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/ConnectorServiceImpl.java
@@ -19,17 +19,13 @@
 package org.apache.syncope.core.rest.cxf.service;
 
 import java.net.URI;
-import java.util.ArrayList;
 import java.util.List;
 import javax.ws.rs.core.Response;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Transformer;
 import org.apache.syncope.common.lib.to.BulkAction;
 import org.apache.syncope.common.lib.to.BulkActionResult;
 import org.apache.syncope.common.lib.to.ConnBundleTO;
 import org.apache.syncope.common.lib.to.ConnInstanceTO;
 import org.apache.syncope.common.lib.to.PlainSchemaTO;
-import org.apache.syncope.common.lib.types.ConnConfProperty;
 import org.apache.syncope.common.lib.wrap.ConnIdObjectClass;
 import org.apache.syncope.common.rest.api.CollectionWrapper;
 import org.apache.syncope.common.rest.api.RESTHeaders;
@@ -64,35 +60,13 @@ public class ConnectorServiceImpl extends AbstractServiceImpl implements Connect
     }
 
     @Override
-    public List<ConnConfProperty> getConfigurationProperties(final Long key) {
-        return logic.getConfigurationProperties(key);
+    public List<PlainSchemaTO> buildSchemaNames(final ConnInstanceTO connInstanceTO, final boolean includeSpecial) {
+        return logic.buildSchemaNames(connInstanceTO, includeSpecial);
     }
 
     @Override
-    public List<PlainSchemaTO> getSchemaNames(final Long key, final ConnInstanceTO connInstanceTO,
-            final boolean includeSpecial) {
-
-        connInstanceTO.setKey(key);
-
-        return CollectionUtils.collect(logic.getSchemaNames(connInstanceTO, includeSpecial),
-                new Transformer<String, PlainSchemaTO>() {
-
-                    @Override
-                    public PlainSchemaTO transform(final String name) {
-                        PlainSchemaTO schemaTO = new PlainSchemaTO();
-                        schemaTO.setKey(name);
-                        return schemaTO;
-                    }
-                }, new ArrayList<PlainSchemaTO>());
-    }
-
-    @Override
-    public List<ConnIdObjectClass> getSupportedObjectClasses(final Long key,
-            final ConnInstanceTO connInstanceTO) {
-
-        connInstanceTO.setKey(key);
-
-        return CollectionWrapper.wrap(logic.getSupportedObjectClasses(connInstanceTO), ConnIdObjectClass.class);
+    public List<ConnIdObjectClass> buildSupportedObjectClasses(final ConnInstanceTO connInstanceTO) {
+        return CollectionWrapper.wrap(logic.buildSupportedObjectClasses(connInstanceTO), ConnIdObjectClass.class);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/93439817/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/ConnectorITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/ConnectorITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/ConnectorITCase.java
index cc97936..71859a7 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/ConnectorITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/ConnectorITCase.java
@@ -397,7 +397,7 @@ public class ConnectorITCase extends AbstractITCase {
 
     @Test
     public void getConnectorConfiguration() {
-        List<ConnConfProperty> props = connectorService.getConfigurationProperties(104L);
+        Set<ConnConfProperty> props = connectorService.read(104L, Locale.ENGLISH.getLanguage()).getConfiguration();
         assertNotNull(props);
         assertFalse(props.isEmpty());
     }
@@ -541,13 +541,13 @@ public class ConnectorITCase extends AbstractITCase {
     public void getSchemaNames() {
         ConnInstanceTO conn = connectorService.read(101L, Locale.ENGLISH.getLanguage());
 
-        List<PlainSchemaTO> schemaNames = connectorService.getSchemaNames(conn.getKey(), conn, true);
+        List<PlainSchemaTO> schemaNames = connectorService.buildSchemaNames(conn, true);
         assertNotNull(schemaNames);
         assertFalse(schemaNames.isEmpty());
         assertNotNull(schemaNames.get(0).getKey());
         assertNull(schemaNames.get(0).getEnumerationValues());
 
-        schemaNames = connectorService.getSchemaNames(conn.getKey(), conn, false);
+        schemaNames = connectorService.buildSchemaNames(conn, false);
 
         assertNotNull(schemaNames);
         assertEquals(1, schemaNames.size());
@@ -557,7 +557,7 @@ public class ConnectorITCase extends AbstractITCase {
         // to be used with overridden properties
         conn.getConfiguration().clear();
 
-        schemaNames = connectorService.getSchemaNames(conn.getKey(), conn, true);
+        schemaNames = connectorService.buildSchemaNames(conn, true);
         assertNotNull(schemaNames);
         assertFalse(schemaNames.isEmpty());
     }
@@ -567,7 +567,7 @@ public class ConnectorITCase extends AbstractITCase {
         ConnInstanceTO ldap = connectorService.read(105L, Locale.ENGLISH.getLanguage());
         assertNotNull(ldap);
 
-        List<ConnIdObjectClass> objectClasses = connectorService.getSupportedObjectClasses(ldap.getKey(), ldap);
+        List<ConnIdObjectClass> objectClasses = connectorService.buildSupportedObjectClasses(ldap);
         assertNotNull(objectClasses);
         assertEquals(2, objectClasses.size());
         assertTrue(objectClasses.contains(
@@ -578,7 +578,7 @@ public class ConnectorITCase extends AbstractITCase {
         ConnInstanceTO csv = connectorService.read(104L, Locale.ENGLISH.getLanguage());
         assertNotNull(csv);
 
-        objectClasses = connectorService.getSupportedObjectClasses(csv.getKey(), csv);
+        objectClasses = connectorService.buildSupportedObjectClasses(csv);
         assertNotNull(objectClasses);
         assertEquals(1, objectClasses.size());
         assertTrue(objectClasses.contains(


[2/4] syncope git commit: [SYNCOPE-714] Consolidating old buildSchemaNames and buildSupportedObjectClasses into new buildO bjectClassInfo

Posted by il...@apache.org.
http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/ResourceServiceImpl.java
----------------------------------------------------------------------
diff --git a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/ResourceServiceImpl.java b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/ResourceServiceImpl.java
index 2cc6476..39dbba9 100644
--- a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/ResourceServiceImpl.java
+++ b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/ResourceServiceImpl.java
@@ -28,6 +28,7 @@ import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriBuilder;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.tuple.Pair;
+import org.apache.syncope.common.lib.patch.ResourceDeassociationPatch;
 import org.apache.syncope.common.lib.to.AnyTO;
 import org.apache.syncope.common.lib.to.BulkAction;
 import org.apache.syncope.common.lib.to.BulkActionResult;
@@ -35,8 +36,6 @@ import org.apache.syncope.common.lib.to.ConnObjectTO;
 import org.apache.syncope.common.lib.to.PagedConnObjectTOResult;
 import org.apache.syncope.common.lib.to.ResourceTO;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
-import org.apache.syncope.common.lib.types.ResourceDeassociationAction;
-import org.apache.syncope.common.lib.wrap.AnyKey;
 import org.apache.syncope.common.rest.api.RESTHeaders;
 import org.apache.syncope.common.rest.api.beans.ConnObjectTOListQuery;
 import org.apache.syncope.common.rest.api.service.ResourceService;
@@ -134,41 +133,39 @@ public class ResourceServiceImpl extends AbstractServiceImpl implements Resource
     }
 
     @Override
-    public BulkActionResult bulkDeassociation(
-            final String key, final String anyTypeKey, final ResourceDeassociationAction type,
-            final List<AnyKey> keys) {
-
-        AbstractResourceAssociator<? extends AnyTO> associator = anyTypeKey.equalsIgnoreCase(AnyTypeKind.USER.name())
-                ? userLogic
-                : anyTypeKey.equalsIgnoreCase(AnyTypeKind.GROUP.name())
-                        ? groupLogic
-                        : anyObjectLogic;
+    public BulkActionResult bulkDeassociation(final ResourceDeassociationPatch patch) {
+        AbstractResourceAssociator<? extends AnyTO> associator =
+                patch.getAnyTypeKey().equalsIgnoreCase(AnyTypeKind.USER.name())
+                        ? userLogic
+                        : patch.getAnyTypeKey().equalsIgnoreCase(AnyTypeKind.GROUP.name())
+                                ? groupLogic
+                                : anyObjectLogic;
 
         BulkActionResult result = new BulkActionResult();
 
-        for (AnyKey anyKey : keys) {
-            Set<String> resources = Collections.singleton(key);
+        for (Long anyKey : patch.getAnyKyes()) {
+            Set<String> resources = Collections.singleton(patch.getKey());
             try {
-                switch (type) {
+                switch (patch.getAction()) {
                     case DEPROVISION:
-                        associator.deprovision(anyKey.getElement(), resources);
+                        associator.deprovision(anyKey, resources);
                         break;
 
                     case UNASSIGN:
-                        associator.unassign(anyKey.getElement(), resources);
+                        associator.unassign(anyKey, resources);
                         break;
 
                     case UNLINK:
-                        associator.unlink(anyKey.getElement(), resources);
+                        associator.unlink(anyKey, resources);
                         break;
 
                     default:
                 }
 
-                result.getResults().put(String.valueOf(anyKey.getElement()), BulkActionResult.Status.SUCCESS);
+                result.getResults().put(String.valueOf(anyKey), BulkActionResult.Status.SUCCESS);
             } catch (Exception e) {
-                LOG.warn("While executing {} on {} {}", type, anyTypeKey, anyKey.getElement(), e);
-                result.getResults().put(String.valueOf(anyKey.getElement()), BulkActionResult.Status.FAILURE);
+                LOG.warn("While executing {} on {} {}", patch.getAction(), patch.getAnyTypeKey(), anyKey, e);
+                result.getResults().put(String.valueOf(anyKey), BulkActionResult.Status.FAILURE);
             }
         }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AbstractITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AbstractITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AbstractITCase.java
index b30c962..60565e1 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AbstractITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AbstractITCase.java
@@ -399,7 +399,7 @@ public abstract class AbstractITCase {
             throws NamingException {
         ResourceTO ldapRes = resourceService.read(RESOURCE_NAME_LDAP);
         final Map<String, ConnConfProperty> ldapConnConf =
-                connectorService.read(ldapRes.getConnector(), Locale.ENGLISH.getLanguage()).getConfigurationMap();
+                connectorService.read(ldapRes.getConnector(), Locale.ENGLISH.getLanguage()).getConfMap();
 
         Properties env = new Properties();
         env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/ConnectorITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/ConnectorITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/ConnectorITCase.java
index 71859a7..770a7cb 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/ConnectorITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/ConnectorITCase.java
@@ -28,6 +28,7 @@ import static org.junit.Assert.fail;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.EnumSet;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -37,16 +38,18 @@ import java.util.Map;
 import java.util.Properties;
 import java.util.Set;
 import javax.ws.rs.core.Response;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.Transformer;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.exception.ExceptionUtils;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.to.BulkAction;
 import org.apache.syncope.common.lib.to.ConnBundleTO;
+import org.apache.syncope.common.lib.to.ConnIdObjectClassTO;
 import org.apache.syncope.common.lib.to.ConnInstanceTO;
 import org.apache.syncope.common.lib.to.ConnPoolConfTO;
 import org.apache.syncope.common.lib.to.MappingItemTO;
 import org.apache.syncope.common.lib.to.MappingTO;
-import org.apache.syncope.common.lib.to.PlainSchemaTO;
 import org.apache.syncope.common.lib.to.ProvisionTO;
 import org.apache.syncope.common.lib.to.ResourceTO;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
@@ -54,7 +57,6 @@ import org.apache.syncope.common.lib.types.ConnConfPropSchema;
 import org.apache.syncope.common.lib.types.ConnConfProperty;
 import org.apache.syncope.common.lib.types.ConnectorCapability;
 import org.apache.syncope.common.lib.types.IntMappingType;
-import org.apache.syncope.common.lib.wrap.ConnIdObjectClass;
 import org.apache.syncope.common.rest.api.service.ConnectorService;
 import org.apache.syncope.common.rest.api.service.ResourceService;
 import org.identityconnectors.common.security.GuardedString;
@@ -146,7 +148,7 @@ public class ConnectorITCase extends AbstractITCase {
         conf.add(servicename);
 
         // set connector configuration
-        connectorTO.getConfiguration().addAll(conf);
+        connectorTO.getConf().addAll(conf);
 
         // set connector capabilities
         connectorTO.getCapabilities().add(ConnectorCapability.CREATE);
@@ -253,7 +255,7 @@ public class ConnectorITCase extends AbstractITCase {
         conf.add(servicename);
 
         // set connector configuration
-        connectorTO.getConfiguration().addAll(conf);
+        connectorTO.getConf().addAll(conf);
 
         connectorService.update(connectorTO);
         ConnInstanceTO actual = connectorService.read(connectorTO.getKey(), Locale.ENGLISH.getLanguage());
@@ -397,7 +399,7 @@ public class ConnectorITCase extends AbstractITCase {
 
     @Test
     public void getConnectorConfiguration() {
-        Set<ConnConfProperty> props = connectorService.read(104L, Locale.ENGLISH.getLanguage()).getConfiguration();
+        Set<ConnConfProperty> props = connectorService.read(104L, Locale.ENGLISH.getLanguage()).getConf();
         assertNotNull(props);
         assertFalse(props.isEmpty());
     }
@@ -408,7 +410,7 @@ public class ConnectorITCase extends AbstractITCase {
 
         boolean check = false;
 
-        for (ConnConfProperty prop : connInstanceTO.getConfiguration()) {
+        for (ConnConfProperty prop : connInstanceTO.getConf()) {
             if ("receiveTimeout".equals(prop.getSchema().getName())) {
                 check = true;
             }
@@ -424,7 +426,7 @@ public class ConnectorITCase extends AbstractITCase {
         Map<String, ConnConfProperty> instanceConfMap;
         for (ConnInstanceTO instance : connectorInstanceTOs) {
             if ("net.tirasa.connid.bundles.db.table".equals(instance.getBundleName())) {
-                instanceConfMap = instance.getConfigurationMap();
+                instanceConfMap = instance.getConfMap();
                 assertEquals("Utente", instanceConfMap.get("user").getSchema().getDisplayName());
             }
         }
@@ -434,7 +436,7 @@ public class ConnectorITCase extends AbstractITCase {
 
         for (ConnInstanceTO instance : connectorInstanceTOs) {
             if ("net.tirasa.connid.bundles.db.table".equals(instance.getBundleName())) {
-                instanceConfMap = instance.getConfigurationMap();
+                instanceConfMap = instance.getConfMap();
                 assertEquals("User", instanceConfMap.get("user").getSchema().getDisplayName());
             }
         }
@@ -516,7 +518,7 @@ public class ConnectorITCase extends AbstractITCase {
         conf.add(passwordColumn);
 
         // set connector configuration
-        connectorTO.getConfiguration().addAll(conf);
+        connectorTO.getConf().addAll(conf);
 
         try {
             connectorService.check(connectorTO);
@@ -538,51 +540,35 @@ public class ConnectorITCase extends AbstractITCase {
     }
 
     @Test
-    public void getSchemaNames() {
-        ConnInstanceTO conn = connectorService.read(101L, Locale.ENGLISH.getLanguage());
-
-        List<PlainSchemaTO> schemaNames = connectorService.buildSchemaNames(conn, true);
-        assertNotNull(schemaNames);
-        assertFalse(schemaNames.isEmpty());
-        assertNotNull(schemaNames.get(0).getKey());
-        assertNull(schemaNames.get(0).getEnumerationValues());
+    public void buildObjectClassInfo() {
+        ConnInstanceTO ws = connectorService.read(102L, Locale.ENGLISH.getLanguage());
+        assertNotNull(ws);
 
-        schemaNames = connectorService.buildSchemaNames(conn, false);
+        List<ConnIdObjectClassTO> objectClassInfo = connectorService.buildObjectClassInfo(ws, true);
+        assertNotNull(objectClassInfo);
+        assertEquals(1, objectClassInfo.size());
+        assertEquals(ObjectClass.ACCOUNT_NAME, objectClassInfo.get(0).getType());
+        assertTrue(objectClassInfo.get(0).getAttributes().contains("promoThirdPartyDisclaimer"));
 
-        assertNotNull(schemaNames);
-        assertEquals(1, schemaNames.size());
+        ConnInstanceTO ldap = connectorService.read(105L, Locale.ENGLISH.getLanguage());
+        assertNotNull(ldap);
 
-        conn = connectorService.read(104L, Locale.ENGLISH.getLanguage());
+        objectClassInfo = connectorService.buildObjectClassInfo(ldap, true);
+        assertNotNull(objectClassInfo);
+        assertEquals(2, objectClassInfo.size());
 
-        // to be used with overridden properties
-        conn.getConfiguration().clear();
+        Collection<String> objectClasses = CollectionUtils.collect(objectClassInfo,
+                new Transformer<ConnIdObjectClassTO, String>() {
 
-        schemaNames = connectorService.buildSchemaNames(conn, true);
-        assertNotNull(schemaNames);
-        assertFalse(schemaNames.isEmpty());
-    }
-
-    @Test
-    public void getSupportedObjectClasses() {
-        ConnInstanceTO ldap = connectorService.read(105L, Locale.ENGLISH.getLanguage());
-        assertNotNull(ldap);
+                    @Override
+                    public String transform(final ConnIdObjectClassTO info) {
+                        return info.getType();
+                    }
 
-        List<ConnIdObjectClass> objectClasses = connectorService.buildSupportedObjectClasses(ldap);
-        assertNotNull(objectClasses);
+                });
         assertEquals(2, objectClasses.size());
-        assertTrue(objectClasses.contains(
-                ConnIdObjectClass.getInstance(ConnIdObjectClass.class, ObjectClass.ACCOUNT_NAME)));
-        assertTrue(objectClasses.contains(
-                ConnIdObjectClass.getInstance(ConnIdObjectClass.class, ObjectClass.GROUP_NAME)));
-
-        ConnInstanceTO csv = connectorService.read(104L, Locale.ENGLISH.getLanguage());
-        assertNotNull(csv);
-
-        objectClasses = connectorService.buildSupportedObjectClasses(csv);
-        assertNotNull(objectClasses);
-        assertEquals(1, objectClasses.size());
-        assertTrue(objectClasses.contains(
-                ConnIdObjectClass.getInstance(ConnIdObjectClass.class, ObjectClass.ACCOUNT_NAME)));
+        assertTrue(objectClasses.contains(ObjectClass.ACCOUNT_NAME));
+        assertTrue(objectClasses.contains(ObjectClass.GROUP_NAME));
     }
 
     @Test
@@ -631,7 +617,7 @@ public class ConnectorITCase extends AbstractITCase {
         conf.add(servicename);
 
         // set connector configuration
-        connectorTO.getConfiguration().addAll(conf);
+        connectorTO.getConf().addAll(conf);
 
         try {
             try {
@@ -664,7 +650,7 @@ public class ConnectorITCase extends AbstractITCase {
             endpoint.getValues().add("http://localhost:9080/wssample/services/provisioning");
             conf.add(endpoint);
 
-            resourceTO.getConnConfProperties().addAll(conf);
+            resourceTO.getConfOverride().addAll(conf);
 
             ProvisionTO provisionTO = new ProvisionTO();
             provisionTO.setAnyType(AnyTypeKind.USER.name());

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/LoggerITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/LoggerITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/LoggerITCase.java
index 928365f..236d169 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/LoggerITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/LoggerITCase.java
@@ -38,7 +38,7 @@ import org.apache.syncope.common.lib.types.AuditLoggerName;
 import org.apache.syncope.common.lib.types.LoggerLevel;
 import org.apache.syncope.common.lib.types.LoggerType;
 import org.apache.syncope.common.lib.types.ResourceOperation;
-import org.apache.syncope.common.rest.api.CollectionWrapper;
+import org.apache.syncope.common.rest.api.LoggerWrapper;
 import org.apache.syncope.core.logic.ReportLogic;
 import org.apache.syncope.core.logic.ResourceLogic;
 import org.apache.syncope.core.logic.GroupLogic;
@@ -105,7 +105,7 @@ public class LoggerITCase extends AbstractITCase {
                 "deleteExecution",
                 AuditElements.Result.FAILURE);
 
-        List<AuditLoggerName> audits = CollectionWrapper.wrapLogger(loggerService.list(LoggerType.AUDIT));
+        List<AuditLoggerName> audits = LoggerWrapper.wrap(loggerService.list(LoggerType.AUDIT));
         assertNotNull(audits);
         assertFalse(audits.contains(auditLoggerName));
 
@@ -114,13 +114,13 @@ public class LoggerITCase extends AbstractITCase {
         loggerTO.setLevel(LoggerLevel.DEBUG);
         loggerService.update(LoggerType.AUDIT, loggerTO);
 
-        audits = CollectionWrapper.wrapLogger(loggerService.list(LoggerType.AUDIT));
+        audits = LoggerWrapper.wrap(loggerService.list(LoggerType.AUDIT));
         assertNotNull(audits);
         assertTrue(audits.contains(auditLoggerName));
 
         loggerService.delete(LoggerType.AUDIT, auditLoggerName.toLoggerName());
 
-        audits = CollectionWrapper.wrapLogger(loggerService.list(LoggerType.AUDIT));
+        audits = LoggerWrapper.wrap(loggerService.list(LoggerType.AUDIT));
         assertNotNull(audits);
         assertFalse(audits.contains(auditLoggerName));
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/ResourceITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/ResourceITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/ResourceITCase.java
index e0539c8..5d4d176 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/ResourceITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/ResourceITCase.java
@@ -170,7 +170,7 @@ public class ResourceITCase extends AbstractITCase {
         p.getValues().add("http://invalidurl/");
 
         Set<ConnConfProperty> connectorConfigurationProperties = new HashSet<>(Arrays.asList(p));
-        resourceTO.getConnConfProperties().addAll(connectorConfigurationProperties);
+        resourceTO.getConfOverride().addAll(connectorConfigurationProperties);
 
         Response response = resourceService.create(resourceTO);
         ResourceTO actual = getObject(response.getLocation(), ResourceService.class, ResourceTO.class);

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/SyncTaskITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/SyncTaskITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/SyncTaskITCase.java
index e8ffd56..ef73242 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/SyncTaskITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/SyncTaskITCase.java
@@ -748,7 +748,7 @@ public class SyncTaskITCase extends AbstractTaskITCase {
         ResourceTO ldapResource = resourceService.read(RESOURCE_NAME_LDAP);
         ConnInstanceTO resourceConnector = connectorService.read(
                 ldapResource.getConnector(), Locale.ENGLISH.getLanguage());
-        ConnConfProperty property = resourceConnector.getConfigurationMap().get("retrievePasswordsWithSearch");
+        ConnConfProperty property = resourceConnector.getConfMap().get("retrievePasswordsWithSearch");
         property.getValues().clear();
         property.getValues().add(Boolean.TRUE);
         connectorService.update(resourceConnector);

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/VirAttrITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/VirAttrITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/VirAttrITCase.java
index e96026f..cf00ffd 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/VirAttrITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/VirAttrITCase.java
@@ -367,7 +367,7 @@ public class VirAttrITCase extends AbstractITCase {
         String jdbcURL = null;
         ConnInstanceTO connInstanceTO = connectorService.readByResource(
                 RESOURCE_NAME_DBVIRATTR, Locale.ENGLISH.getLanguage());
-        for (ConnConfProperty prop : connInstanceTO.getConfiguration()) {
+        for (ConnConfProperty prop : connInstanceTO.getConf()) {
             if ("jdbcUrlTemplate".equals(prop.getSchema().getName())) {
                 jdbcURL = prop.getValues().iterator().next().toString();
                 prop.getValues().clear();
@@ -400,7 +400,7 @@ public class VirAttrITCase extends AbstractITCase {
         // ----------------------------------------
         // 5. restore connector URL, values can be read again from external resource
         // ----------------------------------------
-        for (ConnConfProperty prop : connInstanceTO.getConfiguration()) {
+        for (ConnConfProperty prop : connInstanceTO.getConf()) {
             if ("jdbcUrlTemplate".equals(prop.getSchema().getName())) {
                 prop.getValues().clear();
                 prop.getValues().add(jdbcURL);


[3/4] syncope git commit: [SYNCOPE-714] Consolidating old buildSchemaNames and buildSupportedObjectClasses into new buildO bjectClassInfo

Posted by il...@apache.org.
http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ConnInstanceTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ConnInstanceTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ConnInstanceTest.java
index f3ade5e..6033bd4 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ConnInstanceTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ConnInstanceTest.java
@@ -104,8 +104,8 @@ public class ConnInstanceTest extends AbstractTest {
         conf.add(servicename);
 
         // set connector configuration
-        connInstance.setConfiguration(conf);
-        assertFalse(connInstance.getConfiguration().isEmpty());
+        connInstance.setConf(conf);
+        assertFalse(connInstance.getConf().isEmpty());
 
         // perform save operation
         ConnInstance actual = connInstanceDAO.save(connInstance);
@@ -125,7 +125,7 @@ public class ConnInstanceTest extends AbstractTest {
 
         assertEquals(60, actual.getConnRequestTimeout(), 0);
 
-        conf = connInstance.getConfiguration();
+        conf = connInstance.getConf();
         assertFalse(conf.isEmpty());
 
         assertNotNull("configuration retrieving failed", conf);

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/ConnInstanceTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/ConnInstanceTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/ConnInstanceTest.java
index d9f79fc..f557e8c 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/ConnInstanceTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/ConnInstanceTest.java
@@ -85,7 +85,7 @@ public class ConnInstanceTest extends AbstractTest {
                 || "ws-target-resource-nopropagation".equalsIgnoreCase(resources.get(2).getKey())
                 || "ws-target-resource-nopropagation".equalsIgnoreCase(resources.get(3).getKey()));
 
-        connInstance.addCapability(ConnectorCapability.SEARCH);
+        connInstance.getCapabilities().add(ConnectorCapability.SEARCH);
 
         connInstance = connInstanceDAO.save(connInstance);
         assertNotNull(connInstance);

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/resources/domains/MasterContent.xml b/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
index d1fde9e..2bc840d 100644
--- a/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
+++ b/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
@@ -580,54 +580,55 @@ under the License.
   <ConnInstance_capabilities ConnInstance_id="108" capability="SYNC"/>
   
   <ExternalResource name="ws-target-resource-1" connector_id="100"
-                    randomPwdIfNotProvided="0" enforceMandatoryCondition="0"
+                    randomPwdIfNotProvided="0" enforceMandatoryCondition="0" overrideCapabilities="0"
                     propagationPriority="0" propagationPrimary="1" createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL"
-                    creator="admin" lastModifier="admin" 
+                    creator="admin" lastModifier="admin"
                     creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/>
   <ExternalResource name="ws-target-resource-2" connector_id="100"
-                    randomPwdIfNotProvided="0" enforceMandatoryCondition="1"
+                    randomPwdIfNotProvided="0" enforceMandatoryCondition="1" overrideCapabilities="0"
                     propagationPriority="0" propagationPrimary="0" createTraceLevel="FAILURES" deleteTraceLevel="NONE" updateTraceLevel="ALL" syncTraceLevel="ALL"
                     syncPolicy_id="9"
                     creator="admin" lastModifier="admin" 
                     creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/>
   <ExternalResource name="ws-target-resource-timeout" connector_id="102"
-                    randomPwdIfNotProvided="0" enforceMandatoryCondition="1"
+                    randomPwdIfNotProvided="0" enforceMandatoryCondition="1" overrideCapabilities="0"
                     propagationPriority="0" propagationPrimary="1" createTraceLevel="FAILURES" deleteTraceLevel="NONE" updateTraceLevel="ALL" syncTraceLevel="ALL"
                     jsonConf='[{"schema":{"name":"endpoint","displayName":null,"helpMessage":null,"type":"java.lang.String","required":true,"order":0,"confidential":false,"defaultValues":null},"overridable":true,"values":["http://localhost:${cargo.servlet.port}/syncope-fit-build-tools/services/provisioning"]}]'
                     creator="admin" lastModifier="admin" 
                     creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/>
   <ExternalResource name="ws-target-resource-list-mappings-1" connector_id="100"
-                    randomPwdIfNotProvided="0" enforceMandatoryCondition="0"
+                    randomPwdIfNotProvided="0" enforceMandatoryCondition="0" overrideCapabilities="0"
                     propagationPriority="0" propagationPrimary="0" createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL"
                     creator="admin" lastModifier="admin" 
                     creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/>
   <ExternalResource name="ws-target-resource-list-mappings-2" connector_id="100"
-                    randomPwdIfNotProvided="0" enforceMandatoryCondition="1"
+                    randomPwdIfNotProvided="0" enforceMandatoryCondition="1" overrideCapabilities="0"
                     propagationPriority="0" propagationPrimary="0" createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL"
                     creator="admin" lastModifier="admin" 
                     creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/>
   <ExternalResource name="ws-target-resource-delete" connector_id="102"
-                    randomPwdIfNotProvided="0" enforceMandatoryCondition="0"
+                    randomPwdIfNotProvided="0" enforceMandatoryCondition="0" overrideCapabilities="0"
                     propagationPriority="2" propagationPrimary="0" createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL"
                     creator="admin" lastModifier="admin" 
                     creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/>
   <ExternalResource name="ws-target-resource-update" connector_id="100"
-                    randomPwdIfNotProvided="0" enforceMandatoryCondition="1"
+                    randomPwdIfNotProvided="0" enforceMandatoryCondition="1" overrideCapabilities="0"
                     propagationPriority="0" propagationPrimary="0" createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL"
                     creator="admin" lastModifier="admin" 
                     creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/>
   <ExternalResource name="resource-testdb" connector_id="101"
-                    randomPwdIfNotProvided="0" enforceMandatoryCondition="1"
+                    randomPwdIfNotProvided="0" enforceMandatoryCondition="1" overrideCapabilities="0"
                     propagationPriority="0" propagationPrimary="0" createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL"
                     creator="admin" lastModifier="admin" 
                     creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/>
   <ExternalResource name="resource-testdb2" connector_id="106"
-                    randomPwdIfNotProvided="1" enforceMandatoryCondition="1"
+                    randomPwdIfNotProvided="1" enforceMandatoryCondition="1" overrideCapabilities="0"
                     propagationPriority="0" propagationPrimary="0" createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL"
                     creator="admin" lastModifier="admin" 
                     creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/>
   <ExternalResource name="resource-csv" connector_id="104"
-                    randomPwdIfNotProvided="0" enforceMandatoryCondition="0" syncPolicy_id="3"
+                    randomPwdIfNotProvided="0" enforceMandatoryCondition="0" overrideCapabilities="0"
+                    syncPolicy_id="3"
                     propagationPriority="0" propagationPrimary="0" createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL"
                     creator="admin" lastModifier="admin" 
                     creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/>
@@ -636,7 +637,7 @@ under the License.
                     creator="admin" lastModifier="admin" 
                     creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/>
   <ExternalResource name="resource-ldap" connector_id="105"
-                    randomPwdIfNotProvided="1" enforceMandatoryCondition="1"
+                    randomPwdIfNotProvided="1" enforceMandatoryCondition="1" overrideCapabilities="0"
                     propagationPriority="0" propagationPrimary="1"
                     createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL"
                     creator="admin" lastModifier="admin" 
@@ -644,22 +645,25 @@ under the License.
   <ExternalResource_PropActions resource_name="resource-ldap"
                                 actionClassName="org.apache.syncope.core.provisioning.java.propagation.LDAPMembershipPropagationActions"/>
   <ExternalResource name="ws-target-resource-nopropagation" connector_id="103"
-                    randomPwdIfNotProvided="0" enforceMandatoryCondition="1"
+                    randomPwdIfNotProvided="0" enforceMandatoryCondition="1" overrideCapabilities="0"
                     propagationPriority="0" propagationPrimary="0" createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL" 
                     passwordPolicy_id="4"
                     creator="admin" lastModifier="admin" 
                     creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/>
   
-  <!-- The following three resources has been added to verify the issue SYNCOPE-68 -->
-  <ExternalResource name="ws-target-resource-nopropagation2" connector_id="103" enforceMandatoryCondition="1"
+  <!-- The following three resources have been added to verify the issue SYNCOPE-68 -->
+  <ExternalResource name="ws-target-resource-nopropagation2" connector_id="103" 
+                    enforceMandatoryCondition="1" overrideCapabilities="0"
                     randomPwdIfNotProvided="0" propagationPriority="0" propagationPrimary="0" createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL"
                     creator="admin" lastModifier="admin" 
                     creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/>
-  <ExternalResource name="ws-target-resource-nopropagation3" connector_id="103" enforceMandatoryCondition="1"
+  <ExternalResource name="ws-target-resource-nopropagation3" connector_id="103" 
+                    enforceMandatoryCondition="1" overrideCapabilities="0"
                     randomPwdIfNotProvided="0" propagationPriority="0" propagationPrimary="0" createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL"
                     creator="admin" lastModifier="admin" 
                     creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/>
-  <ExternalResource name="ws-target-resource-nopropagation4" connector_id="103" enforceMandatoryCondition="1"
+  <ExternalResource name="ws-target-resource-nopropagation4" connector_id="103" 
+                    enforceMandatoryCondition="1" overrideCapabilities="0"
                     randomPwdIfNotProvided="0" propagationPriority="0" propagationPrimary="0" createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL"
                     creator="admin" lastModifier="admin" 
                     creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/>
@@ -668,7 +672,7 @@ under the License.
   <ExternalResource name="resource-db-sync" connector_id="107"
                     randomPwdIfNotProvided="0" createTraceLevel="ALL" deleteTraceLevel="ALL" syncTraceLevel="ALL" updateTraceLevel="ALL"
                     enforceMandatoryCondition="0" 
-                    propagationPrimary="0" propagationPriority="0"
+                    propagationPrimary="0" propagationPriority="0" overrideCapabilities="0"
                     creator="admin" lastModifier="admin" 
                     creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/>
                     
@@ -676,14 +680,14 @@ under the License.
   <ExternalResource name="resource-db-virattr" connector_id="107"
                     randomPwdIfNotProvided="0" createTraceLevel="ALL" deleteTraceLevel="ALL" syncTraceLevel="ALL" updateTraceLevel="ALL"
                     enforceMandatoryCondition="0" 
-                    propagationPrimary="0" propagationPriority="0"
+                    propagationPrimary="0" propagationPriority="0" overrideCapabilities="0"
                     creator="admin" lastModifier="admin" 
                     creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/>
 
   <ExternalResource name="resource-db-scripted" connector_id="108"
                     randomPwdIfNotProvided="0" createTraceLevel="ALL" deleteTraceLevel="ALL" syncTraceLevel="ALL" updateTraceLevel="ALL"
                     enforceMandatoryCondition="0"
-                    propagationPrimary="0" propagationPriority="0"
+                    propagationPrimary="0" propagationPriority="0" overrideCapabilities="0"
                     creator="admin" lastModifier="admin" 
                     creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/>
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/ConnIdBundleManager.java
----------------------------------------------------------------------
diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/ConnIdBundleManager.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/ConnIdBundleManager.java
index 186dbbb..242202f 100644
--- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/ConnIdBundleManager.java
+++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/ConnIdBundleManager.java
@@ -31,7 +31,7 @@ import org.identityconnectors.framework.api.ConnectorInfoManager;
  */
 public interface ConnIdBundleManager {
 
-    ConfigurationProperties getConfigurationProperties(final ConnectorInfo info);
+    ConfigurationProperties getConfigurationProperties(ConnectorInfo info);
 
     Map<URI, ConnectorInfoManager> getConnManagers();
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/Connector.java
----------------------------------------------------------------------
diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/Connector.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/Connector.java
index ce8adba..2a3a0a1 100644
--- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/Connector.java
+++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/Connector.java
@@ -28,6 +28,7 @@ import org.apache.syncope.core.persistence.api.entity.resource.MappingItem;
 import org.identityconnectors.framework.common.objects.Attribute;
 import org.identityconnectors.framework.common.objects.ConnectorObject;
 import org.identityconnectors.framework.common.objects.ObjectClass;
+import org.identityconnectors.framework.common.objects.ObjectClassInfo;
 import org.identityconnectors.framework.common.objects.OperationOptions;
 import org.identityconnectors.framework.common.objects.ResultsHandler;
 import org.identityconnectors.framework.common.objects.SyncResultsHandler;
@@ -134,8 +135,7 @@ public interface Connector {
     ConnectorObject getObject(ObjectClass objectClass, Uid uid, OperationOptions options);
 
     /**
-     * Get remote object used by the propagation manager in order to choose for a create (object doesn't exist) or an
-     * update (object exists).
+     * Get remote object with check for intended operation to perform on external resource.
      *
      * @param operationType resource operation type
      * @param objectClass ConnId's object class
@@ -186,40 +186,11 @@ public interface Connector {
             Iterator<? extends MappingItem> mapItems);
 
     /**
-     * Read attribute for a given connector object.
+     * Builds metadata description of ConnId {@link ObjectClass}.
      *
-     * @param objectClass ConnId's object class
-     * @param uid ConnId's Uid
-     * @param options ConnId's OperationOptions
-     * @param attributeName attribute to read
-     * @return attribute (if present)
-     */
-    Attribute getObjectAttribute(ObjectClass objectClass, Uid uid, OperationOptions options, String attributeName);
-
-    /**
-     * Read attributes for a given connector object.
-     *
-     * @param objectClass ConnId's object class
-     * @param uid ConnId's Uid
-     * @param options ConnId's OperationOptions
-     * @return attributes (if present)
+     * @return metadata description of ConnId ObjectClass
      */
-    Set<Attribute> getObjectAttributes(ObjectClass objectClass, Uid uid, OperationOptions options);
-
-    /**
-     * Return resource schema names.
-     *
-     * @param includeSpecial return special attributes (like as __NAME__ or __PASSWORD__) if true
-     * @return schema names
-     */
-    Set<String> getSchemaNames(boolean includeSpecial);
-
-    /**
-     * Return ConnId's object classes supported by this connector.
-     *
-     * @return supported object classes
-     */
-    Set<ObjectClass> getSupportedObjectClasses();
+    Set<ObjectClassInfo> getObjectClassInfo();
 
     /**
      * Validate a connector instance.
@@ -236,14 +207,5 @@ public interface Connector {
      *
      * @return active connector instance.
      */
-    ConnInstance getActiveConnInstance();
-
-    /**
-     * Build options for requesting all mapped connector attributes.
-     *
-     * @param mapItems mapping items
-     * @return options for requesting all mapped connector attributes
-     * @see OperationOptions
-     */
-    OperationOptions getOperationOptions(Iterator<? extends MappingItem> mapItems);
+    ConnInstance getConnInstance();
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/ConnectorFactory.java
----------------------------------------------------------------------
diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/ConnectorFactory.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/ConnectorFactory.java
index 6d2d0c8..4c6dd82 100644
--- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/ConnectorFactory.java
+++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/ConnectorFactory.java
@@ -20,7 +20,7 @@ package org.apache.syncope.core.provisioning.api;
 
 import java.util.Set;
 import org.apache.syncope.common.lib.types.ConnConfProperty;
-import org.apache.syncope.core.persistence.api.SyncopeLoader;
+import org.apache.syncope.common.lib.types.ConnectorCapability;
 import org.apache.syncope.core.persistence.api.entity.ConnInstance;
 import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
 
@@ -29,16 +29,28 @@ import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
  *
  * @see Connector
  */
-public interface ConnectorFactory extends SyncopeLoader {
+public interface ConnectorFactory {
 
     /**
-     * Create connector from given connector instance and configuration properties.
+     * Builds connector instance override over base connector instance, configuration and capabilities override.
+     *
+     * @param connInstance base connector instance
+     * @param confOverride configuration override
+     * @param capabilitiesOverride capabilities override
+     * @return connector instance override over base connector instance, configuration and capabilities override
+     */
+    ConnInstance buildConnInstanceOverride(
+            ConnInstance connInstance,
+            Set<ConnConfProperty> confOverride,
+            Set<ConnectorCapability> capabilitiesOverride);
+
+    /**
+     * Create connector from given connector instance.
      *
      * @param connInstance connector instance
-     * @param configuration configuration properties
      * @return connector
      */
-    Connector createConnector(ConnInstance connInstance, Set<ConnConfProperty> configuration);
+    Connector createConnector(ConnInstance connInstance);
 
     /**
      * Get existing connector for the given resource.
@@ -53,7 +65,6 @@ public interface ConnectorFactory extends SyncopeLoader {
      *
      * @see ExternalResource
      */
-    @Override
     void load();
 
     /**

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/ConnectorRegistry.java
----------------------------------------------------------------------
diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/ConnectorRegistry.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/ConnectorRegistry.java
index 1bcbcbc..c1cc547 100644
--- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/ConnectorRegistry.java
+++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/ConnectorRegistry.java
@@ -18,9 +18,6 @@
  */
 package org.apache.syncope.core.provisioning.api;
 
-import java.util.Set;
-import org.apache.syncope.common.lib.types.ConnConfProperty;
-import org.apache.syncope.core.persistence.api.entity.ConnInstance;
 import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
 
 /**
@@ -29,15 +26,6 @@ import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
 public interface ConnectorRegistry {
 
     /**
-     * Returns a connector instance with overridden property values, if found.
-     *
-     * @param connInstance base connector instance
-     * @param overridden overridden property values
-     * @return connector instance with overridden property values, if found
-     */
-    ConnInstance getOverriddenConnInstance(ConnInstance connInstance, Set<ConnConfProperty> overridden);
-
-    /**
      * Create and register into Spring context a bean for the given resource.
      *
      * @param resource external resource

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/ConnInstanceDataBinder.java
----------------------------------------------------------------------
diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/ConnInstanceDataBinder.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/ConnInstanceDataBinder.java
index d3496a2..373d1af 100644
--- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/ConnInstanceDataBinder.java
+++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/ConnInstanceDataBinder.java
@@ -18,31 +18,19 @@
  */
 package org.apache.syncope.core.provisioning.api.data;
 
-import java.util.Set;
 import org.apache.syncope.common.lib.to.ConnInstanceTO;
 import org.apache.syncope.common.lib.types.ConnConfPropSchema;
-import org.apache.syncope.common.lib.types.ConnConfProperty;
 import org.apache.syncope.core.persistence.api.entity.ConnInstance;
 import org.identityconnectors.framework.api.ConfigurationProperty;
 
 public interface ConnInstanceDataBinder {
 
-    ConnConfPropSchema buildConnConfPropSchema(ConfigurationProperty property);
+    ConnConfPropSchema build(ConfigurationProperty property);
 
     ConnInstance getConnInstance(ConnInstanceTO connInstanceTO);
 
     ConnInstanceTO getConnInstanceTO(ConnInstance connInstance);
 
-    /**
-     * Merge connector configuration properties avoiding repetition but giving priority to primary set.
-     *
-     * @param primary primary set.
-     * @param secondary secondary set.
-     * @return merged set.
-     */
-    Set<ConnConfProperty> mergeConnConfProperties(Set<ConnConfProperty> primary,
-            Set<ConnConfProperty> secondary);
-
-    ConnInstance updateConnInstance(long connInstanceId, ConnInstanceTO connInstanceTO);
+    ConnInstance update(long key, ConnInstanceTO connInstanceTO);
 
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/ResourceDataBinder.java
----------------------------------------------------------------------
diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/ResourceDataBinder.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/ResourceDataBinder.java
index 2d96d71..9f1ea5d 100644
--- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/ResourceDataBinder.java
+++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/ResourceDataBinder.java
@@ -19,17 +19,14 @@
 package org.apache.syncope.core.provisioning.api.data;
 
 import org.apache.syncope.common.lib.to.ResourceTO;
-import org.apache.syncope.core.persistence.api.entity.ConnInstance;
 import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
 
 public interface ResourceDataBinder {
 
-    ExternalResource create(ResourceTO resourceTO);
-
-    ConnInstance getConnInstance(ResourceTO resourceTO);
-
     ResourceTO getResourceTO(ExternalResource resource);
 
+    ExternalResource create(ResourceTO resourceTO);
+
     ExternalResource update(ExternalResource resource, ResourceTO resourceTO);
 
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/AsyncConnectorFacade.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/AsyncConnectorFacade.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/AsyncConnectorFacade.java
index 0b4340e..83a38eb 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/AsyncConnectorFacade.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/AsyncConnectorFacade.java
@@ -18,19 +18,16 @@
  */
 package org.apache.syncope.core.provisioning.java;
 
-import java.util.HashSet;
+import java.util.Collections;
 import java.util.Set;
 import java.util.concurrent.Future;
 import org.identityconnectors.common.security.GuardedString;
 import org.identityconnectors.framework.api.ConnectorFacade;
 import org.identityconnectors.framework.common.objects.Attribute;
-import org.identityconnectors.framework.common.objects.AttributeInfo;
-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.ObjectClassInfo;
 import org.identityconnectors.framework.common.objects.OperationOptions;
-import org.identityconnectors.framework.common.objects.Schema;
 import org.identityconnectors.framework.common.objects.SyncToken;
 import org.identityconnectors.framework.common.objects.Uid;
 import org.slf4j.Logger;
@@ -46,9 +43,6 @@ import org.springframework.stereotype.Component;
 @Component
 public class AsyncConnectorFacade {
 
-    /**
-     * Logger.
-     */
     private static final Logger LOG = LoggerFactory.getLogger(AsyncConnectorFacade.class);
 
     @Async
@@ -111,83 +105,17 @@ public class AsyncConnectorFacade {
     }
 
     @Async
-    public Future<Attribute> getObjectAttribute(
-            final ConnectorFacade connector,
-            final ObjectClass objectClass,
-            final Uid uid,
-            final OperationOptions options,
-            final String attributeName) {
-
-        Attribute attribute = null;
-
-        ConnectorObject object = connector.getObject(objectClass, uid, options);
-        if (object == null) {
-            LOG.debug("Object for '{}' not found", uid.getUidValue());
-        } else {
-            attribute = object.getAttributeByName(attributeName);
-        }
-
-        return new AsyncResult<>(attribute);
-    }
-
-    @Async
-    public Future<Set<Attribute>> getObjectAttributes(
-            final ConnectorFacade connector,
-            final ObjectClass objectClass,
-            final Uid uid,
-            final OperationOptions options) {
-
-        Set<Attribute> attributes = new HashSet<>();
-
-        ConnectorObject object = connector.getObject(objectClass, uid, options);
-
-        if (object == null) {
-            LOG.debug("Object for '{}' not found", uid.getUidValue());
-        } else {
-            for (String attribute : options.getAttributesToGet()) {
-                attributes.add(object.getAttributeByName(attribute));
-            }
-        }
-
-        return new AsyncResult<>(attributes);
-    }
-
-    @Async
-    public Future<Set<String>> getSchemaNames(final ConnectorFacade connector, final boolean includeSpecial) {
-        Set<String> schemaNames = new HashSet<>();
-
-        try {
-            Schema schema = connector.schema();
-            for (ObjectClassInfo info : schema.getObjectClassInfo()) {
-                for (AttributeInfo attrInfo : info.getAttributeInfo()) {
-                    if (includeSpecial || !AttributeUtil.isSpecialName(attrInfo.getName())) {
-                        schemaNames.add(attrInfo.getName());
-                    }
-                }
-            }
-        } catch (Exception e) {
-            // catch exception in order to manage unpredictable behaviors
-            LOG.debug("While reading schema on connector {}", connector, e);
-        }
-
-        return new AsyncResult<>(schemaNames);
-    }
-
-    @Async
-    public Future<Set<ObjectClass>> getSupportedObjectClasses(final ConnectorFacade connector) {
-        Set<ObjectClass> objectClasses = new HashSet<>();
+    public Future<Set<ObjectClassInfo>> getObjectClassInfo(final ConnectorFacade connector) {
+        Set<ObjectClassInfo> result = Collections.emptySet();
 
         try {
-            Schema schema = connector.schema();
-            for (ObjectClassInfo info : schema.getObjectClassInfo()) {
-                objectClasses.add(new ObjectClass(info.getType()));
-            }
+            result = connector.schema().getObjectClassInfo();
         } catch (Exception e) {
             // catch exception in order to manage unpredictable behaviors
             LOG.debug("While reading schema on connector {}", connector, e);
         }
 
-        return new AsyncResult<>(objectClasses);
+        return new AsyncResult<>(result);
     }
 
     @Async

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ConnectorFacadeProxy.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ConnectorFacadeProxy.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ConnectorFacadeProxy.java
index 6c2be32..a3b865f 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ConnectorFacadeProxy.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ConnectorFacadeProxy.java
@@ -21,7 +21,6 @@ package org.apache.syncope.core.provisioning.java;
 import java.io.File;
 import java.net.URI;
 import java.util.ArrayList;
-import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
@@ -31,8 +30,8 @@ import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.Transformer;
 import org.apache.syncope.common.lib.types.ConnConfProperty;
 import org.apache.syncope.common.lib.types.ConnectorCapability;
-import org.apache.syncope.common.lib.types.MappingPurpose;
 import org.apache.syncope.common.lib.types.ResourceOperation;
+import org.apache.syncope.core.misc.MappingUtils;
 import org.apache.syncope.core.persistence.api.entity.ConnInstance;
 import org.apache.syncope.core.provisioning.api.ConnIdBundleManager;
 import org.apache.syncope.core.provisioning.api.ConnPoolConfUtils;
@@ -50,11 +49,10 @@ import org.identityconnectors.framework.api.ConnectorFacadeFactory;
 import org.identityconnectors.framework.api.ConnectorInfo;
 import org.identityconnectors.framework.common.objects.Attribute;
 import org.identityconnectors.framework.common.objects.ConnectorObject;
-import org.identityconnectors.framework.common.objects.Name;
 import org.identityconnectors.framework.common.objects.ObjectClass;
+import org.identityconnectors.framework.common.objects.ObjectClassInfo;
 import org.identityconnectors.framework.common.objects.OperationOptions;
 import org.identityconnectors.framework.common.objects.OperationOptionsBuilder;
-import org.identityconnectors.framework.common.objects.OperationalAttributes;
 import org.identityconnectors.framework.common.objects.ResultsHandler;
 import org.identityconnectors.framework.common.objects.SearchResult;
 import org.identityconnectors.framework.common.objects.SortKey;
@@ -84,7 +82,7 @@ public class ConnectorFacadeProxy implements Connector {
     /**
      * Active connector instance.
      */
-    private final ConnInstance activeConnInstance;
+    private final ConnInstance connInstance;
 
     @Autowired
     private AsyncConnectorFacade asyncFacade;
@@ -92,14 +90,14 @@ public class ConnectorFacadeProxy implements Connector {
     /**
      * Use the passed connector instance to build a ConnectorFacade that will be used to make all wrapped calls.
      *
-     * @param connInstance the connector instance configuration
+     * @param connInstance the connector instance
      * @see ConnectorInfo
      * @see APIConfiguration
      * @see ConfigurationProperties
      * @see ConnectorFacade
      */
     public ConnectorFacadeProxy(final ConnInstance connInstance) {
-        this.activeConnInstance = connInstance;
+        this.connInstance = connInstance;
 
         ConnIdBundleManager connIdBundleManager =
                 ApplicationContextProvider.getBeanFactory().getBean(ConnIdBundleManager.class);
@@ -112,7 +110,7 @@ public class ConnectorFacadeProxy implements Connector {
 
         // set connector configuration according to conninstance's
         ConfigurationProperties properties = apiConfig.getConfigurationProperties();
-        for (ConnConfProperty property : connInstance.getConfiguration()) {
+        for (ConnConfProperty property : connInstance.getConf()) {
             if (property.getValues() != null && !property.getValues().isEmpty()) {
                 properties.setPropertyValue(property.getSchema().getName(),
                         getPropertyValue(property.getSchema().getType(), property.getValues()));
@@ -140,11 +138,11 @@ public class ConnectorFacadeProxy implements Connector {
     public Uid authenticate(final String username, final String password, final OperationOptions options) {
         Uid result = null;
 
-        if (activeConnInstance.getCapabilities().contains(ConnectorCapability.AUTHENTICATE)) {
+        if (connInstance.getCapabilities().contains(ConnectorCapability.AUTHENTICATE)) {
             Future<Uid> future = asyncFacade.authenticate(
                     connector, username, new GuardedString(password.toCharArray()), options);
             try {
-                result = future.get(activeConnInstance.getConnRequestTimeout(), TimeUnit.SECONDS);
+                result = future.get(connInstance.getConnRequestTimeout(), TimeUnit.SECONDS);
             } catch (java.util.concurrent.TimeoutException e) {
                 future.cancel(true);
                 throw new TimeoutException("Request timeout");
@@ -158,7 +156,7 @@ public class ConnectorFacadeProxy implements Connector {
             }
         } else {
             LOG.info("Authenticate was attempted, although the connector only has these capabilities: {}. No action.",
-                    activeConnInstance.getCapabilities());
+                    connInstance.getCapabilities());
         }
 
         return result;
@@ -173,12 +171,12 @@ public class ConnectorFacadeProxy implements Connector {
 
         Uid result = null;
 
-        if (activeConnInstance.getCapabilities().contains(ConnectorCapability.CREATE)) {
+        if (connInstance.getCapabilities().contains(ConnectorCapability.CREATE)) {
             propagationAttempted[0] = true;
 
             Future<Uid> future = asyncFacade.create(connector, objectClass, attrs, options);
             try {
-                result = future.get(activeConnInstance.getConnRequestTimeout(), TimeUnit.SECONDS);
+                result = future.get(connInstance.getConnRequestTimeout(), TimeUnit.SECONDS);
             } catch (java.util.concurrent.TimeoutException e) {
                 future.cancel(true);
                 throw new TimeoutException("Request timeout");
@@ -192,7 +190,7 @@ public class ConnectorFacadeProxy implements Connector {
             }
         } else {
             LOG.info("Create was attempted, although the connector only has these capabilities: {}. No action.",
-                    activeConnInstance.getCapabilities());
+                    connInstance.getCapabilities());
         }
 
         return result;
@@ -208,13 +206,13 @@ public class ConnectorFacadeProxy implements Connector {
 
         Uid result = null;
 
-        if (activeConnInstance.getCapabilities().contains(ConnectorCapability.UPDATE)) {
+        if (connInstance.getCapabilities().contains(ConnectorCapability.UPDATE)) {
             propagationAttempted[0] = true;
 
             Future<Uid> future = asyncFacade.update(connector, objectClass, uid, attrs, options);
 
             try {
-                result = future.get(activeConnInstance.getConnRequestTimeout(), TimeUnit.SECONDS);
+                result = future.get(connInstance.getConnRequestTimeout(), TimeUnit.SECONDS);
             } catch (java.util.concurrent.TimeoutException e) {
                 future.cancel(true);
                 throw new TimeoutException("Request timeout");
@@ -228,7 +226,7 @@ public class ConnectorFacadeProxy implements Connector {
             }
         } else {
             LOG.info("Update for {} was attempted, although the "
-                    + "connector only has these capabilities: {}. No action.", uid.getUidValue(), activeConnInstance.
+                    + "connector only has these capabilities: {}. No action.", uid.getUidValue(), connInstance.
                     getCapabilities());
         }
 
@@ -242,13 +240,13 @@ public class ConnectorFacadeProxy implements Connector {
             final OperationOptions options,
             final Boolean[] propagationAttempted) {
 
-        if (activeConnInstance.getCapabilities().contains(ConnectorCapability.DELETE)) {
+        if (connInstance.getCapabilities().contains(ConnectorCapability.DELETE)) {
             propagationAttempted[0] = true;
 
             Future<Uid> future = asyncFacade.delete(connector, objectClass, uid, options);
 
             try {
-                future.get(activeConnInstance.getConnRequestTimeout(), TimeUnit.SECONDS);
+                future.get(connInstance.getConnRequestTimeout(), TimeUnit.SECONDS);
             } catch (java.util.concurrent.TimeoutException e) {
                 future.cancel(true);
                 throw new TimeoutException("Request timeout");
@@ -262,7 +260,7 @@ public class ConnectorFacadeProxy implements Connector {
             }
         } else {
             LOG.info("Delete for {} was attempted, although the connector only has these capabilities: {}. No action.",
-                    uid.getUidValue(), activeConnInstance.getCapabilities());
+                    uid.getUidValue(), connInstance.getCapabilities());
         }
     }
 
@@ -270,11 +268,11 @@ public class ConnectorFacadeProxy implements Connector {
     public void sync(final ObjectClass objectClass, final SyncToken token, final SyncResultsHandler handler,
             final OperationOptions options) {
 
-        if (activeConnInstance.getCapabilities().contains(ConnectorCapability.SYNC)) {
+        if (connInstance.getCapabilities().contains(ConnectorCapability.SYNC)) {
             connector.sync(objectClass, token, handler, options);
         } else {
             LOG.info("Sync was attempted, although the connector only has these capabilities: {}. No action.",
-                    activeConnInstance.getCapabilities());
+                    connInstance.getCapabilities());
         }
     }
 
@@ -282,11 +280,11 @@ public class ConnectorFacadeProxy implements Connector {
     public SyncToken getLatestSyncToken(final ObjectClass objectClass) {
         SyncToken result = null;
 
-        if (activeConnInstance.getCapabilities().contains(ConnectorCapability.SYNC)) {
+        if (connInstance.getCapabilities().contains(ConnectorCapability.SYNC)) {
             Future<SyncToken> future = asyncFacade.getLatestSyncToken(connector, objectClass);
 
             try {
-                result = future.get(activeConnInstance.getConnRequestTimeout(), TimeUnit.SECONDS);
+                result = future.get(connInstance.getConnRequestTimeout(), TimeUnit.SECONDS);
             } catch (java.util.concurrent.TimeoutException e) {
                 future.cancel(true);
                 throw new TimeoutException("Request timeout");
@@ -300,7 +298,7 @@ public class ConnectorFacadeProxy implements Connector {
             }
         } else {
             LOG.info("getLatestSyncToken was attempted, although the "
-                    + "connector only has these capabilities: {}. No action.", activeConnInstance.getCapabilities());
+                    + "connector only has these capabilities: {}. No action.", connInstance.getCapabilities());
         }
 
         return result;
@@ -320,17 +318,17 @@ public class ConnectorFacadeProxy implements Connector {
 
         boolean hasCapablities = false;
 
-        if (activeConnInstance.getCapabilities().contains(ConnectorCapability.SEARCH)) {
+        if (connInstance.getCapabilities().contains(ConnectorCapability.SEARCH)) {
             if (operationType == null) {
                 hasCapablities = true;
             } else {
                 switch (operationType) {
                     case CREATE:
-                        hasCapablities = activeConnInstance.getCapabilities().contains(ConnectorCapability.CREATE);
+                        hasCapablities = connInstance.getCapabilities().contains(ConnectorCapability.CREATE);
                         break;
 
                     case UPDATE:
-                        hasCapablities = activeConnInstance.getCapabilities().contains(ConnectorCapability.UPDATE);
+                        hasCapablities = connInstance.getCapabilities().contains(ConnectorCapability.UPDATE);
                         break;
 
                     default:
@@ -344,11 +342,11 @@ public class ConnectorFacadeProxy implements Connector {
             future = asyncFacade.getObject(connector, objectClass, uid, options);
         } else {
             LOG.info("Search was attempted, although the connector only has these capabilities: {}. No action.",
-                    activeConnInstance.getCapabilities());
+                    connInstance.getCapabilities());
         }
 
         try {
-            return future == null ? null : future.get(activeConnInstance.getConnRequestTimeout(), TimeUnit.SECONDS);
+            return future == null ? null : future.get(connInstance.getConnRequestTimeout(), TimeUnit.SECONDS);
         } catch (java.util.concurrent.TimeoutException e) {
             if (future != null) {
                 future.cancel(true);
@@ -383,69 +381,10 @@ public class ConnectorFacadeProxy implements Connector {
     }
 
     @Override
-    public Attribute getObjectAttribute(final ObjectClass objectClass, final Uid uid, final OperationOptions options,
-            final String attributeName) {
-
-        Future<Attribute> future = asyncFacade.getObjectAttribute(
-                connector, objectClass, uid, options, attributeName);
-        try {
-            return future.get(activeConnInstance.getConnRequestTimeout(), TimeUnit.SECONDS);
-        } catch (java.util.concurrent.TimeoutException e) {
-            future.cancel(true);
-            throw new TimeoutException("Request timeout");
-        } catch (Exception e) {
-            LOG.error("Connector request execution failure", e);
-            if (e.getCause() instanceof RuntimeException) {
-                throw (RuntimeException) e.getCause();
-            } else {
-                throw new IllegalArgumentException(e.getCause());
-            }
-        }
-    }
-
-    @Override
-    public Set<Attribute> getObjectAttributes(final ObjectClass objectClass, final Uid uid,
-            final OperationOptions options) {
-
-        Future<Set<Attribute>> future = asyncFacade.getObjectAttributes(connector, objectClass, uid, options);
+    public Set<ObjectClassInfo> getObjectClassInfo() {
+        Future<Set<ObjectClassInfo>> future = asyncFacade.getObjectClassInfo(connector);
         try {
-            return future.get(activeConnInstance.getConnRequestTimeout(), TimeUnit.SECONDS);
-        } catch (java.util.concurrent.TimeoutException e) {
-            future.cancel(true);
-            throw new TimeoutException("Request timeout");
-        } catch (Exception e) {
-            LOG.error("Connector request execution failure", e);
-            if (e.getCause() instanceof RuntimeException) {
-                throw (RuntimeException) e.getCause();
-            } else {
-                throw new IllegalArgumentException(e.getCause());
-            }
-        }
-    }
-
-    @Override
-    public Set<String> getSchemaNames(final boolean includeSpecial) {
-        Future<Set<String>> future = asyncFacade.getSchemaNames(connector, includeSpecial);
-        try {
-            return future.get(activeConnInstance.getConnRequestTimeout(), TimeUnit.SECONDS);
-        } catch (java.util.concurrent.TimeoutException e) {
-            future.cancel(true);
-            throw new TimeoutException("Request timeout");
-        } catch (Exception e) {
-            LOG.error("Connector request execution failure", e);
-            if (e.getCause() instanceof RuntimeException) {
-                throw (RuntimeException) e.getCause();
-            } else {
-                throw new IllegalArgumentException(e.getCause());
-            }
-        }
-    }
-
-    @Override
-    public Set<ObjectClass> getSupportedObjectClasses() {
-        Future<Set<ObjectClass>> future = asyncFacade.getSupportedObjectClasses(connector);
-        try {
-            return future.get(activeConnInstance.getConnRequestTimeout(), TimeUnit.SECONDS);
+            return future.get(connInstance.getConnRequestTimeout(), TimeUnit.SECONDS);
         } catch (java.util.concurrent.TimeoutException e) {
             future.cancel(true);
             throw new TimeoutException("Request timeout");
@@ -463,7 +402,7 @@ public class ConnectorFacadeProxy implements Connector {
     public void validate() {
         Future<String> future = asyncFacade.test(connector);
         try {
-            future.get(activeConnInstance.getConnRequestTimeout(), TimeUnit.SECONDS);
+            future.get(connInstance.getConnRequestTimeout(), TimeUnit.SECONDS);
         } catch (java.util.concurrent.TimeoutException e) {
             future.cancel(true);
             throw new TimeoutException("Request timeout");
@@ -481,7 +420,7 @@ public class ConnectorFacadeProxy implements Connector {
     public void test() {
         Future<String> future = asyncFacade.test(connector);
         try {
-            future.get(activeConnInstance.getConnRequestTimeout(), TimeUnit.SECONDS);
+            future.get(connInstance.getConnRequestTimeout(), TimeUnit.SECONDS);
         } catch (java.util.concurrent.TimeoutException e) {
             future.cancel(true);
             throw new TimeoutException("Request timeout");
@@ -502,7 +441,7 @@ public class ConnectorFacadeProxy implements Connector {
             final ResultsHandler handler,
             final OperationOptions options) {
 
-        if (activeConnInstance.getCapabilities().contains(ConnectorCapability.SEARCH)) {
+        if (connInstance.getCapabilities().contains(ConnectorCapability.SEARCH)) {
             if (options.getPageSize() == null && options.getPagedResultsCookie() == null) {
                 OperationOptionsBuilder builder = new OperationOptionsBuilder(options);
                 builder.setPageSize(DEFAULT_PAGE_SIZE);
@@ -534,7 +473,7 @@ public class ConnectorFacadeProxy implements Connector {
             }
         } else {
             LOG.info("Search was attempted, although the connector only has these capabilities: {}. No action.",
-                    activeConnInstance.getCapabilities());
+                    connInstance.getCapabilities());
         }
     }
 
@@ -560,39 +499,14 @@ public class ConnectorFacadeProxy implements Connector {
             }
         }, new ArrayList<SortKey>(orderBy.size())));
 
-        builder.setAttributesToGet(getOperationOptions(mapItems).getAttributesToGet());
+        builder.setAttributesToGet(MappingUtils.buildOperationOptions(mapItems).getAttributesToGet());
 
         search(objectClass, filter, handler, builder.build());
     }
 
     @Override
-    public ConnInstance getActiveConnInstance() {
-        return activeConnInstance;
-    }
-
-    @Override
-    public OperationOptions getOperationOptions(final Iterator<? extends MappingItem> mapItems) {
-        // -------------------------------------
-        // Ask just for mapped attributes
-        // -------------------------------------
-        OperationOptionsBuilder builder = new OperationOptionsBuilder();
-
-        Set<String> attrsToGet = new HashSet<>();
-        attrsToGet.add(Name.NAME);
-        attrsToGet.add(Uid.NAME);
-        attrsToGet.add(OperationalAttributes.ENABLE_NAME);
-
-        while (mapItems.hasNext()) {
-            MappingItem mapItem = mapItems.next();
-            if (mapItem.getPurpose() != MappingPurpose.NONE) {
-                attrsToGet.add(mapItem.getExtAttrName());
-            }
-        }
-
-        builder.setAttributesToGet(attrsToGet);
-        // -------------------------------------
-
-        return builder.build();
+    public ConnInstance getConnInstance() {
+        return connInstance;
     }
 
     private Object getPropertyValue(final String propType, final List<?> values) {
@@ -637,6 +551,6 @@ public class ConnectorFacadeProxy implements Connector {
     @Override
     public String toString() {
         return "ConnectorFacadeProxy{"
-                + "connector=" + connector + "\n" + "capabitilies=" + activeConnInstance.getCapabilities() + '}';
+                + "connector=" + connector + "\n" + "capabitilies=" + connInstance.getCapabilities() + '}';
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ConnectorManager.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ConnectorManager.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ConnectorManager.java
index a38ba50..1ecc163 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ConnectorManager.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ConnectorManager.java
@@ -25,8 +25,10 @@ import java.util.Map;
 import java.util.Set;
 import org.apache.commons.lang3.SerializationUtils;
 import org.apache.syncope.common.lib.types.ConnConfProperty;
+import org.apache.syncope.common.lib.types.ConnectorCapability;
 import org.apache.syncope.core.misc.security.AuthContextUtils;
 import org.apache.syncope.core.misc.spring.ApplicationContextProvider;
+import org.apache.syncope.core.persistence.api.SyncopeLoader;
 import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
 import org.apache.syncope.core.persistence.api.entity.ConnInstance;
 import org.apache.syncope.core.provisioning.api.ConnIdBundleManager;
@@ -42,11 +44,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
 
-/**
- * Load ConnId connector instances.
- */
 @Component
-public class ConnectorManager implements ConnectorRegistry, ConnectorFactory {
+public class ConnectorManager implements ConnectorRegistry, ConnectorFactory, SyncopeLoader {
 
     private static final Logger LOG = LoggerFactory.getLogger(ConnectorManager.class);
 
@@ -56,6 +55,11 @@ public class ConnectorManager implements ConnectorRegistry, ConnectorFactory {
     @Autowired
     private ExternalResourceDAO resourceDAO;
 
+    @Override
+    public Integer getPriority() {
+        return 100;
+    }
+
     private String getBeanName(final ExternalResource resource) {
         return String.format("connInstance-%s-%d-%s",
                 AuthContextUtils.getDomain(), resource.getConnector().getKey(), resource.getKey());
@@ -72,54 +76,61 @@ public class ConnectorManager implements ConnectorRegistry, ConnectorFactory {
     }
 
     @Override
-    public Connector createConnector(final ConnInstance connInstance, final Set<ConnConfProperty> configuration) {
-        ConnInstance connInstanceClone = SerializationUtils.clone(connInstance);
-
-        connInstanceClone.setConfiguration(configuration);
+    public ConnInstance buildConnInstanceOverride(
+            final ConnInstance connInstance,
+            final Set<ConnConfProperty> confOverride,
+            final Set<ConnectorCapability> capabilitiesOverride) {
 
-        Connector connector = new ConnectorFacadeProxy(connInstanceClone);
-        ApplicationContextProvider.getBeanFactory().autowireBean(connector);
-
-        return connector;
-    }
-
-    @Override
-    public ConnInstance getOverriddenConnInstance(
-            final ConnInstance connInstance, final Set<ConnConfProperty> overridden) {
+        ConnInstance override = SerializationUtils.clone(connInstance);
 
-        Set<ConnConfProperty> configuration = new HashSet<>();
         Map<String, ConnConfProperty> overridable = new HashMap<>();
+        Set<ConnConfProperty> conf = new HashSet<>();
 
-        // add not overridable properties
-        for (ConnConfProperty prop : connInstance.getConfiguration()) {
+        for (ConnConfProperty prop : override.getConf()) {
             if (prop.isOverridable()) {
                 overridable.put(prop.getSchema().getName(), prop);
             } else {
-                configuration.add(prop);
+                conf.add(prop);
             }
         }
 
         // add overridden properties
-        for (ConnConfProperty prop : overridden) {
+        for (ConnConfProperty prop : confOverride) {
             if (overridable.containsKey(prop.getSchema().getName()) && !prop.getValues().isEmpty()) {
-                configuration.add(prop);
+                conf.add(prop);
                 overridable.remove(prop.getSchema().getName());
             }
         }
 
         // add overridable properties not overridden
-        configuration.addAll(overridable.values());
+        conf.addAll(overridable.values());
 
-        connInstance.setConfiguration(configuration);
+        override.setConf(conf);
 
-        return connInstance;
+        // replace capabilities
+        if (capabilitiesOverride != null) {
+            override.getCapabilities().clear();
+            override.getCapabilities().addAll(capabilitiesOverride);
+        }
+
+        return override;
+    }
+
+    @Override
+    public Connector createConnector(final ConnInstance connInstance) {
+        Connector connector = new ConnectorFacadeProxy(connInstance);
+        ApplicationContextProvider.getBeanFactory().autowireBean(connector);
+
+        return connector;
     }
 
     @Override
     public void registerConnector(final ExternalResource resource) {
-        ConnInstance connInstance = getOverriddenConnInstance(
-                SerializationUtils.clone(resource.getConnector()), resource.getConnInstanceConfiguration());
-        Connector connector = createConnector(resource.getConnector(), connInstance.getConfiguration());
+        ConnInstance connInstance = buildConnInstanceOverride(
+                resource.getConnector(),
+                resource.getConfOverride(),
+                resource.isOverrideCapabilities() ? resource.getCapabilitiesOverride() : null);
+        Connector connector = createConnector(connInstance);
         LOG.debug("Connector to be registered: {}", connector);
 
         String beanName = getBeanName(resource);
@@ -137,11 +148,6 @@ public class ConnectorManager implements ConnectorRegistry, ConnectorFactory {
         ApplicationContextProvider.getBeanFactory().destroySingleton(id);
     }
 
-    @Override
-    public Integer getPriority() {
-        return 100;
-    }
-
     @Transactional(readOnly = true)
     @Override
     public void load() {
@@ -171,7 +177,7 @@ public class ConnectorManager implements ConnectorRegistry, ConnectorFactory {
     public void unload() {
         int connectors = 0;
         for (ExternalResource resource : resourceDAO.findAll()) {
-            final String beanName = getBeanName(resource);
+            String beanName = getBeanName(resource);
             if (ApplicationContextProvider.getBeanFactory().containsSingleton(beanName)) {
                 LOG.info("Unegistering resource-connector pair {}-{}", resource, resource.getConnector());
                 unregisterConnector(beanName);

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/VirAttrHandlerImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/VirAttrHandlerImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/VirAttrHandlerImpl.java
index 5763449..94c68ee 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/VirAttrHandlerImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/VirAttrHandlerImpl.java
@@ -130,7 +130,7 @@ public class VirAttrHandlerImpl implements VirAttrHandler {
                     ConnectorObject connectorObject = connector.getObject(
                             entry.getKey().getObjectClass(),
                             new Uid(connObjectKey),
-                            connector.getOperationOptions(linkingMappingItems.iterator()));
+                            MappingUtils.buildOperationOptions(linkingMappingItems.iterator()));
 
                     if (connectorObject == null) {
                         LOG.debug("No read from {} about {}", entry.getKey(), connObjectKey);

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ConnInstanceDataBinderImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ConnInstanceDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ConnInstanceDataBinderImpl.java
index 7c28b66..70914ae 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ConnInstanceDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ConnInstanceDataBinderImpl.java
@@ -21,8 +21,6 @@ package org.apache.syncope.core.provisioning.java.data;
 import org.apache.syncope.core.provisioning.api.data.ConnInstanceDataBinder;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.HashSet;
-import java.util.Set;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.Predicate;
 import org.apache.syncope.common.lib.SyncopeClientException;
@@ -58,35 +56,6 @@ public class ConnInstanceDataBinderImpl implements ConnInstanceDataBinder {
     private EntityFactory entityFactory;
 
     @Override
-    public Set<ConnConfProperty> mergeConnConfProperties(
-            final Set<ConnConfProperty> primary,
-            final Set<ConnConfProperty> secondary) {
-
-        Set<ConnConfProperty> conf = new HashSet<>();
-
-        // to be used to control managed prop (needed by overridden mechanism)
-        Set<String> propertyNames = new HashSet<>();
-
-        // get overridden connector configuration properties
-        for (ConnConfProperty prop : primary) {
-            if (!propertyNames.contains(prop.getSchema().getName())) {
-                conf.add(prop);
-                propertyNames.add(prop.getSchema().getName());
-            }
-        }
-
-        // get connector configuration properties
-        for (ConnConfProperty prop : secondary) {
-            if (!propertyNames.contains(prop.getSchema().getName())) {
-                conf.add(prop);
-                propertyNames.add(prop.getSchema().getName());
-            }
-        }
-
-        return conf;
-    }
-
-    @Override
     public ConnInstance getConnInstance(final ConnInstanceTO connInstanceTO) {
         SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.RequiredValuesMissing);
 
@@ -106,7 +75,7 @@ public class ConnInstanceDataBinderImpl implements ConnInstanceDataBinder {
             sce.getElements().add("connectorname");
         }
 
-        if (connInstanceTO.getConfiguration() == null || connInstanceTO.getConfiguration().isEmpty()) {
+        if (connInstanceTO.getConf().isEmpty()) {
             sce.getElements().add("configuration");
         }
 
@@ -130,7 +99,7 @@ public class ConnInstanceDataBinderImpl implements ConnInstanceDataBinder {
     }
 
     @Override
-    public ConnInstance updateConnInstance(final long connInstanceId, final ConnInstanceTO connInstanceTO) {
+    public ConnInstance update(final long connInstanceId, final ConnInstanceTO connInstanceTO) {
         SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.RequiredValuesMissing);
 
         if (connInstanceId == 0) {
@@ -157,8 +126,8 @@ public class ConnInstanceDataBinderImpl implements ConnInstanceDataBinder {
             connInstance.setConnectorName(connInstanceTO.getConnectorName());
         }
 
-        if (connInstanceTO.getConfiguration() != null && !connInstanceTO.getConfiguration().isEmpty()) {
-            connInstance.setConfiguration(connInstanceTO.getConfiguration());
+        if (connInstanceTO.getConf() != null && !connInstanceTO.getConf().isEmpty()) {
+            connInstance.setConf(connInstanceTO.getConf());
         }
 
         if (connInstanceTO.getDisplayName() != null) {
@@ -184,7 +153,7 @@ public class ConnInstanceDataBinderImpl implements ConnInstanceDataBinder {
     }
 
     @Override
-    public ConnConfPropSchema buildConnConfPropSchema(final ConfigurationProperty property) {
+    public ConnConfPropSchema build(final ConfigurationProperty property) {
         ConnConfPropSchema connConfPropSchema = new ConnConfPropSchema();
 
         connConfPropSchema.setName(property.getName());
@@ -219,9 +188,9 @@ public class ConnInstanceDataBinderImpl implements ConnInstanceDataBinder {
         ConfigurationProperties properties =
                 connIdBundleManager.getConfigurationProperties(connIdBundleManager.getConnectorInfo(connInstance));
         for (final String propName : properties.getPropertyNames()) {
-            ConnConfPropSchema schema = buildConnConfPropSchema(properties.getProperty(propName));
+            ConnConfPropSchema schema = build(properties.getProperty(propName));
 
-            ConnConfProperty property = CollectionUtils.find(connInstanceTO.getConfiguration(),
+            ConnConfProperty property = CollectionUtils.find(connInstanceTO.getConf(),
                     new Predicate<ConnConfProperty>() {
 
                         @Override
@@ -231,7 +200,7 @@ public class ConnInstanceDataBinderImpl implements ConnInstanceDataBinder {
                     });
             if (property == null) {
                 property = new ConnConfProperty();
-                connInstanceTO.getConfiguration().add(property);
+                connInstanceTO.getConf().add(property);
             }
 
             property.setSchema(schema);

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderImpl.java
index 388f099..dff71a0 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderImpl.java
@@ -33,7 +33,6 @@ import org.apache.syncope.common.lib.to.ResourceTO;
 import org.apache.syncope.common.lib.types.ClientExceptionType;
 import org.apache.syncope.common.lib.types.IntMappingType;
 import org.apache.syncope.core.persistence.api.dao.ConnInstanceDAO;
-import org.apache.syncope.core.persistence.api.dao.NotFoundException;
 import org.apache.syncope.core.persistence.api.dao.PolicyDAO;
 import org.apache.syncope.core.persistence.api.entity.policy.AccountPolicy;
 import org.apache.syncope.core.persistence.api.entity.ConnInstance;
@@ -43,7 +42,6 @@ import org.apache.syncope.core.persistence.api.entity.resource.Mapping;
 import org.apache.syncope.core.persistence.api.entity.resource.MappingItem;
 import org.apache.syncope.core.persistence.api.entity.policy.PasswordPolicy;
 import org.apache.syncope.core.persistence.api.entity.policy.SyncPolicy;
-import org.apache.syncope.core.provisioning.api.ConnectorRegistry;
 import org.apache.syncope.core.misc.jexl.JexlUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -68,9 +66,6 @@ public class ResourceDataBinderImpl implements ResourceDataBinder {
     private AnyTypeDAO anyTypeDAO;
 
     @Autowired
-    private ConnectorRegistry connRegistry;
-
-    @Autowired
     private ConnInstanceDAO connInstanceDAO;
 
     @Autowired
@@ -100,7 +95,7 @@ public class ResourceDataBinderImpl implements ResourceDataBinder {
             resource.setConnector(connector);
 
             if (!connector.getResources().contains(resource)) {
-                connector.addResource(resource);
+                connector.add(resource);
             }
         }
 
@@ -196,7 +191,11 @@ public class ResourceDataBinderImpl implements ResourceDataBinder {
         resource.setSyncPolicy(resourceTO.getSyncPolicy() == null
                 ? null : (SyncPolicy) policyDAO.find(resourceTO.getSyncPolicy()));
 
-        resource.setConnInstanceConfiguration(new HashSet<>(resourceTO.getConnConfProperties()));
+        resource.setConfOverride(new HashSet<>(resourceTO.getConfOverride()));
+
+        resource.setOverrideCapabilities(resourceTO.isOverrideCapabilities());
+        resource.getCapabilitiesOverride().clear();
+        resource.getCapabilitiesOverride().addAll(resourceTO.getCapabilitiesOverride());
 
         resource.getPropagationActionsClassNames().clear();
         resource.getPropagationActionsClassNames().addAll(resourceTO.getPropagationActionsClassNames());
@@ -270,17 +269,6 @@ public class ResourceDataBinderImpl implements ResourceDataBinder {
         return item;
     }
 
-    @Override
-    public ConnInstance getConnInstance(final ResourceTO resourceTO) {
-        ConnInstance connInstance = connInstanceDAO.find(resourceTO.getConnector());
-        if (connInstance == null) {
-            throw new NotFoundException("Connector '" + resourceTO.getConnector() + "'");
-        }
-
-        final ConnInstance connInstanceClone = SerializationUtils.clone(connInstance);
-        return connRegistry.getOverriddenConnInstance(connInstanceClone, resourceTO.getConnConfProperties());
-    }
-
     private void populateMappingTO(final Mapping mapping, final MappingTO mappingTO) {
         mappingTO.setConnObjectLink(mapping.getConnObjectLink());
 
@@ -367,7 +355,10 @@ public class ResourceDataBinderImpl implements ResourceDataBinder {
         resourceTO.setSyncPolicy(resource.getSyncPolicy() == null
                 ? null : resource.getSyncPolicy().getKey());
 
-        resourceTO.getConnConfProperties().addAll(resource.getConnInstanceConfiguration());
+        resourceTO.getConfOverride().addAll(resource.getConfOverride());
+
+        resourceTO.setOverrideCapabilities(resource.isOverrideCapabilities());
+        resourceTO.getCapabilitiesOverride().addAll(resource.getCapabilitiesOverride());
 
         resourceTO.getPropagationActionsClassNames().addAll(resource.getPropagationActionsClassNames());
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/AbstractPropagationTaskExecutor.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/AbstractPropagationTaskExecutor.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/AbstractPropagationTaskExecutor.java
index 316f91a..c083187 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/AbstractPropagationTaskExecutor.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/AbstractPropagationTaskExecutor.java
@@ -566,7 +566,7 @@ public abstract class AbstractPropagationTaskExecutor implements PropagationTask
                     task.getOperation(),
                     new ObjectClass(task.getObjectClassName()),
                     new Uid(connObjectKey),
-                    connector.getOperationOptions(IteratorUtils.chainedIterator(
+                    MappingUtils.buildOperationOptions(IteratorUtils.chainedIterator(
                                     MappingUtils.getPropagationMappingItems(provision).iterator(),
                                     linkingMappingItems.iterator())));
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/DBPasswordPropagationActions.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/DBPasswordPropagationActions.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/DBPasswordPropagationActions.java
index 6b4760b..6910c19 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/DBPasswordPropagationActions.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/DBPasswordPropagationActions.java
@@ -88,7 +88,7 @@ public class DBPasswordPropagationActions extends DefaultPropagationActions {
 
     private String getCipherAlgorithm(final ConnInstance connInstance) {
         ConnConfProperty cipherAlgorithm =
-                CollectionUtils.find(connInstance.getConfiguration(), new Predicate<ConnConfProperty>() {
+                CollectionUtils.find(connInstance.getConf(), new Predicate<ConnConfProperty>() {
 
                     @Override
                     public boolean evaluate(final ConnConfProperty property) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/LDAPPasswordPropagationActions.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/LDAPPasswordPropagationActions.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/LDAPPasswordPropagationActions.java
index 870be79..3ba0dc9 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/LDAPPasswordPropagationActions.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/LDAPPasswordPropagationActions.java
@@ -94,7 +94,7 @@ public class LDAPPasswordPropagationActions extends DefaultPropagationActions {
 
     private String getCipherAlgorithm(final ConnInstance connInstance) {
         ConnConfProperty cipherAlgorithm =
-                CollectionUtils.find(connInstance.getConfiguration(), new Predicate<ConnConfProperty>() {
+                CollectionUtils.find(connInstance.getConf(), new Predicate<ConnConfProperty>() {
 
                     @Override
                     public boolean evaluate(final ConnConfProperty property) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/AbstractPushResultHandler.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/AbstractPushResultHandler.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/AbstractPushResultHandler.java
index dcce5e5..e0d3d59 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/AbstractPushResultHandler.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/AbstractPushResultHandler.java
@@ -134,7 +134,7 @@ public abstract class AbstractPushResultHandler extends AbstractSyncopeResultHan
             obj = profile.getConnector().getObject(
                     objectClass,
                     uid,
-                    profile.getConnector().getOperationOptions(IteratorUtils.<MappingItem>emptyIterator()));
+                    MappingUtils.buildOperationOptions(IteratorUtils.<MappingItem>emptyIterator()));
         } catch (TimeoutException toe) {
             LOG.debug("Request timeout", toe);
             throw toe;

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/DBPasswordSyncActions.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/DBPasswordSyncActions.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/DBPasswordSyncActions.java
index ec7fb2e..35e50f9 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/DBPasswordSyncActions.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/DBPasswordSyncActions.java
@@ -91,7 +91,7 @@ public class DBPasswordSyncActions extends DefaultSyncActions {
 
     private void parseEncodedPassword(final String password, final Connector connector) {
         if (password != null) {
-            ConnInstance connInstance = connector.getActiveConnInstance();
+            ConnInstance connInstance = connector.getConnInstance();
 
             String cipherAlgorithm = getCipherAlgorithm(connInstance);
             if (!CLEARTEXT.equals(cipherAlgorithm)) {
@@ -108,7 +108,7 @@ public class DBPasswordSyncActions extends DefaultSyncActions {
 
     private String getCipherAlgorithm(final ConnInstance connInstance) {
         ConnConfProperty cipherAlgorithm =
-                CollectionUtils.find(connInstance.getConfiguration(), new Predicate<ConnConfProperty>() {
+                CollectionUtils.find(connInstance.getConf(), new Predicate<ConnConfProperty>() {
 
                     @Override
                     public boolean evaluate(final ConnConfProperty property) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/LDAPMembershipSyncActions.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/LDAPMembershipSyncActions.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/LDAPMembershipSyncActions.java
index 430d06d..59e8c42 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/LDAPMembershipSyncActions.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/LDAPMembershipSyncActions.java
@@ -55,6 +55,7 @@ import org.apache.syncope.core.persistence.api.entity.user.UMembership;
 import org.apache.syncope.core.provisioning.api.notification.NotificationManager;
 import org.apache.syncope.core.workflow.api.UserWorkflowAdapter;
 import org.identityconnectors.framework.common.objects.Attribute;
+import org.identityconnectors.framework.common.objects.ConnectorObject;
 import org.identityconnectors.framework.common.objects.ObjectClass;
 import org.identityconnectors.framework.common.objects.OperationOptionsBuilder;
 import org.identityconnectors.framework.common.objects.SyncDelta;
@@ -109,7 +110,7 @@ public class LDAPMembershipSyncActions extends DefaultSyncActions {
      * @return the name of the attribute used to keep track of group memberships
      */
     protected String getGroupMembershipAttrName(final Connector connector) {
-        ConnConfProperty groupMembership = CollectionUtils.find(connector.getActiveConnInstance().getConfiguration(),
+        ConnConfProperty groupMembership = CollectionUtils.find(connector.getConnInstance().getConf(),
                 new Predicate<ConnConfProperty>() {
 
                     @Override
@@ -196,7 +197,12 @@ public class LDAPMembershipSyncActions extends DefaultSyncActions {
         if (membAttr == null) {
             OperationOptionsBuilder oob = new OperationOptionsBuilder();
             oob.setAttributesToGet(groupMemberName);
-            membAttr = connector.getObjectAttribute(ObjectClass.GROUP, delta.getUid(), oob.build(), groupMemberName);
+            ConnectorObject remoteObj = connector.getObject(ObjectClass.GROUP, delta.getUid(), oob.build());
+            if (remoteObj == null) {
+                LOG.debug("Object for '{}' not found", delta.getUid().getUidValue());
+            } else {
+                membAttr = remoteObj.getAttributeByName(groupMemberName);
+            }
         }
         if (membAttr != null && membAttr.getValue() != null) {
             result = membAttr.getValue();

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/SyncJobDelegate.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/SyncJobDelegate.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/SyncJobDelegate.java
index 890cece..d3a4a4d 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/SyncJobDelegate.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/SyncJobDelegate.java
@@ -27,6 +27,7 @@ import java.util.Set;
 import org.apache.commons.collections4.IteratorUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.common.lib.policy.SyncPolicySpec;
+import org.apache.syncope.core.misc.MappingUtils;
 import org.apache.syncope.core.misc.spring.ApplicationContextProvider;
 import org.apache.syncope.core.persistence.api.dao.GroupDAO;
 import org.apache.syncope.core.persistence.api.dao.NotFoundException;
@@ -185,13 +186,13 @@ public class SyncJobDelegate extends AbstractProvisioningJobDelegate<SyncTask> {
                         connector.getAllObjects(
                                 provision.getObjectClass(),
                                 handler,
-                                connector.getOperationOptions(mapItems));
+                                MappingUtils.buildOperationOptions(mapItems));
                     } else {
                         connector.sync(
                                 provision.getObjectClass(),
                                 provision.getSyncToken(),
                                 handler,
-                                connector.getOperationOptions(mapItems));
+                                MappingUtils.buildOperationOptions(mapItems));
                     }
 
                     if (!dryRun && !syncTask.isFullReconciliation()) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/SyncUtils.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/SyncUtils.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/SyncUtils.java
index eefccad..4fa504e 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/SyncUtils.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/SyncUtils.java
@@ -128,7 +128,7 @@ public class SyncUtils {
                         return found.add(obj);
                     }
                 },
-                connector.getOperationOptions(MappingUtils.getSyncMappingItems(provision).iterator()));
+                MappingUtils.buildOperationOptions(MappingUtils.getSyncMappingItems(provision).iterator()));
 
         if (found.isEmpty()) {
             LOG.debug("No {} found on {} with __NAME__ {}", provision.getObjectClass(), resource, name);

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/ConnectorServiceImpl.java
----------------------------------------------------------------------
diff --git a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/ConnectorServiceImpl.java b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/ConnectorServiceImpl.java
index ac0694d..c64a02d 100644
--- a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/ConnectorServiceImpl.java
+++ b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/ConnectorServiceImpl.java
@@ -24,10 +24,8 @@ import javax.ws.rs.core.Response;
 import org.apache.syncope.common.lib.to.BulkAction;
 import org.apache.syncope.common.lib.to.BulkActionResult;
 import org.apache.syncope.common.lib.to.ConnBundleTO;
+import org.apache.syncope.common.lib.to.ConnIdObjectClassTO;
 import org.apache.syncope.common.lib.to.ConnInstanceTO;
-import org.apache.syncope.common.lib.to.PlainSchemaTO;
-import org.apache.syncope.common.lib.wrap.ConnIdObjectClass;
-import org.apache.syncope.common.rest.api.CollectionWrapper;
 import org.apache.syncope.common.rest.api.RESTHeaders;
 import org.apache.syncope.common.rest.api.service.ConnectorService;
 import org.apache.syncope.core.logic.ConnectorLogic;
@@ -60,13 +58,10 @@ public class ConnectorServiceImpl extends AbstractServiceImpl implements Connect
     }
 
     @Override
-    public List<PlainSchemaTO> buildSchemaNames(final ConnInstanceTO connInstanceTO, final boolean includeSpecial) {
-        return logic.buildSchemaNames(connInstanceTO, includeSpecial);
-    }
+    public List<ConnIdObjectClassTO> buildObjectClassInfo(
+            final ConnInstanceTO connInstanceTO, final boolean includeSpecial) {
 
-    @Override
-    public List<ConnIdObjectClass> buildSupportedObjectClasses(final ConnInstanceTO connInstanceTO) {
-        return CollectionWrapper.wrap(logic.buildSupportedObjectClasses(connInstanceTO), ConnIdObjectClass.class);
+        return logic.buildObjectClassInfo(connInstanceTO, includeSpecial);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/LoggerServiceImpl.java
----------------------------------------------------------------------
diff --git a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/LoggerServiceImpl.java b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/LoggerServiceImpl.java
index 32ae12c..b8a9fa7 100644
--- a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/LoggerServiceImpl.java
+++ b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/LoggerServiceImpl.java
@@ -25,7 +25,7 @@ import org.apache.syncope.common.lib.to.EventCategoryTO;
 import org.apache.syncope.common.lib.to.LoggerTO;
 import org.apache.syncope.common.lib.types.AuditLoggerName;
 import org.apache.syncope.common.lib.types.LoggerType;
-import org.apache.syncope.common.rest.api.CollectionWrapper;
+import org.apache.syncope.common.rest.api.LoggerWrapper;
 import org.apache.syncope.common.rest.api.service.LoggerService;
 import org.apache.syncope.core.logic.LoggerLogic;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -66,7 +66,7 @@ public class LoggerServiceImpl extends AbstractServiceImpl implements LoggerServ
 
             case AUDIT:
                 List<AuditLoggerName> auditLogger = logic.listAudits();
-                return CollectionWrapper.unwrapLogger(auditLogger);
+                return LoggerWrapper.unwrap(auditLogger);
 
             default:
                 throw new BadRequestException();


[4/4] syncope git commit: [SYNCOPE-714] Consolidating old buildSchemaNames and buildSupportedObjectClasses into new buildO bjectClassInfo

Posted by il...@apache.org.
[SYNCOPE-714] Consolidating old buildSchemaNames and buildSupportedObjectClasses into new buildO
bjectClassInfo


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

Branch: refs/heads/master
Commit: 1347c1081dd9eb3e32ae0b0f39e47fa5498aa3c3
Parents: 9343981
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Mon Oct 26 10:55:14 2015 +0100
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Mon Oct 26 10:55:14 2015 +0100

----------------------------------------------------------------------
 .../ConnectorListConfigurationProperties.java   |   4 +-
 .../connector/ConnectorResultManager.java       |   7 +-
 .../console/pages/ProvisioningModalPage.java    |  17 +-
 .../client/console/panels/ConnectorModal.java   |  14 +-
 .../console/panels/ResourceConnConfPanel.java   |  10 +-
 .../console/panels/ResourceMappingPanel.java    |  20 ++-
 .../console/rest/ConnectorRestClient.java       |  40 ++---
 .../client/console/rest/LoggerRestClient.java   |   4 +-
 .../client/console/rest/ResourceRestClient.java |  12 +-
 .../lib/patch/ResourceDeassociationPatch.java   |  80 +++++++++
 .../common/lib/to/ConnIdObjectClassTO.java      |  78 +++++++++
 .../syncope/common/lib/to/ConnInstanceTO.java   |  38 ++---
 .../syncope/common/lib/to/ResourceTO.java       |  31 +++-
 .../common/lib/wrap/AbstractWrappable.java      |  46 ------
 .../apache/syncope/common/lib/wrap/AnyKey.java  |  30 ----
 .../common/lib/wrap/ConnIdObjectClass.java      |  30 ----
 .../syncope/common/lib/wrap/package-info.java   |  23 ---
 .../common/rest/api/CollectionWrapper.java      |  80 ---------
 .../syncope/common/rest/api/LoggerWrapper.java  |  56 +++++++
 .../rest/api/service/ConnectorService.java      |  29 +---
 .../rest/api/service/ResourceService.java       |  14 +-
 .../syncope/core/logic/ConnectorLogic.java      |  76 +++------
 .../syncope/core/logic/ResourceLogic.java       |  21 ++-
 .../apache/syncope/core/misc/MappingUtils.java  |  33 +++-
 .../persistence/api/entity/ConnInstance.java    |  41 +++--
 .../api/entity/resource/ExternalResource.java   |  11 +-
 .../persistence/jpa/entity/JPAConnInstance.java |  33 +---
 .../entity/resource/JPAExternalResource.java    |  46 +++++-
 .../persistence/jpa/DummyConnectorRegistry.java |  13 +-
 .../persistence/jpa/inner/ConnInstanceTest.java |   6 +-
 .../persistence/jpa/outer/ConnInstanceTest.java |   2 +-
 .../test/resources/domains/MasterContent.xml    |  44 ++---
 .../provisioning/api/ConnIdBundleManager.java   |   2 +-
 .../core/provisioning/api/Connector.java        |  50 +-----
 .../core/provisioning/api/ConnectorFactory.java |  23 ++-
 .../provisioning/api/ConnectorRegistry.java     |  12 --
 .../api/data/ConnInstanceDataBinder.java        |  16 +-
 .../api/data/ResourceDataBinder.java            |   7 +-
 .../provisioning/java/AsyncConnectorFacade.java |  82 +---------
 .../provisioning/java/ConnectorFacadeProxy.java | 164 +++++--------------
 .../provisioning/java/ConnectorManager.java     |  76 +++++----
 .../provisioning/java/VirAttrHandlerImpl.java   |   2 +-
 .../java/data/ConnInstanceDataBinderImpl.java   |  47 +-----
 .../java/data/ResourceDataBinderImpl.java       |  29 ++--
 .../AbstractPropagationTaskExecutor.java        |   2 +-
 .../DBPasswordPropagationActions.java           |   2 +-
 .../LDAPPasswordPropagationActions.java         |   2 +-
 .../java/sync/AbstractPushResultHandler.java    |   2 +-
 .../java/sync/DBPasswordSyncActions.java        |   4 +-
 .../java/sync/LDAPMembershipSyncActions.java    |  10 +-
 .../provisioning/java/sync/SyncJobDelegate.java |   5 +-
 .../core/provisioning/java/sync/SyncUtils.java  |   2 +-
 .../rest/cxf/service/ConnectorServiceImpl.java  |  13 +-
 .../rest/cxf/service/LoggerServiceImpl.java     |   4 +-
 .../rest/cxf/service/ResourceServiceImpl.java   |  37 ++---
 .../fit/core/reference/AbstractITCase.java      |   2 +-
 .../fit/core/reference/ConnectorITCase.java     |  84 ++++------
 .../fit/core/reference/LoggerITCase.java        |   8 +-
 .../fit/core/reference/ResourceITCase.java      |   2 +-
 .../fit/core/reference/SyncTaskITCase.java      |   2 +-
 .../fit/core/reference/VirAttrITCase.java       |   4 +-
 61 files changed, 720 insertions(+), 964 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/client/cli/src/main/java/org/apache/syncope/client/cli/commands/connector/ConnectorListConfigurationProperties.java
----------------------------------------------------------------------
diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/connector/ConnectorListConfigurationProperties.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/connector/ConnectorListConfigurationProperties.java
index 6b80e8e..3e454d7 100644
--- a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/connector/ConnectorListConfigurationProperties.java
+++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/connector/ConnectorListConfigurationProperties.java
@@ -37,8 +37,8 @@ public class ConnectorListConfigurationProperties extends AbstractConnectorComma
         if (input.getParameters().length >= 1) {
             for (final String parameter : input.getParameters()) {
                 try {
-                    connectorResultManager.fromListConfigurationProperties(
-                            connectorService.getConfigurationProperties(Long.valueOf(parameter)));
+                    connectorResultManager.fromConfigurationProperties(
+                            connectorService.read(Long.valueOf(parameter), null).getConf());
                 } catch (final NumberFormatException ex) {
                     connectorResultManager.managerNumberFormatException("connector", parameter);
                 } catch (final SyncopeClientException | WebServiceException ex) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/client/cli/src/main/java/org/apache/syncope/client/cli/commands/connector/ConnectorResultManager.java
----------------------------------------------------------------------
diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/connector/ConnectorResultManager.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/connector/ConnectorResultManager.java
index b6edbc2..7c72349 100644
--- a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/connector/ConnectorResultManager.java
+++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/connector/ConnectorResultManager.java
@@ -18,7 +18,6 @@
  */
 package org.apache.syncope.client.cli.commands.connector;
 
-import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 import org.apache.syncope.client.cli.commands.CommonsResultManager;
@@ -49,8 +48,8 @@ public class ConnectorResultManager extends CommonsResultManager {
         }
     }
 
-    public void fromListConfigurationProperties(final List<ConnConfProperty> connConfPropertys) {
-        printConfiguration(new HashSet<>(connConfPropertys));
+    public void fromConfigurationProperties(final Set<ConnConfProperty> connConfPropertys) {
+        printConfiguration(connConfPropertys);
 
     }
 
@@ -65,7 +64,7 @@ public class ConnectorResultManager extends CommonsResultManager {
         System.out.println("    CAPABILITIES:");
         printCapabilities(connInstanceTO.getCapabilities());
         System.out.println("    CONFIGURATION:");
-        printConfiguration(connInstanceTO.getConfiguration());
+        printConfiguration(connInstanceTO.getConf());
         System.out.println("    POOL CONFIGURATION:");
         printConfPool(connInstanceTO.getPoolConf());
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/client/console/src/main/java/org/apache/syncope/client/console/pages/ProvisioningModalPage.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/ProvisioningModalPage.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/ProvisioningModalPage.java
index c66d650..43944bd 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/ProvisioningModalPage.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/ProvisioningModalPage.java
@@ -37,8 +37,6 @@ import org.apache.syncope.common.lib.to.BulkActionResult;
 import org.apache.syncope.common.lib.to.ResourceTO;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.ResourceDeassociationAction;
-import org.apache.syncope.common.lib.wrap.AbstractWrappable;
-import org.apache.syncope.common.lib.wrap.AnyKey;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
@@ -227,26 +225,25 @@ public class ProvisioningModalPage<T extends AnyTO> extends AbstractStatusModalP
 
     private void bulkAssociationAction(
             final AjaxRequestTarget target,
-            final ResourceDeassociationAction type,
+            final ResourceDeassociationAction action,
             final ActionDataTablePanel<StatusBean, String> table,
             final List<IColumn<StatusBean, String>> columns) {
 
-        final List<StatusBean> beans = new ArrayList<>(table.getModelObject());
-        List<AnyKey> subjectKeys = new ArrayList<>();
+        List<StatusBean> beans = new ArrayList<>(table.getModelObject());
+        List<Long> anyKeys = new ArrayList<>();
         for (StatusBean bean : beans) {
-            LOG.debug("Selected bean {}", bean);
-            subjectKeys.add(AbstractWrappable.getInstance(AnyKey.class, bean.getAnyKey()));
+            anyKeys.add(bean.getAnyKey());
         }
 
         if (beans.isEmpty()) {
             window.close(target);
         } else {
-            final BulkActionResult res = resourceRestClient.bulkAssociationAction(
-                    resourceTO.getKey(), anyTypeKind.name(), type, subjectKeys);
+            BulkActionResult result =
+                    resourceRestClient.bulkAssociationAction(resourceTO.getKey(), anyTypeKind.name(), action, anyKeys);
 
             ((BasePage) pageRef.getPage()).setModalResult(true);
 
-            setResponsePage(new BulkActionResultModalPage<>(window, beans, columns, res, "anyKey"));
+            setResponsePage(new BulkActionResultModalPage<>(window, beans, columns, result, "anyKey"));
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnectorModal.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnectorModal.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnectorModal.java
index 4f5e8eb..f02cbe9 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnectorModal.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnectorModal.java
@@ -286,7 +286,7 @@ public class ConnectorModal extends AbstractResourceModal {
         // form - second tab (properties)
         final ListView<ConnConfProperty> connPropView = new ConnConfPropertyListView("connectorProperties",
                 new PropertyModel<List<ConnConfProperty>>(this, "properties"),
-                true, connInstanceTO.getConfiguration());
+                true, connInstanceTO.getConf());
         connPropView.setOutputMarkupId(true);
         connectorPropForm.add(connPropView);
 
@@ -353,8 +353,8 @@ public class ConnectorModal extends AbstractResourceModal {
                 conn.setConnectorName(bundleTO.getConnectorName());
                 conn.setBundleName(bundleTO.getBundleName());
                 conn.setVersion(bundleTO.getVersion());
-                conn.getConfiguration().clear();
-                conn.getConfiguration().addAll(connPropView.getModelObject());
+                conn.getConf().clear();
+                conn.getConf().addAll(connPropView.getModelObject());
 
                 // Set the model object's capabilities to capabilitiesPalette's converted Set
                 conn.getCapabilities().clear();
@@ -448,11 +448,11 @@ public class ConnectorModal extends AbstractResourceModal {
                 final ConnConfProperty property = new ConnConfProperty();
                 property.setSchema(key);
                 if (connInstanceTO.getKey() != 0
-                        && connInstanceTO.getConfigurationMap().containsKey(key.getName())
-                        && connInstanceTO.getConfigurationMap().get(key.getName()).getValues() != null) {
+                        && connInstanceTO.getConfMap().containsKey(key.getName())
+                        && connInstanceTO.getConfMap().get(key.getName()).getValues() != null) {
 
-                    property.getValues().addAll(connInstanceTO.getConfigurationMap().get(key.getName()).getValues());
-                    property.setOverridable(connInstanceTO.getConfigurationMap().get(key.getName()).isOverridable());
+                    property.getValues().addAll(connInstanceTO.getConfMap().get(key.getName()).getValues());
+                    property.setOverridable(connInstanceTO.getConfMap().get(key.getName()).isOverridable());
                 }
 
                 if (property.getValues().isEmpty() && !key.getDefaultValues().isEmpty()) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceConnConfPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceConnConfPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceConnConfPanel.java
index 246e0eb..fdb9f83 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceConnConfPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceConnConfPanel.java
@@ -79,7 +79,7 @@ public class ResourceConnConfPanel extends Panel {
          */
         final ListView<ConnConfProperty> connPropView = new ConnConfPropertyListView("connectorProperties",
                 new PropertyModel<List<ConnConfProperty>>(this, "connConfProperties"),
-                false, resourceTO.getConnConfProperties());
+                false, resourceTO.getConfOverride());
         connPropView.setOutputMarkupId(true);
         connConfPropContainer.add(connPropView);
 
@@ -116,17 +116,17 @@ public class ResourceConnConfPanel extends Panel {
         List<ConnConfProperty> props = new ArrayList<>();
         Long connectorKey = resourceTO.getConnector();
         if (connectorKey != null && connectorKey > 0) {
-            for (ConnConfProperty property : restClient.read(connectorKey).getConfiguration()) {
+            for (ConnConfProperty property : restClient.read(connectorKey).getConf()) {
                 if (property.isOverridable()) {
                     props.add(property);
                 }
             }
         }
-        if (createFlag || resourceTO.getConnConfProperties().isEmpty()) {
-            resourceTO.getConnConfProperties().clear();
+        if (createFlag || resourceTO.getConfOverride().isEmpty()) {
+            resourceTO.getConfOverride().clear();
         } else {
             Map<String, ConnConfProperty> valuedProps = new HashMap<>();
-            for (ConnConfProperty prop : resourceTO.getConnConfProperties()) {
+            for (ConnConfProperty prop : resourceTO.getConfOverride()) {
                 valuedProps.put(prop.getSchema().getName(), prop);
             }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceMappingPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceMappingPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceMappingPanel.java
index 40cc013..ceabd57 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceMappingPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceMappingPanel.java
@@ -25,6 +25,8 @@ import java.util.Comparator;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.Transformer;
 import org.apache.syncope.client.console.commons.Constants;
 import org.apache.syncope.client.console.commons.JexlHelpUtils;
 import org.apache.syncope.client.console.panels.ResourceConnConfPanel.ConnConfModEvent;
@@ -36,6 +38,7 @@ import org.apache.syncope.client.console.wicket.markup.html.form.AjaxDropDownCho
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxTextFieldPanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.FieldPanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.MappingPurposePanel;
+import org.apache.syncope.common.lib.to.ConnIdObjectClassTO;
 import org.apache.syncope.common.lib.to.ConnInstanceTO;
 import org.apache.syncope.common.lib.to.MappingItemTO;
 import org.apache.syncope.common.lib.to.MappingTO;
@@ -156,7 +159,7 @@ public class ResourceMappingPanel extends Panel {
         add(this.mappingContainer);
 
         if (resourceTO.getConnector() != null && resourceTO.getConnector() > 0) {
-            schemaNames = getSchemaNames(resourceTO.getConnector(), resourceTO.getConnConfProperties());
+            schemaNames = getSchemaNames(resourceTO.getConnector(), resourceTO.getConfOverride());
             setEnabled();
         } else {
             schemaNames = Collections.<String>emptyList();
@@ -441,15 +444,24 @@ public class ResourceMappingPanel extends Panel {
     private List<String> getSchemaNames(final Long connectorId, final Set<ConnConfProperty> conf) {
         final ConnInstanceTO connInstanceTO = new ConnInstanceTO();
         connInstanceTO.setKey(connectorId);
-        connInstanceTO.getConfiguration().addAll(conf);
+        connInstanceTO.getConf().addAll(conf);
 
-        return connRestClient.getSchemaNames(connInstanceTO);
+        // SYNCOPE-156: use provided info to give schema names (and type!) by ObjectClass
+        return CollectionUtils.collect(connRestClient.buildObjectClassInfo(connInstanceTO, true),
+                new Transformer<ConnIdObjectClassTO, String>() {
+
+                    @Override
+                    public String transform(final ConnIdObjectClassTO input) {
+                        return input.getType();
+                    }
+                },
+                new ArrayList<String>());
     }
 
     private void setEnabled() {
         ConnInstanceTO connInstanceTO = new ConnInstanceTO();
         connInstanceTO.setKey(resourceTO.getConnector());
-        connInstanceTO.getConfiguration().addAll(resourceTO.getConnConfProperties());
+        connInstanceTO.getConf().addAll(resourceTO.getConfOverride());
 
         boolean enabled = provisionTO != null;
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/client/console/src/main/java/org/apache/syncope/client/console/rest/ConnectorRestClient.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/rest/ConnectorRestClient.java b/client/console/src/main/java/org/apache/syncope/client/console/rest/ConnectorRestClient.java
index 8c84993..d483411 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/rest/ConnectorRestClient.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/rest/ConnectorRestClient.java
@@ -28,11 +28,10 @@ import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.to.BulkAction;
 import org.apache.syncope.common.lib.to.BulkActionResult;
 import org.apache.syncope.common.lib.to.ConnBundleTO;
+import org.apache.syncope.common.lib.to.ConnIdObjectClassTO;
 import org.apache.syncope.common.lib.to.ConnInstanceTO;
-import org.apache.syncope.common.lib.to.PlainSchemaTO;
 import org.apache.syncope.common.lib.to.ResourceTO;
 import org.apache.syncope.common.lib.types.ConnConfProperty;
-import org.apache.syncope.common.lib.wrap.ConnIdObjectClass;
 import org.apache.syncope.common.rest.api.service.ConnectorService;
 import org.apache.syncope.common.rest.api.service.ResourceService;
 import org.springframework.beans.BeanUtils;
@@ -57,9 +56,9 @@ public class ConnectorRestClient extends BaseRestClient {
     }
 
     public void create(final ConnInstanceTO connectorTO) {
-        Set<ConnConfProperty> filteredConf = filterProperties(connectorTO.getConfiguration());
-        connectorTO.getConfiguration().clear();
-        connectorTO.getConfiguration().addAll(filteredConf);
+        Set<ConnConfProperty> filteredConf = filterProperties(connectorTO.getConf());
+        connectorTO.getConf().clear();
+        connectorTO.getConf().addAll(filteredConf);
         getService(ConnectorService.class).create(connectorTO);
     }
 
@@ -83,9 +82,9 @@ public class ConnectorRestClient extends BaseRestClient {
     }
 
     public void update(final ConnInstanceTO connectorTO) {
-        Set<ConnConfProperty> filteredConf = filterProperties(connectorTO.getConfiguration());
-        connectorTO.getConfiguration().clear();
-        connectorTO.getConfiguration().addAll(filteredConf);
+        Set<ConnConfProperty> filteredConf = filterProperties(connectorTO.getConf());
+        connectorTO.getConf().clear();
+        connectorTO.getConf().addAll(filteredConf);
         getService(ConnectorService.class).update(connectorTO);
     }
 
@@ -139,7 +138,7 @@ public class ConnectorRestClient extends BaseRestClient {
     public boolean check(final ConnInstanceTO connectorTO) {
         ConnInstanceTO toBeChecked = new ConnInstanceTO();
         BeanUtils.copyProperties(connectorTO, toBeChecked, new String[] { "configuration", "configurationMap" });
-        toBeChecked.getConfiguration().addAll(filterProperties(connectorTO.getConfiguration()));
+        toBeChecked.getConf().addAll(filterProperties(connectorTO.getConf()));
 
         boolean check = false;
         try {
@@ -164,27 +163,12 @@ public class ConnectorRestClient extends BaseRestClient {
         return check;
     }
 
-    public List<String> getSchemaNames(final ConnInstanceTO connectorTO) {
-        List<String> schemaNames = new ArrayList<>();
-        try {
-            List<PlainSchemaTO> response = getService(ConnectorService.class).buildSchemaNames(connectorTO, false);
-            for (PlainSchemaTO schema : response) {
-                schemaNames.add(schema.getKey());
-            }
-        } catch (Exception e) {
-            LOG.error("While getting schema names", e);
-        } finally {
-            // re-order schema names list
-            Collections.sort(schemaNames);
-        }
-
-        return schemaNames;
-    }
+    public List<ConnIdObjectClassTO> buildObjectClassInfo(
+            final ConnInstanceTO connInstanceTO, final boolean includeSpecial) {
 
-    public List<ConnIdObjectClass> getSupportedObjectClasses(final ConnInstanceTO connectorTO) {
-        List<ConnIdObjectClass> result = Collections.emptyList();
+        List<ConnIdObjectClassTO> result = Collections.emptyList();
         try {
-            result = getService(ConnectorService.class).buildSupportedObjectClasses(connectorTO);
+            result = getService(ConnectorService.class).buildObjectClassInfo(connInstanceTO, includeSpecial);
         } catch (Exception e) {
             LOG.error("While getting supported object classes", e);
         }

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/client/console/src/main/java/org/apache/syncope/client/console/rest/LoggerRestClient.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/rest/LoggerRestClient.java b/client/console/src/main/java/org/apache/syncope/client/console/rest/LoggerRestClient.java
index 627e828..56283ab 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/rest/LoggerRestClient.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/rest/LoggerRestClient.java
@@ -29,7 +29,7 @@ import org.apache.syncope.common.lib.to.LoggerTO;
 import org.apache.syncope.common.lib.types.AuditLoggerName;
 import org.apache.syncope.common.lib.types.LoggerLevel;
 import org.apache.syncope.common.lib.types.LoggerType;
-import org.apache.syncope.common.rest.api.CollectionWrapper;
+import org.apache.syncope.common.rest.api.LoggerWrapper;
 import org.apache.syncope.common.rest.api.service.LoggerService;
 import org.springframework.stereotype.Component;
 
@@ -43,7 +43,7 @@ public class LoggerRestClient extends BaseRestClient {
     }
 
     public List<AuditLoggerName> listAudits() {
-        return CollectionWrapper.wrapLogger(getService(LoggerService.class).list(LoggerType.AUDIT));
+        return LoggerWrapper.wrap(getService(LoggerService.class).list(LoggerType.AUDIT));
     }
 
     public Map<String, Set<AuditLoggerName>> listAuditsByCategory() {

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/client/console/src/main/java/org/apache/syncope/client/console/rest/ResourceRestClient.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/rest/ResourceRestClient.java b/client/console/src/main/java/org/apache/syncope/client/console/rest/ResourceRestClient.java
index 5efa119..f5579cf 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/rest/ResourceRestClient.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/rest/ResourceRestClient.java
@@ -21,11 +21,11 @@ package org.apache.syncope.client.console.rest;
 import java.util.List;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.common.lib.SyncopeClientException;
+import org.apache.syncope.common.lib.patch.ResourceDeassociationPatch;
 import org.apache.syncope.common.lib.to.BulkAction;
 import org.apache.syncope.common.lib.to.BulkActionResult;
 import org.apache.syncope.common.lib.to.ResourceTO;
 import org.apache.syncope.common.lib.types.ResourceDeassociationAction;
-import org.apache.syncope.common.lib.wrap.AnyKey;
 import org.apache.syncope.common.rest.api.service.ResourceService;
 import org.springframework.stereotype.Component;
 
@@ -82,8 +82,14 @@ public class ResourceRestClient extends BaseRestClient {
 
     public BulkActionResult bulkAssociationAction(
             final String resourceName, final String anyTypeName,
-            final ResourceDeassociationAction type, final List<AnyKey> anyKeys) {
+            final ResourceDeassociationAction action, final List<Long> anyKeys) {
 
-        return getService(ResourceService.class).bulkDeassociation(resourceName, anyTypeName, type, anyKeys);
+        ResourceDeassociationPatch patch = new ResourceDeassociationPatch();
+        patch.setKey(resourceName);
+        patch.setAnyTypeKey(anyTypeName);
+        patch.setAction(action);
+        patch.getAnyKyes().addAll(anyKeys);
+
+        return getService(ResourceService.class).bulkDeassociation(patch);
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/common/lib/src/main/java/org/apache/syncope/common/lib/patch/ResourceDeassociationPatch.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/patch/ResourceDeassociationPatch.java b/common/lib/src/main/java/org/apache/syncope/common/lib/patch/ResourceDeassociationPatch.java
new file mode 100644
index 0000000..9738498
--- /dev/null
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/patch/ResourceDeassociationPatch.java
@@ -0,0 +1,80 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.common.lib.patch;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import java.util.ArrayList;
+import java.util.List;
+import javax.ws.rs.PathParam;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlType;
+import org.apache.syncope.common.lib.AbstractBaseBean;
+import org.apache.syncope.common.lib.types.ResourceDeassociationAction;
+
+@XmlRootElement(name = "resourceDeassociationPatch")
+@XmlType
+public class ResourceDeassociationPatch extends AbstractBaseBean {
+
+    private static final long serialVersionUID = -9116268525079837276L;
+
+    private String key;
+
+    private String anyTypeKey;
+
+    private ResourceDeassociationAction action;
+
+    private final List<Long> anyKyes = new ArrayList<>();
+
+    public String getKey() {
+        return key;
+    }
+
+    @PathParam("key")
+    public void setKey(final String key) {
+        this.key = key;
+    }
+
+    public String getAnyTypeKey() {
+        return anyTypeKey;
+    }
+
+    @PathParam("anyTypeKey")
+    public void setAnyTypeKey(final String anyTypeKey) {
+        this.anyTypeKey = anyTypeKey;
+    }
+
+    public ResourceDeassociationAction getAction() {
+        return action;
+    }
+
+    @PathParam("action")
+    public void setAction(final ResourceDeassociationAction action) {
+        this.action = action;
+    }
+
+    @XmlElementWrapper(name = "anyKyes")
+    @XmlElement(name = "key")
+    @JsonProperty("anyKyes")
+    public List<Long> getAnyKyes() {
+        return anyKyes;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/common/lib/src/main/java/org/apache/syncope/common/lib/to/ConnIdObjectClassTO.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ConnIdObjectClassTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ConnIdObjectClassTO.java
new file mode 100644
index 0000000..be1b6d6
--- /dev/null
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ConnIdObjectClassTO.java
@@ -0,0 +1,78 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.common.lib.to;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import java.util.ArrayList;
+import java.util.List;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlType;
+import org.apache.syncope.common.lib.AbstractBaseBean;
+
+/**
+ * Metadata description of ConnId ObjectClass.
+ */
+@XmlRootElement(name = "connIdObjectClass")
+@XmlType
+public class ConnIdObjectClassTO extends AbstractBaseBean {
+
+    private static final long serialVersionUID = -3719658595689434648L;
+
+    private String type;
+
+    private boolean container;
+
+    private boolean auxiliary;
+
+    private final List<String> attributes = new ArrayList<>();
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(final String type) {
+        this.type = type;
+    }
+
+    public boolean isContainer() {
+        return container;
+    }
+
+    public void setContainer(final boolean container) {
+        this.container = container;
+    }
+
+    public boolean isAuxiliary() {
+        return auxiliary;
+    }
+
+    public void setAuxiliary(final boolean auxiliary) {
+        this.auxiliary = auxiliary;
+    }
+
+    @XmlElementWrapper(name = "attributes")
+    @XmlElement(name = "attribute")
+    @JsonProperty("attributes")
+    public List<String> getAttributes() {
+        return attributes;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/common/lib/src/main/java/org/apache/syncope/common/lib/to/ConnInstanceTO.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ConnInstanceTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ConnInstanceTO.java
index 2111570..257f2ed 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ConnInstanceTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ConnInstanceTO.java
@@ -51,9 +51,9 @@ public class ConnInstanceTO extends AbstractBaseBean {
 
     private String version;
 
-    private final Set<ConnConfProperty> configuration;
+    private final Set<ConnConfProperty> conf = new HashSet<>();
 
-    private final Set<ConnectorCapability> capabilities;
+    private final Set<ConnectorCapability> capabilities = EnumSet.noneOf(ConnectorCapability.class);
 
     private String displayName;
 
@@ -61,13 +61,6 @@ public class ConnInstanceTO extends AbstractBaseBean {
 
     private ConnPoolConfTO poolConf;
 
-    public ConnInstanceTO() {
-        super();
-
-        configuration = new HashSet<>();
-        capabilities = EnumSet.noneOf(ConnectorCapability.class);
-    }
-
     public long getKey() {
         return key;
     }
@@ -109,28 +102,23 @@ public class ConnInstanceTO extends AbstractBaseBean {
         this.version = version;
     }
 
-    @XmlElementWrapper(name = "configuration")
+    @XmlElementWrapper(name = "conf")
     @XmlElement(name = "property")
-    @JsonProperty("configuration")
-    public Set<ConnConfProperty> getConfiguration() {
-        return this.configuration;
+    @JsonProperty("conf")
+    public Set<ConnConfProperty> getConf() {
+        return this.conf;
     }
 
     @JsonIgnore
-    public Map<String, ConnConfProperty> getConfigurationMap() {
-        Map<String, ConnConfProperty> result;
-
-        if (getConfiguration() == null) {
-            result = Collections.<String, ConnConfProperty>emptyMap();
-        } else {
-            result = new HashMap<>();
-            for (ConnConfProperty prop : getConfiguration()) {
-                result.put(prop.getSchema().getName(), prop);
-            }
-            result = Collections.unmodifiableMap(result);
+    public Map<String, ConnConfProperty> getConfMap() {
+        Map<String, ConnConfProperty> result = new HashMap<>();
+
+        for (ConnConfProperty prop : getConf()) {
+            result.put(prop.getSchema().getName(), prop);
         }
+        result = Collections.unmodifiableMap(result);
 
-        return result;
+        return Collections.unmodifiableMap(result);
     }
 
     @XmlElementWrapper(name = "capabilities")

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/common/lib/src/main/java/org/apache/syncope/common/lib/to/ResourceTO.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ResourceTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ResourceTO.java
index 419b852..fc540a9 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ResourceTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ResourceTO.java
@@ -21,6 +21,7 @@ package org.apache.syncope.common.lib.to;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import java.util.ArrayList;
+import java.util.EnumSet;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -32,6 +33,7 @@ import javax.xml.bind.annotation.XmlType;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.Predicate;
 import org.apache.syncope.common.lib.types.ConnConfProperty;
+import org.apache.syncope.common.lib.types.ConnectorCapability;
 import org.apache.syncope.common.lib.types.TraceLevel;
 
 @XmlRootElement(name = "resource")
@@ -76,7 +78,11 @@ public class ResourceTO extends AbstractAnnotatedBean {
 
     private Long syncPolicy;
 
-    private final Set<ConnConfProperty> connConfProperties = new HashSet<>();
+    private final Set<ConnConfProperty> confOverride = new HashSet<>();
+
+    private boolean overrideCapabilities = false;
+
+    private final Set<ConnectorCapability> capabilitiesOverride = EnumSet.noneOf(ConnectorCapability.class);
 
     private final List<String> propagationActionsClassNames = new ArrayList<>();
 
@@ -203,11 +209,26 @@ public class ResourceTO extends AbstractAnnotatedBean {
         return provisions;
     }
 
-    @XmlElementWrapper(name = "connConfProperties")
+    @XmlElementWrapper(name = "confOverride")
     @XmlElement(name = "property")
-    @JsonProperty("connConfProperties")
-    public Set<ConnConfProperty> getConnConfProperties() {
-        return connConfProperties;
+    @JsonProperty("confOverride")
+    public Set<ConnConfProperty> getConfOverride() {
+        return confOverride;
+    }
+
+    public boolean isOverrideCapabilities() {
+        return overrideCapabilities;
+    }
+
+    public void setOverrideCapabilities(final boolean overrideCapabilities) {
+        this.overrideCapabilities = overrideCapabilities;
+    }
+
+    @XmlElementWrapper(name = "capabilitiesOverride")
+    @XmlElement(name = "capability")
+    @JsonProperty("capabilitiesOverride")
+    public Set<ConnectorCapability> getCapabilitiesOverride() {
+        return capabilitiesOverride;
     }
 
     public TraceLevel getSyncTraceLevel() {

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/common/lib/src/main/java/org/apache/syncope/common/lib/wrap/AbstractWrappable.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/wrap/AbstractWrappable.java b/common/lib/src/main/java/org/apache/syncope/common/lib/wrap/AbstractWrappable.java
deleted file mode 100644
index 7ba0afa..0000000
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/wrap/AbstractWrappable.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.common.lib.wrap;
-
-import org.apache.syncope.common.lib.AbstractBaseBean;
-
-public abstract class AbstractWrappable<E> extends AbstractBaseBean {
-
-    private static final long serialVersionUID = 1712808704911635170L;
-
-    private E element;
-
-    public static <E, T extends AbstractWrappable<E>> T getInstance(final Class<T> reference, final E element) {
-        try {
-            T instance = reference.newInstance();
-            instance.setElement(element);
-            return instance;
-        } catch (Exception e) {
-            throw new IllegalArgumentException("Could not instantiate " + reference.getName(), e);
-        }
-    }
-
-    public E getElement() {
-        return element;
-    }
-
-    public void setElement(final E element) {
-        this.element = element;
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/common/lib/src/main/java/org/apache/syncope/common/lib/wrap/AnyKey.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/wrap/AnyKey.java b/common/lib/src/main/java/org/apache/syncope/common/lib/wrap/AnyKey.java
deleted file mode 100644
index 0eb6eef..0000000
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/wrap/AnyKey.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.common.lib.wrap;
-
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
-
-@XmlRootElement(name = "anyKey")
-@XmlType
-public class AnyKey extends AbstractWrappable<Long> {
-
-    private static final long serialVersionUID = -8664228651057889297L;
-
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/common/lib/src/main/java/org/apache/syncope/common/lib/wrap/ConnIdObjectClass.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/wrap/ConnIdObjectClass.java b/common/lib/src/main/java/org/apache/syncope/common/lib/wrap/ConnIdObjectClass.java
deleted file mode 100644
index 868b3f1..0000000
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/wrap/ConnIdObjectClass.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.common.lib.wrap;
-
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
-
-@XmlRootElement(name = "connIdObjectClass")
-@XmlType
-public class ConnIdObjectClass extends AbstractWrappable<String> {
-
-    private static final long serialVersionUID = 613925852330408531L;
-
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/common/lib/src/main/java/org/apache/syncope/common/lib/wrap/package-info.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/wrap/package-info.java b/common/lib/src/main/java/org/apache/syncope/common/lib/wrap/package-info.java
deleted file mode 100644
index 397cb66..0000000
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/wrap/package-info.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-@XmlSchema(namespace = SyncopeConstants.NAMESPACE)
-package org.apache.syncope.common.lib.wrap;
-
-import javax.xml.bind.annotation.XmlSchema;
-import org.apache.syncope.common.lib.SyncopeConstants;

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/CollectionWrapper.java
----------------------------------------------------------------------
diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/CollectionWrapper.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/CollectionWrapper.java
deleted file mode 100644
index 3cdf1fa..0000000
--- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/CollectionWrapper.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.common.rest.api;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import org.apache.syncope.common.lib.to.LoggerTO;
-import org.apache.syncope.common.lib.types.AuditLoggerName;
-import org.apache.syncope.common.lib.types.LoggerLevel;
-import org.apache.syncope.common.lib.wrap.AbstractWrappable;
-
-public final class CollectionWrapper {
-
-    private CollectionWrapper() {
-        // empty constructor for static utility class
-    }
-
-    public static <E, T extends AbstractWrappable<E>> List<T> wrap(final E element, final Class<T> reference) {
-        return Collections.singletonList(AbstractWrappable.getInstance(reference, element));
-    }
-
-    public static <E, T extends AbstractWrappable<E>> List<T> wrap(
-            final Collection<E> collection, final Class<T> reference) {
-
-        List<T> response = new ArrayList<>();
-        for (E element : collection) {
-            response.add(AbstractWrappable.getInstance(reference, element));
-        }
-        return response;
-    }
-
-    public static <T extends AbstractWrappable<String>> List<String> unwrap(final Collection<T> collection) {
-        List<String> response = new ArrayList<>();
-        for (T item : collection) {
-            response.add(item.getElement());
-        }
-        return response;
-    }
-
-    public static List<AuditLoggerName> wrapLogger(final Collection<LoggerTO> logger) {
-        List<AuditLoggerName> respons = new ArrayList<>();
-        for (LoggerTO loggerTO : logger) {
-            try {
-                respons.add(AuditLoggerName.fromLoggerName(loggerTO.getKey()));
-            } catch (Exception ignore) {
-                // ignore
-            }
-        }
-        return respons;
-    }
-
-    public static List<LoggerTO> unwrapLogger(final Collection<AuditLoggerName> auditNames) {
-        List<LoggerTO> respons = new ArrayList<>();
-        for (AuditLoggerName name : auditNames) {
-            LoggerTO loggerTO = new LoggerTO();
-            loggerTO.setKey(name.toLoggerName());
-            loggerTO.setLevel(LoggerLevel.DEBUG);
-            respons.add(loggerTO);
-        }
-        return respons;
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/LoggerWrapper.java
----------------------------------------------------------------------
diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/LoggerWrapper.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/LoggerWrapper.java
new file mode 100644
index 0000000..9f9dfde
--- /dev/null
+++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/LoggerWrapper.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.common.rest.api;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import org.apache.syncope.common.lib.to.LoggerTO;
+import org.apache.syncope.common.lib.types.AuditLoggerName;
+import org.apache.syncope.common.lib.types.LoggerLevel;
+
+public final class LoggerWrapper {
+
+    private LoggerWrapper() {
+        // empty constructor for static utility class
+    }
+
+    public static List<AuditLoggerName> wrap(final Collection<LoggerTO> logger) {
+        List<AuditLoggerName> respons = new ArrayList<>();
+        for (LoggerTO loggerTO : logger) {
+            try {
+                respons.add(AuditLoggerName.fromLoggerName(loggerTO.getKey()));
+            } catch (Exception ignore) {
+                // ignore
+            }
+        }
+        return respons;
+    }
+
+    public static List<LoggerTO> unwrap(final Collection<AuditLoggerName> auditNames) {
+        List<LoggerTO> respons = new ArrayList<>();
+        for (AuditLoggerName name : auditNames) {
+            LoggerTO loggerTO = new LoggerTO();
+            loggerTO.setKey(name.toLoggerName());
+            loggerTO.setLevel(LoggerLevel.DEBUG);
+            respons.add(loggerTO);
+        }
+        return respons;
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ConnectorService.java
----------------------------------------------------------------------
diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ConnectorService.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ConnectorService.java
index ea63718..bc111ed 100644
--- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ConnectorService.java
+++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ConnectorService.java
@@ -35,9 +35,8 @@ import javax.ws.rs.core.Response;
 import org.apache.syncope.common.lib.to.BulkAction;
 import org.apache.syncope.common.lib.to.BulkActionResult;
 import org.apache.syncope.common.lib.to.ConnBundleTO;
+import org.apache.syncope.common.lib.to.ConnIdObjectClassTO;
 import org.apache.syncope.common.lib.to.ConnInstanceTO;
-import org.apache.syncope.common.lib.to.PlainSchemaTO;
-import org.apache.syncope.common.lib.wrap.ConnIdObjectClass;
 
 /**
  * REST operations for connector bundles and instances.
@@ -57,38 +56,24 @@ public interface ConnectorService extends JAXRSService {
     List<ConnBundleTO> getBundles(@QueryParam("lang") String lang);
 
     /**
-     * Builds the list of schema names managed by the connector bundle matching the given connector instance key, with
-     * the provided configuration.
+     * Builds the list of ConnId object classes information for the connector bundle matching the given connector
+     * instance key, with the provided configuration.
      *
      * @param connInstanceTO connector instance object providing configuration properties
      * @param includeSpecial if set to true, special schema names (like '__PASSWORD__') will be included;
      * default is false
-     * @return schema names for the connector bundle matching the given connector instance key, with the provided
-     * configuration
+     * @return supported object classes info for the connector bundle matching the given connector instance key, with
+     * the provided configuration
      */
     @POST
-    @Path("{key}/schemaNames")
+    @Path("{key}/supportedObjectClasses")
     @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
     @Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
-    List<PlainSchemaTO> buildSchemaNames(
+    List<ConnIdObjectClassTO> buildObjectClassInfo(
             @NotNull ConnInstanceTO connInstanceTO,
             @QueryParam("includeSpecial") @DefaultValue("false") boolean includeSpecial);
 
     /**
-     * Builds the list of supported ConnId object classes for the connector bundle matching the given connector instance
-     * key, with the provided configuration.
-     *
-     * @param connInstanceTO connector instance object providing configuration properties
-     * @return supported object classes for the connector bundle matching the given connector instance key, with the
-     * provided configuration
-     */
-    @POST
-    @Path("{key}/supportedObjectClasses")
-    @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
-    @Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
-    List<ConnIdObjectClass> buildSupportedObjectClasses(@NotNull ConnInstanceTO connInstanceTO);
-
-    /**
      * Returns connector instance with matching key.
      *
      * @param key connector instance key to be read

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ResourceService.java
----------------------------------------------------------------------
diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ResourceService.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ResourceService.java
index 7a3550b..d515268 100644
--- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ResourceService.java
+++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ResourceService.java
@@ -31,13 +31,12 @@ import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
+import org.apache.syncope.common.lib.patch.ResourceDeassociationPatch;
 import org.apache.syncope.common.lib.to.BulkAction;
 import org.apache.syncope.common.lib.to.BulkActionResult;
 import org.apache.syncope.common.lib.to.ConnObjectTO;
 import org.apache.syncope.common.lib.to.PagedConnObjectTOResult;
 import org.apache.syncope.common.lib.to.ResourceTO;
-import org.apache.syncope.common.lib.types.ResourceDeassociationAction;
-import org.apache.syncope.common.lib.wrap.AnyKey;
 import org.apache.syncope.common.rest.api.beans.ConnObjectTOListQuery;
 
 /**
@@ -143,19 +142,14 @@ public interface ResourceService extends JAXRSService {
     /**
      * De-associate any objects from the given resource.
      *
-     * @param key name of resource
-     * @param anyTypeKey any object kind
-     * @param type resource de-association action type
-     * @param keys any object keys against which the bulk action will be performed
-     * @return Response object featuring BulkActionResult as Entity
+     * @param patch any objects to be used for propagation-related operations
+     * @return Bulk action result
      */
     @POST
     @Path("{key}/bulkDeassociation/{anyTypeKey}/{action}")
     @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
     @Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
-    BulkActionResult bulkDeassociation(@NotNull @PathParam("key") String key,
-            @NotNull @PathParam("anyTypeKey") String anyTypeKey,
-            @NotNull @PathParam("action") ResourceDeassociationAction type, @NotNull List<AnyKey> keys);
+    BulkActionResult bulkDeassociation(@NotNull ResourceDeassociationPatch patch);
 
     /**
      * Executes the provided bulk action.

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/logic/src/main/java/org/apache/syncope/core/logic/ConnectorLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/ConnectorLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/ConnectorLogic.java
index cc6aaed..77ef94c 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/ConnectorLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/ConnectorLogic.java
@@ -32,10 +32,9 @@ import org.apache.commons.lang3.ArrayUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.to.ConnBundleTO;
+import org.apache.syncope.common.lib.to.ConnIdObjectClassTO;
 import org.apache.syncope.common.lib.to.ConnInstanceTO;
-import org.apache.syncope.common.lib.to.PlainSchemaTO;
 import org.apache.syncope.common.lib.types.ClientExceptionType;
-import org.apache.syncope.common.lib.types.ConnConfProperty;
 import org.apache.syncope.common.lib.types.Entitlement;
 import org.apache.syncope.core.persistence.api.dao.ConnInstanceDAO;
 import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
@@ -43,7 +42,6 @@ import org.apache.syncope.core.persistence.api.dao.NotFoundException;
 import org.apache.syncope.core.persistence.api.entity.ConnInstance;
 import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
 import org.apache.syncope.core.provisioning.api.ConnIdBundleManager;
-import org.apache.syncope.core.provisioning.api.Connector;
 import org.apache.syncope.core.provisioning.api.ConnectorFactory;
 import org.apache.syncope.core.provisioning.api.data.ConnInstanceDataBinder;
 import org.identityconnectors.common.l10n.CurrentLocale;
@@ -51,7 +49,9 @@ import org.identityconnectors.framework.api.ConfigurationProperties;
 import org.identityconnectors.framework.api.ConnectorInfo;
 import org.identityconnectors.framework.api.ConnectorInfoManager;
 import org.identityconnectors.framework.api.ConnectorKey;
-import org.identityconnectors.framework.common.objects.ObjectClass;
+import org.identityconnectors.framework.common.objects.AttributeInfo;
+import org.identityconnectors.framework.common.objects.AttributeUtil;
+import org.identityconnectors.framework.common.objects.ObjectClassInfo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.stereotype.Component;
@@ -93,7 +93,7 @@ public class ConnectorLogic extends AbstractTransactionalLogic<ConnInstanceTO> {
 
     @PreAuthorize("hasRole('" + Entitlement.CONNECTOR_UPDATE + "')")
     public ConnInstanceTO update(final ConnInstanceTO connInstanceTO) {
-        ConnInstance connInstance = binder.updateConnInstance(connInstanceTO.getKey(), connInstanceTO);
+        ConnInstance connInstance = binder.update(connInstanceTO.getKey(), connInstanceTO);
         try {
             connInstance = connInstanceDAO.save(connInstance);
         } catch (SyncopeClientException e) {
@@ -193,7 +193,7 @@ public class ConnectorLogic extends AbstractTransactionalLogic<ConnInstanceTO> {
                 ConfigurationProperties properties = connIdBundleManager.getConfigurationProperties(bundle);
 
                 for (String propName : properties.getPropertyNames()) {
-                    connBundleTO.getProperties().add(binder.buildConnConfPropSchema(properties.getProperty(propName)));
+                    connBundleTO.getProperties().add(binder.build(properties.getProperty(propName)));
                 }
 
                 connectorBundleTOs.add(connBundleTO);
@@ -204,65 +204,41 @@ public class ConnectorLogic extends AbstractTransactionalLogic<ConnInstanceTO> {
     }
 
     @PreAuthorize("hasRole('" + Entitlement.CONNECTOR_READ + "')")
-    @Transactional(readOnly = true)
-    public List<PlainSchemaTO> buildSchemaNames(final ConnInstanceTO connInstanceTO, final boolean includeSpecial) {
+    public List<ConnIdObjectClassTO> buildObjectClassInfo(
+            final ConnInstanceTO connInstanceTO, final boolean includeSpecial) {
+
         ConnInstance connInstance = connInstanceDAO.find(connInstanceTO.getKey());
         if (connInstance == null) {
             throw new NotFoundException("Connector '" + connInstanceTO.getKey() + "'");
         }
 
-        // consider the possibility to receive overridden properties only
-        Set<ConnConfProperty> conf =
-                binder.mergeConnConfProperties(connInstanceTO.getConfiguration(), connInstance.getConfiguration());
+        Set<ObjectClassInfo> objectClassInfo = connFactory.createConnector(
+                connFactory.buildConnInstanceOverride(connInstance, connInstanceTO.getConf(), null)).
+                getObjectClassInfo();
 
-        // We cannot use Spring bean because this method could be used during resource definition or modification:
-        // bean couldn't exist or couldn't be updated.
-        // This is the reason why we should take a "not mature" connector facade proxy to ask for schema names.
-        Set<String> schemaNames = connFactory.createConnector(connInstance, conf).getSchemaNames(includeSpecial);
+        List<ConnIdObjectClassTO> result = new ArrayList<>(objectClassInfo.size());
+        for (ObjectClassInfo info : objectClassInfo) {
+            ConnIdObjectClassTO connIdObjectClassTO = new ConnIdObjectClassTO();
+            connIdObjectClassTO.setType(info.getType());
+            connIdObjectClassTO.setAuxiliary(info.isAuxiliary());
+            connIdObjectClassTO.setContainer(info.isContainer());
 
-        return CollectionUtils.collect(schemaNames, new Transformer<String, PlainSchemaTO>() {
-
-            @Override
-            public PlainSchemaTO transform(final String name) {
-                PlainSchemaTO schemaTO = new PlainSchemaTO();
-                schemaTO.setKey(name);
-                return schemaTO;
+            for (AttributeInfo attrInfo : info.getAttributeInfo()) {
+                if (includeSpecial || !AttributeUtil.isSpecialName(attrInfo.getName())) {
+                    connIdObjectClassTO.getAttributes().add(attrInfo.getName());
+                }
             }
-        }, new ArrayList<PlainSchemaTO>());
-    }
 
-    @PreAuthorize("hasRole('" + Entitlement.CONNECTOR_READ + "')")
-    @Transactional(readOnly = true)
-    public List<String> buildSupportedObjectClasses(final ConnInstanceTO connInstanceTO) {
-        ConnInstance connInstance = connInstanceDAO.find(connInstanceTO.getKey());
-        if (connInstance == null) {
-            throw new NotFoundException("Connector '" + connInstanceTO.getKey() + "'");
+            result.add(connIdObjectClassTO);
         }
 
-        // consider the possibility to receive overridden properties only
-        Set<ConnConfProperty> conf =
-                binder.mergeConnConfProperties(connInstanceTO.getConfiguration(), connInstance.getConfiguration());
-
-        // We cannot use Spring bean because this method could be used during resource definition or modification:
-        // bean couldn't exist or couldn't be updated.
-        // This is the reason why we should take a "not mature" connector facade proxy to ask for object classes.
-        Set<ObjectClass> objectClasses = connFactory.createConnector(connInstance, conf).getSupportedObjectClasses();
-
-        return CollectionUtils.collect(objectClasses, new Transformer<ObjectClass, String>() {
-
-            @Override
-            public String transform(final ObjectClass objectClass) {
-                return objectClass.getObjectClassValue();
-            }
-        }, new ArrayList<String>());
+        return result;
     }
 
     @PreAuthorize("hasRole('" + Entitlement.CONNECTOR_READ + "')")
     @Transactional(readOnly = true)
     public void check(final ConnInstanceTO connInstanceTO) {
-        Connector connector = connFactory.createConnector(
-                binder.getConnInstance(connInstanceTO), connInstanceTO.getConfiguration());
-        connector.test();
+        connFactory.createConnector(binder.getConnInstance(connInstanceTO)).test();
     }
 
     @PreAuthorize("hasRole('" + Entitlement.CONNECTOR_READ + "')")
@@ -274,7 +250,7 @@ public class ConnectorLogic extends AbstractTransactionalLogic<ConnInstanceTO> {
         if (resource == null) {
             throw new NotFoundException("Resource '" + resourceName + "'");
         }
-        return binder.getConnInstanceTO(connFactory.getConnector(resource).getActiveConnInstance());
+        return binder.getConnInstanceTO(connFactory.getConnector(resource).getConnInstance());
     }
 
     @PreAuthorize("hasRole('" + Entitlement.CONNECTOR_RELOAD + "')")

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/logic/src/main/java/org/apache/syncope/core/logic/ResourceLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/ResourceLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/ResourceLogic.java
index 44a5aa8..a6a2610 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/ResourceLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/ResourceLogic.java
@@ -44,7 +44,6 @@ import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
 import org.apache.syncope.core.persistence.api.dao.NotFoundException;
 import org.apache.syncope.core.persistence.api.dao.GroupDAO;
 import org.apache.syncope.core.persistence.api.dao.UserDAO;
-import org.apache.syncope.core.persistence.api.entity.ConnInstance;
 import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
 import org.apache.syncope.core.persistence.api.entity.resource.MappingItem;
 import org.apache.syncope.core.provisioning.api.Connector;
@@ -54,10 +53,12 @@ import org.apache.syncope.core.misc.ConnObjectUtils;
 import org.apache.syncope.core.misc.MappingUtils;
 import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO;
 import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
+import org.apache.syncope.core.persistence.api.dao.ConnInstanceDAO;
 import org.apache.syncope.core.persistence.api.dao.VirSchemaDAO;
 import org.apache.syncope.core.persistence.api.dao.search.OrderByClause;
 import org.apache.syncope.core.persistence.api.entity.Any;
 import org.apache.syncope.core.persistence.api.entity.AnyType;
+import org.apache.syncope.core.persistence.api.entity.ConnInstance;
 import org.apache.syncope.core.persistence.api.entity.VirSchema;
 import org.apache.syncope.core.persistence.api.entity.resource.Provision;
 import org.identityconnectors.framework.common.objects.Attribute;
@@ -85,6 +86,9 @@ public class ResourceLogic extends AbstractTransactionalLogic<ResourceTO> {
     private AnyObjectDAO anyObjectDAO;
 
     @Autowired
+    private ConnInstanceDAO connInstanceDAO;
+
+    @Autowired
     private UserDAO userDAO;
 
     @Autowired
@@ -245,7 +249,7 @@ public class ResourceLogic extends AbstractTransactionalLogic<ResourceTO> {
         ConnectorObject connectorObject = connector.getObject(
                 init.getRight().getObjectClass(),
                 new Uid(connObjectKeyValue),
-                connector.getOperationOptions(mapItems));
+                MappingUtils.buildOperationOptions(mapItems));
         if (connectorObject == null) {
             throw new NotFoundException(
                     "Object " + connObjectKeyValue + " with class " + init.getRight().getObjectClass()
@@ -303,10 +307,17 @@ public class ResourceLogic extends AbstractTransactionalLogic<ResourceTO> {
     @PreAuthorize("hasRole('" + Entitlement.CONNECTOR_READ + "')")
     @Transactional(readOnly = true)
     public void check(final ResourceTO resourceTO) {
-        ConnInstance connInstance = binder.getConnInstance(resourceTO);
-        Connector connector = connFactory.createConnector(connInstance, connInstance.getConfiguration());
+        ConnInstance connInstance = connInstanceDAO.find(resourceTO.getConnector());
+        if (connInstance == null) {
+            throw new NotFoundException("Connector '" + resourceTO.getConnector() + "'");
+        }
 
-        connector.test();
+        connFactory.createConnector(
+                connFactory.buildConnInstanceOverride(
+                        connInstance,
+                        resourceTO.getConfOverride(),
+                        resourceTO.isOverrideCapabilities() ? resourceTO.getCapabilitiesOverride() : null)).
+                test();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/misc/src/main/java/org/apache/syncope/core/misc/MappingUtils.java
----------------------------------------------------------------------
diff --git a/core/misc/src/main/java/org/apache/syncope/core/misc/MappingUtils.java b/core/misc/src/main/java/org/apache/syncope/core/misc/MappingUtils.java
index 54a4428..aed2ee6 100644
--- a/core/misc/src/main/java/org/apache/syncope/core/misc/MappingUtils.java
+++ b/core/misc/src/main/java/org/apache/syncope/core/misc/MappingUtils.java
@@ -21,6 +21,7 @@ package org.apache.syncope.core.misc;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
 import org.apache.commons.collections4.ListUtils;
@@ -75,7 +76,10 @@ import org.identityconnectors.framework.common.objects.Attribute;
 import org.identityconnectors.framework.common.objects.AttributeBuilder;
 import org.identityconnectors.framework.common.objects.AttributeUtil;
 import org.identityconnectors.framework.common.objects.Name;
+import org.identityconnectors.framework.common.objects.OperationOptions;
+import org.identityconnectors.framework.common.objects.OperationOptionsBuilder;
 import org.identityconnectors.framework.common.objects.OperationalAttributes;
+import org.identityconnectors.framework.common.objects.Uid;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -256,6 +260,34 @@ public class MappingUtils {
     }
 
     /**
+     * Build options for requesting all mapped connector attributes.
+     *
+     * @param mapItems mapping items
+     * @return options for requesting all mapped connector attributes
+     * @see OperationOptions
+     */
+    public static OperationOptions buildOperationOptions(final Iterator<? extends MappingItem> mapItems) {
+        OperationOptionsBuilder builder = new OperationOptionsBuilder();
+
+        Set<String> attrsToGet = new HashSet<>();
+        attrsToGet.add(Name.NAME);
+        attrsToGet.add(Uid.NAME);
+        attrsToGet.add(OperationalAttributes.ENABLE_NAME);
+
+        while (mapItems.hasNext()) {
+            MappingItem mapItem = mapItems.next();
+            if (mapItem.getPurpose() != MappingPurpose.NONE) {
+                attrsToGet.add(mapItem.getExtAttrName());
+            }
+        }
+
+        builder.setAttributesToGet(attrsToGet);
+        // -------------------------------------
+
+        return builder.build();
+    }
+
+    /**
      * Prepare attributes for sending to a connector instance.
      *
      * @param any given any object
@@ -796,5 +828,4 @@ public class MappingUtils {
             default:
         }
     }
-
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/ConnInstance.java
----------------------------------------------------------------------
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/ConnInstance.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/ConnInstance.java
index eb665ea..2019e8e 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/ConnInstance.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/ConnInstance.java
@@ -26,47 +26,44 @@ import org.apache.syncope.common.lib.types.ConnectorCapability;
 
 public interface ConnInstance extends Entity<Long> {
 
-    boolean addCapability(ConnectorCapability capabitily);
-
-    boolean addResource(ExternalResource resource);
-
-    String getBundleName();
-
-    Set<ConnectorCapability> getCapabilities();
-
-    Set<ConnConfProperty> getConfiguration();
-
-    Integer getConnRequestTimeout();
+    void setConnectorName(String connectorName);
 
     String getConnectorName();
 
+    void setDisplayName(String displayName);
+
     String getDisplayName();
 
+    void setLocation(String location);
+
     String getLocation();
 
+    void setPoolConf(ConnPoolConf poolConf);
+
     ConnPoolConf getPoolConf();
 
-    List<? extends ExternalResource> getResources();
+    void setVersion(String version);
 
     String getVersion();
 
-    boolean removeCapability(ConnectorCapability capabitily);
+    void setBundleName(String bundleName);
 
-    boolean removeResource(ExternalResource resource);
+    String getBundleName();
 
-    void setBundleName(String bundleName);
+    Set<ConnectorCapability> getCapabilities();
 
-    void setConfiguration(Set<ConnConfProperty> configuration);
+    boolean add(ExternalResource resource);
 
-    void setConnRequestTimeout(Integer timeout);
+    boolean remove(ExternalResource resource);
 
-    void setConnectorName(String connectorName);
+    List<? extends ExternalResource> getResources();
 
-    void setDisplayName(String displayName);
+    void setConf(Set<ConnConfProperty> conf);
 
-    void setLocation(String location);
+    Set<ConnConfProperty> getConf();
 
-    void setPoolConf(ConnPoolConf poolConf);
+    void setConnRequestTimeout(Integer timeout);
+
+    Integer getConnRequestTimeout();
 
-    void setVersion(String version);
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/resource/ExternalResource.java
----------------------------------------------------------------------
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/resource/ExternalResource.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/resource/ExternalResource.java
index 26aa9a1..0cc3c04 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/resource/ExternalResource.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/resource/ExternalResource.java
@@ -21,6 +21,7 @@ package org.apache.syncope.core.persistence.api.entity.resource;
 import java.util.List;
 import java.util.Set;
 import org.apache.syncope.common.lib.types.ConnConfProperty;
+import org.apache.syncope.common.lib.types.ConnectorCapability;
 import org.apache.syncope.common.lib.types.TraceLevel;
 import org.apache.syncope.core.persistence.api.entity.policy.AccountPolicy;
 import org.apache.syncope.core.persistence.api.entity.AnnotatedEntity;
@@ -38,9 +39,15 @@ public interface ExternalResource extends AnnotatedEntity<String> {
 
     void setConnector(ConnInstance connector);
 
-    Set<ConnConfProperty> getConnInstanceConfiguration();
+    Set<ConnConfProperty> getConfOverride();
 
-    void setConnInstanceConfiguration(Set<ConnConfProperty> properties);
+    void setConfOverride(Set<ConnConfProperty> confOverride);
+
+    boolean isOverrideCapabilities();
+
+    void setOverrideCapabilities(boolean overrideCapabilities);
+
+    Set<ConnectorCapability> getCapabilitiesOverride();
 
     AccountPolicy getAccountPolicy();
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAConnInstance.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAConnInstance.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAConnInstance.java
index 054dd69..e31aaaa 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAConnInstance.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAConnInstance.java
@@ -99,8 +99,8 @@ public class JPAConnInstance extends AbstractEntity<Long> implements ConnInstanc
     @Column(name = "capability")
     @CollectionTable(name = "ConnInstance_capabilities",
             joinColumns =
-            @JoinColumn(name = "ConnInstance_id", referencedColumnName = "id"))
-    private Set<ConnectorCapability> capabilities;
+            @JoinColumn(name = "connInstance_id", referencedColumnName = "id"))
+    private Set<ConnectorCapability> capabilities = new HashSet<>();
 
     /**
      * The main configuration for the connector instance. This is directly implemented by the Configuration bean class
@@ -118,7 +118,7 @@ public class JPAConnInstance extends AbstractEntity<Long> implements ConnInstanc
      * External resources associated to the connector.
      */
     @OneToMany(cascade = { CascadeType.ALL }, mappedBy = "connector")
-    private List<JPAExternalResource> resources;
+    private List<JPAExternalResource> resources = new ArrayList<>();
 
     /**
      * Connector request timeout. It is not applied in case of sync, full reconciliation and search.
@@ -128,13 +128,6 @@ public class JPAConnInstance extends AbstractEntity<Long> implements ConnInstanc
 
     private JPAConnPoolConf poolConf;
 
-    public JPAConnInstance() {
-        super();
-
-        capabilities = new HashSet<>();
-        resources = new ArrayList<>();
-    }
-
     @Override
     public Long getKey() {
         return id;
@@ -181,7 +174,7 @@ public class JPAConnInstance extends AbstractEntity<Long> implements ConnInstanc
     }
 
     @Override
-    public Set<ConnConfProperty> getConfiguration() {
+    public Set<ConnConfProperty> getConf() {
         Set<ConnConfProperty> configuration = new HashSet<>();
         if (!StringUtils.isBlank(jsonConf)) {
             CollectionUtils.addAll(configuration, POJOHelper.deserialize(jsonConf, ConnConfProperty[].class));
@@ -191,8 +184,8 @@ public class JPAConnInstance extends AbstractEntity<Long> implements ConnInstanc
     }
 
     @Override
-    public void setConfiguration(final Set<ConnConfProperty> configuration) {
-        jsonConf = POJOHelper.serialize(new HashSet<>(configuration));
+    public void setConf(final Set<ConnConfProperty> conf) {
+        jsonConf = POJOHelper.serialize(new HashSet<>(conf));
     }
 
     @Override
@@ -211,29 +204,19 @@ public class JPAConnInstance extends AbstractEntity<Long> implements ConnInstanc
     }
 
     @Override
-    public boolean addResource(final ExternalResource resource) {
+    public boolean add(final ExternalResource resource) {
         checkType(resource, JPAExternalResource.class);
         return this.resources.contains((JPAExternalResource) resource)
                 || this.resources.add((JPAExternalResource) resource);
     }
 
     @Override
-    public boolean removeResource(final ExternalResource resource) {
+    public boolean remove(final ExternalResource resource) {
         checkType(resource, JPAExternalResource.class);
         return this.resources.remove((JPAExternalResource) resource);
     }
 
     @Override
-    public boolean addCapability(final ConnectorCapability capabitily) {
-        return capabilities.add(capabitily);
-    }
-
-    @Override
-    public boolean removeCapability(final ConnectorCapability capabitily) {
-        return capabilities.remove(capabitily);
-    }
-
-    @Override
     public Set<ConnectorCapability> getCapabilities() {
         return capabilities;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAExternalResource.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAExternalResource.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAExternalResource.java
index de3931e..393338b 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAExternalResource.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAExternalResource.java
@@ -44,6 +44,7 @@ import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.Predicate;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.common.lib.types.ConnConfProperty;
+import org.apache.syncope.common.lib.types.ConnectorCapability;
 import org.apache.syncope.common.lib.types.TraceLevel;
 import org.apache.syncope.core.persistence.api.entity.policy.AccountPolicy;
 import org.apache.syncope.core.persistence.api.entity.ConnInstance;
@@ -153,6 +154,20 @@ public class JPAExternalResource extends AbstractAnnotatedEntity<String> impleme
     @Lob
     private String jsonConf;
 
+    @NotNull
+    @Basic
+    @Min(0)
+    @Max(1)
+    private Integer overrideCapabilities;
+
+    @ElementCollection(fetch = FetchType.EAGER)
+    @Enumerated(EnumType.STRING)
+    @Column(name = "capabilityOverride")
+    @CollectionTable(name = "ExternalResource_capabilitiesOverride",
+            joinColumns =
+            @JoinColumn(name = "resource_name", referencedColumnName = "name"))
+    private Set<ConnectorCapability> capabilitiesOverride = new HashSet<>();
+
     /**
      * (Optional) classes for PropagationAction.
      */
@@ -163,9 +178,6 @@ public class JPAExternalResource extends AbstractAnnotatedEntity<String> impleme
             @JoinColumn(name = "resource_name", referencedColumnName = "name"))
     private List<String> propagationActionsClassNames = new ArrayList<>();
 
-    /**
-     * Default constructor.
-     */
     public JPAExternalResource() {
         super();
 
@@ -173,6 +185,7 @@ public class JPAExternalResource extends AbstractAnnotatedEntity<String> impleme
         propagationPrimary = 0;
         propagationPriority = 0;
         randomPwdIfNotProvided = 0;
+        overrideCapabilities = 0;
 
         createTraceLevel = TraceLevel.FAILURES;
         updateTraceLevel = TraceLevel.FAILURES;
@@ -357,18 +370,33 @@ public class JPAExternalResource extends AbstractAnnotatedEntity<String> impleme
     }
 
     @Override
-    public Set<ConnConfProperty> getConnInstanceConfiguration() {
-        Set<ConnConfProperty> configuration = new HashSet<>();
+    public Set<ConnConfProperty> getConfOverride() {
+        Set<ConnConfProperty> confOverride = new HashSet<>();
         if (!StringUtils.isBlank(jsonConf)) {
-            CollectionUtils.addAll(configuration, POJOHelper.deserialize(jsonConf, ConnConfProperty[].class));
+            CollectionUtils.addAll(confOverride, POJOHelper.deserialize(jsonConf, ConnConfProperty[].class));
         }
 
-        return configuration;
+        return confOverride;
+    }
+
+    @Override
+    public void setConfOverride(final Set<ConnConfProperty> confOverride) {
+        jsonConf = POJOHelper.serialize(new HashSet<>(confOverride));
+    }
+
+    @Override
+    public boolean isOverrideCapabilities() {
+        return isBooleanAsInteger(overrideCapabilities);
+    }
+
+    @Override
+    public void setOverrideCapabilities(final boolean overrideCapabilities) {
+        this.overrideCapabilities = getBooleanAsInteger(overrideCapabilities);
     }
 
     @Override
-    public void setConnInstanceConfiguration(final Set<ConnConfProperty> properties) {
-        jsonConf = POJOHelper.serialize(new HashSet<>(properties));
+    public Set<ConnectorCapability> getCapabilitiesOverride() {
+        return capabilitiesOverride;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/1347c108/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/DummyConnectorRegistry.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/DummyConnectorRegistry.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/DummyConnectorRegistry.java
index 91618d2..f0b892b 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/DummyConnectorRegistry.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/DummyConnectorRegistry.java
@@ -18,10 +18,7 @@
  */
 package org.apache.syncope.core.persistence.jpa;
 
-import java.util.Set;
-import org.apache.syncope.common.lib.types.ConnConfProperty;
 import org.apache.syncope.core.persistence.api.dao.NotFoundException;
-import org.apache.syncope.core.persistence.api.entity.ConnInstance;
 import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
 import org.apache.syncope.core.provisioning.api.ConnectorRegistry;
 import org.springframework.stereotype.Component;
@@ -30,15 +27,7 @@ import org.springframework.stereotype.Component;
 public class DummyConnectorRegistry implements ConnectorRegistry {
 
     @Override
-    public ConnInstance getOverriddenConnInstance(
-            final ConnInstance connInstance, final Set<ConnConfProperty> overridden) {
-
-        return connInstance;
-    }
-
-    @Override
-    public void registerConnector(final ExternalResource resource)
-            throws NotFoundException {
+    public void registerConnector(final ExternalResource resource) throws NotFoundException {
     }
 
     @Override