You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by fm...@apache.org on 2016/03/11 17:12:06 UTC

syncope git commit: [SYNCOPE-774] fixes the issue by improving feature

Repository: syncope
Updated Branches:
  refs/heads/master 61a7fdd38 -> 3c19e3515


[SYNCOPE-774] fixes the issue by improving feature


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

Branch: refs/heads/master
Commit: 3c19e35153170af40169fd1d42bcc2551dc73190
Parents: 61a7fdd
Author: fmartelli <fa...@gmail.com>
Authored: Fri Mar 11 17:11:53 2016 +0100
Committer: fmartelli <fa...@gmail.com>
Committed: Fri Mar 11 17:11:53 2016 +0100

----------------------------------------------------------------------
 .../client/console/panels/ListViewPanel.java    |  33 +-
 .../console/panels/ResourceDetailsPanel.java    |   6 +-
 .../console/panels/ResourceMappingPanel.java    | 318 ++++++++++++-------
 .../client/console/panels/ResourceModal.java    |  39 ++-
 .../provision/ProvisionWizardBuilder.java       |   3 +-
 .../META-INF/resources/css/syncopeConsole.css   |   2 +-
 .../console/panels/ResourceDetailsPanel.html    |   2 +-
 .../src/test/resources/core-rebel.xml           |   2 +-
 .../syncope/fit/console/TopologyITCase.java     |  16 +
 9 files changed, 289 insertions(+), 132 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/3c19e351/client/console/src/main/java/org/apache/syncope/client/console/panels/ListViewPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ListViewPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ListViewPanel.java
index ebc0b18..e15b151 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ListViewPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ListViewPanel.java
@@ -25,6 +25,8 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
+import org.apache.commons.collections4.IteratorUtils;
+import org.apache.commons.collections4.Predicate;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
 import org.apache.syncope.client.console.wicket.markup.html.form.ActionLinksPanel;
@@ -76,6 +78,8 @@ public abstract class ListViewPanel<T extends Serializable> extends WizardMgtPan
 
     private final Model<CheckAvailability> check;
 
