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/06/11 16:17:50 UTC

[60/70] syncope git commit: [SYNCOPE-666] Any* tests added

[SYNCOPE-666] Any* tests added


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

Branch: refs/heads/master
Commit: a45a46bba7186ef43b4877482d636901bc40cbc5
Parents: 46aaa9e
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Wed Jun 10 14:33:59 2015 +0200
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Wed Jun 10 14:33:59 2015 +0200

----------------------------------------------------------------------
 .../client/console/commons/AnyDataProvider.java | 101 ++++
 .../commons/AttributableDataProvider.java       | 103 ----
 .../console/pages/BulkActionModalPage.java      |   8 +-
 .../pages/BulkActionResultModalPage.java        |   8 +-
 .../console/pages/ProvisioningModalPage.java    |  38 +-
 .../client/console/pages/ResourceModalPage.java |  52 +-
 .../panels/AbstractSearchResultPanel.java       |  22 +-
 .../console/panels/AjaxDataTablePanel.java      |   4 +-
 .../console/panels/AnnotatedBeanPanel.java      |   4 +-
 .../console/panels/ResourceConnConfPanel.java   |  18 +-
 .../console/panels/ResourceDetailsPanel.java    |  10 +-
 .../console/panels/ResourceMappingPanel.java    | 228 +++++----
 .../client/console/panels/Resources.java        | 485 -------------------
 .../console/rest/ConnectorRestClient.java       |   6 +-
 .../client/console/rest/GroupRestClient.java    |  47 +-
 .../client/console/rest/UserRestClient.java     |  48 +-
 .../repeater/data/table/ActionResultColumn.java |  17 +-
 .../console/pages/ResourceModalPage.properties  |   6 +-
 .../pages/ResourceModalPage_it.properties       |   6 +-
 .../pages/ResourceModalPage_pt_BR.properties    |   6 +-
 .../console/panels/ResourceMappingPanel.html    |  14 +-
 .../client/console/panels/Resources.html        |  52 --
 .../client/console/panels/Resources.properties  |  34 --
 .../console/panels/Resources_it.properties      |  34 --
 .../console/panels/Resources_pt_BR.properties   |  32 --
 .../syncope/client/lib/SyncopeClient.java       |  13 +-
 .../lib/builders/AnyListQueryBuilder.java       |   1 +
 .../apache/syncope/common/lib/mod/AnyMod.java   |   2 +
 .../AbstractFiqlSearchConditionBuilder.java     |   1 +
 .../AnyObjectFiqlSearchConditionBuilder.java    |  71 +++
 .../common/lib/search/AnyObjectProperty.java    |  23 +
 .../syncope/common/lib/search/SpecialAttr.java  |   1 +
 .../common/lib/to/ConnIdObjectClassTO.java      |  74 ---
 .../apache/syncope/common/lib/to/MappingTO.java |   2 +-
 .../common/lib/types/IntMappingType.java        |  18 +-
 .../common/lib/wrap/ConnIdObjectClass.java      |  30 ++
 .../rest/api/service/AnyObjectService.java      |  49 ++
 .../common/rest/api/service/AnyService.java     | 191 ++++++++
 .../rest/api/service/ConnectorService.java      |   4 +-
 .../common/rest/api/service/GroupService.java   | 158 +-----
 .../common/rest/api/service/UserService.java    | 160 +-----
 .../syncope/core/logic/AbstractAnyLogic.java    |  16 +-
 .../syncope/core/logic/AnyObjectLogic.java      |  27 +-
 .../apache/syncope/core/logic/AnyTypeLogic.java |  10 +-
 .../apache/syncope/core/logic/GroupLogic.java   |   1 +
 .../apache/syncope/core/logic/UserLogic.java    |   6 +
 .../syncope/core/misc/ConnObjectUtils.java      |   5 +
 .../apache/syncope/core/misc/MappingUtils.java  |  14 +-
 .../core/misc/search/SearchCondVisitor.java     |   7 +
 .../misc/search/SearchCondConverterTest.java    |  14 +
 .../core/persistence/api/dao/AnyObjectDAO.java  |   8 +-
 .../persistence/api/dao/search/AnyTypeCond.java |  40 ++
 .../persistence/api/dao/search/SearchCond.java  |  22 +-
 .../persistence/jpa/dao/JPAAnyObjectDAO.java    |  24 +-
 .../persistence/jpa/dao/JPAAnySearchDAO.java    |  22 +
 .../persistence/jpa/entity/JPAAnyUtils.java     |   6 +-
 .../jpa/entity/resource/JPAMapping.java         |   2 +-
 .../jpa/entity/resource/JPAMappingItem.java     |   2 +-
 .../persistence/jpa/entity/AnyObjectTest.java   |  10 +
 .../persistence/jpa/entity/AnySearchTest.java   |  24 +-
 .../persistence/jpa/entity/AnyTypeTest.java     |   8 +-
 .../persistence/jpa/entity/PlainSchemaTest.java |   2 +-
 .../persistence/jpa/entity/ResourceTest.java    |   4 +-
 .../core/persistence/jpa/entity/TaskTest.java   |   2 +-
 .../persistence/jpa/relationship/GroupTest.java |  16 +-
 .../jpa/relationship/PlainSchemaTest.java       |  12 +-
 .../persistence/jpa/relationship/RoleTest.java  |   2 +-
 .../src/test/resources/content.xml              |  70 ++-
 .../provisioning/java/ConnectorFacadeProxy.java |  35 +-
 .../provisioning/java/VirAttrHandlerImpl.java   |   2 +-
 .../java/data/AbstractAnyDataBinder.java        |   2 +-
 .../java/data/AnyObjectDataBinderImpl.java      |  16 +
 .../propagation/PropagationManagerImpl.java     |   1 +
 .../provisioning/java/sync/SyncJobImpl.java     |  39 +-
 .../core/provisioning/java/sync/SyncUtils.java  |   6 +-
 .../rest/cxf/service/AbstractAnyService.java    | 290 +++++++++++
 .../rest/cxf/service/AnyObjectServiceImpl.java  |  71 +++
 .../rest/cxf/service/ConnectorServiceImpl.java  |  12 +-
 .../core/rest/cxf/service/GroupServiceImpl.java | 205 +-------
 .../core/rest/cxf/service/UserServiceImpl.java  | 259 +---------
 .../core/logic/init/CamelRouteLoader.java       |   4 +
 .../CamelAnyObjectProvisioningManager.java      | 163 +++++++
 .../processor/AnyObjectCreateProcessor.java     |  71 +++
 .../processor/AnyObjectDeleteProcessor.java     |  83 ++++
 .../AnyObjectDeprovisionProcessor.java          |  78 +++
 .../processor/AnyObjectUpdateProcessor.java     |  90 ++++
 .../src/main/resources/anyObjectRoutes.xml      | 121 +++++
 .../src/main/resources/provisioning.properties  |   2 +-
 .../main/resources/provisioningCamelContext.xml |   6 +-
 fit/build-tools/pom.xml                         |  10 +-
 .../fit/buildtools/ConnIdStartStopListener.java |   3 +-
 .../src/main/resources/buildToolsContext.xml    |   7 +-
 fit/build-tools/src/main/resources/testdb.sql   |   8 +-
 .../src/main/resources/connid.properties        |   2 +-
 .../resources/scriptedsql/CreateScript.groovy   |  52 ++
 .../resources/scriptedsql/DeleteScript.groovy   |  43 ++
 .../resources/scriptedsql/SchemaScript.groovy   |  50 ++
 .../resources/scriptedsql/SearchScript.groovy   |  94 ++++
 .../resources/scriptedsql/SyncScript.groovy     |  98 ++++
 .../resources/scriptedsql/TestScript.groovy     |  31 ++
 .../resources/scriptedsql/UpdateScript.groovy   |  67 +++
 .../fit/core/reference/AbstractITCase.java      |  35 +-
 .../fit/core/reference/AnyObjectITCase.java     | 126 +++++
 .../fit/core/reference/AnyTypeClassITCase.java  | 117 +++++
 .../fit/core/reference/AnyTypeITCase.java       | 169 +++++++
 .../fit/core/reference/ConnectorITCase.java     |  15 +-
 .../syncope/fit/core/reference/GroupITCase.java |  24 +-
 .../fit/core/reference/SearchITCase.java        |  93 ++--
 .../fit/core/reference/SyncTaskITCase.java      |  45 ++
 .../syncope/fit/core/reference/UserITCase.java  |   4 +-
 pom.xml                                         |  11 +-
 111 files changed, 3166 insertions(+), 2051 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/a45a46bb/client/console/src/main/java/org/apache/syncope/client/console/commons/AnyDataProvider.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/commons/AnyDataProvider.java b/client/console/src/main/java/org/apache/syncope/client/console/commons/AnyDataProvider.java
