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 2016/04/05 15:46:46 UTC

[1/3] syncope git commit: Upgrading SLF4J

Repository: syncope
Updated Branches:
  refs/heads/master bef072646 -> 692e1f91c


Upgrading SLF4J


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

Branch: refs/heads/master
Commit: 756e5c5e2434d85ba207e0296f90c223a0b96f5b
Parents: bef0726
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Tue Apr 5 15:14:11 2016 +0200
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Tue Apr 5 15:14:11 2016 +0200

----------------------------------------------------------------------
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/756e5c5e/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index d80da12..da5842e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -350,7 +350,7 @@ under the License.
 
     <activiti.version>5.19.0.2</activiti.version>
 
-    <slf4j.version>1.7.20</slf4j.version>
+    <slf4j.version>1.7.21</slf4j.version>
     <log4j.version>2.5</log4j.version>
     <disruptor.version>3.3.4</disruptor.version>
 


[3/3] syncope git commit: [SYNCOPE-806] Resource provisioning validated, and management of aux classes in Provision instances added

Posted by il...@apache.org.
[SYNCOPE-806] Resource provisioning validated, and management of aux classes in Provision instances added


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

Branch: refs/heads/master
Commit: 692e1f91c67d8eeaa731392d42daa03b1df07248
Parents: 756e5c5
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Tue Apr 5 15:46:37 2016 +0200
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Tue Apr 5 15:46:37 2016 +0200

----------------------------------------------------------------------
 .../console/approvals/ApprovalDetails.java      |   2 +-
 .../panels/ProvisionAuxClassesPanel.java        |  62 +++++++
 .../console/panels/ResourceMappingPanel.java    |  30 +--
 .../client/console/panels/ResourceModal.java    |  12 +-
 .../panels/search/AbstractSearchPanel.java      |   2 +-
 .../console/rest/AnyTypeClassRestClient.java    |   4 +
 .../client/console/rest/AnyTypeRestClient.java  |   4 +-
 .../wicket/markup/html/form/ActionLink.java     |   1 -
 .../markup/html/form/ActionLinksPanel.java      |  24 ---
 .../markup/html/form/AjaxPalettePanel.java      |  12 +-
 .../client/console/wizards/any/Ownership.java   |   4 +-
 .../provision/ProvisionWizardBuilder.java       |  19 +-
 .../panels/ProvisionAuxClassesPanel.html        |  23 +++
 .../console/panels/ResourceModal.properties     |   2 +-
 .../console/panels/ResourceModal_it.properties  |   2 +-
 .../panels/ResourceModal_pt_BR.properties       |   2 +-
 .../markup/html/form/ActionLinksPanel.html      |   5 -
 .../ProvisionWizardBuilder$AuxClasses.html      |  23 +++
 ...ProvisionWizardBuilder$AuxClasses.properties |  20 ++
 ...visionWizardBuilder$AuxClasses_it.properties |  19 ++
 ...ionWizardBuilder$AuxClasses_pt_BR.properties |  20 ++
 ...isionWizardBuilder$ConnObjectLink.properties |   4 +-
 ...onWizardBuilder$ConnObjectLink_it.properties |   4 +-
 ...izardBuilder$ConnObjectLink_pt_BR.properties |   4 +-
 .../ProvisionWizardBuilder$Mapping.properties   |   2 +-
 ...ProvisionWizardBuilder$Mapping_it.properties |   2 +-
 ...visionWizardBuilder$Mapping_pt_BR.properties |   2 +-
 .../ProvisionWizardBuilder$ObjectType.html      |   1 -
 .../syncope/common/lib/to/ProvisionTO.java      |   9 +
 .../api/dao/ExternalResourceDAO.java            |   3 +
 .../core/persistence/api/dao/GroupDAO.java      |   2 +-
 .../api/entity/resource/Provision.java          |   6 +
 .../persistence/jpa/dao/JPAAnyTypeClassDAO.java |  11 +-
 .../jpa/dao/JPAExternalResourceDAO.java         |  11 ++
 .../core/persistence/jpa/dao/JPAGroupDAO.java   |   2 +-
 .../jpa/entity/resource/JPAProvision.java       |  25 +++
 .../test/resources/domains/MasterContent.xml    |   5 +
 .../java/data/ResourceDataBinderImpl.java       | 186 +++++++++++++------
 .../syncope/fit/console/TopologyITCase.java     |  12 +-
 .../apache/syncope/fit/core/PushTaskITCase.java |   3 +-
 .../apache/syncope/fit/core/ResourceITCase.java |  15 +-
 .../apache/syncope/fit/core/VirAttrITCase.java  |  58 +++---
 42 files changed, 473 insertions(+), 186 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/client/console/src/main/java/org/apache/syncope/client/console/approvals/ApprovalDetails.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/approvals/ApprovalDetails.java b/client/console/src/main/java/org/apache/syncope/client/console/approvals/ApprovalDetails.java
