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 2015/08/18 18:49:17 UTC
[2/3] syncope git commit: [SYNCOPE-156] improve topology performance
+ basic provisioning implementation aspects
[SYNCOPE-156] improve topology performance + basic provisioning implementation aspects
Project: http://git-wip-us.apache.org/repos/asf/syncope/repo
Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/310b34af
Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/310b34af
Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/310b34af
Branch: refs/heads/master
Commit: 310b34afef103156a49e7a94b862f9f780522f08
Parents: 8fe3c7c
Author: fmartelli <fa...@gmail.com>
Authored: Tue Aug 18 18:24:27 2015 +0200
Committer: fmartelli <fa...@gmail.com>
Committed: Tue Aug 18 18:24:27 2015 +0200
----------------------------------------------------------------------
.../client/console/panels/ListViewPanel.java | 68 ++++--
.../console/panels/NotificationPanel.java | 19 +-
.../console/panels/ResourceDetailsPanel.java | 2 +-
.../console/panels/ResourceMappingPanel.java | 48 ----
.../client/console/panels/ResourceModal.java | 25 ++-
.../client/console/rest/AnyTypeRestClient.java | 46 ++++
.../client/console/topology/Topology.java | 169 ++++++++++++--
.../markup/html/form/AjaxCheckBoxPanel.java | 7 +-
.../html/form/AjaxDropDownChoicePanel.java | 7 +-
.../markup/html/form/AjaxTextFieldPanel.java | 7 +-
.../wicket/markup/html/form/FieldPanel.java | 8 +-
.../client/console/wizards/AjaxWizard.java | 79 +++++--
.../console/wizards/AjaxWizardBuilder.java | 96 ++++++++
.../console/wizards/AjaxWizardButtonBar.java | 28 ++-
.../client/console/wizards/ProvisionWizard.java | 123 ----------
.../provision/ProvisionWizardBuilder.java | 222 +++++++++++++++++++
.../console/panels/ResourceMappingPanel.html | 20 --
.../wizards/ProvisionWizard$AccountLink.html | 23 --
.../wizards/ProvisionWizard$Mapping.html | 23 --
.../wizards/ProvisionWizard$ObjectType.html | 30 ---
.../console/wizards/ProvisionWizard.properties | 24 --
.../wizards/ProvisionWizard_it.properties | 24 --
.../wizards/ProvisionWizard_pt_BR.properties | 24 --
.../ProvisionWizardBuilder$ConnObjectLink.html | 31 +++
...isionWizardBuilder$ConnObjectLink.properties | 20 ++
...onWizardBuilder$ConnObjectLink_it.properties | 20 ++
...izardBuilder$ConnObjectLink_pt_BR.properties | 20 ++
.../ProvisionWizardBuilder$Mapping.html | 23 ++
.../ProvisionWizardBuilder$Mapping.properties | 20 ++
...ProvisionWizardBuilder$Mapping_it.properties | 20 ++
...visionWizardBuilder$Mapping_pt_BR.properties | 20 ++
.../ProvisionWizardBuilder$ObjectType.html | 31 +++
...ProvisionWizardBuilder$ObjectType.properties | 24 ++
...visionWizardBuilder$ObjectType_it.properties | 23 ++
...ionWizardBuilder$ObjectType_pt_BR.properties | 23 ++
35 files changed, 965 insertions(+), 432 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/syncope/blob/310b34af/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 f89aa9b..1cb987f 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
@@ -26,12 +26,15 @@ import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
+import org.apache.syncope.client.console.commons.Constants;
import org.apache.syncope.client.console.wicket.ajax.markup.html.ClearIndicatingAjaxButton;
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.wizards.AjaxWizard;
+import org.apache.syncope.client.console.wizards.AjaxWizardBuilder;
import org.apache.wicket.PageReference;
import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.event.Broadcast;
import org.apache.wicket.event.IEvent;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
@@ -55,7 +58,7 @@ public final class ListViewPanel<T extends Serializable> extends Panel {
private final ClearIndicatingAjaxButton addButton;
- private AjaxWizard<T> newItemPanel;
+ private AjaxWizardBuilder<T> newItemPanelBuilder;
private final WebMarkupContainer container;
@@ -63,6 +66,8 @@ public final class ListViewPanel<T extends Serializable> extends Panel {
private final List<T> listOfItems;
+ private NotificationPanel notificationPanel;
+
/**
* Table view of a list of beans.
*
@@ -141,12 +146,12 @@ public final class ListViewPanel<T extends Serializable> extends Panel {
@Override
protected void populateItem(final ListItem<String> fieldItem) {
try {
- LOG.error("Processing field {}", fieldItem.getModelObject());
+ LOG.debug("Processing field {}", fieldItem.getModelObject());
final Object value = new PropertyDescriptor(fieldItem.getModelObject(), bean.getClass()).
getReadMethod().invoke(bean);
- LOG.error("Field value {}", value);
+ LOG.debug("Field value {}", value);
fieldItem.add(value == null
? new Label("field", StringUtils.EMPTY)
@@ -171,10 +176,7 @@ public final class ListViewPanel<T extends Serializable> extends Panel {
@Override
protected void onSubmitInternal(final AjaxRequestTarget target, final Form<?> form) {
- final Fragment fragment = new Fragment("content", "wizard", ListViewPanel.this);
- fragment.add(newItemPanel.clone());
- container.addOrReplace(fragment);
- target.add(container);
+ send(ListViewPanel.this, Broadcast.DEPTH, new AjaxWizard.NewItemActionEvent<T>(null, target));
}
};
@@ -185,27 +187,44 @@ public final class ListViewPanel<T extends Serializable> extends Panel {
}
@Override
+ @SuppressWarnings("unchecked")
public void onEvent(final IEvent<?> event) {
if (event.getPayload() instanceof AjaxWizard.NewItemEvent) {
final AjaxRequestTarget target = AjaxWizard.NewItemEvent.class.cast(event.getPayload()).getTarget();
- @SuppressWarnings("unchecked")
final T item = ((AjaxWizard.NewItemEvent<T>) event.getPayload()).getItem();
- if (event.getPayload() instanceof AjaxWizard.NewItemFinishEvent) {
- this.listOfItems.add(item);
+ if (event.getPayload() instanceof AjaxWizard.NewItemActionEvent) {
+ final Fragment fragment = new Fragment("content", "wizard", ListViewPanel.this);
+ newItemPanelBuilder.setItem(item);
+
+ fragment.add(newItemPanelBuilder.build(
+ ((AjaxWizard.NewItemActionEvent<T>) event.getPayload()).getIndex()));
+
+ container.addOrReplace(fragment);
+ } else {
+ if (event.getPayload() instanceof AjaxWizard.NewItemFinishEvent) {
+ if (item != null && !this.listOfItems.contains(item)) {
+ this.listOfItems.add(item);
+ }
+
+ if (notificationPanel != null) {
+ getSession().info(getString(Constants.OPERATION_SUCCEEDED));
+ notificationPanel.refresh(target);
+ }
+ }
+ container.addOrReplace(initialFragment);
}
- container.addOrReplace(initialFragment);
target.add(container);
}
super.onEvent(event);
}
- private ListViewPanel<T> addNewItemPanel(final AjaxWizard<T> panel) {
- this.newItemPanel = panel;
+ private ListViewPanel<T> addNewItemPanelBuilder(final AjaxWizardBuilder<T> panelBuilder) {
+ this.newItemPanelBuilder = panelBuilder;
- if (this.newItemPanel != null) {
+ if (this.newItemPanelBuilder != null) {
addButton.setEnabled(true);
addButton.setVisible(true);
}
@@ -213,6 +232,11 @@ public final class ListViewPanel<T extends Serializable> extends Panel {
return this;
}
+ private ListViewPanel<T> addNotificationPanel(final NotificationPanel notificationPanel) {
+ this.notificationPanel = notificationPanel;
+ return this;
+ }
+
public static <T extends Serializable> Builder<T> builder(final Class<T> reference, final PageReference pageRef) {
return new Builder<T>(reference, pageRef);
}
@@ -236,7 +260,9 @@ public final class ListViewPanel<T extends Serializable> extends Panel {
private List<T> items;
- private AjaxWizard<T> newItemPanel;
+ private AjaxWizardBuilder<T> newItemPanelBuilder;
+
+ private NotificationPanel notificationPanel;
private Builder(final Class<T> reference, final PageReference pageRef) {
this.pageRef = pageRef;
@@ -252,7 +278,8 @@ public final class ListViewPanel<T extends Serializable> extends Panel {
* @return List view.
*/
public ListViewPanel<T> build(final String id) {
- return new ListViewPanel<T>(id, items, reference, includes, actions, pageRef).addNewItemPanel(newItemPanel);
+ return new ListViewPanel<T>(id, items, reference, includes, actions, pageRef).
+ addNewItemPanelBuilder(newItemPanelBuilder).addNotificationPanel(notificationPanel);
}
/**
@@ -314,8 +341,13 @@ public final class ListViewPanel<T extends Serializable> extends Panel {
return this;
}
- public Builder<T> addNewItemPanel(final AjaxWizard<T> panel) {
- this.newItemPanel = panel;
+ public Builder<T> addNewItemPanelBuilder(final AjaxWizardBuilder<T> panelBuilder) {
+ this.newItemPanelBuilder = panelBuilder;
+ return this;
+ }
+
+ public Builder<T> addNotificationPanel(final NotificationPanel notificationPanel) {
+ this.notificationPanel = notificationPanel;
return this;
}
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/310b34af/client/console/src/main/java/org/apache/syncope/client/console/panels/NotificationPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/NotificationPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/NotificationPanel.java
index 5d9c9a0..3098f5a 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/NotificationPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/NotificationPanel.java
@@ -32,11 +32,11 @@ public class NotificationPanel extends FeedbackPanel {
private static final long serialVersionUID = 5895940553202128621L;
public NotificationPanel(final String id) {
- this(id, null, null);
+ this(id, null);
}
- public NotificationPanel(final String id, final String additionalCSSClass,
- final IFeedbackMessageFilter feedbackMessageFilter) {
+ public NotificationPanel(
+ final String id, final IFeedbackMessageFilter feedbackMessageFilter) {
super(id, feedbackMessageFilter);
@@ -46,17 +46,14 @@ public class NotificationPanel extends FeedbackPanel {
@Override
protected void onEvent(final AjaxRequestTarget target) {
- target.appendJavaScript(
- "setTimeout(\"$('div#" + getMarkupId() + "').fadeOut('normal')\", 0);");
+ target.appendJavaScript("setTimeout(\"$('div#" + getMarkupId() + "').fadeOut('normal')\", 0);");
}
});
- // set custom markup id and ouput it, to find the component later on in the js function
- setMarkupId(id);
setOutputMarkupId(true);
- add(new AttributeModifier("class", new Model<>("alert")));
- add(new AttributeModifier("style", new Model<>("opacity: 0;")));
+ this.add(new AttributeModifier("class", new Model<>("alert")));
+ this.add(new AttributeModifier("style", new Model<>("opacity: 0;")));
}
private String getCSSClass(final int level) {
@@ -96,9 +93,9 @@ public class NotificationPanel extends FeedbackPanel {
// refresh the panel and call the js function with the panel markup id
// and the total count of messages
target.add(this);
+
if (anyMessage(FeedbackMessage.ERROR)) {
- target.appendJavaScript(
- "$('div#" + getMarkupId() + "').fadeTo('normal', 1.0);");
+ target.appendJavaScript("$('div#" + getMarkupId() + "').fadeTo('normal', 1.0);");
} else {
target.appendJavaScript(
"showNotification('" + getMarkupId() + "', " + getCurrentMessages().size() + ");");
http://git-wip-us.apache.org/repos/asf/syncope/blob/310b34af/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 ff5cac3..d556346 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceDetailsPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceDetailsPanel.java
@@ -222,7 +222,7 @@ public class ResourceDetailsPanel extends Panel {
new ResourceModel("connector", "connector").getObject(),
new PropertyModel<ConnInstanceTO>(this, "connInstanceTO"));
conn.setChoices(connectors.getObject());
- conn.setChoiceRenderer(new ChoiceRenderer<>("displayName", "key"));
+ conn.setChoiceRenderer(new ChoiceRenderer<ConnInstanceTO>("displayName", "key"));
conn.getField().setModel(new IModel<ConnInstanceTO>() {
http://git-wip-us.apache.org/repos/asf/syncope/blob/310b34af/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 b210c86..40cc013 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
@@ -129,10 +129,6 @@ public class ResourceMappingPanel extends Panel {
*/
private final WebMarkupContainer mappingContainer;
- private final WebMarkupContainer connObjectLinkContainer;
-
- private final AjaxCheckBoxPanel connObjectLinkCheckbox;
-
private MappingTO getMapping() {
if (provisionTO.getMapping() == null) {
provisionTO.setMapping(new MappingTO());
@@ -159,10 +155,6 @@ public class ResourceMappingPanel extends Panel {
this.mappingContainer.setOutputMarkupId(true);
add(this.mappingContainer);
- this.connObjectLinkContainer = new WebMarkupContainer("connObjectLinkContainer");
- this.connObjectLinkContainer.setOutputMarkupId(true);
- add(this.connObjectLinkContainer);
-
if (resourceTO.getConnector() != null && resourceTO.getConnector() > 0) {
schemaNames = getSchemaNames(resourceTO.getConnector(), resourceTO.getConnConfProperties());
setEnabled();
@@ -444,41 +436,6 @@ public class ResourceMappingPanel extends Panel {
addMappingBtn.setDefaultFormProcessing(false);
addMappingBtn.setEnabled(resourceTO.getConnector() != null && resourceTO.getConnector() > 0);
mappingContainer.add(addMappingBtn);
-
- boolean connObjectLinkEnabled = false;
- if (getMapping().getConnObjectLink() != null) {
- connObjectLinkEnabled = true;
- }
- connObjectLinkCheckbox = new AjaxCheckBoxPanel("connObjectLinkCheckbox",
- new ResourceModel("connObjectLinkCheckbox", "connObjectLinkCheckbox").getObject(),
- new Model<>(connObjectLinkEnabled));
- connObjectLinkCheckbox.setEnabled(true);
-
- connObjectLinkContainer.add(connObjectLinkCheckbox);
-
- final AjaxTextFieldPanel connObjectLink = new AjaxTextFieldPanel("connObjectLink",
- new ResourceModel("connObjectLink", "connObjectLink").getObject(),
- new PropertyModel<String>(getMapping(), "connObjectLink"));
- connObjectLink.setEnabled(connObjectLinkEnabled);
- connObjectLinkContainer.add(connObjectLink);
-
- connObjectLinkCheckbox.getField().add(new AjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
-
- private static final long serialVersionUID = -1107858522700306810L;
-
- @Override
- protected void onUpdate(final AjaxRequestTarget target) {
- if (connObjectLinkCheckbox.getModelObject()) {
- connObjectLink.setEnabled(Boolean.TRUE);
- connObjectLink.setModelObject("");
- } else {
- connObjectLink.setEnabled(Boolean.FALSE);
- connObjectLink.setModelObject("");
- }
-
- target.add(connObjectLink);
- }
- });
}
private List<String> getSchemaNames(final Long connectorId, final Set<ConnConfProperty> conf) {
@@ -498,15 +455,10 @@ public class ResourceMappingPanel extends Panel {
this.mappingContainer.setEnabled(enabled);
this.mappingContainer.setVisible(enabled);
- this.connObjectLinkContainer.setEnabled(enabled);
- this.connObjectLinkContainer.setVisible(enabled);
if (!enabled) {
getMapping().getItems().clear();
getMapping().setConnObjectLink(null);
- if (this.connObjectLinkCheckbox != null) {
- this.connObjectLinkCheckbox.setModelObject(null);
- }
}
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/310b34af/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 6390f01..345d2e7 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
@@ -24,11 +24,13 @@ import java.util.ArrayList;
import java.util.Collection;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.Predicate;
+import org.apache.commons.lang3.SerializationUtils;
import org.apache.syncope.client.console.commons.Constants;
import org.apache.syncope.client.console.pages.AbstractBasePage;
import org.apache.syncope.client.console.topology.TopologyNode;
import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
-import org.apache.syncope.client.console.wizards.ProvisionWizard;
+import org.apache.syncope.client.console.wizards.AjaxWizard;
+import org.apache.syncope.client.console.wizards.provision.ProvisionWizardBuilder;
import org.apache.syncope.common.lib.to.MappingItemTO;
import org.apache.syncope.common.lib.to.ProvisionTO;
import org.apache.syncope.common.lib.to.ResourceTO;
@@ -89,7 +91,8 @@ public class ResourceModal extends AbstractResourceModal {
@Override
public void onClick(final AjaxRequestTarget target, final ProvisionTO provisionTO) {
-
+ send(pageRef.getPage(), Broadcast.DEPTH,
+ new AjaxWizard.NewItemActionEvent<ProvisionTO>(provisionTO, 2, target));
}
}, ActionLink.ActionType.MAPPING, Entitlement.RESOURCE_UPDATE).addAction(new ActionLink<ProvisionTO>() {
@@ -97,7 +100,8 @@ public class ResourceModal extends AbstractResourceModal {
@Override
public void onClick(final AjaxRequestTarget target, final ProvisionTO provisionTO) {
-
+ send(pageRef.getPage(), Broadcast.DEPTH,
+ new AjaxWizard.NewItemActionEvent<ProvisionTO>(provisionTO, 3, target));
}
}, ActionLink.ActionType.ACCOUNT_LINK, Entitlement.RESOURCE_UPDATE).addAction(new ActionLink<ProvisionTO>() {
@@ -105,7 +109,9 @@ public class ResourceModal extends AbstractResourceModal {
@Override
public void onClick(final AjaxRequestTarget target, final ProvisionTO provisionTO) {
-
+ provisionTO.setSyncToken(null);
+ send(pageRef.getPage(), Broadcast.DEPTH,
+ new AjaxWizard.NewItemFinishEvent<ProvisionTO>(provisionTO, target));
}
}, ActionLink.ActionType.RESET_TIME, Entitlement.RESOURCE_UPDATE).addAction(new ActionLink<ProvisionTO>() {
@@ -113,7 +119,8 @@ public class ResourceModal extends AbstractResourceModal {
@Override
public void onClick(final AjaxRequestTarget target, final ProvisionTO provisionTO) {
-
+ send(pageRef.getPage(), Broadcast.DEPTH,
+ new AjaxWizard.NewItemActionEvent<ProvisionTO>(SerializationUtils.clone(provisionTO), target));
}
}, ActionLink.ActionType.CLONE, Entitlement.RESOURCE_CREATE).addAction(new ActionLink<ProvisionTO>() {
@@ -122,12 +129,14 @@ public class ResourceModal extends AbstractResourceModal {
@Override
public void onClick(final AjaxRequestTarget target, final ProvisionTO provisionTO) {
resourceTO.getProvisions().remove(provisionTO);
- target.add(provisions);
-
+ send(pageRef.getPage(), Broadcast.DEPTH,
+ new AjaxWizard.NewItemFinishEvent<ProvisionTO>(null, target));
}
}, ActionLink.ActionType.DELETE, Entitlement.RESOURCE_DELETE);
- builder.addNewItemPanel(new ProvisionWizard("wizard", resourceTO, pageRef));
+ builder.addNewItemPanelBuilder(new ProvisionWizardBuilder("wizard", resourceTO, pageRef));
+ builder.addNotificationPanel(feedbackPanel);
+
provisions.add(builder.build("provisions"));
//--------------------------------
http://git-wip-us.apache.org/repos/asf/syncope/blob/310b34af/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
new file mode 100644
index 0000000..7202082
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/rest/AnyTypeRestClient.java
@@ -0,0 +1,46 @@
+/*
+ * 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.rest;
+
+import java.util.List;
+import org.apache.syncope.common.lib.SyncopeClientException;
+import org.apache.syncope.common.lib.to.AnyTypeTO;
+import org.apache.syncope.common.rest.api.service.AnyTypeService;
+import org.springframework.stereotype.Component;
+
+/**
+ * Console client for invoking Rest AnyType services.
+ */
+@Component
+public class AnyTypeRestClient extends BaseRestClient {
+
+ private static final long serialVersionUID = 1L;
+
+ public List<AnyTypeTO> getAll() {
+ List<AnyTypeTO> types = null;
+
+ try {
+ types = getService(AnyTypeService.class).list();
+ } catch (SyncopeClientException e) {
+ LOG.error("While reading all any types", e);
+ }
+
+ return types;
+ }
+}
http://git-wip-us.apache.org/repos/asf/syncope/blob/310b34af/client/console/src/main/java/org/apache/syncope/client/console/topology/Topology.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/topology/Topology.java b/client/console/src/main/java/org/apache/syncope/client/console/topology/Topology.java
index 4fc5a86..c991a44 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/topology/Topology.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/topology/Topology.java
@@ -20,6 +20,7 @@ package org.apache.syncope.client.console.topology;
import static org.apache.syncope.client.console.topology.TopologyNode.Status.FAILURE;
import static org.apache.syncope.client.console.topology.TopologyNode.Status.REACHABLE;
+import static org.apache.syncope.client.console.topology.TopologyNode.Status.UNKNOWN;
import static org.apache.syncope.client.console.topology.TopologyNode.Status.UNREACHABLE;
import com.fasterxml.jackson.databind.JsonNode;
@@ -29,11 +30,13 @@ import java.io.Serializable;
import java.net.URI;
import java.util.ArrayList;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
-import java.util.logging.Level;
-import java.util.logging.Logger;
+import java.util.Set;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.Pair;
import org.apache.cxf.jaxrs.client.WebClient;
@@ -46,7 +49,10 @@ import org.apache.syncope.common.lib.to.ConnInstanceTO;
import org.apache.syncope.common.lib.to.ResourceTO;
import org.apache.syncope.common.lib.types.Entitlement;
import org.apache.syncope.common.rest.api.service.SyncopeService;
+import org.apache.wicket.Application;
import org.apache.wicket.Component;
+import org.apache.wicket.Session;
+import org.apache.wicket.ThreadContext;
import org.apache.wicket.ajax.AbstractAjaxTimerBehavior;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.IAjaxIndicatorAware;
@@ -164,36 +170,62 @@ public class Topology extends BasePage {
private static final long serialVersionUID = 1L;
+ final Map<String, String> resources = new HashMap<String, String>();
+
+ final Set<String> runningResCheck = new HashSet<>();
+
+ final Map<Long, String> connectors = new HashMap<Long, String>();
+
+ final Set<Long> runningConnCheck = new HashSet<>();
+
@Override
protected void onMessage(final WebSocketRequestHandler handler, final TextMessage message) {
try {
final ObjectMapper mapper = new ObjectMapper();
final JsonNode obj = mapper.readTree(message.getText());
+ final ExecutorService executorService = Executors.newFixedThreadPool(1);
+
switch (SupportedOperation.valueOf(obj.get("kind").asText())) {
case CHECK_CONNECTOR:
- try {
- final ConnInstanceTO connector = connectorRestClient.read(obj.get("target").asLong());
- handler.push(String.format("{ \"status\": \"%s\", \"target\": \"%s\"}",
- connectorRestClient.check(connector) ? REACHABLE : UNREACHABLE,
- obj.get("target").asLong()));
- } catch (Exception e) {
- handler.push(String.format("{ \"status\": \"%s\", \"target\": \"%s\"}",
- FAILURE,
- obj.get("target").asLong()));
+ final Long ckey = obj.get("target").asLong();
+
+ if (connectors.containsKey(ckey)) {
+ handler.push(connectors.get(ckey));
+ } else {
+ handler.push(String.format("{ \"status\": \"%s\", \"target\": \"%s\"}", UNKNOWN, ckey));
}
+
+ synchronized (runningConnCheck) {
+ if (runningConnCheck.contains(ckey)) {
+ LOG.debug("Running connection check for connector {}", ckey);
+ } else {
+ runningConnCheck.add(ckey);
+ }
+ }
+
+ executorService.execute(new ConnCheck(ckey));
+
break;
case CHECK_RESOURCE:
- try {
- final ResourceTO resource = resourceRestClient.read(obj.get("target").asText());
- handler.push(String.format("{ \"status\": \"%s\", \"target\": \"%s\"}",
- connectorRestClient.check(resource) ? REACHABLE : UNREACHABLE,
- obj.get("target").asText()));
- } catch (Exception e) {
- handler.push(String.format("{ \"status\": \"%s\", \"target\": \"%s\"}",
- FAILURE,
- obj.get("target").asText()));
+ final String rkey = obj.get("target").asText();
+
+ if (resources.containsKey(rkey)) {
+ handler.push(resources.get(rkey));
+ } else {
+ handler.push(String.format("{ \"status\": \"%s\", \"target\": \"%s\"}", UNKNOWN, rkey));
+ }
+
+ synchronized (runningResCheck) {
+ if (runningResCheck.contains(rkey)) {
+ LOG.debug("Running connection check for resource {}", rkey);
+ } else {
+ runningResCheck.add(rkey);
+ }
}
+
+ executorService.execute(new ResCheck(rkey));
+
break;
case ADD_ENDPOINT:
handler.appendJavaScript(String.format("addEndpoint('%s', '%s', '%s');",
@@ -204,10 +236,91 @@ public class Topology extends BasePage {
default:
}
- } catch (IOException ex) {
- Logger.getLogger(Topology.class.getName()).log(Level.SEVERE, null, ex);
+ executorService.shutdown();
+
+ } catch (IOException e) {
+ LOG.error("Eror managing websocket message", e);
}
+ }
+
+ class ConnCheck implements Runnable {
+
+ final Long key;
+
+ private final Application application;
+ private final Session session;
+
+ public ConnCheck(final Long key) {
+ this.key = key;
+ this.application = Application.get();
+ this.session = Session.exists() ? Session.get() : null;
+ }
+
+ @Override
+ public void run() {
+ try {
+ ThreadContext.setApplication(application);
+ ThreadContext.setSession(session);
+
+ String res;
+ try {
+ final ConnInstanceTO connector = connectorRestClient.read(key);
+ res = String.format("{ \"status\": \"%s\", \"target\": \"%s\"}",
+ connectorRestClient.check(connector) ? REACHABLE : UNREACHABLE, key);
+ } catch (Exception e) {
+ LOG.warn("Error checking connection for {}", key, e);
+ res = String.format("{ \"status\": \"%s\", \"target\": \"%s\"}", FAILURE, key);
+ }
+
+ synchronized (runningConnCheck) {
+ connectors.put(key, res);
+ runningConnCheck.remove(key);
+ }
+ } finally {
+ ThreadContext.detach();
+ }
+ }
+ }
+
+ class ResCheck implements Runnable {
+
+ final String key;
+
+ private final Application application;
+
+ private final Session session;
+
+ public ResCheck(final String key) {
+ this.key = key;
+ this.application = Application.get();
+ this.session = Session.exists() ? Session.get() : null;
+ }
+
+ @Override
+ public void run() {
+ try {
+ ThreadContext.setApplication(application);
+ ThreadContext.setSession(session);
+
+ String res;
+ try {
+ final ResourceTO resource = resourceRestClient.read(key);
+ res = String.format("{ \"status\": \"%s\", \"target\": \"%s\"}",
+ connectorRestClient.check(resource) ? REACHABLE : UNREACHABLE, key);
+ } catch (Exception e) {
+ LOG.warn("Error checking connection for {}", key, e);
+ res = String.format("{ \"status\": \"%s\", \"target\": \"%s\"}", FAILURE, key);
+ }
+
+ synchronized (runningResCheck) {
+ resources.put(key, res);
+ runningResCheck.remove(key);
+ }
+ } finally {
+ ThreadContext.detach();
+ }
+ }
}
});
@@ -517,7 +630,17 @@ public class Topology extends BasePage {
protected void onTimer(final AjaxRequestTarget target) {
target.appendJavaScript("checkConnection()");
- if (getUpdateInterval().seconds() < 60.0) {
+ if (getUpdateInterval().seconds() < 5.0) {
+ setUpdateInterval(Duration.seconds(5));
+ } else if (getUpdateInterval().seconds() < 10.0) {
+ setUpdateInterval(Duration.seconds(10));
+ } else if (getUpdateInterval().seconds() < 15.0) {
+ setUpdateInterval(Duration.seconds(15));
+ } else if (getUpdateInterval().seconds() < 20.0) {
+ setUpdateInterval(Duration.seconds(20));
+ } else if (getUpdateInterval().seconds() < 30.0) {
+ setUpdateInterval(Duration.seconds(30));
+ } else if (getUpdateInterval().seconds() < 60.0) {
setUpdateInterval(Duration.seconds(60));
}
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/310b34af/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxCheckBoxPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxCheckBoxPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxCheckBoxPanel.java
index 3702aa2..ff64fbe 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxCheckBoxPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxCheckBoxPanel.java
@@ -33,12 +33,17 @@ public class AjaxCheckBoxPanel extends FieldPanel<Boolean> {
private static final long serialVersionUID = 5664138233103884310L;
public AjaxCheckBoxPanel(final String id, final String name, final IModel<Boolean> model) {
+ this(id, name, model, true);
+ }
+
+ public AjaxCheckBoxPanel(
+ final String id, final String name, final IModel<Boolean> model, final boolean enableOnChange) {
super(id, model);
field = new CheckBox("checkboxField", model);
add(field.setLabel(new Model<String>(name)).setOutputMarkupId(true));
- if (!isReadOnly()) {
+ if (enableOnChange && !isReadOnly()) {
field.add(new AjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
private static final long serialVersionUID = -1107858522700306810L;
http://git-wip-us.apache.org/repos/asf/syncope/blob/310b34af/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxDropDownChoicePanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxDropDownChoicePanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxDropDownChoicePanel.java
index f628a84..ae3a01f 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxDropDownChoicePanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxDropDownChoicePanel.java
@@ -43,8 +43,7 @@ public class AjaxDropDownChoicePanel<T extends Serializable> extends FieldPanel<
super(id, model);
- field = new DropDownChoice<>(
- "dropDownChoiceField", model, Collections.<T>emptyList(), new ChoiceRenderer<T>());
+ field = new DropDownChoice<>("dropDownChoiceField", model, Collections.<T>emptyList(), new ChoiceRenderer<T>());
add(field.setLabel(new Model<>(name)).setOutputMarkupId(true));
if (enableOnBlur) {
@@ -61,7 +60,7 @@ public class AjaxDropDownChoicePanel<T extends Serializable> extends FieldPanel<
}
@SuppressWarnings("unchecked")
- public AjaxDropDownChoicePanel<T> setChoiceRenderer(final IChoiceRenderer renderer) {
+ public AjaxDropDownChoicePanel<T> setChoiceRenderer(final IChoiceRenderer<T> renderer) {
((DropDownChoice) field).setChoiceRenderer(renderer);
return this;
}
@@ -80,7 +79,7 @@ public class AjaxDropDownChoicePanel<T extends Serializable> extends FieldPanel<
@Override
@SuppressWarnings("unchecked")
- public FieldPanel clone() {
+ public FieldPanel<T> clone() {
final AjaxDropDownChoicePanel<T> panel = (AjaxDropDownChoicePanel<T>) super.clone();
panel.setChoiceRenderer(((DropDownChoice) field).getChoiceRenderer());
panel.setChoices(((DropDownChoice) field).getChoices());
http://git-wip-us.apache.org/repos/asf/syncope/blob/310b34af/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxTextFieldPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxTextFieldPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxTextFieldPanel.java
index df8e808..2ba29f8 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxTextFieldPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxTextFieldPanel.java
@@ -39,6 +39,11 @@ public class AjaxTextFieldPanel extends FieldPanel<String> implements Cloneable
private List<String> choices = Collections.emptyList();
public AjaxTextFieldPanel(final String id, final String name, final IModel<String> model) {
+ this(id, name, model, true);
+ }
+
+ public AjaxTextFieldPanel(
+ final String id, final String name, final IModel<String> model, final boolean enableOnChange) {
super(id, model);
final AutoCompleteSettings settings = new AutoCompleteSettings();
@@ -66,7 +71,7 @@ public class AjaxTextFieldPanel extends FieldPanel<String> implements Cloneable
};
add(field.setLabel(new Model<>(name)).setOutputMarkupId(true));
- if (!isReadOnly()) {
+ if (enableOnChange && !isReadOnly()) {
field.add(new AjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
private static final long serialVersionUID = -1107858522700306810L;
http://git-wip-us.apache.org/repos/asf/syncope/blob/310b34af/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/FieldPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/FieldPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/FieldPanel.java
index ebbff5d..e0f2f3e 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/FieldPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/FieldPanel.java
@@ -21,6 +21,7 @@ package org.apache.syncope.client.console.wicket.markup.html.form;
import java.io.Serializable;
import java.util.List;
import org.apache.commons.lang3.SerializationUtils;
+import org.apache.commons.lang3.StringUtils;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.FormComponent;
@@ -61,11 +62,8 @@ public abstract class FieldPanel<T> extends AbstractFieldPanel<T> implements Clo
return this;
}
- public FieldPanel<T> setStyleSheet(final String classes) {
- field.add(AttributeModifier.replace("class", classes != null
- ? classes
- : ""));
-
+ public FieldPanel<T> setStyleSheet(final String... classes) {
+ field.add(AttributeModifier.replace("class", StringUtils.join(classes, ' ')));
return this;
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/310b34af/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizard.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizard.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizard.java
index d9a42c1..caa3857 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizard.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizard.java
@@ -16,12 +16,14 @@
package org.apache.syncope.client.console.wizards;
import java.io.Serializable;
-import org.apache.commons.lang3.SerializationUtils;
+import org.apache.syncope.client.console.panels.NotificationPanel;
import org.apache.wicket.Component;
import org.apache.wicket.PageReference;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.event.Broadcast;
import org.apache.wicket.extensions.wizard.Wizard;
+import org.apache.wicket.extensions.wizard.WizardModel;
+import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.request.cycle.RequestCycle;
public abstract class AjaxWizard<T extends Serializable> extends Wizard {
@@ -30,25 +32,50 @@ public abstract class AjaxWizard<T extends Serializable> extends Wizard {
private final PageReference pageRef;
- private final T item;
+ private T item;
+
+ private final boolean edit;
+
+ private NotificationPanel feedbackPanel;
/**
* Construct.
*
- * @param id The component id
- * @param item
+ * @param id The component id.
+ * @param item model object.
+ * @param model
* @param pageRef Caller page reference.
+ * @param edit <tt>true</tt> if edit mode.
*/
- public AjaxWizard(final String id, final T item, final PageReference pageRef) {
+ public AjaxWizard(
+ final String id, final T item, final WizardModel model, final PageReference pageRef, final boolean edit) {
super(id);
this.item = item;
this.pageRef = pageRef;
+ this.edit = edit;
+
setOutputMarkupId(true);
+
+ setDefaultModel(new CompoundPropertyModel<AjaxWizard<T>>(this));
+
+ init(model);
}
@Override
protected Component newButtonBar(final String id) {
- return new AjaxWizardButtonBar(id, this);
+ return new AjaxWizardButtonBar(id, this, this.edit);
+ }
+
+ @Override
+ protected Component newFeedbackPanel(final String id) {
+ if (feedbackPanel == null) {
+ feedbackPanel = new NotificationPanel(id);
+ }
+ return feedbackPanel;
+ }
+
+ public NotificationPanel getFeedbackPanel() {
+ return feedbackPanel;
}
protected abstract void onCancelInternal();
@@ -79,7 +106,19 @@ public abstract class AjaxWizard<T extends Serializable> extends Wizard {
return item;
}
+ /**
+ * Replaces the default value provided with the constructor.
+ *
+ * @param item new value.
+ * @return the current wizard instance.
+ */
+ public AjaxWizard<T> setItem(final T item) {
+ this.item = item;
+ return this;
+ }
+
public abstract static class NewItemEvent<T> {
+
private final T item;
private final AjaxRequestTarget target;
@@ -98,6 +137,25 @@ public abstract class AjaxWizard<T extends Serializable> extends Wizard {
}
}
+ public static class NewItemActionEvent<T> extends NewItemEvent<T> {
+
+ private int index = 0;
+
+ public NewItemActionEvent(final T item, final AjaxRequestTarget target) {
+ super(item, target);
+ }
+
+ public NewItemActionEvent(final T item, final int index, final AjaxRequestTarget target) {
+ super(item, target);
+ this.index = index;
+ }
+
+ public int getIndex() {
+ return index;
+ }
+
+ }
+
public static class NewItemCancelEvent<T> extends NewItemEvent<T> {
public NewItemCancelEvent(final T item, final AjaxRequestTarget target) {
@@ -113,13 +171,4 @@ public abstract class AjaxWizard<T extends Serializable> extends Wizard {
}
}
-
- /**
- *
- * @return
- */
- @Override
- public AjaxWizard<T> clone() {
- return SerializationUtils.clone(this);
- }
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/310b34af/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizardBuilder.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizardBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizardBuilder.java
new file mode 100644
index 0000000..035eab6
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizardBuilder.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright 2015 The Apache Software Foundation.
+ *
+ * Licensed 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.wizards;
+
+import java.io.Serializable;
+import org.apache.commons.lang3.SerializationUtils;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.extensions.wizard.WizardModel;
+
+public abstract class AjaxWizardBuilder<T extends Serializable> {
+
+ private static final long serialVersionUID = 1L;
+
+ private final String id;
+
+ private final PageReference pageRef;
+
+ private final T defaultItem;
+
+ private T item;
+
+ /**
+ * Construct.
+ *
+ * @param id The component id
+ * @param defaultItem default item.
+ * @param pageRef Caller page reference.
+ */
+ public AjaxWizardBuilder(final String id, final T defaultItem, final PageReference pageRef) {
+ this.id = id;
+ this.defaultItem = defaultItem;
+ this.pageRef = pageRef;
+ }
+
+ public AjaxWizard<T> build(final int index) {
+ final AjaxWizard<T> wizard = build(index > 0);
+ for (int i = 1; i < index; i++) {
+ wizard.getWizardModel().next();
+ }
+ return wizard;
+ }
+
+ public AjaxWizard<T> build(final boolean edit) {
+ final T modelObject = getItem();
+ setItem(null);
+
+ return new AjaxWizard<T>(id, modelObject, buildModelSteps(modelObject, new WizardModel()), pageRef, edit) {
+
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ protected void onCancelInternal() {
+ AjaxWizardBuilder.this.onCancelInternal();
+ }
+
+ @Override
+ protected void onApplyInternal() {
+ AjaxWizardBuilder.this.onApplyInternal();
+ }
+ };
+ }
+
+ protected abstract WizardModel buildModelSteps(final T modelObject, final WizardModel wizardModel);
+
+ protected abstract void onCancelInternal();
+
+ protected abstract void onApplyInternal();
+
+ private T getItem() {
+ return item == null ? SerializationUtils.clone(defaultItem) : item;
+ }
+
+ /**
+ * Replaces the default value provided with the constructor.
+ *
+ * @param item new value.
+ * @return the current wizard factory instance.
+ */
+ public AjaxWizardBuilder<T> setItem(final T item) {
+ this.item = item;
+ return this;
+ }
+}
http://git-wip-us.apache.org/repos/asf/syncope/blob/310b34af/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizardButtonBar.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizardButtonBar.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizardButtonBar.java
index 4f31a26..b272ff8 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizardButtonBar.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizardButtonBar.java
@@ -15,10 +15,10 @@
*/
package org.apache.syncope.client.console.wizards;
+import org.apache.syncope.client.console.panels.NotificationPanel;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.extensions.wizard.IWizardModel;
import org.apache.wicket.extensions.wizard.IWizardStep;
-import org.apache.wicket.extensions.wizard.Wizard;
import org.apache.wicket.extensions.wizard.WizardButtonBar;
import org.apache.wicket.markup.html.form.Form;
@@ -26,7 +26,7 @@ public class AjaxWizardButtonBar extends WizardButtonBar {
private static final long serialVersionUID = 1L;
- public AjaxWizardButtonBar(final String id, final Wizard wizard) {
+ public AjaxWizardButtonBar(final String id, final AjaxWizard<?> wizard, final boolean edit) {
super(id, wizard);
addOrReplace(new AjaxWizardButton("next", wizard, "next") {
@@ -53,8 +53,14 @@ public class AjaxWizardButtonBar extends WizardButtonBar {
}
@Override
+ protected void onError(final AjaxRequestTarget target, final Form<?> form) {
+ super.onError(target, form);
+ NotificationPanel.class.cast(wizard.getFeedbackPanel()).refresh(target);
+ }
+
+ @Override
public final boolean isEnabled() {
- return super.isEnabled() && getWizardModel().isNextAvailable();
+ return !edit && super.isEnabled() && getWizardModel().isNextAvailable();
}
});
@@ -70,7 +76,7 @@ public class AjaxWizardButtonBar extends WizardButtonBar {
@Override
public final boolean isEnabled() {
- return super.isEnabled() && getWizardModel().isPreviousAvailable();
+ return !edit && super.isEnabled() && getWizardModel().isPreviousAvailable();
}
});
@@ -101,9 +107,19 @@ public class AjaxWizardButtonBar extends WizardButtonBar {
}
@Override
+ protected void onError(final AjaxRequestTarget target, final Form<?> form) {
+ super.onError(target, form);
+ NotificationPanel.class.cast(wizard.getFeedbackPanel()).refresh(target);
+ }
+
+ @Override
public final boolean isEnabled() {
- final IWizardStep activeStep = getWizardModel().getActiveStep();
- return (activeStep != null) && getWizardModel().isLastStep(activeStep) && super.isEnabled();
+ if (edit) {
+ return true;
+ } else {
+ final IWizardStep activeStep = getWizardModel().getActiveStep();
+ return (activeStep != null) && getWizardModel().isLastStep(activeStep) && super.isEnabled();
+ }
}
});
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/310b34af/client/console/src/main/java/org/apache/syncope/client/console/wizards/ProvisionWizard.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/ProvisionWizard.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/ProvisionWizard.java
deleted file mode 100644
index 6c3c8e0..0000000
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/ProvisionWizard.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright 2015 The Apache Software Foundation.
- *
- * Licensed 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.wizards;
-
-import org.apache.commons.lang3.StringUtils;
-import org.apache.syncope.client.console.panels.ResourceMappingPanel;
-import org.apache.syncope.common.lib.to.ProvisionTO;
-import org.apache.syncope.common.lib.to.ResourceTO;
-import org.apache.wicket.PageReference;
-import org.apache.wicket.extensions.wizard.WizardModel;
-import org.apache.wicket.extensions.wizard.WizardStep;
-import org.apache.wicket.markup.html.form.TextField;
-import org.apache.wicket.model.CompoundPropertyModel;
-import org.apache.wicket.model.Model;
-import org.apache.wicket.model.PropertyModel;
-import org.apache.wicket.model.ResourceModel;
-import org.apache.wicket.model.StringResourceModel;
-
-public class ProvisionWizard extends AjaxWizard<ProvisionTO> {
-
- private static final long serialVersionUID = 1L;
-
- private final ResourceTO resourceTO;
-
- /**
- * The object type specification step.
- */
- private final class ObjectType extends WizardStep {
-
- private static final long serialVersionUID = 1L;
-
- /**
- * Construct.
- */
- public ObjectType() {
- super(new ResourceModel("type.title", StringUtils.EMPTY),
- new ResourceModel("type.summary", StringUtils.EMPTY), new Model<ProvisionTO>(getItem()));
-
- add(new TextField<String>(
- "type", new PropertyModel<String>(getItem(), "anyType")).setRequired(true));
- add(new TextField<String>(
- "class", new PropertyModel<String>(getItem(), "objectClass")).setRequired(true));
- }
- }
-
- /**
- * Mapping definition step.
- */
- private final class Mapping extends WizardStep {
-
- private static final long serialVersionUID = 1L;
-
- /**
- * Construct.
- */
- public Mapping() {
- setTitleModel(new ResourceModel("mapping.title", "Mapping"));
- setSummaryModel(new StringResourceModel("mapping.summary", this, new Model<ProvisionTO>(getItem())));
-
- add(new ResourceMappingPanel("mapping", resourceTO, getItem()));
- }
- }
-
- /**
- * AccountLink specification step.
- */
- private final class AccountLink extends WizardStep {
-
- private static final long serialVersionUID = 1L;
-
- /**
- * Construct.
- */
- public AccountLink() {
- super(new ResourceModel("link.title", StringUtils.EMPTY),
- new ResourceModel("link.summary", StringUtils.EMPTY));
- }
- }
-
- /**
- * Construct.
- *
- * @param id The component id
- * @param resourceTO external resource to be updated.
- * @param pageRef Caller page reference.
- */
- public ProvisionWizard(final String id, final ResourceTO resourceTO, final PageReference pageRef) {
- super(id, new ProvisionTO(), pageRef);
- this.resourceTO = resourceTO;
-
- setDefaultModel(new CompoundPropertyModel<ProvisionWizard>(this));
-
- final WizardModel model = new WizardModel();
- model.add(new ObjectType());
- model.add(new Mapping());
- model.add(new AccountLink());
-
- init(model);
- }
-
- @Override
- protected void onCancelInternal() {
- // d nothing
- }
-
- @Override
- protected void onApplyInternal() {
- // do nothing
- }
-}
http://git-wip-us.apache.org/repos/asf/syncope/blob/310b34af/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
new file mode 100644
index 0000000..364bdb2
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder.java
@@ -0,0 +1,222 @@
+/*
+ * Copyright 2015 The Apache Software Foundation.
+ *
+ * Licensed 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.wizards.provision;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.commons.collections4.CollectionUtils;
+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.ResourceMappingPanel;
+import org.apache.syncope.client.console.rest.AnyTypeRestClient;
+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.wizards.AjaxWizardBuilder;
+import org.apache.syncope.common.lib.to.AnyTypeTO;
+import org.apache.syncope.common.lib.to.ProvisionTO;
+import org.apache.syncope.common.lib.to.ResourceTO;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
+import org.apache.wicket.extensions.wizard.WizardModel;
+import org.apache.wicket.extensions.wizard.WizardStep;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.form.TextField;
+import org.apache.wicket.model.LoadableDetachableModel;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.model.PropertyModel;
+import org.apache.wicket.model.ResourceModel;
+import org.apache.wicket.model.StringResourceModel;
+
+public class ProvisionWizardBuilder extends AjaxWizardBuilder<ProvisionTO> implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ private final ResourceTO resourceTO;
+
+ private final LoadableDetachableModel<List<String>> anyTypes = new LoadableDetachableModel<List<String>>() {
+
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ protected List<String> load() {
+ final List<String> currentlyAdded = new ArrayList<>();
+
+ CollectionUtils.collect(resourceTO.getProvisions(), new Transformer<ProvisionTO, String>() {
+
+ @Override
+ public String transform(final ProvisionTO provisionTO) {
+ return provisionTO.getAnyType();
+ }
+ }, currentlyAdded);
+
+ final List<String> res = new ArrayList<>();
+
+ CollectionUtils.filter(
+ CollectionUtils.collect(new AnyTypeRestClient().getAll(), new Transformer<AnyTypeTO, String>() {
+
+ @Override
+ public String transform(final AnyTypeTO anyTypeTO) {
+ return anyTypeTO.getKey();
+ }
+ }, res), new Predicate<String>() {
+
+ @Override
+ public boolean evaluate(String key) {
+ return !currentlyAdded.contains(key);
+ }
+ });
+
+ return res;
+ }
+ };
+
+ /**
+ * The object type specification step.
+ */
+ private final class ObjectType extends WizardStep {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * Construct.
+ */
+ public ObjectType(final ProvisionTO item) {
+ super(new ResourceModel("type.title", StringUtils.EMPTY),
+ new ResourceModel("type.summary", StringUtils.EMPTY), new Model<ProvisionTO>(item));
+
+ add(new AjaxDropDownChoicePanel<String>("type", "type", new PropertyModel<String>(item, "anyType"), false).
+ setChoices(anyTypes).
+ setStyleSheet("form-control").
+ setRequired(true));
+
+ add(new TextField<String>(
+ "class", new PropertyModel<String>(item, "objectClass")).setRequired(true));
+ }
+ }
+
+ /**
+ * Mapping definition step.
+ */
+ private final class Mapping extends WizardStep {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * Construct.
+ */
+ public Mapping(final ProvisionTO item) {
+ setTitleModel(new ResourceModel("mapping.title", "Mapping"));
+ setSummaryModel(new StringResourceModel("mapping.summary", this, new Model<ProvisionTO>(item)));
+
+ add(new ResourceMappingPanel("mapping", resourceTO, item));
+ }
+ }
+
+ /**
+ * AccountLink specification step.
+ */
+ private final class ConnObjectLink extends WizardStep {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * Construct.
+ */
+ public ConnObjectLink(final ProvisionTO item) {
+ super(new ResourceModel("link.title", StringUtils.EMPTY),
+ new ResourceModel("link.summary", StringUtils.EMPTY));
+
+ final WebMarkupContainer connObjectLinkContainer = new WebMarkupContainer("connObjectLinkContainer");
+ connObjectLinkContainer.setOutputMarkupId(true);
+ add(connObjectLinkContainer);
+
+ boolean connObjectLinkEnabled = false;
+ if (StringUtils.isNotBlank(item.getMapping().getConnObjectLink())) {
+ connObjectLinkEnabled = true;
+ }
+
+ final AjaxCheckBoxPanel connObjectLinkCheckbox = new AjaxCheckBoxPanel(
+ "connObjectLinkCheckbox",
+ new ResourceModel("connObjectLinkCheckbox", "connObjectLinkCheckbox").getObject(),
+ new Model<>(connObjectLinkEnabled),
+ false);
+ connObjectLinkCheckbox.setEnabled(true);
+
+ connObjectLinkContainer.add(connObjectLinkCheckbox);
+
+ final AjaxTextFieldPanel connObjectLink = new AjaxTextFieldPanel(
+ "connObjectLink",
+ new ResourceModel("connObjectLink", "connObjectLink").getObject(),
+ new PropertyModel<String>(item.getMapping(), "connObjectLink"),
+ false);
+ connObjectLink.setEnabled(connObjectLinkEnabled);
+ connObjectLinkContainer.add(connObjectLink);
+
+ connObjectLinkCheckbox.getField().add(new AjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
+
+ private static final long serialVersionUID = -1107858522700306810L;
+
+ @Override
+ protected void onUpdate(final AjaxRequestTarget target) {
+ if (connObjectLinkCheckbox.getModelObject()) {
+ connObjectLink.setEnabled(Boolean.TRUE);
+ connObjectLink.setModelObject("");
+ } else {
+ connObjectLink.setEnabled(Boolean.FALSE);
+ connObjectLink.setModelObject("");
+ }
+
+ target.add(connObjectLink);
+ }
+ });
+ }
+ }
+
+ /**
+ * Construct.
+ *
+ * @param id The component id
+ * @param resourceTO external resource to be updated.
+ * @param pageRef Caller page reference.
+ */
+ public ProvisionWizardBuilder(final String id, final ResourceTO resourceTO, final PageReference pageRef) {
+ super(id, new ProvisionTO(), pageRef);
+ this.resourceTO = resourceTO;
+ }
+
+ @Override
+ protected WizardModel buildModelSteps(final ProvisionTO modelObject, final WizardModel wizardModel) {
+ wizardModel.add(new ObjectType(modelObject));
+ wizardModel.add(new Mapping(modelObject));
+ wizardModel.add(new ConnObjectLink(modelObject));
+ return wizardModel;
+ }
+
+ @Override
+ protected void onCancelInternal() {
+ // d nothing
+ }
+
+ @Override
+ protected void onApplyInternal() {
+ // do nothing
+ }
+}
http://git-wip-us.apache.org/repos/asf/syncope/blob/310b34af/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceMappingPanel.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceMappingPanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceMappingPanel.html
index fe6c4ef..12ec5d2 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceMappingPanel.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceMappingPanel.html
@@ -89,26 +89,6 @@ under the License.
</tr>
</tfoot>
</table>
-
- <table id="connObjectLinkTable"
- class="table"
- style="font-size: 1em;margin-top:2px;"
- wicket:id="connObjectLinkContainer">
- <tbody>
- <tr>
- <th width="10%" align="left"><wicket:message key="enable"/></th>
- <th align="left"><wicket:message key="connObjectLink"/></th>
- </tr>
- <tr>
- <td width="10%">
- <span wicket:id="connObjectLinkCheckbox">[connObjectLinkCheckbox]</span>
- </td>
- <td>
- <span wicket:id="connObjectLink">[connObjectLink]</span>
- </td>
- </tr>
- </tbody>
- </table>
</div>
</wicket:panel>
</html>
http://git-wip-us.apache.org/repos/asf/syncope/blob/310b34af/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard$AccountLink.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard$AccountLink.html b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard$AccountLink.html
deleted file mode 100644
index aa2e5ab..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard$AccountLink.html
+++ /dev/null
@@ -1,23 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements. See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership. The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied. See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-<html xmlns="http://www.w3.org/1999/xhtml" >
- <wicket:panel>
- Specify here the account link .... work in progress
- </wicket:panel>
-</html>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/syncope/blob/310b34af/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard$Mapping.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard$Mapping.html b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard$Mapping.html
deleted file mode 100644
index 2147713..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard$Mapping.html
+++ /dev/null
@@ -1,23 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements. See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership. The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied. See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <wicket:panel>
- <span wicket:id="mapping" />
- </wicket:panel>
-</html>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/syncope/blob/310b34af/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard$ObjectType.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard$ObjectType.html b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard$ObjectType.html
deleted file mode 100644
index e36f66d..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard$ObjectType.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements. See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership. The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied. See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <wicket:panel >
- <div class="form-group">
- <label>Object Type</label>
- <input type="text" placeholder="Object Type ..." class="form-control" wicket:id="type">
- </div>
- <div class="form-group">
- <label>Object Class</label>
- <input type="text" placeholder="Object Class ..." class="form-control" wicket:id="class">
- </div>
- </wicket:panel>
-</html>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/syncope/blob/310b34af/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard.properties b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard.properties
deleted file mode 100644
index 535da53..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard.properties
+++ /dev/null
@@ -1,24 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-type.title=Specify the type of the provisioning object
-type.summary=
-mapping.title=Specify the maping about the provisioning object
-mapping.summary=
-link.title=Specify the account link (if required)
-link.summary=
-
http://git-wip-us.apache.org/repos/asf/syncope/blob/310b34af/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard_it.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard_it.properties
deleted file mode 100644
index 535da53..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard_it.properties
+++ /dev/null
@@ -1,24 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-type.title=Specify the type of the provisioning object
-type.summary=
-mapping.title=Specify the maping about the provisioning object
-mapping.summary=
-link.title=Specify the account link (if required)
-link.summary=
-
http://git-wip-us.apache.org/repos/asf/syncope/blob/310b34af/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard_pt_BR.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard_pt_BR.properties
deleted file mode 100644
index 535da53..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard_pt_BR.properties
+++ /dev/null
@@ -1,24 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-type.title=Specify the type of the provisioning object
-type.summary=
-mapping.title=Specify the maping about the provisioning object
-mapping.summary=
-link.title=Specify the account link (if required)
-link.summary=
-
http://git-wip-us.apache.org/repos/asf/syncope/blob/310b34af/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$ConnObjectLink.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$ConnObjectLink.html b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$ConnObjectLink.html
new file mode 100644
index 0000000..0dc5137
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$ConnObjectLink.html
@@ -0,0 +1,31 @@
+<!--
+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://xmlns.jcp.org/jsf/composite">
+ <wicket:panel>
+ <span wicket:id="connObjectLinkContainer">
+ <div>
+ <span wicket:id="connObjectLinkCheckbox">[connObjectLinkCheckbox]</span>
+ </div>
+ <div>
+ <span wicket:id="connObjectLink">[connObjectLink]</span>
+ </div>
+ </span>
+ </wicket:panel>
+</html>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/syncope/blob/310b34af/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
new file mode 100644
index 0000000..e2df31e
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$ConnObjectLink.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.
+
+link.title=Specify the connector object link (if required)
+link.summary=
+
http://git-wip-us.apache.org/repos/asf/syncope/blob/310b34af/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
new file mode 100644
index 0000000..e2df31e
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$ConnObjectLink_it.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.
+
+link.title=Specify the connector object link (if required)
+link.summary=
+
http://git-wip-us.apache.org/repos/asf/syncope/blob/310b34af/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
new file mode 100644
index 0000000..e2df31e
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$ConnObjectLink_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.
+
+link.title=Specify the connector object link (if required)
+link.summary=
+