+    private final ListView<T> beans;
+
     private final List<T> listOfItems;
 
     /**
@@ -148,7 +152,7 @@ public abstract class ListViewPanel<T extends Serializable> extends WizardMgtPan
 
         addInnerObject(header(toBeIncluded));
 
-        final ListView<T> beans = new ListView<T>("beans", listOfItems) {
+        beans = new ListView<T>("beans", listOfItems) {
 
             private static final long serialVersionUID = 1L;
 
@@ -335,6 +339,18 @@ public abstract class ListViewPanel<T extends Serializable> extends WizardMgtPan
                     : new Label("field", new ResourceModel(value.toString(), value.toString()));
         }
 
+        protected T getActualItem(final T item, final List<T> list) {
+            return item == null
+                    ? null
+                    : IteratorUtils.find(list.iterator(), new Predicate<T>() {
+
+                        @Override
+                        public boolean evaluate(final T object) {
+                            return item.equals(object);
+                        }
+                    });
+        }
+
         @Override
         protected WizardMgtPanel<T> newInstance(final String id) {
             return new ListViewPanel<T>(id, items, reference, includes, actions, check, reuseItem, model) {
@@ -346,6 +362,10 @@ public abstract class ListViewPanel<T extends Serializable> extends WizardMgtPan
                     return Builder.this.getValueComponent(key, bean);
                 }
 
+                @Override
+                protected T getActualItem(final T item, final List<T> list) {
+                    return Builder.this.getActualItem(item, list);
+                }
             };
         }
     }
@@ -354,14 +374,17 @@ public abstract class ListViewPanel<T extends Serializable> extends WizardMgtPan
     @SuppressWarnings("unchecked")
     public void onEvent(final IEvent<?> event) {
         if (event.getPayload() instanceof AjaxWizard.NewItemEvent) {
-
             final T item = ((AjaxWizard.NewItemEvent<T>) event.getPayload()).getItem();
             final AjaxRequestTarget target = ((AjaxWizard.NewItemEvent<T>) event.getPayload()).getTarget();
 
             if (event.getPayload() instanceof AjaxWizard.NewItemFinishEvent) {
-                if (item != null && !this.listOfItems.contains(item)) {
-                    this.listOfItems.add(item);
+                final T old = getActualItem(item, ListViewPanel.this.listOfItems);
+                int indexOf = ListViewPanel.this.listOfItems.size();
+                if (old != null) {
+                    indexOf = ListViewPanel.this.listOfItems.indexOf(old);
+                    ListViewPanel.this.listOfItems.remove(old);
                 }
+                ListViewPanel.this.listOfItems.add(indexOf, item);
             }
 
             target.add(ListViewPanel.this);
@@ -373,6 +396,8 @@ public abstract class ListViewPanel<T extends Serializable> extends WizardMgtPan
         }
     }
 
+    protected abstract T getActualItem(final T item, final List<T> list);
+
     public static class ListViewReload {
 
         private final AjaxRequestTarget target;

http://git-wip-us.apache.org/repos/asf/syncope/blob/3c19e351/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceDetailsPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceDetailsPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceDetailsPanel.java
index 06055f4..b044ed0 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceDetailsPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceDetailsPanel.java
@@ -106,9 +106,9 @@ public class ResourceDetailsPanel extends Panel {
                 setChoices(Arrays.asList(TraceLevel.values())));
 
         container.add(new AjaxDropDownChoicePanel<>(
-                "syncTraceLevel",
-                new ResourceModel("syncTraceLevel", "syncTraceLevel").getObject(),
-                new PropertyModel<TraceLevel>(model, "syncTraceLevel"),
+                "pullTraceLevel",
+                new ResourceModel("pullTraceLevel", "pullTraceLevel").getObject(),
+                new PropertyModel<TraceLevel>(model, "pullTraceLevel"),
                 false).
                 setChoices(Arrays.asList(TraceLevel.values())));
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/3c19e351/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 24fda22..935b800 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
@@ -21,23 +21,29 @@ package org.apache.syncope.client.console.panels;
 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;
 import org.apache.syncope.client.console.commons.Constants;
 import org.apache.syncope.client.console.commons.JexlHelpUtils;
+import org.apache.syncope.client.console.rest.AnyTypeClassRestClient;
+import org.apache.syncope.client.console.rest.AnyTypeRestClient;
 import org.apache.syncope.client.console.rest.ConnectorRestClient;
-import org.apache.syncope.client.console.rest.SchemaRestClient;
 import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
 import org.apache.syncope.client.console.wicket.markup.html.form.ActionLinksPanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxCheckBoxPanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxDropDownChoicePanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxTextFieldPanel;
-import org.apache.syncope.client.console.wicket.markup.html.form.FieldPanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.MappingPurposePanel;
+import org.apache.syncope.common.lib.to.AnyTypeClassTO;
+import org.apache.syncope.common.lib.to.AnyTypeTO;
 import org.apache.syncope.common.lib.to.ConnIdObjectClassTO;
 import org.apache.syncope.common.lib.to.ConnInstanceTO;
 import org.apache.syncope.common.lib.to.MappingItemTO;
@@ -77,9 +83,14 @@ public class ResourceMappingPanel extends Panel {
     private static final String DEF_FIELD_STYLE = "";
 
     /**
-     * Schema rest client.
+     * Any type rest client.
      */