index ec8cbcf..7c954fd 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/approvals/ApprovalDetails.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/approvals/ApprovalDetails.java
@@ -38,7 +38,7 @@ public class ApprovalDetails extends MultilevelPanel.SecondLevel {
         super(MultilevelPanel.SECOND_LEVEL_ID);
 
         final UserTO userTO = new UserRestClient().read(formTO.getUserKey());
-        final List<String> anyTypeClasses = new AnyTypeRestClient().get(AnyTypeKind.USER.name()).getClasses();
+        final List<String> anyTypeClasses = new AnyTypeRestClient().read(AnyTypeKind.USER.name()).getClasses();
 
         final AjaxWizard<AnyHandler<UserTO>> wizard
                 = new UserWizardBuilder("wizard", userTO, anyTypeClasses, pageRef).build(AjaxWizard.Mode.READONLY);

http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/client/console/src/main/java/org/apache/syncope/client/console/panels/ProvisionAuxClassesPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ProvisionAuxClassesPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ProvisionAuxClassesPanel.java
new file mode 100644
index 0000000..3e7116c
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ProvisionAuxClassesPanel.java
@@ -0,0 +1,62 @@
+/*
+ * 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.panels;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.syncope.client.console.rest.AnyTypeClassRestClient;
+import org.apache.syncope.client.console.rest.AnyTypeRestClient;
+import org.apache.syncope.client.console.wicket.markup.html.form.AjaxPalettePanel;
+import org.apache.syncope.common.lib.to.AnyTypeClassTO;
+import org.apache.syncope.common.lib.to.AnyTypeTO;
+import org.apache.syncope.common.lib.to.ProvisionTO;
+import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.model.PropertyModel;
+import org.apache.wicket.model.util.ListModel;
+
+public class ProvisionAuxClassesPanel extends Panel {
+
+    private static final long serialVersionUID = -3962956154520358784L;
+
+    private final ProvisionTO provisionTO;
+
+    public ProvisionAuxClassesPanel(final String id, final ProvisionTO provisionTO) {
+        super(id);
+        setOutputMarkupId(true);
+
+        this.provisionTO = provisionTO;
+    }
+
+    @Override
+    protected void onBeforeRender() {
+        super.onBeforeRender();
+
+        AnyTypeTO anyType = new AnyTypeRestClient().read(provisionTO.getAnyType());
+        List<String> choices = new ArrayList<>();
+        for (AnyTypeClassTO aux : new AnyTypeClassRestClient().list()) {
+            if (!anyType.getClasses().contains(aux.getKey())) {
+                choices.add(aux.getKey());
+            }
+        }
+        addOrReplace(new AjaxPalettePanel.Builder<String>().build("auxClasses",
+                new PropertyModel<List<String>>(provisionTO, "auxClasses"),
+                new ListModel<>(choices)).hideLabel().setOutputMarkupId(true));
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/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 09d99d0..30188f9 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
@@ -22,13 +22,11 @@ import de.agilecoders.wicket.core.markup.html.bootstrap.components.TooltipConfig
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collection;
 import java.util.Collections;
 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.IterableUtils;
 import org.apache.commons.collections4.Predicate;
 import org.apache.syncope.client.console.commons.ConnIdSpecialAttributeName;
@@ -531,32 +529,22 @@ public class ResourceMappingPanel extends Panel {
      * @param toBeUpdated drop down choice to be updated.
      */
     private void setAttrNames(final IntMappingType type, final AjaxDropDownChoicePanel<String> toBeUpdated) {
-
         toBeUpdated.setRequired(true);
         toBeUpdated.setEnabled(true);
 
         if (type == null || type.getAnyTypeKind() == null) {
             toBeUpdated.setChoices(Collections.<String>emptyList());
         } else {
-            Collection<AnyTypeTO> anyTypeTOs = type.getAnyTypeKind() == AnyTypeKind.ANY_OBJECT
-                    ? CollectionUtils.select(anyTypeRestClient.list(), new Predicate<AnyTypeTO>() {
-
-                        @Override
-                        public boolean evaluate(final AnyTypeTO object) {
-                            return object.getKind() == AnyTypeKind.ANY_OBJECT;
-                        }
-                    })
-                    : Collections.singletonList(anyTypeRestClient.get(type.getAnyTypeKind().name()));
+            AnyTypeTO anyTypeTO = anyTypeRestClient.read(provisionTO.getAnyType());
 
-            final List<AnyTypeClassTO> anyTypeClassTOs = new ArrayList<>();
-            for (AnyTypeTO anyTypeTO : anyTypeTOs) {
-                anyTypeClassTOs.addAll(anyTypeClassRestClient.list(anyTypeTO.getClasses()));
+            List<AnyTypeClassTO> anyTypeClassTOs = new ArrayList<>();
+            anyTypeClassTOs.addAll(anyTypeClassRestClient.list(anyTypeTO.getClasses()));
+            for (String auxClass : provisionTO.getAuxClasses()) {
+                anyTypeClassTOs.add(anyTypeClassRestClient.read(auxClass));
             }
 
             List<String> choices;
-
             switch (type) {
-                // user attribute names
                 case UserPlainSchema:
                 case GroupPlainSchema:
                 case AnyObjectPlainSchema:
@@ -639,14 +627,14 @@ public class ResourceMappingPanel extends Panel {
     /**
      * Get all attribute types from a selected attribute type.
      *
-     * @param entity entity.
+     * @param kind entity.
      * @return all attribute types.
      */
-    private List<IntMappingType> getAttributeTypes(final AnyTypeKind entity) {
+    private List<IntMappingType> getAttributeTypes(final AnyTypeKind kind) {
         final List<IntMappingType> res = new ArrayList<>();
 
-        if (entity != null) {
-            res.addAll(IntMappingType.getAttributeTypes(entity));
+        if (kind != null) {
+            res.addAll(IntMappingType.getAttributeTypes(kind));
         }
 
         return res;

http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceModal.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceModal.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceModal.java
index c0df4ac..ba29fb9 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceModal.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceModal.java
@@ -116,7 +116,7 @@ public class ResourceModal<T extends Serializable> extends AbstractResourceModal
         };
 
         builder.setItems(model.getObject().getProvisions());
-        builder.includes("anyType", "objectClass");
+        builder.includes("anyType", "objectClass", "auxClasses");
         builder.setReuseItem(false);
 
         builder.
@@ -132,16 +132,6 @@ public class ResourceModal<T extends Serializable> extends AbstractResourceModal
                 }, ActionLink.ActionType.MAPPING, StandardEntitlement.RESOURCE_UPDATE).
                 addAction(new ActionLink<ProvisionTO>() {
 
-                    private static final long serialVersionUID = -3722207913631435514L;
-
-                    @Override
-                    public void onClick(final AjaxRequestTarget target, final ProvisionTO provisionTO) {
-                        send(pageRef.getPage(), Broadcast.DEPTH,
-                                new AjaxWizard.NewItemActionEvent<>(provisionTO, 3, target));
-                    }
-                }, ActionLink.ActionType.ACCOUNT_LINK, StandardEntitlement.RESOURCE_UPDATE).
-                addAction(new ActionLink<ProvisionTO>() {
-
                     private static final long serialVersionUID = -3722207913631435524L;
 
                     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/client/console/src/main/java/org/apache/syncope/client/console/panels/search/AbstractSearchPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/search/AbstractSearchPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/search/AbstractSearchPanel.java
index b3918e1..3d05eee 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/search/AbstractSearchPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/search/AbstractSearchPanel.java
@@ -166,7 +166,7 @@ public abstract class AbstractSearchPanel extends Panel {
             @Override
             protected List<String> load() {
                 return CollectionUtils.collect(
-                        schemaRestClient.getSchemas(SchemaType.PLAIN, anyTypeRestClient.get(type).getClasses().
+                        schemaRestClient.getSchemas(SchemaType.PLAIN, anyTypeRestClient.read(type).getClasses().
                                 toArray(new String[] {})),
                         EntityTOUtils.<String, AbstractSchemaTO>keyTransformer(),
                         new ArrayList<String>());

http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/client/console/src/main/java/org/apache/syncope/client/console/rest/AnyTypeClassRestClient.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/rest/AnyTypeClassRestClient.java b/client/console/src/main/java/org/apache/syncope/client/console/rest/AnyTypeClassRestClient.java
index 2f9d0f1..26b8601 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/rest/AnyTypeClassRestClient.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/rest/AnyTypeClassRestClient.java
@@ -30,6 +30,10 @@ public class AnyTypeClassRestClient extends BaseRestClient {
 
     private static final long serialVersionUID = -2211371717449597247L;
 
+    public AnyTypeClassTO read(final String key) {
+        return getService(AnyTypeClassService.class).read(key);
+    }
+
     public List<AnyTypeClassTO> list() {
         List<AnyTypeClassTO> types = Collections.emptyList();
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/client/console/src/main/java/org/apache/syncope/client/console/rest/AnyTypeRestClient.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/rest/AnyTypeRestClient.java b/client/console/src/main/java/org/apache/syncope/client/console/rest/AnyTypeRestClient.java
index 33b9552..06b45df 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/rest/AnyTypeRestClient.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/rest/AnyTypeRestClient.java
@@ -28,11 +28,11 @@ public class AnyTypeRestClient extends BaseRestClient {
 
     private static final long serialVersionUID = -2211371717449597247L;
 
-    public AnyTypeTO get(final String kind) {
+    public AnyTypeTO read(final String key) {
         AnyTypeTO type = null;
 
         try {
-            type = getService(AnyTypeService.class).read(kind);
+            type = getService(AnyTypeService.class).read(key);
         } catch (SyncopeClientException e) {
             LOG.error("While reading all any types", e);
         }

http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLink.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLink.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLink.java
index 9bd19ee..ed30b69 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLink.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLink.java
@@ -41,7 +41,6 @@ public abstract class ActionLink<T extends Serializable> implements Serializable
     public enum ActionType {
 
         MAPPING("update"),
-        ACCOUNT_LINK("update"),
         MUSTCHANGEPASSWORD("update"),
         RESET_TIME("update"),
         CLONE("create"),

http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.java
index 52e1ada..4040bf6 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.java
@@ -56,7 +56,6 @@ public final class ActionLinksPanel<T extends Serializable> extends Panel {
         super.add(new Fragment("panelManageUsers", "emptyFragment", this));
         super.add(new Fragment("panelManageGroups", "emptyFragment", this));
         super.add(new Fragment("panelMapping", "emptyFragment", this));
-        super.add(new Fragment("panelAccountLink", "emptyFragment", this));
         super.add(new Fragment("panelMustChangePassword", "emptyFragment", this));
         super.add(new Fragment("panelResetTime", "emptyFragment", this));
         super.add(new Fragment("panelClone", "emptyFragment", this));
@@ -194,25 +193,6 @@ public final class ActionLinksPanel<T extends Serializable> extends Panel {
                 }.setVisible(link.isEnabled(model.getObject())));
                 break;
 
-            case ACCOUNT_LINK:
-                fragment = new Fragment("panelAccountLink", "fragmentAccountLink", this);
-
-                fragment.addOrReplace(new IndicatingAjaxLink<Void>("accountLinkLink") {
-
-                    private static final long serialVersionUID = -7978723352517770644L;
-
-                    @Override
-                    public void onClick(final AjaxRequestTarget target) {
-                        link.onClick(target, model.getObject());
-                    }
-
-                    @Override
-                    public String getAjaxIndicatorMarkupId() {
-                        return disableIndicator ? StringUtils.EMPTY : super.getAjaxIndicatorMarkupId();
-                    }
-                }.setVisible(link.isEnabled(model.getObject())));
-                break;
-
             case MUSTCHANGEPASSWORD:
                 fragment = new Fragment("panelMustChangePassword", "fragmentMustChangePassword", this);
 
@@ -808,10 +788,6 @@ public final class ActionLinksPanel<T extends Serializable> extends Panel {
                 super.addOrReplace(new Fragment("panelMapping", "emptyFragment", this));
                 break;
 
-            case ACCOUNT_LINK:
-                super.addOrReplace(new Fragment("panelAccountLink", "emptyFragment", this));
-                break;
-
             case MUSTCHANGEPASSWORD:
                 super.addOrReplace(new Fragment("panelMustChangePassword", "emptyFragment", this));
                 break;

http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxPalettePanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxPalettePanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxPalettePanel.java
index d84397d..0af6e61 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxPalettePanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxPalettePanel.java
@@ -78,7 +78,7 @@ public class AjaxPalettePanel<T extends Serializable> extends AbstractFieldPanel
 
         choicesModel = new PaletteLoadableDetachableModel(builder) {
 
-            private static final long serialVersionUID = 1L;
+            private static final long serialVersionUID = -108100712154481840L;
 
             @Override
             protected List<T> getChoices() {
@@ -174,7 +174,7 @@ public class AjaxPalettePanel<T extends Serializable> extends AbstractFieldPanel
 
         form.add(new AjaxSubmitLink("search") {
 
-            private static final long serialVersionUID = 1L;
+            private static final long serialVersionUID = -1765773642975892072L;
 
             @Override
             protected void onAfterSubmit(final AjaxRequestTarget target, final Form<?> form) {
@@ -184,6 +184,10 @@ public class AjaxPalettePanel<T extends Serializable> extends AbstractFieldPanel
         });
     }
 
+    public LoadableDetachableModel<List<T>> getChoicesModel() {
+        return choicesModel;
+    }
+
     @Override
     public AjaxPalettePanel<T> setModelObject(final List<T> object) {
         palette.setDefaultModelObject(object);
@@ -196,7 +200,7 @@ public class AjaxPalettePanel<T extends Serializable> extends AbstractFieldPanel
 
     public static class Builder<T extends Serializable> implements Serializable {
 
-        private static final long serialVersionUID = 1L;
+        private static final long serialVersionUID = 991248996001040352L;
 
         private IChoiceRenderer<T> renderer;
 
@@ -275,7 +279,7 @@ public class AjaxPalettePanel<T extends Serializable> extends AbstractFieldPanel
 
     private abstract class PaletteLoadableDetachableModel extends LoadableDetachableModel<List<T>> {
 
-        private static final long serialVersionUID = 1L;
+        private static final long serialVersionUID = -7745220313769774616L;
 
         private final Builder<T> builder;
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Ownership.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Ownership.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Ownership.java
index 58e9efa..69df4ba 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Ownership.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Ownership.java
@@ -157,7 +157,7 @@ public class Ownership extends WizardStep {
                 new ListModel<>(new ArrayList<SearchClause>())).required(false).enableSearch().build("groupsearch");
         groupSearchFragment.add(groupSearchPanel.setRenderBodyOnly(true));
 
-        AnyTypeTO anyTypeTO = anyTypeRestClient.get(AnyTypeKind.GROUP.name());
+        AnyTypeTO anyTypeTO = anyTypeRestClient.read(AnyTypeKind.GROUP.name());
 
         groupDirectoryPanel = GroupSelectionDirectoryPanel.class.cast(new GroupSelectionDirectoryPanel.Builder(
                 anyTypeClassRestClient.list(anyTypeTO.getClasses()),
@@ -171,7 +171,7 @@ public class Ownership extends WizardStep {
                 new ListModel<>(new ArrayList<SearchClause>())).required(false).enableSearch().build("usersearch"));
         userSearchFragment.add(userSearchPanel.setRenderBodyOnly(true));
 
-        anyTypeTO = anyTypeRestClient.get(AnyTypeKind.USER.name());
+        anyTypeTO = anyTypeRestClient.read(AnyTypeKind.USER.name());
 
         userDirectoryPanel = UserSelectionDirectoryPanel.class.cast(new UserSelectionDirectoryPanel.Builder(
                 anyTypeClassRestClient.list(anyTypeTO.getClasses()),

http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/client/console/src/main/java/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder.java
index 99eb7c5..73d6bfb 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder.java
@@ -26,6 +26,7 @@ import org.apache.commons.collections4.Predicate;
 import org.apache.commons.collections4.Transformer;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.commons.Constants;
+import org.apache.syncope.client.console.panels.ProvisionAuxClassesPanel;
 import org.apache.syncope.client.console.panels.ResourceMappingPanel;
 import org.apache.syncope.client.console.rest.AnyTypeRestClient;
 import org.apache.syncope.client.console.wicket.ajax.form.IndicatorAjaxFormComponentUpdatingBehavior;
@@ -139,6 +140,21 @@ public class ProvisionWizardBuilder extends AjaxWizardBuilder<ProvisionTO> imple
     }
 
     /**
+     * AuxClasses definition step.
+     */
+    private final class AuxClasses extends WizardStep {
+
+        private static final long serialVersionUID = 5315236191866427500L;
+
+        AuxClasses(final ProvisionTO item) {
+            setTitleModel(new ResourceModel("auxClasses.title"));
+            setSummaryModel(new StringResourceModel("auxClasses.summary", this, new Model<>(item)));
+
+            add(new ProvisionAuxClassesPanel("auxClasses", item));
+        }
+    }
+
+    /**
      * Mapping definition step.
      */
     private final class Mapping extends WizardStep {
@@ -146,7 +162,7 @@ public class ProvisionWizardBuilder extends AjaxWizardBuilder<ProvisionTO> imple
         private static final long serialVersionUID = 3454904947720856253L;
 
         Mapping(final ProvisionTO item) {
-            setTitleModel(new ResourceModel("mapping.title", "Mapping"));
+            setTitleModel(new ResourceModel("mapping.title"));
             setSummaryModel(new StringResourceModel("mapping.summary", this, new Model<>(item)));
 
             add(new ResourceMappingPanel("mapping", resourceTO, item));
@@ -225,6 +241,7 @@ public class ProvisionWizardBuilder extends AjaxWizardBuilder<ProvisionTO> imple
     @Override
     protected WizardModel buildModelSteps(final ProvisionTO modelObject, final WizardModel wizardModel) {
         wizardModel.add(new ObjectType(modelObject));
+        wizardModel.add(new AuxClasses(modelObject));
         wizardModel.add(new Mapping(modelObject));
         wizardModel.add(new ConnObjectLink(modelObject));
         return wizardModel;

http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/client/console/src/main/resources/org/apache/syncope/client/console/panels/ProvisionAuxClassesPanel.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ProvisionAuxClassesPanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ProvisionAuxClassesPanel.html
new file mode 100644
index 0000000..3be0e43
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ProvisionAuxClassesPanel.html
@@ -0,0 +1,23 @@
+<!--
+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.
+-->
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
+  <wicket:panel>
+    <span wicket:id="auxClasses"/>
+  </wicket:panel>
+</html>

http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal.properties
index 38500a7..5b21e1f 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal.properties
@@ -64,5 +64,5 @@ anyType=Object Type
 objectClass= Object Class
 __ACCOUNT__=ACCOUNT
 __GROUP__=GROUP
-listview.caption=Provisioning configuration instances
 connectorCapabilities=Connector Capabilities
+auxClasses=Auxiliary Classes

http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal_it.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal_it.properties
index afb7798..1f7d76a 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal_it.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal_it.properties
@@ -63,5 +63,5 @@ anyType=Oggetto
 objectClass=Classe
 __ACCOUNT__=ACCOUNT
 __GROUP__=GROUP
-listview.caption=Istanze di configurazione del provisioning
 connectorCapabilities=Capabilitiey Connettore
+auxClasses=Classi Ausiliarie

http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal_pt_BR.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal_pt_BR.properties
index 31989cd..db984d9 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal_pt_BR.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal_pt_BR.properties
@@ -63,5 +63,5 @@ anyType=Objeto
 objectClass=Classe
 __ACCOUNT__=ACCOUNT
 __GROUP__=GROUP
-listview.caption=Inst\u00e2ncias de provisionamento de recursos
 connectorCapabilities=Capacidades do Conector
+auxClasses=Classes Auxiliares

http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.html
index cc36119..50d3c6c 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.html
@@ -38,7 +38,6 @@ under the License.
     <span wicket:id="panelNotFound">[plus]</span>
     <span wicket:id="panelView">[plus]</span>
     <span wicket:id="panelMapping">[plus]</span>
-    <span wicket:id="panelAccountLink">[plus]</span>
     <span wicket:id="panelResetTime">[plus]</span>
     <span wicket:id="panelClone">[plus]</span>
     <span wicket:id="panelCreate">[plus]</span>
@@ -87,10 +86,6 @@ under the License.
       <a href="#" wicket:id="mappingLink" class="btn"><i class="fa fa-exchange" alt="mapping icon" title="Mapping"></i></a>
     </wicket:fragment>
 
-    <wicket:fragment wicket:id="fragmentAccountLink">
-      <a href="#" wicket:id="accountLinkLink" class="btn"><i class="fa fa-external-link" alt="account link icon" title="Account Link"></i></a>
-    </wicket:fragment>
-
     <wicket:fragment wicket:id="fragmentResetTime">
       <a href="#" wicket:id="resetTimeLink" class="btn"><i class="fa fa-hourglass-start" alt="reset time icon" title="Reset Time"></i></a>
     </wicket:fragment>

http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$AuxClasses.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$AuxClasses.html b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$AuxClasses.html
new file mode 100644
index 0000000..9b03dd7
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$AuxClasses.html
@@ -0,0 +1,23 @@
+<!--
+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.
+-->
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
+  <wicket:panel>
+    <span wicket:id="auxClasses"/>
+  </wicket:panel>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$AuxClasses.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$AuxClasses.properties b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$AuxClasses.properties
new file mode 100644
index 0000000..8223360
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$AuxClasses.properties
@@ -0,0 +1,20 @@
+# 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.
+
+auxClasses.title=Auxiliary Classes
+auxClasses.summary=
+

http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$AuxClasses_it.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$AuxClasses_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$AuxClasses_it.properties
new file mode 100644
index 0000000..372ef2d
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$AuxClasses_it.properties
@@ -0,0 +1,19 @@
+# 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.
+
+auxClasses.title=Classi Ausiliarie
+auxClasses.summary=

http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$AuxClasses_pt_BR.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$AuxClasses_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$AuxClasses_pt_BR.properties
new file mode 100644
index 0000000..0946b9d
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$AuxClasses_pt_BR.properties
@@ -0,0 +1,20 @@
+# 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.
+
+auxClasses.title=Classes Auxiliares
+auxClasses.summary=
+

http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$ConnObjectLink.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$ConnObjectLink.properties b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$ConnObjectLink.properties
index e2df31e..dad26b4 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$ConnObjectLink.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$ConnObjectLink.properties
@@ -15,6 +15,6 @@
 # specific language governing permissions and limitations
 # under the License.
 
-link.title=Specify the connector object link (if required)
+link.title=Connector object link (if required)
 link.summary=
-
+connObjectLinkCheckbox=Use ConnObjectLink

http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$ConnObjectLink_it.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$ConnObjectLink_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$ConnObjectLink_it.properties
index e2df31e..cf74d19 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$ConnObjectLink_it.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$ConnObjectLink_it.properties
@@ -15,6 +15,6 @@
 # specific language governing permissions and limitations
 # under the License.
 
-link.title=Specify the connector object link (if required)
+link.title=Connector object link (se necessario)
 link.summary=
-
+connObjectLinkCheckbox=Usa ConnObjectLink

http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$ConnObjectLink_pt_BR.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$ConnObjectLink_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$ConnObjectLink_pt_BR.properties
index e2df31e..305b0b7 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$ConnObjectLink_pt_BR.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$ConnObjectLink_pt_BR.properties
@@ -15,6 +15,6 @@
 # specific language governing permissions and limitations
 # under the License.
 
-link.title=Specify the connector object link (if required)
+link.title=Connector object link (se necess\u00e1rio)
 link.summary=
-
+connObjectLinkCheckbox=Usar ConnObjectLink

http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$Mapping.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$Mapping.properties b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$Mapping.properties
index 8dc0c10..99d1add 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$Mapping.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$Mapping.properties
@@ -15,6 +15,6 @@
 # specific language governing permissions and limitations
 # under the License.
 
-mapping.title=Specify the mapping for this provisioning object
+mapping.title=Mapping
 mapping.summary=
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$Mapping_it.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$Mapping_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$Mapping_it.properties
index 63e44ce..fde5de0 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$Mapping_it.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$Mapping_it.properties
@@ -15,5 +15,5 @@
 # specific language governing permissions and limitations
 # under the License.
 
-mapping.title=Specify the mapping for this provisioning object
+mapping.title=Mapping
 mapping.summary=

http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$Mapping_pt_BR.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$Mapping_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$Mapping_pt_BR.properties
index 8dc0c10..99d1add 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$Mapping_pt_BR.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$Mapping_pt_BR.properties
@@ -15,6 +15,6 @@
 # specific language governing permissions and limitations
 # under the License.
 
-mapping.title=Specify the mapping for this provisioning object
+mapping.title=Mapping
 mapping.summary=
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$ObjectType.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$ObjectType.html b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$ObjectType.html
index 7b505e4..1b951d3 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$ObjectType.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$ObjectType.html
@@ -20,7 +20,6 @@ under the License.
   <wicket:panel>
     <div wicket:id="container">
       <div class="form-group">
-        <label>Object Type</label>
         <span wicket:id="type"/>
       </div>
       <div class="form-group">

http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/common/lib/src/main/java/org/apache/syncope/common/lib/to/ProvisionTO.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ProvisionTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ProvisionTO.java
index b39d543..7a683d5 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ProvisionTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ProvisionTO.java
@@ -39,6 +39,8 @@ public class ProvisionTO extends AbstractBaseBean implements EntityTO<Long> {
 
     private String objectClass;
 
+    private final List<String> auxClasses = new ArrayList<>();
+
     private String syncToken;
 
     private MappingTO mapping;
@@ -71,6 +73,13 @@ public class ProvisionTO extends AbstractBaseBean implements EntityTO<Long> {
         this.objectClass = objectClass;
     }
 
+    @XmlElementWrapper(name = "auxClasses")
+    @XmlElement(name = "class")
+    @JsonProperty("auxClasses")
+    public List<String> getAuxClasses() {
+        return auxClasses;
+    }
+
     public String getSyncToken() {
         return syncToken;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/ExternalResourceDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/ExternalResourceDAO.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/ExternalResourceDAO.java
index 6c443e8..b92e9f2 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/ExternalResourceDAO.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/ExternalResourceDAO.java
@@ -20,6 +20,7 @@ package org.apache.syncope.core.persistence.api.dao;
 
 import java.util.List;
 import org.apache.syncope.common.lib.types.IntMappingType;
+import org.apache.syncope.core.persistence.api.entity.AnyTypeClass;
 import org.apache.syncope.core.persistence.api.entity.Policy;
 import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
 import org.apache.syncope.core.persistence.api.entity.resource.Provision;
@@ -32,6 +33,8 @@ public interface ExternalResourceDAO extends DAO<ExternalResource, String> {
 
     Provision findProvision(Long key);
 
+    List<Provision> findProvisionsByAuxClass(AnyTypeClass anyTypeClass);
+
     List<ExternalResource> findByPolicy(Policy policy);
 
     List<ExternalResource> findWithoutPolicy(Class<? extends Policy> policyClass);

http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/GroupDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/GroupDAO.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/GroupDAO.java
index d372fbc..1de4ba2 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/GroupDAO.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/GroupDAO.java
@@ -63,7 +63,7 @@ public interface GroupDAO extends AnyDAO<Group> {
      */
     Map<Long, PropagationByResource> findUsersWithTransitiveResources(Long groupKey);
 
-    List<TypeExtension> findTypeExtensionByAnyTypeClass(AnyTypeClass anyTypeClass);
+    List<TypeExtension> findTypeExtensions(AnyTypeClass anyTypeClass);
 
     void refreshDynMemberships(AnyObject anyObject);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/resource/Provision.java
----------------------------------------------------------------------
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/resource/Provision.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/resource/Provision.java
index f1b33fe..30cd970 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/resource/Provision.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/resource/Provision.java
@@ -18,7 +18,9 @@
  */
 package org.apache.syncope.core.persistence.api.entity.resource;
 
+import java.util.List;
 import org.apache.syncope.core.persistence.api.entity.AnyType;
+import org.apache.syncope.core.persistence.api.entity.AnyTypeClass;
 import org.apache.syncope.core.persistence.api.entity.Entity;
 import org.identityconnectors.framework.common.objects.ObjectClass;
 import org.identityconnectors.framework.common.objects.SyncToken;
@@ -37,6 +39,10 @@ public interface Provision extends Entity<Long> {
 
     void setObjectClass(ObjectClass objectClass);
 
+    boolean add(AnyTypeClass anyTypeClass);
+
+    List<? extends AnyTypeClass> getAuxClasses();
+
     SyncToken getSyncToken();
 
     String getSerializedSyncToken();

http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyTypeClassDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyTypeClassDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyTypeClassDAO.java
index 8efb01f..ee301f5 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyTypeClassDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyTypeClassDAO.java
@@ -24,6 +24,7 @@ import javax.persistence.TypedQuery;
 import org.apache.syncope.core.persistence.api.dao.AnyTypeClassDAO;
 import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
 import org.apache.syncope.core.persistence.api.dao.DerSchemaDAO;
+import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
 import org.apache.syncope.core.persistence.api.dao.GroupDAO;
 import org.apache.syncope.core.persistence.api.dao.PlainSchemaDAO;
 import org.apache.syncope.core.persistence.api.dao.VirSchemaDAO;
@@ -33,6 +34,7 @@ import org.apache.syncope.core.persistence.api.entity.DerSchema;
 import org.apache.syncope.core.persistence.api.entity.PlainSchema;
 import org.apache.syncope.core.persistence.api.entity.VirSchema;
 import org.apache.syncope.core.persistence.api.entity.group.TypeExtension;
+import org.apache.syncope.core.persistence.api.entity.resource.Provision;
 import org.apache.syncope.core.persistence.jpa.entity.JPAAnyTypeClass;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Repository;
@@ -55,6 +57,9 @@ public class JPAAnyTypeClassDAO extends AbstractDAO<AnyTypeClass, String> implem
     @Autowired
     private GroupDAO groupDAO;
 
+    @Autowired
+    private ExternalResourceDAO resourceDAO;
+
     @Override
     public AnyTypeClass find(final String key) {
         return entityManager().find(JPAAnyTypeClass.class, key);
@@ -105,7 +110,7 @@ public class JPAAnyTypeClassDAO extends AbstractDAO<AnyTypeClass, String> implem
             type.getClasses().remove(anyTypeClass);
         }
 
-        for (TypeExtension typeExt : groupDAO.findTypeExtensionByAnyTypeClass(anyTypeClass)) {
+        for (TypeExtension typeExt : groupDAO.findTypeExtensions(anyTypeClass)) {
             typeExt.getAuxClasses().remove(anyTypeClass);
 
             if (typeExt.getAuxClasses().isEmpty()) {
@@ -114,6 +119,10 @@ public class JPAAnyTypeClassDAO extends AbstractDAO<AnyTypeClass, String> implem
             }
         }
 
+        for (Provision provision : resourceDAO.findProvisionsByAuxClass(anyTypeClass)) {
+            provision.getAuxClasses().remove(anyTypeClass);
+        }
+
         entityManager().remove(anyTypeClass);
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAExternalResourceDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAExternalResourceDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAExternalResourceDAO.java
index be02327..1f08938 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAExternalResourceDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAExternalResourceDAO.java
@@ -33,6 +33,7 @@ import org.apache.syncope.core.persistence.api.dao.GroupDAO;
 import org.apache.syncope.core.persistence.api.dao.TaskDAO;
 import org.apache.syncope.core.persistence.api.dao.UserDAO;
 import org.apache.syncope.core.persistence.api.dao.VirSchemaDAO;
+import org.apache.syncope.core.persistence.api.entity.AnyTypeClass;
 import org.apache.syncope.core.persistence.api.entity.policy.AccountPolicy;
 import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
 import org.apache.syncope.core.persistence.api.entity.resource.MappingItem;
@@ -94,6 +95,16 @@ public class JPAExternalResourceDAO extends AbstractDAO<ExternalResource, String
         return entityManager().find(JPAProvision.class, key);
     }
 
+    @Override
+    public List<Provision> findProvisionsByAuxClass(final AnyTypeClass anyTypeClass) {
+        TypedQuery<Provision> query = entityManager().createQuery(
+                "SELECT e FROM " + JPAProvision.class.getSimpleName()
+                + " e WHERE :anyTypeClass MEMBER OF e.auxClasses", Provision.class);
+        query.setParameter("anyTypeClass", anyTypeClass);
+
+        return query.getResultList();
+    }
+
     private StringBuilder getByPolicyQuery(final Class<? extends Policy> policyClass) {
         StringBuilder query = new StringBuilder("SELECT e FROM ").
                 append(JPAExternalResource.class.getSimpleName()).

http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java
index 9a6fe41..990962a 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java
@@ -284,7 +284,7 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> implements GroupDAO {
     }
 
     @Override
-    public List<TypeExtension> findTypeExtensionByAnyTypeClass(final AnyTypeClass anyTypeClass) {
+    public List<TypeExtension> findTypeExtensions(final AnyTypeClass anyTypeClass) {
         TypedQuery<TypeExtension> query = entityManager().createQuery(
                 "SELECT e FROM " + JPATypeExtension.class.getSimpleName()
                 + " e WHERE :anyTypeClass MEMBER OF e.auxClasses", TypeExtension.class);

http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAProvision.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAProvision.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAProvision.java
index ec50d2c..4ae1043 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAProvision.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAProvision.java
@@ -18,11 +18,16 @@
  */
 package org.apache.syncope.core.persistence.jpa.entity.resource;
 
+import java.util.ArrayList;
+import java.util.List;
 import javax.persistence.CascadeType;
 import javax.persistence.Entity;
 import javax.persistence.FetchType;
 import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinTable;
 import javax.persistence.Lob;
+import javax.persistence.ManyToMany;
 import javax.persistence.ManyToOne;
 import javax.persistence.OneToOne;
 import javax.persistence.Table;
@@ -30,11 +35,13 @@ import javax.persistence.UniqueConstraint;
 import javax.validation.constraints.NotNull;
 import org.apache.syncope.core.provisioning.api.serialization.POJOHelper;
 import org.apache.syncope.core.persistence.api.entity.AnyType;
+import org.apache.syncope.core.persistence.api.entity.AnyTypeClass;
 import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
 import org.apache.syncope.core.persistence.api.entity.resource.Mapping;
 import org.apache.syncope.core.persistence.api.entity.resource.Provision;
 import org.apache.syncope.core.persistence.jpa.entity.AbstractEntity;
 import org.apache.syncope.core.persistence.jpa.entity.JPAAnyType;
+import org.apache.syncope.core.persistence.jpa.entity.JPAAnyTypeClass;
 import org.identityconnectors.framework.common.objects.ObjectClass;
 import org.identityconnectors.framework.common.objects.SyncToken;
 
@@ -59,6 +66,13 @@ public class JPAProvision extends AbstractEntity<Long> implements Provision {
     @NotNull
     private String objectClass;
 
+    @ManyToMany(fetch = FetchType.EAGER)
+    @JoinTable(joinColumns =
+            @JoinColumn(name = "provision_id"),
+            inverseJoinColumns =
+            @JoinColumn(name = "anyTypeClass_name"))
+    private List<JPAAnyTypeClass> auxClasses = new ArrayList<>();
+
     @Lob
     private String serializedSyncToken;
 
@@ -105,6 +119,17 @@ public class JPAProvision extends AbstractEntity<Long> implements Provision {
     }
 
     @Override
+    public boolean add(final AnyTypeClass auxClass) {
+        checkType(auxClass, JPAAnyTypeClass.class);
+        return auxClasses.contains((JPAAnyTypeClass) auxClass) || auxClasses.add((JPAAnyTypeClass) auxClass);
+    }
+
+    @Override
+    public List<? extends AnyTypeClass> getAuxClasses() {
+        return auxClasses;
+    }
+
+    @Override
     public SyncToken getSyncToken() {
         return serializedSyncToken == null
                 ? null

http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/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 4505541..9873f32 100644
--- a/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
+++ b/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
@@ -819,6 +819,9 @@ under the License.
                connObjectKey="0" password="1" purpose="PROPAGATION"/>
                          
   <Provision id="9" resource_name="resource-csv" anyType_name="USER" objectClass="__ACCOUNT__"/>
+  <Provision_AnyTypeClass provision_id="9" anyTypeClass_name="csv"/>
+  <Provision_AnyTypeClass provision_id="9" anyTypeClass_name="generic membership"/>
+  <Provision_AnyTypeClass provision_id="9" anyTypeClass_name="minimal group"/>
   <Mapping id="9" provision_id="9"/>
   <MappingItem id="200" extAttrName="id" mapping_id="9"
                intMappingType="Username" mandatoryCondition="true"
@@ -862,6 +865,8 @@ under the License.
                connObjectKey="0" password="1" purpose="BOTH"/>
 
   <Provision id="11" resource_name="resource-ldap" anyType_name="USER" objectClass="__ACCOUNT__"/>
+  <Provision_AnyTypeClass provision_id="11" anyTypeClass_name="generic membership"/>
+  <Provision_AnyTypeClass provision_id="11" anyTypeClass_name="minimal group"/>
   <Mapping id="11" provision_id="11"
            connObjectLink="&apos;uid=&apos; + username + &apos;,ou=people,o=isp&apos;"/>
   <MappingItem id="311" connObjectKey="1" password="0" mapping_id="11"

http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/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 b4aa8b2..51ebfa5 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
@@ -18,20 +18,21 @@
  */
 package org.apache.syncope.core.provisioning.java.data;
 
-import org.apache.syncope.core.provisioning.api.data.ResourceDataBinder;
-import java.util.Collection;
 import java.util.HashSet;
 import java.util.Iterator;
-import java.util.Set;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.IteratorUtils;
 import org.apache.commons.lang3.SerializationUtils;
 import org.apache.syncope.common.lib.SyncopeClientCompositeException;
 import org.apache.syncope.common.lib.SyncopeClientException;
+import org.apache.syncope.common.lib.to.AnyTypeClassTO;
 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.ClientExceptionType;
 import org.apache.syncope.common.lib.types.IntMappingType;
+import org.apache.syncope.core.persistence.api.dao.AnyTypeClassDAO;
 import org.apache.syncope.core.persistence.api.dao.ConnInstanceDAO;
 import org.apache.syncope.core.persistence.api.dao.PolicyDAO;
 import org.apache.syncope.core.persistence.api.entity.policy.AccountPolicy;
@@ -42,18 +43,23 @@ 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.provisioning.java.jexl.JexlUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.apache.syncope.core.spring.BeanUtils;
 import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
 import org.apache.syncope.core.persistence.api.dao.VirSchemaDAO;
 import org.apache.syncope.core.persistence.api.entity.AnyType;
+import org.apache.syncope.core.persistence.api.entity.AnyTypeClass;
+import org.apache.syncope.core.persistence.api.entity.DerSchema;
+import org.apache.syncope.core.persistence.api.entity.PlainSchema;
 import org.apache.syncope.core.persistence.api.entity.VirSchema;
+import org.apache.syncope.core.persistence.api.entity.policy.PullPolicy;
 import org.apache.syncope.core.persistence.api.entity.resource.Provision;
+import org.apache.syncope.core.provisioning.api.data.ResourceDataBinder;
+import org.apache.syncope.core.provisioning.api.utils.EntityUtils;
 import org.identityconnectors.framework.common.objects.ObjectClass;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
-import org.apache.syncope.core.persistence.api.entity.policy.PullPolicy;
 
 @Component
 public class ResourceDataBinderImpl implements ResourceDataBinder {
@@ -75,6 +81,9 @@ public class ResourceDataBinderImpl implements ResourceDataBinder {
     private VirSchemaDAO virSchemaDAO;
 
     @Autowired
+    private AnyTypeClassDAO anyTypeClassDAO;
+
+    @Autowired
     private EntityFactory entityFactory;
 
     @Override
@@ -127,6 +136,23 @@ public class ResourceDataBinderImpl implements ResourceDataBinder {
                 }
                 provision.setObjectClass(new ObjectClass(provisionTO.getObjectClass()));
 
+                // add all classes contained in the TO
+                for (String name : provisionTO.getAuxClasses()) {
+                    AnyTypeClass anyTypeClass = anyTypeClassDAO.find(name);
+                    if (anyTypeClass == null) {
+                        LOG.warn("Ignoring invalid {}: {}", AnyTypeClass.class.getSimpleName(), name);
+                    } else {
+                        provision.add(anyTypeClass);
+                    }
+                }
+                // remove all classes not contained in the TO
+                for (Iterator<? extends AnyTypeClass> itor = provision.getAuxClasses().iterator(); itor.hasNext();) {
+                    AnyTypeClass anyTypeClass = itor.next();
+                    if (!provisionTO.getAuxClasses().contains(anyTypeClass.getKey())) {
+                        itor.remove();
+                    }
+                }
+
                 if (provisionTO.getSyncToken() == null) {
                     provision.setSyncToken(null);
                 }
@@ -142,7 +168,29 @@ public class ResourceDataBinderImpl implements ResourceDataBinder {
                     } else {
                         mapping.getItems().clear();
                     }
-                    populateMapping(provisionTO.getMapping(), mapping, entityFactory.newEntity(MappingItem.class));
+
+                    AnyTypeClassTO allowedSchemas = new AnyTypeClassTO();
+                    for (Iterator<AnyTypeClass> itor = IteratorUtils.chainedIterator(
+                            provision.getAnyType().getClasses().iterator(),
+                            provision.getAuxClasses().iterator()); itor.hasNext();) {
+
+                        AnyTypeClass anyTypeClass = itor.next();
+                        allowedSchemas.getPlainSchemas().addAll(
+                                CollectionUtils.collect(anyTypeClass.getPlainSchemas(),
+                                        EntityUtils.<String, PlainSchema>keyTransformer()));
+                        allowedSchemas.getDerSchemas().addAll(
+                                CollectionUtils.collect(anyTypeClass.getDerSchemas(),
+                                        EntityUtils.<String, DerSchema>keyTransformer()));
+                        allowedSchemas.getVirSchemas().addAll(
+                                CollectionUtils.collect(anyTypeClass.getVirSchemas(),
+                                        EntityUtils.<String, VirSchema>keyTransformer()));
+                    }
+
+                    populateMapping(
+                            provisionTO.getMapping(),
+                            mapping,
+                            entityFactory.newEntity(MappingItem.class),
+                            allowedSchemas);
                 }
 
                 if (provisionTO.getVirSchemas().isEmpty()) {
@@ -201,70 +249,92 @@ public class ResourceDataBinderImpl implements ResourceDataBinder {
         return resource;
     }
 
-    @SuppressWarnings({ "unchecked", "rawtypes" })
-    private void populateMapping(final MappingTO mappingTO, final Mapping mapping, final MappingItem prototype) {
+    private void populateMapping(
+            final MappingTO mappingTO,
+            final Mapping mapping,
+            final MappingItem prototype,
+            final AnyTypeClassTO allowedSchemas) {
+
         mapping.setConnObjectLink(mappingTO.getConnObjectLink());
 
-        for (MappingItem item : getMappingItems(mappingTO.getItems(), prototype)) {
-            item.setMapping(mapping);
-            if (item.isConnObjectKey()) {
-                mapping.setConnObjectKeyItem(item);
+        SyncopeClientCompositeException scce = SyncopeClientException.buildComposite();
+        SyncopeClientException invalidMapping = SyncopeClientException.build(ClientExceptionType.InvalidMapping);
+        SyncopeClientException requiredValuesMissing =
+                SyncopeClientException.build(ClientExceptionType.RequiredValuesMissing);
+
+        for (MappingItemTO itemTO : mappingTO.getItems()) {
+            if (itemTO == null || itemTO.getIntMappingType() == null) {
+                LOG.error("Null {} or missing {}",
+                        MappingItemTO.class.getSimpleName(), IntMappingType.class.getSimpleName());
+                invalidMapping.getElements().add(
+                        "Null " + MappingItemTO.class.getSimpleName()
+                        + " or missing " + IntMappingType.class.getSimpleName());
             } else {
-                mapping.add(item);
-            }
-        }
-    }
-
-    private Set<MappingItem> getMappingItems(final Collection<MappingItemTO> itemTOs, final MappingItem prototype) {
-        Set<MappingItem> items = new HashSet<>(itemTOs.size());
-        for (MappingItemTO itemTO : itemTOs) {
-            items.add(getMappingItem(itemTO, prototype));
-        }
-
-        return items;
-    }
+                if (itemTO.getIntAttrName() == null) {
+                    if (IntMappingType.getEmbedded().contains(itemTO.getIntMappingType())) {
+                        itemTO.setIntAttrName(itemTO.getIntMappingType().toString());
+                    } else {
+                        requiredValuesMissing.getElements().add("intAttrName");
+                        scce.addException(requiredValuesMissing);
+                    }
+                }
 
-    private MappingItem getMappingItem(final MappingItemTO itemTO, final MappingItem prototype) {
-        if (itemTO == null || itemTO.getIntMappingType() == null) {
-            LOG.error("Null mappingTO provided");
-            return null;
-        }
+                boolean allowed;
+                switch (itemTO.getIntMappingType()) {
+                    case UserPlainSchema:
+                    case GroupPlainSchema:
+                    case AnyObjectPlainSchema:
+                        allowed = allowedSchemas.getPlainSchemas().contains(itemTO.getIntAttrName());
+                        break;
+
+                    case UserDerivedSchema:
+                    case GroupDerivedSchema:
+                    case AnyObjectDerivedSchema:
+                        allowed = allowedSchemas.getDerSchemas().contains(itemTO.getIntAttrName());
+                        break;
+
+                    case UserVirtualSchema:
+                    case GroupVirtualSchema:
+                    case AnyObjectVirtualSchema:
+                        allowed = allowedSchemas.getVirSchemas().contains(itemTO.getIntAttrName());
+                        break;
+
+                    default:
+                        allowed = true;
+                }
 
-        SyncopeClientCompositeException scce = SyncopeClientException.buildComposite();
+                if (allowed) {
+                    // no mandatory condition implies mandatory condition false
+                    if (!JexlUtils.isExpressionValid(itemTO.getMandatoryCondition() == null
+                            ? "false" : itemTO.getMandatoryCondition())) {
 
-        SyncopeClientException requiredValuesMissing = SyncopeClientException.build(
-                ClientExceptionType.RequiredValuesMissing);
+                        SyncopeClientException invalidMandatoryCondition =
+                                SyncopeClientException.build(ClientExceptionType.InvalidValues);
+                        invalidMandatoryCondition.getElements().add(itemTO.getMandatoryCondition());
+                        scce.addException(invalidMandatoryCondition);
+                    }
 
-        if (itemTO.getIntAttrName() == null) {
-            if (IntMappingType.getEmbedded().contains(itemTO.getIntMappingType())) {
-                itemTO.setIntAttrName(itemTO.getIntMappingType().toString());
-            } else {
-                requiredValuesMissing.getElements().add("intAttrName");
+                    MappingItem item = SerializationUtils.clone(prototype);
+                    BeanUtils.copyProperties(itemTO, item, MAPPINGITEM_IGNORE_PROPERTIES);
+                    item.setMapping(mapping);
+                    if (item.isConnObjectKey()) {
+                        mapping.setConnObjectKeyItem(item);
+                    } else {
+                        mapping.add(item);
+                    }
+                } else {
+                    LOG.error("{} not allowed", itemTO.getIntAttrName());
+                    invalidMapping.getElements().add(itemTO.getIntAttrName() + " not allowed");
+                }
             }
         }
 
-        // Throw composite exception if there is at least one element set in the composing exceptions
-        if (!requiredValuesMissing.isEmpty()) {
-            scce.addException(requiredValuesMissing);
+        if (!invalidMapping.getElements().isEmpty()) {
+            scce.addException(invalidMapping);
         }
-
-        // no mandatory condition implies mandatory condition false
-        if (!JexlUtils.isExpressionValid(itemTO.getMandatoryCondition() == null
-                ? "false" : itemTO.getMandatoryCondition())) {
-
-            SyncopeClientException invalidMandatoryCondition = SyncopeClientException.build(
-                    ClientExceptionType.InvalidValues);
-            invalidMandatoryCondition.getElements().add(itemTO.getMandatoryCondition());
-            scce.addException(invalidMandatoryCondition);
-        }
-
         if (scce.hasExceptions()) {
             throw scce;
         }
-
-        MappingItem item = SerializationUtils.clone(prototype);
-        BeanUtils.copyProperties(itemTO, item, MAPPINGITEM_IGNORE_PROPERTIES);
-        return item;
     }
 
     private void populateMappingTO(final Mapping mapping, final MappingTO mappingTO) {
@@ -308,6 +378,8 @@ public class ResourceDataBinderImpl implements ResourceDataBinder {
             provisionTO.setKey(provision.getKey());
             provisionTO.setAnyType(provision.getAnyType().getKey());
             provisionTO.setObjectClass(provision.getObjectClass().getObjectClassValue());
+            provisionTO.getAuxClasses().addAll(CollectionUtils.collect(
+                    provision.getAuxClasses(), EntityUtils.<String, AnyTypeClass>keyTransformer()));
             provisionTO.setSyncToken(provision.getSerializedSyncToken());
 
             if (provision.getMapping() != null) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/fit/core-reference/src/test/java/org/apache/syncope/fit/console/TopologyITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/TopologyITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/TopologyITCase.java
index ef0f7c6..edfcf04 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/TopologyITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/TopologyITCase.java
@@ -65,7 +65,7 @@ public class TopologyITCase extends AbstractConsoleITCase {
     @Test
     public void editProvisioning() {
         wicketTester.clickLink("body:topologyLI:topology");
-        
+
         Component component = findComponentByProp("key", "body:resources", "ws-target-resource-1");
         assertNotNull(component);
         wicketTester.executeAjaxEvent(component.getPageRelativePath() + ":res", Constants.ON_CLICK);
@@ -77,6 +77,11 @@ public class TopologyITCase extends AbstractConsoleITCase {
         wicketTester.clickLink("body:toggle:outerObjectsRepeater:0:outer:form:content:tabbedPanel:panel:container:"
                 + "content:group:beans:0:actions:panelMapping:mappingLink");
 
+        FormTester formTester = wicketTester.newFormTester(
+                "body:toggle:outerObjectsRepeater:0:outer:form:content:tabbedPanel:panel:container:"
+                + "content:wizard:form");
+        formTester.submit("buttons:next");
+
         wicketTester.assertComponent("body:toggle:outerObjectsRepeater:0:outer:form:content:tabbedPanel:panel:"
                 + "container:content:wizard:form:view:mapping:mappingContainer:mappings:1", WebMarkupContainer.class);
     }
@@ -101,7 +106,7 @@ public class TopologyITCase extends AbstractConsoleITCase {
     @Test
     public void editPushTask() {
         wicketTester.clickLink("body:topologyLI:topology");
-        
+
         Component component = findComponentByProp("key", "body:resources", "resource-ldap");
         assertNotNull(component);
         wicketTester.executeAjaxEvent(component.getPageRelativePath() + ":res", Constants.ON_CLICK);
@@ -110,10 +115,9 @@ public class TopologyITCase extends AbstractConsoleITCase {
                 + "first:container:content:searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable:"
                 + "body:rows:1:cells:9:cell:panelEdit:editLink");
 
-        final FormTester formTester = wicketTester.newFormTester(
+        FormTester formTester = wicketTester.newFormTester(
                 "body:toggle:outerObjectsRepeater:1:outer:form:content:"
                 + "tasks:firstLevelContainer:first:container:content:wizard:form");
-
         formTester.setValue("view:description:textField", "test");
         formTester.submit("buttons:finish");
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PushTaskITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PushTaskITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PushTaskITCase.java
index 90c98e8..0c7f380 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PushTaskITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PushTaskITCase.java
@@ -261,7 +261,7 @@ public class PushTaskITCase extends AbstractTaskITCase {
         assertNotNull(schemaTO);
 
         AnyTypeClassTO typeClass = new AnyTypeClassTO();
-        typeClass.setKey("SYNCOPE-598");
+        typeClass.setKey("SYNCOPE-598" + getUUIDString());
         typeClass.getPlainSchemas().add(schemaTO.getKey());
         anyTypeClassService.create(typeClass);
 
@@ -288,6 +288,7 @@ public class PushTaskITCase extends AbstractTaskITCase {
             ProvisionTO provisionTO = new ProvisionTO();
             provisionTO.setAnyType(AnyTypeKind.GROUP.name());
             provisionTO.setObjectClass(ObjectClass.GROUP_NAME);
+            provisionTO.getAuxClasses().add(typeClass.getKey());
             resourceTO.getProvisions().add(provisionTO);
 
             MappingTO mapping = new MappingTO();

http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ResourceITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ResourceITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ResourceITCase.java
index b3010ff..e9923ef 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ResourceITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ResourceITCase.java
@@ -93,9 +93,9 @@ public class ResourceITCase extends AbstractITCase {
         item = new MappingItemTO();
         item.setExtAttrName("fullname");
         item.setIntAttrName("cn");
-        item.setIntMappingType(IntMappingType.UserPlainSchema);
+        item.setIntMappingType(IntMappingType.UserDerivedSchema);
         item.setConnObjectKey(false);
-        item.setPurpose(MappingPurpose.BOTH);
+        item.setPurpose(MappingPurpose.PROPAGATION);
         mapping.add(item);
 
         return resourceTO;
@@ -153,9 +153,9 @@ public class ResourceITCase extends AbstractITCase {
         item = new MappingItemTO();
         item.setExtAttrName("fullname");
         item.setIntAttrName("cn");
-        item.setIntMappingType(IntMappingType.UserPlainSchema);
+        item.setIntMappingType(IntMappingType.UserDerivedSchema);
         item.setConnObjectKey(false);
-        item.setPurpose(MappingPurpose.BOTH);
+        item.setPurpose(MappingPurpose.PROPAGATION);
         mapping.add(item);
 
         resourceTO.setKey(resourceName);
@@ -262,8 +262,10 @@ public class ResourceITCase extends AbstractITCase {
             createResource(resourceTO);
             fail("Create should not have worked");
         } catch (SyncopeClientException e) {
-            assertEquals(ClientExceptionType.RequiredValuesMissing, e.getType());
-            assertEquals("intAttrName", e.getElements().iterator().next());
+            assertEquals(ClientExceptionType.Composite, e.getType());
+            SyncopeClientException rvm = e.asComposite().getException(ClientExceptionType.RequiredValuesMissing);
+            assertNotNull(rvm);
+            assertEquals("intAttrName", rvm.getElements().iterator().next());
         }
     }
 
@@ -644,7 +646,6 @@ public class ResourceITCase extends AbstractITCase {
             fail();
         } catch (SyncopeClientException e) {
             assertEquals(ClientExceptionType.InvalidExternalResource, e.getType());
-
             assertTrue(e.getElements().iterator().next().contains(EntityViolationType.InvalidName.name()));
         }
     }


[2/3] syncope git commit: [SYNCOPE-806] Resource provisioning validated, and management of aux classes in Provision instances added

Posted by il...@apache.org.
http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/fit/core-reference/src/test/java/org/apache/syncope/fit/core/VirAttrITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/VirAttrITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/VirAttrITCase.java
index 25434e9..b51670b 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/VirAttrITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/VirAttrITCase.java
@@ -455,6 +455,35 @@ public class VirAttrITCase extends AbstractITCase {
 
         try {
             // -------------------------------------------
+            // Create a VirAttrITCase ad-hoc
+            // -------------------------------------------
+            VirSchemaTO rvirtualdata;
+            try {
+                rvirtualdata = schemaService.read(SchemaType.VIRTUAL, "rvirtualdata");
+            } catch (SyncopeClientException e) {
+                LOG.warn("rvirtualdata not found, re-creating", e);
+
+                rvirtualdata = new VirSchemaTO();
+                rvirtualdata.setKey("rvirtualdata");
+                rvirtualdata.setExtAttrName("businessCategory");
+                rvirtualdata.setProvision(20);
+
+                rvirtualdata = createSchema(SchemaType.VIRTUAL, rvirtualdata);
+            }
+            assertNotNull(rvirtualdata);
+
+            if (!"minimal group".equals(rvirtualdata.getAnyTypeClass())) {
+                LOG.warn("rvirtualdata not in minimal group, restoring");
+
+                AnyTypeClassTO minimalGroup = anyTypeClassService.read("minimal group");
+                minimalGroup.getVirSchemas().add(rvirtualdata.getKey());
+                anyTypeClassService.update(minimalGroup);
+
+                rvirtualdata = schemaService.read(SchemaType.VIRTUAL, rvirtualdata.getKey());
+                assertEquals("minimal group", rvirtualdata.getAnyTypeClass());
+            }
+
+            // -------------------------------------------
             // Create a resource ad-hoc
             // -------------------------------------------
             ResourceTO resourceTO = new ResourceTO();
@@ -465,6 +494,7 @@ public class VirAttrITCase extends AbstractITCase {
             ProvisionTO provisionTO = new ProvisionTO();
             provisionTO.setAnyType(AnyTypeKind.USER.name());
             provisionTO.setObjectClass(ObjectClass.ACCOUNT_NAME);
+            provisionTO.getAuxClasses().add("minimal group");
             resourceTO.getProvisions().add(provisionTO);
 
             MappingTO mapping = new MappingTO();
@@ -495,34 +525,6 @@ public class VirAttrITCase extends AbstractITCase {
             assertNotNull(getObject(
                     resourceService.create(resourceTO).getLocation(), ResourceService.class, ResourceTO.class));
             // -------------------------------------------
-            // -------------------------------------------
-            // Create a VirAttrITCase ad-hoc
-            // -------------------------------------------
-            VirSchemaTO rvirtualdata;
-            try {
-                rvirtualdata = schemaService.read(SchemaType.VIRTUAL, "rvirtualdata");
-            } catch (SyncopeClientException e) {
-                LOG.warn("rvirtualdata not found, re-creating", e);
-
-                rvirtualdata = new VirSchemaTO();
-                rvirtualdata.setKey("rvirtualdata");
-                rvirtualdata.setExtAttrName("businessCategory");
-                rvirtualdata.setProvision(20);
-
-                rvirtualdata = createSchema(SchemaType.VIRTUAL, rvirtualdata);
-            }
-            assertNotNull(rvirtualdata);
-
-            if (!"minimal group".equals(rvirtualdata.getAnyTypeClass())) {
-                LOG.warn("rvirtualdata not in minimal group, restoring");
-
-                AnyTypeClassTO minimalGroup = anyTypeClassService.read("minimal group");
-                minimalGroup.getVirSchemas().add(rvirtualdata.getKey());
-                anyTypeClassService.update(minimalGroup);
-
-                rvirtualdata = schemaService.read(SchemaType.VIRTUAL, rvirtualdata.getKey());
-                assertEquals("minimal group", rvirtualdata.getAnyTypeClass());
-            }
 
             GroupTO groupTO = new GroupTO();
             groupTO.setName(groupName);