new file mode 100644
index 0000000..bd4183b
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/commons/AnyDataProvider.java
@@ -0,0 +1,101 @@
+/*
+ * 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.client.console.commons;
+
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import org.apache.syncope.client.console.rest.AbstractAnyRestClient;
+import org.apache.syncope.common.lib.to.AnyTO;
+import org.apache.wicket.extensions.markup.html.repeater.data.sort.SortOrder;
+import org.apache.wicket.extensions.markup.html.repeater.util.SortableDataProvider;
+import org.apache.wicket.model.CompoundPropertyModel;
+import org.apache.wicket.model.IModel;
+
+public class AnyDataProvider extends SortableDataProvider<AnyTO, String> {
+
+    private static final long serialVersionUID = 6267494272884913376L;
+
+    private final SortableAnyProviderComparator comparator;
+
+    private String fiql = null;
+
+    private final int paginatorRows;
+
+    private final boolean filtered;
+
+    private final AbstractAnyRestClient restClient;
+
+    private final String realm = "/";
+
+    public AnyDataProvider(final AbstractAnyRestClient restClient, final int paginatorRows, final boolean filtered) {
+        super();
+
+        this.restClient = restClient;
+        this.filtered = filtered;
+        this.paginatorRows = paginatorRows;
+
+        // default sorting
+        setSort("key", SortOrder.ASCENDING);
+
+        this.comparator = new SortableAnyProviderComparator(this);
+    }
+
+    public void setFIQL(final String fiql) {
+        this.fiql = fiql;
+    }
+
+    @Override
+    public Iterator<? extends AnyTO> iterator(final long first, final long count) {
+        List<? extends AnyTO> result;
+
+        final int page = ((int) first / paginatorRows);
+
+        if (filtered) {
+            result = fiql == null
+                    ? Collections.<AnyTO>emptyList()
+                    : restClient.search(realm, fiql, (page < 0 ? 0 : page) + 1, paginatorRows, getSort());
+        } else {
+            result = restClient.list(realm, (page < 0 ? 0 : page) + 1, paginatorRows, getSort());
+        }
+
+        Collections.sort(result, comparator);
+        return result.iterator();
+    }
+
+    @Override
+    public long size() {
+        long result;
+
+        if (filtered) {
+            result = fiql == null
+                    ? 0
+                    : restClient.searchCount(realm, fiql);
+        } else {
+            result = restClient.count(realm);
+        }
+
+        return result;
+    }
+
+    @Override
+    public IModel<AnyTO> model(final AnyTO object) {
+        return new CompoundPropertyModel<>(object);
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/a45a46bb/client/console/src/main/java/org/apache/syncope/client/console/commons/AttributableDataProvider.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/commons/AttributableDataProvider.java b/client/console/src/main/java/org/apache/syncope/client/console/commons/AttributableDataProvider.java
deleted file mode 100644
index 1890a80..0000000
--- a/client/console/src/main/java/org/apache/syncope/client/console/commons/AttributableDataProvider.java
+++ /dev/null
@@ -1,103 +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.client.console.commons;
-
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import org.apache.syncope.client.console.rest.AbstractSubjectRestClient;
-import org.apache.syncope.common.lib.to.AbstractAttributableTO;
-import org.apache.wicket.extensions.markup.html.repeater.data.sort.SortOrder;
-import org.apache.wicket.extensions.markup.html.repeater.util.SortableDataProvider;
-import org.apache.wicket.model.CompoundPropertyModel;
-import org.apache.wicket.model.IModel;
-
-public class AttributableDataProvider extends SortableDataProvider<AbstractAttributableTO, String> {
-
-    private static final long serialVersionUID = 6267494272884913376L;
-
-    private final SortableAttributableProviderComparator comparator;
-
-    private String fiql = null;
-
-    private final int paginatorRows;
-
-    private final boolean filtered;
-
-    private final AbstractSubjectRestClient restClient;
-
-    private final String realm = "/";
-
-    public AttributableDataProvider(final AbstractSubjectRestClient restClient,
-            final int paginatorRows, final boolean filtered) {
-
-        super();
-
-        this.restClient = restClient;
-        this.filtered = filtered;
-        this.paginatorRows = paginatorRows;
-
-        // default sorting
-        setSort("key", SortOrder.ASCENDING);
-
-        this.comparator = new SortableAttributableProviderComparator(this);
-    }
-
-    public void setFIQL(final String fiql) {
-        this.fiql = fiql;
-    }
-
-    @Override
-    public Iterator<? extends AbstractAttributableTO> iterator(final long first, final long count) {
-        List<? extends AbstractAttributableTO> result;
-
-        final int page = ((int) first / paginatorRows);
-
-        if (filtered) {
-            result = fiql == null
-                    ? Collections.<AbstractAttributableTO>emptyList()
-                    : restClient.search(realm, fiql, (page < 0 ? 0 : page) + 1, paginatorRows, getSort());
-        } else {
-            result = restClient.list(realm, (page < 0 ? 0 : page) + 1, paginatorRows, getSort());
-        }
-
-        Collections.sort(result, comparator);
-        return result.iterator();
-    }
-
-    @Override
-    public long size() {
-        long result;
-
-        if (filtered) {
-            result = fiql == null
-                    ? 0
-                    : restClient.searchCount(realm, fiql);
-        } else {
-            result = restClient.count(realm);
-        }
-
-        return result;
-    }
-
-    @Override
-    public IModel<AbstractAttributableTO> model(final AbstractAttributableTO object) {
-        return new CompoundPropertyModel<>(object);
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/a45a46bb/client/console/src/main/java/org/apache/syncope/client/console/pages/BulkActionModalPage.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/BulkActionModalPage.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/BulkActionModalPage.java
index 65dfa58..5567094 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/BulkActionModalPage.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/BulkActionModalPage.java
@@ -53,7 +53,7 @@ public class BulkActionModalPage<T, S> extends BaseModalPage {
             final List<IColumn<T, S>> columns,
             final Collection<ActionLink.ActionType> actions,
             final BaseRestClient bulkActionExecutor,
-            final String idFieldName,
+            final String keyFieldName,
             final String pageId) {
 
         super();
@@ -92,9 +92,9 @@ public class BulkActionModalPage<T, S> extends BaseModalPage {
             final BulkAction bulkAction = new BulkAction();
             for (T item : items) {
                 try {
-                    bulkAction.getTargets().add(getTargetId(item, idFieldName).toString());
+                    bulkAction.getTargets().add(getTargetId(item, keyFieldName).toString());
                 } catch (IllegalAccessException | InvocationTargetException e) {
-                    LOG.error("Error retrieving item id {}", idFieldName, e);
+                    LOG.error("Error retrieving item id {}", keyFieldName, e);
                 }
             }
 
@@ -128,7 +128,7 @@ public class BulkActionModalPage<T, S> extends BaseModalPage {
                         final BulkActionResult res = (BulkActionResult) bulkActionExecutor.getClass().
                                 getMethod("bulkAction", BulkAction.class).invoke(bulkActionExecutor, bulkAction);
 
-                        setResponsePage(new BulkActionResultModalPage<>(window, items, columns, res, idFieldName));
+                        setResponsePage(new BulkActionResultModalPage<>(window, items, columns, res, keyFieldName));
                     } catch (NoSuchMethodException | SecurityException | IllegalAccessException 
                             | IllegalArgumentException | InvocationTargetException e) {
                         error(getString(Constants.ERROR)

http://git-wip-us.apache.org/repos/asf/syncope/blob/a45a46bb/client/console/src/main/java/org/apache/syncope/client/console/pages/BulkActionResultModalPage.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/BulkActionResultModalPage.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/BulkActionResultModalPage.java
index 72a789f..98ac15c 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/BulkActionResultModalPage.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/BulkActionResultModalPage.java
@@ -36,14 +36,12 @@ import org.apache.wicket.model.IModel;
 
 /**
  * Show user or group status after performing a successful operation.
+ *
  * @param <T>
  * @param <S>
  */
 public class BulkActionResultModalPage<T, S> extends BaseModalPage {
 
-    /**
-     * Serial version id.
-     */
     private static final long serialVersionUID = 2646115294319713724L;
 
     public BulkActionResultModalPage(
@@ -51,12 +49,12 @@ public class BulkActionResultModalPage<T, S> extends BaseModalPage {
             final Collection<T> items,
             final List<IColumn<T, S>> columns,
             final BulkActionResult results,
-            final String idFieldName) {
+            final String keyFieldName) {
 
         super();
 
         final List<IColumn<T, S>> newColumnList = new ArrayList<>(columns.subList(1, columns.size() - 1));
-        newColumnList.add(newColumnList.size(), new ActionResultColumn<T, S>(results, idFieldName));
+        newColumnList.add(newColumnList.size(), new ActionResultColumn<T, S>(results, keyFieldName));
 
         final SortableDataProvider<T, S> dataProvider = new SortableDataProvider<T, S>() {
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/a45a46bb/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 af1d0b5..6f56bbb 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
@@ -31,15 +31,13 @@ import org.apache.syncope.client.console.commons.status.StatusUtils;
 import org.apache.syncope.client.console.panels.ActionDataTablePanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
 import org.apache.syncope.client.lib.SyncopeClient;
-import org.apache.syncope.common.lib.to.AbstractAttributableTO;
-import org.apache.syncope.common.lib.to.AbstractSubjectTO;
+import org.apache.syncope.common.lib.to.AnyTO;
 import org.apache.syncope.common.lib.to.BulkActionResult;
 import org.apache.syncope.common.lib.to.ResourceTO;
-import org.apache.syncope.common.lib.to.GroupTO;
-import org.apache.syncope.common.lib.to.UserTO;
+import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.ResourceDeassociationActionType;
 import org.apache.syncope.common.lib.wrap.AbstractWrappable;
-import org.apache.syncope.common.lib.wrap.SubjectKey;
+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;
@@ -54,7 +52,7 @@ import org.apache.wicket.markup.repeater.Item;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.StringResourceModel;
 
-public class ProvisioningModalPage<T extends AbstractAttributableTO> extends AbstractStatusModalPage {
+public class ProvisioningModalPage<T extends AnyTO> extends AbstractStatusModalPage {
 
     private static final long serialVersionUID = -4285220460543213901L;
 
@@ -62,7 +60,7 @@ public class ProvisioningModalPage<T extends AbstractAttributableTO> extends Abs
 
     private final ResourceTO resourceTO;
 
-    private final Class<? extends AbstractAttributableTO> typeRef;
+    private final AnyTypeKind anyTypeKind;
 
     private final PageReference pageRef;
 
@@ -76,16 +74,16 @@ public class ProvisioningModalPage<T extends AbstractAttributableTO> extends Abs
             final PageReference pageRef,
             final ModalWindow window,
             final ResourceTO resourceTO,
-            final Class<T> typeRef) {
+            final AnyTypeKind anyTypeKind) {
 
         super();
 
         this.pageRef = pageRef;
         this.window = window;
         this.resourceTO = resourceTO;
-        this.typeRef = typeRef;
+        this.anyTypeKind = anyTypeKind;
 
-        statusUtils = new StatusUtils((UserTO.class.isAssignableFrom(typeRef) ? userRestClient : groupRestClient));
+        statusUtils = new StatusUtils(anyTypeKind == AnyTypeKind.USER ? userRestClient : groupRestClient);
 
         add(new Label("displayName", StringUtils.EMPTY));
 
@@ -100,8 +98,8 @@ public class ProvisioningModalPage<T extends AbstractAttributableTO> extends Abs
                 new StringResourceModel("resourceName", this, null, "Resource name"),
                 "resourceName", "resourceName"));
         columns.add(new PropertyColumn<StatusBean, String>(
-                new StringResourceModel("accountLink", this, null, "Account link"),
-                "accountLink", "accountLink"));
+                new StringResourceModel("connObjectLink", this, null, "ConnObjectLink"),
+                "connObjectLink", "connObjectLink"));
         columns.add(new AbstractColumn<StatusBean, String>(
                 new StringResourceModel("status", this, null, "")) {
 
@@ -198,7 +196,7 @@ public class ProvisioningModalPage<T extends AbstractAttributableTO> extends Abs
             final String fiql = SyncopeClient.getUserSearchConditionBuilder().hasResources(resourceTO.getKey()).query();
 
             final List<T> subjects = new ArrayList<>();
-            if (UserTO.class.isAssignableFrom(typeRef)) {
+            if (anyTypeKind == AnyTypeKind.USER) {
                 subjects.addAll((List<T>) userRestClient.search(
                         realm, fiql, 1, ROWS_PER_PAGE, new SortParam<>("key", true)));
             } else {
@@ -207,16 +205,16 @@ public class ProvisioningModalPage<T extends AbstractAttributableTO> extends Abs
             }
 
             final List<ConnObjectWrapper> connObjects = statusUtils.getConnectorObjects(
-                    (List<AbstractSubjectTO>) subjects, Collections.<String>singleton(resourceTO.getKey()));
+                    (List<AnyTO>) subjects, Collections.<String>singleton(resourceTO.getKey()));
 
             final List<StatusBean> statusBeans = new ArrayList<>(connObjects.size() + 1);
             final LinkedHashMap<String, StatusBean> initialStatusBeanMap = new LinkedHashMap<>(connObjects.size());
 
             for (ConnObjectWrapper entry : connObjects) {
-                final StatusBean statusBean = statusUtils.getStatusBean(entry.getAttributable(),
+                StatusBean statusBean = statusUtils.getStatusBean(entry.getAny(),
                         entry.getResourceName(),
                         entry.getConnObjectTO(),
-                        GroupTO.class.isAssignableFrom(typeRef));
+                        anyTypeKind == AnyTypeKind.GROUP);
 
                 initialStatusBeanMap.put(entry.getResourceName(), statusBean);
                 statusBeans.add(statusBean);
@@ -233,21 +231,21 @@ public class ProvisioningModalPage<T extends AbstractAttributableTO> extends Abs
             final List<IColumn<StatusBean, String>> columns) {
 
         final List<StatusBean> beans = new ArrayList<>(table.getModelObject());
-        List<SubjectKey> subjectKeys = new ArrayList<>();
+        List<AnyKey> subjectKeys = new ArrayList<>();
         for (StatusBean bean : beans) {
             LOG.debug("Selected bean {}", bean);
-            subjectKeys.add(AbstractWrappable.getInstance(SubjectKey.class, bean.getAttributableId()));
+            subjectKeys.add(AbstractWrappable.getInstance(AnyKey.class, bean.getAnyKey()));
         }
 
         if (beans.isEmpty()) {
             window.close(target);
         } else {
             final BulkActionResult res = resourceRestClient.bulkAssociationAction(
-                    resourceTO.getKey(), typeRef, type, subjectKeys);
+                    resourceTO.getKey(), anyTypeKind.name(), type, subjectKeys);
 
             ((BasePage) pageRef.getPage()).setModalResult(true);
 
-            setResponsePage(new BulkActionResultModalPage<>(window, beans, columns, res, "attributableKey"));
+            setResponsePage(new BulkActionResultModalPage<>(window, beans, columns, res, "anyKey"));
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/a45a46bb/client/console/src/main/java/org/apache/syncope/client/console/pages/ResourceModalPage.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/ResourceModalPage.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/ResourceModalPage.java
index aa9dbfc..e578255 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/ResourceModalPage.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/ResourceModalPage.java
@@ -18,6 +18,8 @@
  */
 package org.apache.syncope.client.console.pages;
 
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.Predicate;
 import org.apache.syncope.client.console.commons.Constants;
 import org.apache.syncope.client.console.panels.AnnotatedBeanPanel;
 import org.apache.syncope.client.console.panels.ResourceConnConfPanel;
@@ -25,8 +27,9 @@ import org.apache.syncope.client.console.panels.ResourceDetailsPanel;
 import org.apache.syncope.client.console.panels.ResourceMappingPanel;
 import org.apache.syncope.client.console.panels.ResourceSecurityPanel;
 import org.apache.syncope.common.lib.to.MappingItemTO;
+import org.apache.syncope.common.lib.to.ProvisionTO;
 import org.apache.syncope.common.lib.to.ResourceTO;
-import org.apache.syncope.common.lib.types.AttributableType;
+import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.Entitlement;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
@@ -66,8 +69,8 @@ public class ResourceModalPage extends BaseModalPage {
         //--------------------------------
         // Resource mapping panels
         //--------------------------------
-        form.add(new ResourceMappingPanel("umapping", resourceTO, AttributableType.USER));
-        form.add(new ResourceMappingPanel("gmapping", resourceTO, AttributableType.GROUP));
+        form.add(new ResourceMappingPanel("umapping", resourceTO, AnyTypeKind.USER));
+        form.add(new ResourceMappingPanel("gmapping", resourceTO, AnyTypeKind.GROUP));
         //--------------------------------
 
         //--------------------------------
@@ -84,7 +87,7 @@ public class ResourceModalPage extends BaseModalPage {
         form.add(new ResourceSecurityPanel("security", resourceTO));
         //--------------------------------
 
-        final AjaxButton submit = new IndicatingAjaxButton(APPLY, new ResourceModel(SUBMIT, SUBMIT)) {
+        AjaxButton submit = new IndicatingAjaxButton(APPLY, new ResourceModel(SUBMIT, SUBMIT)) {
 
             private static final long serialVersionUID = -958724007591692537L;
 
@@ -92,34 +95,29 @@ public class ResourceModalPage extends BaseModalPage {
             protected void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
                 final ResourceTO resourceTO = (ResourceTO) form.getDefaultModelObject();
 
-                boolean accountIdError = false;
+                boolean connObjectKeyError = false;
 
-                if (resourceTO.getUmapping() == null || resourceTO.getUmapping().getItems().isEmpty()) {
-                    resourceTO.setUmapping(null);
-                } else {
-                    int uAccountIdCount = 0;
-                    for (MappingItemTO item : resourceTO.getUmapping().getItems()) {
-                        if (item.isAccountid()) {
-                            uAccountIdCount++;
-                        }
-                    }
-                    accountIdError = uAccountIdCount != 1;
-                }
+                for (ProvisionTO provision : resourceTO.getProvisions()) {
+                    if (provision != null) {
+                        if (provision.getMapping() == null || provision.getMapping().getItems().isEmpty()) {
+                            resourceTO.getProvisions().remove(provision);
+                        } else {
+                            int uConnObjectKeyCount = CollectionUtils.countMatches(
+                                    provision.getMapping().getItems(), new Predicate<MappingItemTO>() {
 
-                if (resourceTO.getGmapping() == null || resourceTO.getGmapping().getItems().isEmpty()) {
-                    resourceTO.setGmapping(null);
-                } else {
-                    int rAccountIdCount = 0;
-                    for (MappingItemTO item : resourceTO.getGmapping().getItems()) {
-                        if (item.isAccountid()) {
-                            rAccountIdCount++;
+                                        @Override
+                                        public boolean evaluate(final MappingItemTO item) {
+                                            return item.isConnObjectKey();
+                                        }
+                                    });
+
+                            connObjectKeyError = uConnObjectKeyCount != 1;
                         }
                     }
-                    accountIdError |= rAccountIdCount != 1;
                 }
 
-                if (accountIdError) {
-                    error(getString("accountIdValidation"));
+                if (connObjectKeyError) {
+                    error(getString("connObjectKeyValidation"));
                     feedbackPanel.refresh(target);
                 } else {
                     try {
@@ -142,6 +140,7 @@ public class ResourceModalPage extends BaseModalPage {
             }
 
             @Override
+
             protected void onError(final AjaxRequestTarget target, final Form<?> form) {
                 feedbackPanel.refresh(target);
             }
@@ -171,6 +170,7 @@ public class ResourceModalPage extends BaseModalPage {
 
         MetaDataRoleAuthorizationStrategy.authorize(
                 submit, ENABLE, createFlag ? Entitlement.RESOURCE_CREATE : Entitlement.RESOURCE_UPDATE);
+
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/syncope/blob/a45a46bb/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractSearchResultPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractSearchResultPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractSearchResultPanel.java
index 0af8a0b..20f62d5 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractSearchResultPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractSearchResultPanel.java
@@ -21,12 +21,12 @@ package org.apache.syncope.client.console.panels;
 import java.util.Collection;
 import java.util.List;
 import org.apache.syncope.client.console.PreferenceManager;
-import org.apache.syncope.client.console.commons.AttributableDataProvider;
+import org.apache.syncope.client.console.commons.AnyDataProvider;
 import org.apache.syncope.client.console.commons.Constants;
 import org.apache.syncope.client.console.pages.AbstractBasePage;
-import org.apache.syncope.client.console.rest.AbstractSubjectRestClient;
+import org.apache.syncope.client.console.rest.AbstractAnyRestClient;
 import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
-import org.apache.syncope.common.lib.to.AbstractAttributableTO;
+import org.apache.syncope.common.lib.to.AnyTO;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
@@ -89,7 +89,7 @@ public abstract class AbstractSearchResultPanel extends Panel implements IEventS
     @SpringBean
     protected PreferenceManager prefMan;
 
-    protected final AbstractSubjectRestClient restClient;
+    protected final AbstractAnyRestClient restClient;
 
     /**
      * Number of rows per page.
@@ -120,12 +120,12 @@ public abstract class AbstractSearchResultPanel extends Panel implements IEventS
     /**
      * Result table.
      */
-    private AjaxDataTablePanel<AbstractAttributableTO, String> resultTable;
+    private AjaxDataTablePanel<AnyTO, String> resultTable;
 
     /**
      * Data provider used to search for users.
      */
-    private AttributableDataProvider dataProvider;
+    private AnyDataProvider dataProvider;
 
     /**
      * Modal window to be used for user profile editing. Global visibility is required ...
@@ -147,8 +147,8 @@ public abstract class AbstractSearchResultPanel extends Panel implements IEventS
      */
     protected final AbstractBasePage page;
 
-    protected <T extends AbstractAttributableTO> AbstractSearchResultPanel(final String id, final boolean filtered,
-            final String fiql, final PageReference pageRef, final AbstractSubjectRestClient restClient) {
+    protected <T extends AnyTO> AbstractSearchResultPanel(final String id, final boolean filtered,
+            final String fiql, final PageReference pageRef, final AbstractAnyRestClient restClient) {
 
         super(id);
 
@@ -238,7 +238,7 @@ public abstract class AbstractSearchResultPanel extends Panel implements IEventS
     }
 
     private void updateResultTable(final boolean create, final int rows) {
-        dataProvider = new AttributableDataProvider(restClient, rows, filtered);
+        dataProvider = new AnyDataProvider(restClient, rows, filtered);
         dataProvider.setFIQL(fiql);
 
         final int currentPage = resultTable != null
@@ -265,7 +265,7 @@ public abstract class AbstractSearchResultPanel extends Panel implements IEventS
         container.addOrReplace(resultTable);
     }
 
-    protected abstract List<IColumn<AbstractAttributableTO, String>> getColumns();
+    protected abstract List<IColumn<AnyTO, String>> getColumns();
 
     @Override
     public void onEvent(final IEvent<?> event) {
@@ -340,7 +340,7 @@ public abstract class AbstractSearchResultPanel extends Panel implements IEventS
         }
     }
 
-    protected abstract <T extends AbstractAttributableTO> Collection<ActionLink.ActionType> getBulkActions();
+    protected abstract <T extends AnyTO> Collection<ActionLink.ActionType> getBulkActions();
 
     protected abstract String getPageId();
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/a45a46bb/client/console/src/main/java/org/apache/syncope/client/console/panels/AjaxDataTablePanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AjaxDataTablePanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AjaxDataTablePanel.java
index 563bd17..daaaa23 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AjaxDataTablePanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AjaxDataTablePanel.java
@@ -52,7 +52,7 @@ public class AjaxDataTablePanel<T, S> extends DataTablePanel<T, S> {
             final int rowsPerPage,
             final Collection<ActionLink.ActionType> actions,
             final BaseRestClient bulkActionExecutor,
-            final String itemIdField,
+            final String itemKeyField,
             final String pageId,
             final PageReference pageRef) {
 
@@ -130,7 +130,7 @@ public class AjaxDataTablePanel<T, S> extends DataTablePanel<T, S> {
                                 columns,
                                 actions,
                                 bulkActionExecutor,
-                                itemIdField,
+                                itemKeyField,
                                 pageId);
                     }
                 });

http://git-wip-us.apache.org/repos/asf/syncope/blob/a45a46bb/client/console/src/main/java/org/apache/syncope/client/console/panels/AnnotatedBeanPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnnotatedBeanPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnnotatedBeanPanel.java
index e809263..ab1e7e0 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnnotatedBeanPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnnotatedBeanPanel.java
@@ -20,7 +20,7 @@ package org.apache.syncope.client.console.panels;
 
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.common.lib.to.AbstractAnnotatedBean;
-import org.apache.syncope.common.lib.to.AbstractAttributableTO;
+import org.apache.syncope.common.lib.to.AnyTO;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.model.Model;
@@ -29,7 +29,7 @@ public class AnnotatedBeanPanel extends Panel {
 
     private static final long serialVersionUID = 4228064224811390809L;
 
-    public <T extends AbstractAttributableTO> AnnotatedBeanPanel(
+    public <T extends AnyTO> AnnotatedBeanPanel(
             final String id, final AbstractAnnotatedBean sysInfoTO) {
 
         super(id);

http://git-wip-us.apache.org/repos/asf/syncope/blob/a45a46bb/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 c1d01e0..6f2a17b 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
@@ -57,9 +57,9 @@ public class ResourceConnConfPanel extends Panel {
 
     private List<ConnConfProperty> connConfProperties;
 
-    private WebMarkupContainer connConfPropContainer;
+    private final WebMarkupContainer connConfPropContainer;
 
-    private AjaxButton check;
+    private final AjaxButton check;
 
     public ResourceConnConfPanel(final String id, final ResourceTO resourceTO, final boolean createFlag) {
         super(id);
@@ -103,7 +103,7 @@ public class ResourceConnConfPanel extends Panel {
 
         check.setEnabled(!connConfProperties.isEmpty());
         check.setVisible(!connConfProperties.isEmpty());
-        
+
         connConfPropContainer.add(check);
     }
 
@@ -113,10 +113,10 @@ public class ResourceConnConfPanel extends Panel {
      * @return overridable properties.
      */
     private List<ConnConfProperty> getConnConfProperties() {
-        final List<ConnConfProperty> props = new ArrayList<ConnConfProperty>();
-        final Long connectorId = resourceTO.getConnectorId();
-        if (connectorId != null && connectorId > 0) {
-            for (ConnConfProperty property : restClient.getConnectorProperties(connectorId)) {
+        List<ConnConfProperty> props = new ArrayList<>();
+        Long connectorKey = resourceTO.getConnector();
+        if (connectorKey != null && connectorKey > 0) {
+            for (ConnConfProperty property : restClient.getConnectorProperties(connectorKey)) {
                 if (property.isOverridable()) {
                     props.add(property);
                 }
@@ -125,7 +125,7 @@ public class ResourceConnConfPanel extends Panel {
         if (createFlag || resourceTO.getConnConfProperties().isEmpty()) {
             resourceTO.getConnConfProperties().clear();
         } else {
-            Map<String, ConnConfProperty> valuedProps = new HashMap<String, ConnConfProperty>();
+            Map<String, ConnConfProperty> valuedProps = new HashMap<>();
             for (ConnConfProperty prop : resourceTO.getConnConfProperties()) {
                 valuedProps.put(prop.getSchema().getName(), prop);
             }
@@ -169,7 +169,7 @@ public class ResourceConnConfPanel extends Panel {
      */
     public static class ConnConfModEvent extends ResourceEvent {
 
-        private List<ConnConfProperty> configuration;
+        private final List<ConnConfProperty> configuration;
 
         /**
          * Constructor.

http://git-wip-us.apache.org/repos/asf/syncope/blob/a45a46bb/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceDetailsPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceDetailsPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceDetailsPanel.java
index 3bff23f..3095b4e 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceDetailsPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceDetailsPanel.java
@@ -222,7 +222,7 @@ public class ResourceDetailsPanel extends Panel {
                 new ResourceModel("connector", "connector").getObject(),
                 new PropertyModel<ConnInstanceTO>(this, "connInstanceTO"));
         conn.setChoices(connectors.getObject());
-        conn.setChoiceRenderer(new ChoiceRenderer("displayName", "key"));
+        conn.setChoiceRenderer(new ChoiceRenderer<String>("displayName", "key"));
 
         conn.getField().setModel(new IModel<ConnInstanceTO>() {
 
@@ -235,7 +235,7 @@ public class ResourceDetailsPanel extends Panel {
 
             @Override
             public void setObject(final ConnInstanceTO connector) {
-                resourceTO.setConnectorId(connector.getKey());
+                resourceTO.setConnector(connector.getKey());
                 connInstanceTO = connector;
             }
 
@@ -270,20 +270,20 @@ public class ResourceDetailsPanel extends Panel {
      */
     private ConnInstanceTO getConectorInstanceTO(final List<ConnInstanceTO> connectorTOs, final ResourceTO resourceTO) {
         if (connectorTOs.isEmpty()) {
-            resourceTO.setConnectorId(null);
+            resourceTO.setConnector(null);
             return null;
         } else {
             // use the first element as default
             ConnInstanceTO res = connectorTOs.get(0);
 
             for (ConnInstanceTO to : connectorTOs) {
-                if (Long.valueOf(to.getKey()).equals(resourceTO.getConnectorId())) {
+                if (Long.valueOf(to.getKey()).equals(resourceTO.getConnector())) {
                     res = to;
                 }
             }
 
             // in case of no match
-            resourceTO.setConnectorId(res.getKey());
+            resourceTO.setConnector(res.getKey());
 
             return res;
         }

http://git-wip-us.apache.org/repos/asf/syncope/blob/a45a46bb/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 b00bc1b..17ae3bf 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
@@ -36,12 +36,12 @@ 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;
+import org.apache.syncope.common.lib.to.ProvisionTO;
 import org.apache.syncope.common.lib.to.ResourceTO;
-import org.apache.syncope.common.lib.types.AttributableType;
+import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.ConnConfProperty;
 import org.apache.syncope.common.lib.types.IntMappingType;
 import org.apache.syncope.common.lib.types.MappingPurpose;
@@ -122,37 +122,28 @@ public class ResourceMappingPanel extends Panel {
     /**
      * User / group.
      */
-    private final AttributableType attrType;
+    private final AnyTypeKind anyTypeKind;
 
     /**
      * Mapping container.
      */
     private final WebMarkupContainer mappingContainer;
 
-    /**
-     * AccountLink container.
-     */
-    private final WebMarkupContainer accountLinkContainer;
+    private final WebMarkupContainer connObjectLinkContainer;
 
-    private final AjaxCheckBoxPanel accountLinkCheckbox;
+    private final AjaxCheckBoxPanel connObjectLinkCheckbox;
 
     private MappingTO getMapping() {
-        MappingTO result = null;
-
-        if (AttributableType.USER == this.attrType) {
-            if (this.resourceTO.getUmapping() == null) {
-                this.resourceTO.setUmapping(new MappingTO());
-            }
-            result = this.resourceTO.getUmapping();
+        ProvisionTO provision = resourceTO.getProvision(this.anyTypeKind.name());
+        if (provision == null) {
+            provision = new ProvisionTO();
+            resourceTO.getProvisions().add(provision);
         }
-        if (AttributableType.GROUP == this.attrType) {
-            if (this.resourceTO.getGmapping() == null) {
-                this.resourceTO.setGmapping(new MappingTO());
-            }
-            result = this.resourceTO.getGmapping();
+        if (provision.getMapping() == null) {
+            provision.setMapping(new MappingTO());
         }
 
-        return result;
+        return provision.getMapping();
     }
 
     /**
@@ -160,25 +151,25 @@ public class ResourceMappingPanel extends Panel {
      *
      * @param id panel id
      * @param resourceTO external resource
-     * @param attrType USER / GROUP
+     * @param anyTypeKind USER / GROUP
      */
-    public ResourceMappingPanel(final String id, final ResourceTO resourceTO, final AttributableType attrType) {
+    public ResourceMappingPanel(final String id, final ResourceTO resourceTO, final AnyTypeKind anyTypeKind) {
         super(id);
         setOutputMarkupId(true);
 
         this.resourceTO = resourceTO;
-        this.attrType = attrType;
+        this.anyTypeKind = anyTypeKind;
 
         this.mappingContainer = new WebMarkupContainer("mappingContainer");
         this.mappingContainer.setOutputMarkupId(true);
         add(this.mappingContainer);
 
-        this.accountLinkContainer = new WebMarkupContainer("accountLinkContainer");
-        this.accountLinkContainer.setOutputMarkupId(true);
-        add(this.accountLinkContainer);
+        this.connObjectLinkContainer = new WebMarkupContainer("connObjectLinkContainer");
+        this.connObjectLinkContainer.setOutputMarkupId(true);
+        add(this.connObjectLinkContainer);
 
-        if (this.resourceTO.getConnectorId() != null && this.resourceTO.getConnectorId() > 0) {
-            schemaNames = getSchemaNames(this.resourceTO.getConnectorId(), this.resourceTO.getConnConfProperties());
+        if (this.resourceTO.getConnector() != null && this.resourceTO.getConnector() > 0) {
+            schemaNames = getSchemaNames(this.resourceTO.getConnector(), this.resourceTO.getConnConfProperties());
 
             setEnabled();
         } else {
@@ -193,7 +184,7 @@ public class ResourceMappingPanel extends Panel {
 
         final Label passwordLabel = new Label("passwordLabel", new ResourceModel("password"));
         mappingContainer.add(passwordLabel);
-        if (AttributableType.USER != ResourceMappingPanel.this.attrType) {
+        if (AnyTypeKind.USER != ResourceMappingPanel.this.anyTypeKind) {
             passwordLabel.setVisible(false);
         }
 
@@ -213,8 +204,8 @@ public class ResourceMappingPanel extends Panel {
                 } else if (left.getPurpose() != MappingPurpose.BOTH && right.getPurpose() == MappingPurpose.BOTH) {
                     compared = 1;
                 } else if (left.getPurpose() == MappingPurpose.PROPAGATION
-                        && (right.getPurpose() == MappingPurpose.SYNCHRONIZATION || right.getPurpose()
-                        == MappingPurpose.NONE)) {
+                        && (right.getPurpose() == MappingPurpose.SYNCHRONIZATION
+                        || right.getPurpose() == MappingPurpose.NONE)) {
                     compared = -1;
                 } else if (left.getPurpose() == MappingPurpose.SYNCHRONIZATION
                         && right.getPurpose() == MappingPurpose.PROPAGATION) {
@@ -225,9 +216,9 @@ public class ResourceMappingPanel extends Panel {
                 } else if (left.getPurpose() == MappingPurpose.NONE
                         && right.getPurpose() != MappingPurpose.NONE) {
                     compared = 1;
-                } else if (left.isAccountid()) {
+                } else if (left.isConnObjectKey()) {
                     compared = -1;
-                } else if (right.isAccountid()) {
+                } else if (right.isConnObjectKey()) {
                     compared = 1;
                 } else if (left.isPassword()) {
                     compared = -1;
@@ -251,14 +242,12 @@ public class ResourceMappingPanel extends Panel {
                     mapItem.setPurpose(MappingPurpose.BOTH);
                 }
 
-                AttributableType entity = null;
+                AnyTypeKind entity = null;
                 if (mapItem.getIntMappingType() != null) {
-                    entity = mapItem.getIntMappingType().getAttributableType();
+                    entity = mapItem.getIntMappingType().getAnyTypeKind();
                 }
 
-                final List<IntMappingType> attrTypes = new ArrayList<IntMappingType>(getAttributeTypes(entity));
-
-                item.add(new AjaxDecoratedCheckbox("toRemove", new Model<Boolean>(Boolean.FALSE)) {
+                item.add(new AjaxDecoratedCheckbox("toRemove", new Model<>(Boolean.FALSE)) {
 
                     private static final long serialVersionUID = 7170946748485726506L;
 
@@ -282,7 +271,7 @@ public class ResourceMappingPanel extends Panel {
                     protected void updateAjaxAttributes(final AjaxRequestAttributes attributes) {
                         super.updateAjaxAttributes(attributes);
 
-                        final AjaxCallListener ajaxCallListener = new AjaxCallListener() {
+                        AjaxCallListener ajaxCallListener = new AjaxCallListener() {
 
                             private static final long serialVersionUID = 7160235486520935153L;
 
@@ -296,7 +285,7 @@ public class ResourceMappingPanel extends Panel {
                 });
 
                 final AjaxDropDownChoicePanel<String> intAttrNames =
-                        new AjaxDropDownChoicePanel<String>("intAttrNames", getString("intAttrNames"),
+                        new AjaxDropDownChoicePanel<>("intAttrNames", getString("intAttrNames"),
                                 new PropertyModel<String>(mapItem, "intAttrName"), false);
                 intAttrNames.setChoices(schemaNames);
                 intAttrNames.setRequired(true);
@@ -311,8 +300,9 @@ public class ResourceMappingPanel extends Panel {
                 });
                 item.add(intAttrNames);
 
+                final List<IntMappingType> attrTypes = new ArrayList<>(getAttributeTypes(entity));
                 final AjaxDropDownChoicePanel<IntMappingType> intMappingTypes =
-                        new AjaxDropDownChoicePanel<IntMappingType>("intMappingTypes",
+                        new AjaxDropDownChoicePanel<>("intMappingTypes",
                                 new ResourceModel("intMappingTypes", "intMappingTypes").getObject(),
                                 new PropertyModel<IntMappingType>(mapItem, "intMappingType"));
                 intMappingTypes.setRequired(true);
@@ -320,13 +310,13 @@ public class ResourceMappingPanel extends Panel {
                 intMappingTypes.setStyleSheet(FIELD_STYLE);
                 item.add(intMappingTypes);
 
-                final AjaxDropDownChoicePanel<AttributableType> entitiesPanel =
-                        new AjaxDropDownChoicePanel<AttributableType>("entities",
-                                new ResourceModel("entities", "entities").getObject(), new Model<AttributableType>(
-                                        entity));
-                entitiesPanel.setChoices(attrType == AttributableType.GROUP
-                        ? Collections.<AttributableType>singletonList(AttributableType.GROUP)
-                        : Arrays.asList(AttributableType.values()));
+                final AjaxDropDownChoicePanel<AnyTypeKind> entitiesPanel =
+                        new AjaxDropDownChoicePanel<>("entities",
+                                new ResourceModel("entities", "entities").getObject(),
+                                new Model<>(entity));
+                entitiesPanel.setChoices(anyTypeKind == AnyTypeKind.GROUP
+                        ? Collections.<AnyTypeKind>singletonList(AnyTypeKind.GROUP)
+                        : Arrays.asList(AnyTypeKind.values()));
                 entitiesPanel.setStyleSheet(DEF_FIELD_STYLE);
                 entitiesPanel.getField().add(new AjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
 
@@ -369,16 +359,16 @@ public class ResourceMappingPanel extends Panel {
                 mandatory.setStyleSheet(SHORT_FIELD_STYLE);
                 item.add(mandatory);
 
-                final AjaxCheckBoxPanel accountId = new AjaxCheckBoxPanel("accountId",
-                        new ResourceModel("accountId", "accountId").getObject(),
-                        new PropertyModel<Boolean>(mapItem, "accountid"));
-                accountId.getField().add(new AjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
+                final AjaxCheckBoxPanel connObjectKey = new AjaxCheckBoxPanel("connObjectKey",
+                        new ResourceModel("connObjectKey", "connObjectKey").getObject(),
+                        new PropertyModel<Boolean>(mapItem, "connObjectKey"));
+                connObjectKey.getField().add(new AjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
 
                     private static final long serialVersionUID = -1107858522700306810L;
 
                     @Override
                     protected void onUpdate(final AjaxRequestTarget target) {
-                        if (accountId.getModelObject()) {
+                        if (connObjectKey.getModelObject()) {
                             mapItem.setMandatoryCondition("true");
                             mandatory.setEnabled(false);
                         } else {
@@ -388,7 +378,7 @@ public class ResourceMappingPanel extends Panel {
                         target.add(mandatory);
                     }
                 });
-                item.add(accountId);
+                item.add(connObjectKey);
 
                 final AjaxCheckBoxPanel password = new AjaxCheckBoxPanel("password",
                         new ResourceModel("password", "password").getObject(),
@@ -399,17 +389,17 @@ public class ResourceMappingPanel extends Panel {
 
                     @Override
                     protected void onUpdate(final AjaxRequestTarget target) {
-                        extAttrNames.setEnabled(!mapItem.isAccountid() && !password.getModelObject());
+                        extAttrNames.setEnabled(!mapItem.isConnObjectKey() && !password.getModelObject());
                         extAttrNames.setModelObject(null);
                         extAttrNames.setRequired(!password.getModelObject());
                         target.add(extAttrNames);
 
-                        setAccountId(intMappingTypes.getModelObject(), accountId, password);
-                        target.add(accountId);
+                        setConnObjectKey(intMappingTypes.getModelObject(), connObjectKey, password);
+                        target.add(connObjectKey);
                     }
                 });
                 item.add(password);
-                if (AttributableType.USER != ResourceMappingPanel.this.attrType) {
+                if (AnyTypeKind.USER != ResourceMappingPanel.this.anyTypeKind) {
                     password.setVisible(false);
                 }
 
@@ -432,13 +422,13 @@ public class ResourceMappingPanel extends Panel {
                         setAttrNames(intMappingTypes.getModelObject(), intAttrNames);
                         target.add(intAttrNames);
 
-                        setAccountId(intMappingTypes.getModelObject(), accountId, password);
-                        target.add(accountId);
+                        setConnObjectKey(intMappingTypes.getModelObject(), connObjectKey, password);
+                        target.add(connObjectKey);
                     }
                 });
 
                 setAttrNames(mapItem.getIntMappingType(), intAttrNames);
-                setAccountId(mapItem.getIntMappingType(), accountId, password);
+                setConnObjectKey(mapItem.getIntMappingType(), connObjectKey, password);
             }
         };
 
@@ -456,41 +446,41 @@ public class ResourceMappingPanel extends Panel {
             }
         };
         addMappingBtn.setDefaultFormProcessing(false);
-        addMappingBtn.setEnabled(this.resourceTO.getConnectorId() != null && this.resourceTO.getConnectorId() > 0);
+        addMappingBtn.setEnabled(this.resourceTO.getConnector() != null && this.resourceTO.getConnector() > 0);
         mappingContainer.add(addMappingBtn);
 
-        boolean accountLinkEnabled = false;
-        if (getMapping().getAccountLink() != null) {
-            accountLinkEnabled = true;
+        boolean connObjectLinkEnabled = false;
+        if (getMapping().getConnObjectLink() != null) {
+            connObjectLinkEnabled = true;
         }
-        accountLinkCheckbox = new AjaxCheckBoxPanel("accountLinkCheckbox",
-                new ResourceModel("accountLinkCheckbox", "accountLinkCheckbox").getObject(),
-                new Model<Boolean>(Boolean.valueOf(accountLinkEnabled)));
-        accountLinkCheckbox.setEnabled(true);
+        connObjectLinkCheckbox = new AjaxCheckBoxPanel("connObjectLinkCheckbox",
+                new ResourceModel("connObjectLinkCheckbox", "connObjectLinkCheckbox").getObject(),
+                new Model<>(connObjectLinkEnabled));
+        connObjectLinkCheckbox.setEnabled(true);
 
-        accountLinkContainer.add(accountLinkCheckbox);
+        connObjectLinkContainer.add(connObjectLinkCheckbox);
 
-        final AjaxTextFieldPanel accountLink = new AjaxTextFieldPanel("accountLink",
-                new ResourceModel("accountLink", "accountLink").getObject(),
-                new PropertyModel<String>(getMapping(), "accountLink"));
-        accountLink.setEnabled(accountLinkEnabled);
-        accountLinkContainer.add(accountLink);
+        final AjaxTextFieldPanel connObjectLink = new AjaxTextFieldPanel("connObjectLink",
+                new ResourceModel("connObjectLink", "connObjectLink").getObject(),
+                new PropertyModel<String>(getMapping(), "connObjectLink"));
+        connObjectLink.setEnabled(connObjectLinkEnabled);
+        connObjectLinkContainer.add(connObjectLink);
 
-        accountLinkCheckbox.getField().add(new AjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
+        connObjectLinkCheckbox.getField().add(new AjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
 
             private static final long serialVersionUID = -1107858522700306810L;
 
             @Override
             protected void onUpdate(final AjaxRequestTarget target) {
-                if (accountLinkCheckbox.getModelObject()) {
-                    accountLink.setEnabled(Boolean.TRUE);
-                    accountLink.setModelObject("");
+                if (connObjectLinkCheckbox.getModelObject()) {
+                    connObjectLink.setEnabled(Boolean.TRUE);
+                    connObjectLink.setModelObject("");
                 } else {
-                    accountLink.setEnabled(Boolean.FALSE);
-                    accountLink.setModelObject("");
+                    connObjectLink.setEnabled(Boolean.FALSE);
+                    connObjectLink.setModelObject("");
                 }
 
-                target.add(accountLink);
+                target.add(connObjectLink);
             }
         });
     }
@@ -504,25 +494,22 @@ public class ResourceMappingPanel extends Panel {
     }
 
     private void setEnabled() {
-        final ConnInstanceTO connInstanceTO = new ConnInstanceTO();
-        connInstanceTO.setKey(this.resourceTO.getConnectorId());
+        ConnInstanceTO connInstanceTO = new ConnInstanceTO();
+        connInstanceTO.setKey(this.resourceTO.getConnector());
         connInstanceTO.getConfiguration().addAll(this.resourceTO.getConnConfProperties());
 
-        List<ConnIdObjectClassTO> objectClasses = connRestClient.getSupportedObjectClasses(connInstanceTO);
+        boolean enabled = resourceTO.getProvision(anyTypeKind.name()) != null;
 
-        boolean enabled = objectClasses.isEmpty()
-                || (AttributableType.USER == attrType && objectClasses.contains(ConnIdObjectClassTO.ACCOUNT))
-                || (AttributableType.GROUP == attrType && objectClasses.contains(ConnIdObjectClassTO.GROUP));
         this.mappingContainer.setEnabled(enabled);
         this.mappingContainer.setVisible(enabled);
-        this.accountLinkContainer.setEnabled(enabled);
-        this.accountLinkContainer.setVisible(enabled);
+        this.connObjectLinkContainer.setEnabled(enabled);
+        this.connObjectLinkContainer.setVisible(enabled);
 
         if (!enabled) {
             getMapping().getItems().clear();
-            getMapping().setAccountLink(null);
-            if (this.accountLinkCheckbox != null) {
-                this.accountLinkCheckbox.setModelObject(null);
+            getMapping().setConnObjectLink(null);
+            if (this.connObjectLinkCheckbox != null) {
+                this.connObjectLinkCheckbox.setModelObject(null);
             }
         }
     }
@@ -536,10 +523,10 @@ public class ResourceMappingPanel extends Panel {
 
             mappings.removeAll();
 
-            addMappingBtn.setEnabled(resourceTO.getConnectorId() != null && resourceTO.getConnectorId() > 0);
+            addMappingBtn.setEnabled(resourceTO.getConnector() != null && resourceTO.getConnector() > 0);
 
             schemaNames.clear();
-            schemaNames.addAll(getSchemaNames(resourceTO.getConnectorId(), new HashSet<ConnConfProperty>(conf)));
+            schemaNames.addAll(getSchemaNames(resourceTO.getConnector(), new HashSet<ConnConfProperty>(conf)));
 
             setEnabled();
 
@@ -557,34 +544,35 @@ public class ResourceMappingPanel extends Panel {
         toBeUpdated.setRequired(true);
         toBeUpdated.setEnabled(true);
 
-        if (type == null || type.getAttributableType() == null) {
+        if (type == null || type.getAnyTypeKind() == null) {
             toBeUpdated.setChoices(Collections.<String>emptyList());
         } else {
             switch (type) {
                 // user attribute names
                 case UserPlainSchema:
                 case GroupPlainSchema:
-                case MembershipPlainSchema:
-                    toBeUpdated.setChoices(schemaRestClient.getPlainSchemaNames(type.getAttributableType()));
+                case AnyObjectPlainSchema:
+                    toBeUpdated.setChoices(schemaRestClient.getPlainSchemaNames());
                     break;
 
                 case UserDerivedSchema:
                 case GroupDerivedSchema:
-                case MembershipDerivedSchema:
-                    toBeUpdated.setChoices(schemaRestClient.getDerSchemaNames(type.getAttributableType()));
+                case AnyObjectDerivedSchema:
+                    toBeUpdated.setChoices(schemaRestClient.getDerSchemaNames());
                     break;
 
                 case UserVirtualSchema:
                 case GroupVirtualSchema:
-                case MembershipVirtualSchema:
-                    toBeUpdated.setChoices(schemaRestClient.getVirSchemaNames(type.getAttributableType()));
+                case AnyObjectVirtualSchema:
+                    toBeUpdated.setChoices(schemaRestClient.getVirSchemaNames());
                     break;
 
-                case UserId:
+                case UserKey:
                 case Password:
                 case Username:
-                case GroupId:
+                case GroupKey:
                 case GroupName:
+                case AnyObjectKey:
                 default:
                     toBeUpdated.setRequired(false);
                     toBeUpdated.setEnabled(false);
@@ -594,33 +582,33 @@ public class ResourceMappingPanel extends Panel {
     }
 
     /**
-     * Enable/Disable accountId checkbox.
+     * Enable/Disable connObjectKey checkbox.
      *
      * @param type attribute type.
-     * @param accountId accountId checkbox.
+     * @param connObjectKey connObjectKey checkbox.
      * @param password password checkbox.
      */
-    private void setAccountId(final IntMappingType type, final AjaxCheckBoxPanel accountId,
-            final AjaxCheckBoxPanel password) {
+    private void setConnObjectKey(
+            final IntMappingType type, final AjaxCheckBoxPanel connObjectKey, final AjaxCheckBoxPanel password) {
 
-        if (type != null && type.getAttributableType() != null) {
+        if (type != null && type.getAnyTypeKind() != null) {
             switch (type) {
                 case UserVirtualSchema:
                 case GroupVirtualSchema:
-                case MembershipVirtualSchema:
-                // Virtual accountId is not permitted
+                case AnyObjectVirtualSchema:
+                // Virtual connObjectKey is not permitted
                 case Password:
-                    // AccountId cannot be derived from password.
-                    accountId.setReadOnly(true);
-                    accountId.setModelObject(false);
+                    // connObjectKey cannot be derived from password.
+                    connObjectKey.setReadOnly(true);
+                    connObjectKey.setModelObject(false);
                     break;
 
                 default:
                     if (password.getModelObject()) {
-                        accountId.setReadOnly(true);
-                        accountId.setModelObject(false);
+                        connObjectKey.setReadOnly(true);
+                        connObjectKey.setModelObject(false);
                     } else {
-                        accountId.setReadOnly(false);
+                        connObjectKey.setReadOnly(false);
                     }
             }
         }
@@ -632,11 +620,11 @@ public class ResourceMappingPanel extends Panel {
      * @param entity entity.
      * @return all attribute types.
      */
-    private List<IntMappingType> getAttributeTypes(final AttributableType entity) {
+    private List<IntMappingType> getAttributeTypes(final AnyTypeKind entity) {
         final List<IntMappingType> res = new ArrayList<>();
 
         if (entity != null) {
-            res.addAll(IntMappingType.getAttributeTypes(AttributableType.valueOf(entity.name())));
+            res.addAll(IntMappingType.getAttributeTypes(entity));
         }
 
         return res;