-    private final SchemaRestClient schemaRestClient = new SchemaRestClient();
+    private final AnyTypeRestClient anyTypeRestClient = new AnyTypeRestClient();
+
+    /**
+     * Any type class rest client.
+     */
+    private final AnyTypeClassRestClient anyTypeClassRestClient = new AnyTypeClassRestClient();
 
     /**
      * ConnInstance rest client.
@@ -217,10 +228,127 @@ public class ResourceMappingPanel extends Panel {
                 }
 
                 AnyTypeKind entity = null;
-                if (mapItem.getIntMappingType() != null) {
+                if (provisionTO.getAnyType().equals(AnyTypeKind.GROUP.name())) {
+                    // support for clone
+                    entity = AnyTypeKind.GROUP;
+                } else if (mapItem.getIntMappingType() != null) {
                     entity = mapItem.getIntMappingType().getAnyTypeKind();
                 }
 
+                // it will happen just in case of clone to create a new mapping for group object
+                if (mapItem.getIntMappingType() != null && mapItem.getIntMappingType().getAnyTypeKind() != entity) {
+                    mapItem.setIntMappingType(null);
+                    mapItem.setIntAttrName(null);
+                }
+
+                //--------------------------------
+                // Entity
+                // -------------------------------
+                final AjaxDropDownChoicePanel<AnyTypeKind> entitiesPanel = new AjaxDropDownChoicePanel<>(
+                        "entities",
+                        new ResourceModel("entities", "entities").getObject(),
+                        new Model<>(entity));
+
+                entitiesPanel.hideLabel();
+                entitiesPanel.setChoices(provisionTO.getAnyType().equals(AnyTypeKind.GROUP.name())
+                        ? Collections.<AnyTypeKind>singletonList(AnyTypeKind.GROUP)
+                        : Arrays.asList(AnyTypeKind.values()));
+
+                entitiesPanel.setStyleSheet(false, DEF_FIELD_STYLE);
+                item.add(entitiesPanel);
+                // -------------------------------
+
+                //--------------------------------
+                // Internal attribute type
+                // -------------------------------
+                final List<IntMappingType> attrTypes = new ArrayList<>(getAttributeTypes(entity));
+                final AjaxDropDownChoicePanel<IntMappingType> intMappingTypes = new AjaxDropDownChoicePanel<>(
+                        "intMappingTypes",
+                        new ResourceModel("intMappingTypes", "intMappingTypes").getObject(),
+                        new PropertyModel<IntMappingType>(mapItem, "intMappingType"),
+                        false);
+                intMappingTypes.setNullValid(true).setRequired(true).hideLabel();
+                intMappingTypes.setChoices(attrTypes);
+                item.add(intMappingTypes);
+                // -------------------------------
+
+                //--------------------------------
+                // Internal attribute
+                // -------------------------------
+                final AjaxDropDownChoicePanel<String> intAttrNames = new AjaxDropDownChoicePanel<>(
+                        "intAttrNames",
+                        getString("intAttrNames"),
+                        new PropertyModel<String>(mapItem, "intAttrName"),
+                        false);
+                intAttrNames.setChoices(Collections.<String>emptyList());
+                intAttrNames.setNullValid(true).setRequired(true).hideLabel();
+                item.add(intAttrNames);
+                // -------------------------------
+
+                //--------------------------------
+                // External attribute
+                // -------------------------------
+                final AjaxTextFieldPanel extAttrNames = new AjaxTextFieldPanel(
+                        "extAttrName",
+                        new ResourceModel("extAttrNames", "extAttrNames").getObject(),
+                        new PropertyModel<String>(mapItem, "extAttrName"));
+                extAttrNames.setChoices(schemaNames);
+
+                boolean required = !mapItem.isPassword();
+                extAttrNames.setRequired(required).hideLabel();
+                extAttrNames.setEnabled(required);
+                item.add(extAttrNames);
+                // -------------------------------
+
+                //--------------------------------
+                // Mandatory
+                // -------------------------------
+                final AjaxTextFieldPanel mandatory = new AjaxTextFieldPanel(
+                        "mandatoryCondition",
+                        new ResourceModel("mandatoryCondition", "mandatoryCondition").getObject(),
+                        new PropertyModel<String>(mapItem, "mandatoryCondition"));
+                mandatory.hideLabel();
+                mandatory.setChoices(Arrays.asList(new String[] { "true", "false" }));
+                item.add(mandatory);
+                // -------------------------------
+
+                //--------------------------------
+                // Connector object key
+                // -------------------------------
+                final AjaxCheckBoxPanel connObjectKey = new AjaxCheckBoxPanel(
+                        "connObjectKey",
+                        new ResourceModel("connObjectKey", "connObjectKey").getObject(),
+                        new PropertyModel<Boolean>(mapItem, "connObjectKey"), false);
+                connObjectKey.hideLabel();
+                item.add(connObjectKey);
+                // -------------------------------
+
+                //--------------------------------
+                // Password
+                // -------------------------------
+                final AjaxCheckBoxPanel password = new AjaxCheckBoxPanel(
+                        "password",
+                        new ResourceModel("password", "password").getObject(),
+                        new PropertyModel<Boolean>(mapItem, "password"), false);
+                item.add(password.hideLabel());
+                // -------------------------------
+
+                //--------------------------------
+                // Purpose
+                // -------------------------------
+                final WebMarkupContainer purpose = new WebMarkupContainer("purpose");
+                purpose.setOutputMarkupId(Boolean.TRUE);
+
+                final MappingPurposePanel panel = new MappingPurposePanel(
+                        "purposeActions", new PropertyModel<MappingPurpose>(mapItem, "purpose"), purpose);
+
+                purpose.add(panel.setRenderBodyOnly(true));
+                item.add(purpose);
+                // -------------------------------
+
+                //--------------------------------
+                // Remove
+                // -------------------------------
                 final ActionLinksPanel.Builder<Serializable> actions = ActionLinksPanel.builder();
                 actions.add(new ActionLink<Serializable>() {
 
@@ -242,47 +370,8 @@ public class ResourceMappingPanel extends Panel {
                         }
                     }
                 }, ActionLink.ActionType.DELETE, StandardEntitlement.RESOURCE_UPDATE);
-
                 item.add(actions.build("toRemove"));
-
-                final AjaxDropDownChoicePanel<String> intAttrNames = new AjaxDropDownChoicePanel<>(
-                        "intAttrNames",
-                        getString("intAttrNames"),
-                        new PropertyModel<String>(mapItem, "intAttrName"),
-                        false);
-                intAttrNames.setChoices(schemaNames);
-                intAttrNames.setRequired(true).hideLabel();
-
-                intAttrNames.getField().add(new AjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
-
-                    private static final long serialVersionUID = -1107858522700306810L;
-
-                    @Override
-                    protected void onUpdate(final AjaxRequestTarget target) {
-                    }
-                });
-                item.add(intAttrNames);
-
-                final List<IntMappingType> attrTypes = new ArrayList<>(getAttributeTypes(entity));
-                final AjaxDropDownChoicePanel<IntMappingType> intMappingTypes = new AjaxDropDownChoicePanel<>(
-                        "intMappingTypes",
-                        new ResourceModel("intMappingTypes", "intMappingTypes").getObject(),
-                        new PropertyModel<IntMappingType>(mapItem, "intMappingType"));
-                intMappingTypes.setRequired(true).hideLabel();
-                intMappingTypes.setChoices(attrTypes);
-                item.add(intMappingTypes);
-
-                final AjaxDropDownChoicePanel<AnyTypeKind> entitiesPanel = new AjaxDropDownChoicePanel<>(
-                        "entities",
-                        new ResourceModel("entities", "entities").getObject(),
-                        new Model<>(entity));
-
-                entitiesPanel.hideLabel();
-                entitiesPanel.setChoices(provisionTO.getAnyType().equals(AnyTypeKind.GROUP.name())
-                        ? Collections.<AnyTypeKind>singletonList(AnyTypeKind.GROUP)
-                        : Arrays.asList(AnyTypeKind.values()));
-
-                entitiesPanel.setStyleSheet(false, DEF_FIELD_STYLE);
+                // -------------------------------
 
                 entitiesPanel.getField().add(new AjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
 
@@ -300,38 +389,30 @@ public class ResourceMappingPanel extends Panel {
                         target.add(intAttrNames);
                     }
                 });
-                item.add(entitiesPanel);
 
-                final FieldPanel<String> extAttrNames = new AjaxTextFieldPanel(
-                        "extAttrName",
-                        new ResourceModel("extAttrNames", "extAttrNames").getObject(),
-                        new PropertyModel<String>(mapItem, "extAttrName"));
-                ((AjaxTextFieldPanel) extAttrNames).setChoices(schemaNames);
+                intMappingTypes.getField().add(new AjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
 
-                boolean required = false;
-                if (mapItem.isPassword()) {
-                    ((AjaxTextFieldPanel) extAttrNames).setModelObject(null);
-                } else {
-                    required = true;
-                }
-                extAttrNames.setRequired(required).hideLabel();
-                extAttrNames.setEnabled(required);
-                item.add(extAttrNames);
+                    private static final long serialVersionUID = -1107858522700306810L;
 
-                final AjaxTextFieldPanel mandatory = new AjaxTextFieldPanel(
-                        "mandatoryCondition",
-                        new ResourceModel("mandatoryCondition", "mandatoryCondition").getObject(),
-                        new PropertyModel<String>(mapItem, "mandatoryCondition"));
-                mandatory.hideLabel();
-                mandatory.setChoices(Arrays.asList(new String[] { "true", "false" }));
-                item.add(mandatory);
+                    @Override
+                    protected void onUpdate(final AjaxRequestTarget target) {
+                        setAttrNames(intMappingTypes.getModelObject(), intAttrNames);
+                        target.add(intAttrNames);
 
-                final AjaxCheckBoxPanel connObjectKey = new AjaxCheckBoxPanel(
-                        "connObjectKey",
-                        new ResourceModel("connObjectKey", "connObjectKey").getObject(),
-                        new PropertyModel<Boolean>(mapItem, "connObjectKey"));
+                        setConnObjectKey(intMappingTypes.getModelObject(), connObjectKey, password);
+                        target.add(connObjectKey);
+                    }
+                });
+
+                intAttrNames.getField().add(new AjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
+
+                    private static final long serialVersionUID = -1107858522700306810L;
+
+                    @Override
+                    protected void onUpdate(final AjaxRequestTarget target) {
+                    }
+                });
 
-                connObjectKey.hideLabel();
                 connObjectKey.getField().add(new AjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
 
                     private static final long serialVersionUID = -1107858522700306810L;
@@ -348,14 +429,7 @@ public class ResourceMappingPanel extends Panel {
                         target.add(mandatory);
                     }
                 });
-                item.add(connObjectKey);
-
-                final AjaxCheckBoxPanel password = new AjaxCheckBoxPanel(
-                        "password",
-                        new ResourceModel("password", "password").getObject(),
-                        new PropertyModel<Boolean>(mapItem, "password"));
 
-                password.hideLabel();
                 password.getField().add(new AjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
 
                     private static final long serialVersionUID = -1107858522700306810L;
@@ -363,7 +437,8 @@ public class ResourceMappingPanel extends Panel {
                     @Override
                     protected void onUpdate(final AjaxRequestTarget target) {
                         extAttrNames.setEnabled(!mapItem.isConnObjectKey() && !password.getModelObject());
-                        extAttrNames.setModelObject(null);
+                        extAttrNames.setModelObject(password.getModelObject()
+                                ? ConnIdSpecialAttributeName.PASSWORD : extAttrNames.getModelObject());
                         extAttrNames.setRequired(!password.getModelObject());
                         target.add(extAttrNames);
 
@@ -371,37 +446,21 @@ public class ResourceMappingPanel extends Panel {
                         target.add(connObjectKey);
                     }
                 });
-                item.add(password);
-                if (!AnyTypeKind.USER.name().equals(provisionTO.getAnyType())) {
-                    password.setVisible(false);
-                }
-
-                final WebMarkupContainer purpose = new WebMarkupContainer("purpose");
-                purpose.setOutputMarkupId(Boolean.TRUE);
 
-                final MappingPurposePanel panel = new MappingPurposePanel(
-                        "purposeActions", new PropertyModel<MappingPurpose>(mapItem, "purpose"), purpose);
-
-                purpose.add(panel.setRenderBodyOnly(true));
-
-                item.add(purpose);
-
-                intMappingTypes.getField().add(new AjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
-
-                    private static final long serialVersionUID = -1107858522700306810L;
+                setAttrNames(mapItem.getIntMappingType(), intAttrNames);
+                setConnObjectKey(mapItem.getIntMappingType(), connObjectKey, password);
 
-                    @Override
-                    protected void onUpdate(final AjaxRequestTarget target) {
-                        setAttrNames(intMappingTypes.getModelObject(), intAttrNames);
-                        target.add(intAttrNames);
+                if (!AnyTypeKind.USER.name().equals(provisionTO.getAnyType())) {
+                    password.setVisible(false);
 
-                        setConnObjectKey(intMappingTypes.getModelObject(), connObjectKey, password);
-                        target.add(connObjectKey);
+                    // Changes required by clone ....
+                    extAttrNames.setEnabled(!mapItem.isConnObjectKey());
+                    if (mapItem.isPassword()) {
+                        // re-enable if and only if cloned objec mapping item was a password
+                        intAttrNames.setEnabled(true);
                     }
-                });
-
-                setAttrNames(mapItem.getIntMappingType(), intAttrNames);
-                setConnObjectKey(mapItem.getIntMappingType(), connObjectKey, password);
+                    mapItem.setPassword(false);
+                }
             }
         };
 
@@ -443,8 +502,9 @@ public class ResourceMappingPanel extends Panel {
 
                     @Override
                     public boolean evaluate(final String object) {
-                        return !("__NAME__".equals(object) || "__ENABLE__".equals(object)
-                                || "__PASSWORD__".equals(object));
+                        return !(ConnIdSpecialAttributeName.NAME.equals(object)
+                                || ConnIdSpecialAttributeName.ENABLE.equals(object)
+                                || ConnIdSpecialAttributeName.PASSWORD.equals(object));
                     }
                 }));
     }
@@ -472,30 +532,60 @@ 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()));
+
+            final List<AnyTypeClassTO> anyTypeClassTOs = new ArrayList<>();
+            for (AnyTypeTO anyTypeTO : anyTypeTOs) {
+                anyTypeClassTOs.addAll(anyTypeClassRestClient.list(anyTypeTO.getClasses()));
+            }
+
+            List<String> choices;
+
             switch (type) {
                 // user attribute names
                 case UserPlainSchema:
                 case GroupPlainSchema:
                 case AnyObjectPlainSchema:
-                    toBeUpdated.setChoices(schemaRestClient.getPlainSchemaNames());
+                    final Set<String> plains = new HashSet<>();
+                    for (AnyTypeClassTO anyTypeClassTO : anyTypeClassTOs) {
+                        plains.addAll(anyTypeClassTO.getPlainSchemas());
+                    }
+                    choices = new ArrayList<>(plains);
                     break;
 
                 case UserDerivedSchema:
                 case GroupDerivedSchema:
                 case AnyObjectDerivedSchema:
-                    toBeUpdated.setChoices(schemaRestClient.getDerSchemaNames());
+                    final Set<String> deriveds = new HashSet<>();
+                    for (AnyTypeClassTO anyTypeClassTO : anyTypeClassTOs) {
+                        deriveds.addAll(anyTypeClassTO.getDerSchemas());
+                    }
+                    choices = new ArrayList<>(deriveds);
                     break;
 
                 case UserVirtualSchema:
                 case GroupVirtualSchema:
                 case AnyObjectVirtualSchema:
-                    toBeUpdated.setChoices(schemaRestClient.getVirSchemaNames());
+                    final Set<String> virtuals = new HashSet<>();
+                    for (AnyTypeClassTO anyTypeClassTO : anyTypeClassTOs) {
+                        virtuals.addAll(anyTypeClassTO.getVirSchemas());
+                    }
+                    choices = new ArrayList<>(virtuals);
                     break;
 
                 case UserKey:
@@ -507,8 +597,10 @@ public class ResourceMappingPanel extends Panel {
                 default:
                     toBeUpdated.setRequired(false);
                     toBeUpdated.setEnabled(false);
-                    toBeUpdated.setChoices(Collections.<String>emptyList());
+                    choices = Collections.<String>emptyList();
             }
+            Collections.sort(choices);
+            toBeUpdated.setChoices(choices);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/3c19e351/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 b3405b7..f9ebc9b 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
@@ -21,7 +21,9 @@ package org.apache.syncope.client.console.panels;
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.List;
 import org.apache.commons.collections4.IterableUtils;
+import org.apache.commons.collections4.IteratorUtils;
 import org.apache.commons.collections4.Predicate;
 import org.apache.commons.lang3.SerializationUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -90,9 +92,31 @@ public class ResourceModal<T extends Serializable> extends AbstractResourceModal
         //--------------------------------
         // Resource provision panels
         //--------------------------------
-        final ListViewPanel.Builder<ProvisionTO> builder = new ListViewPanel.Builder<>(ProvisionTO.class, pageRef);
+        final ListViewPanel.Builder<ProvisionTO> builder
+                = new ListViewPanel.Builder<ProvisionTO>(ProvisionTO.class, pageRef) {
+
+            private static final long serialVersionUID = 4907732721283972943L;
+
+            @Override
+            protected ProvisionTO getActualItem(final ProvisionTO item, final List<ProvisionTO> list) {
+                return item == null
+                        ? null
+                        : IteratorUtils.find(list.iterator(), new Predicate<ProvisionTO>() {
+
+                            @Override
+                            public boolean evaluate(final ProvisionTO in) {
+                                return ((item.getKey() == null && in.getKey() == null)
+                                        || (in.getKey() != null && in.getKey().equals(item.getKey())))
+                                        && ((item.getAnyType() == null && in.getAnyType() == null)
+                                        || (in.getAnyType() != null && in.getAnyType().equals(item.getAnyType())));
+                            }
+                        });
+            }
+        };
+
         builder.setItems(model.getObject().getProvisions());
         builder.includes("anyType", "objectClass");
+        builder.setReuseItem(false);
 
         builder.
                 addAction(new ActionLink<ProvisionTO>() {
@@ -122,8 +146,7 @@ public class ResourceModal<T extends Serializable> extends AbstractResourceModal
                     @Override
                     public void onClick(final AjaxRequestTarget target, final ProvisionTO provisionTO) {
                         provisionTO.setSyncToken(null);
-                        send(pageRef.getPage(), Broadcast.DEPTH,
-                                new AjaxWizard.NewItemFinishEvent<>(provisionTO, target));
+                        send(pageRef.getPage(), Broadcast.DEPTH, new ListViewPanel.ListViewReload(target));
                     }
                 }, ActionLink.ActionType.RESET_TIME, StandardEntitlement.RESOURCE_UPDATE).
                 addAction(new ActionLink<ProvisionTO>() {
@@ -132,8 +155,11 @@ public class ResourceModal<T extends Serializable> extends AbstractResourceModal
 
                     @Override
                     public void onClick(final AjaxRequestTarget target, final ProvisionTO provisionTO) {
-                        send(pageRef.getPage(), Broadcast.DEPTH,
-                                new AjaxWizard.NewItemActionEvent<>(SerializationUtils.clone(provisionTO), target));
+                        final ProvisionTO clone = SerializationUtils.clone(provisionTO);
+                        clone.setKey(0L);
+                        clone.setAnyType(null);
+                        clone.setObjectClass(null);
+                        send(pageRef.getPage(), Broadcast.DEPTH, new AjaxWizard.NewItemActionEvent<>(clone, target));
                     }
                 }, ActionLink.ActionType.CLONE, StandardEntitlement.RESOURCE_CREATE).
                 addAction(new ActionLink<ProvisionTO>() {
@@ -143,8 +169,7 @@ public class ResourceModal<T extends Serializable> extends AbstractResourceModal
                     @Override
                     public void onClick(final AjaxRequestTarget target, final ProvisionTO provisionTO) {
                         model.getObject().getProvisions().remove(provisionTO);
-                        send(pageRef.getPage(), Broadcast.DEPTH,
-                                new AjaxWizard.NewItemFinishEvent<ProvisionTO>(null, target));
+                        send(pageRef.getPage(), Broadcast.DEPTH, new ListViewPanel.ListViewReload(target));
                     }
                 }, ActionLink.ActionType.DELETE, StandardEntitlement.RESOURCE_DELETE);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/3c19e351/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 7c763fb..9d71413 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
@@ -77,7 +77,7 @@ public class ProvisionWizardBuilder extends AjaxWizardBuilder<ProvisionTO> imple
             final List<String> res = new ArrayList<>();
 
             CollectionUtils.filter(CollectionUtils.collect(new AnyTypeRestClient().list(),
-                            EntityTOUtils.<String, AnyTypeTO>keyTransformer(), res),
+                    EntityTOUtils.<String, AnyTypeTO>keyTransformer(), res),
                     new Predicate<String>() {
 
                 @Override
@@ -242,7 +242,6 @@ public class ProvisionWizardBuilder extends AjaxWizardBuilder<ProvisionTO> imple
 
     @Override
     protected Serializable onApplyInternal(final ProvisionTO modelObject) {
-        this.resourceTO.getProvisions().add(modelObject);
         return modelObject;
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/3c19e351/client/console/src/main/resources/META-INF/resources/css/syncopeConsole.css
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/META-INF/resources/css/syncopeConsole.css b/client/console/src/main/resources/META-INF/resources/css/syncopeConsole.css
index c3940eb..6aec71b 100644
--- a/client/console/src/main/resources/META-INF/resources/css/syncopeConsole.css
+++ b/client/console/src/main/resources/META-INF/resources/css/syncopeConsole.css
@@ -471,7 +471,7 @@ div.listview-actions a {
 }
 
 .btn-circle, .circular-actions a {
-  border-radius: 15px;
+  border-radius: 15px !important;
   font-size: 12px;
   height: 30px;
   line-height: 1.42857;

http://git-wip-us.apache.org/repos/asf/syncope/blob/3c19e351/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceDetailsPanel.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceDetailsPanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceDetailsPanel.html
index 6adb0b9..3d7486b 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceDetailsPanel.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceDetailsPanel.html
@@ -57,7 +57,7 @@ under the License.
       </div>
 
       <div class="form-group">
-        <span wicket:id="syncTraceLevel">[syncTraceLevel]</span>
+        <span wicket:id="pullTraceLevel">[pullTraceLevel]</span>
       </div>
     </div>
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/3c19e351/fit/console-reference/src/test/resources/core-rebel.xml
----------------------------------------------------------------------
diff --git a/fit/console-reference/src/test/resources/core-rebel.xml b/fit/console-reference/src/test/resources/core-rebel.xml
index 7709811..b025aa9 100644
--- a/fit/console-reference/src/test/resources/core-rebel.xml
+++ b/fit/console-reference/src/test/resources/core-rebel.xml
@@ -66,7 +66,7 @@ under the License.
 
   <web>
     <link target="/">
-      <dir name="${basedir}/../fit/core-reference/src/main/webapp">
+      <dir name="${basedir}/../core-reference/src/main/webapp">
       </dir>
     </link>
     <link target="/">

http://git-wip-us.apache.org/repos/asf/syncope/blob/3c19e351/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 c9f013b..04a2808 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
@@ -60,6 +60,22 @@ public class TopologyITCase extends AbstractConsoleITCase {
     }
 
     @Test
+    public void editProvisioning() {
+        wicketTester.clickLink("body:topologyLI:topology");
+        wicketTester.executeAjaxEvent("body:resources:8:resources:0:res", Constants.ON_CLICK);
+        wicketTester.clickLink("body:toggle:togglePanelContainer:container:actions:edit");
+
+        wicketTester.clickLink(
+                "body:toggle:outerObjectsRepeater:0:outer:form:content:tabbedPanel:tabs-container:tabs:1:link");
+
+        wicketTester.clickLink("body:toggle:outerObjectsRepeater:0:outer:form:content:tabbedPanel:panel:container:"
+                + "content:group:beans:0:actions:panelMapping:mappingLink");
+
+        wicketTester.assertComponent("body:toggle:outerObjectsRepeater:0:outer:form:content:tabbedPanel:panel:"
+                + "container:content:wizard:form:view:mapping:mappingContainer:mappings:1", WebMarkupContainer.class);
+    }
+
+    @Test
     public void executePullTask() {
         wicketTester.clickLink("body:topologyLI:topology");
         wicketTester.executeAjaxEvent("body:resources:2:resources:0:res", Constants.ON_CLICK);