Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id AFCD7200CDF for ; Thu, 17 Aug 2017 08:54:18 +0200 (CEST) Received: by cust-asf.ponee.io (Postfix) id AE05E16A61D; Thu, 17 Aug 2017 06:54:18 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id A49DE16A61E for ; Thu, 17 Aug 2017 08:54:16 +0200 (CEST) Received: (qmail 5807 invoked by uid 500); 17 Aug 2017 06:54:15 -0000 Mailing-List: contact commits-help@syncope.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@syncope.apache.org Delivered-To: mailing list commits@syncope.apache.org Received: (qmail 5796 invoked by uid 99); 17 Aug 2017 06:54:15 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 17 Aug 2017 06:54:15 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id EA83DED49C; Thu, 17 Aug 2017 06:54:14 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit From: ilgrosso@apache.org To: commits@syncope.apache.org Date: Thu, 17 Aug 2017 06:54:15 -0000 Message-Id: <1c5e3df0332a4597bbf52a4c8aaec9f9@git.apache.org> In-Reply-To: <71057a567d054cd6a5ecfd133500f990@git.apache.org> References: <71057a567d054cd6a5ecfd133500f990@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [2/2] syncope git commit: [SYNCOPE-1143] Some fixes and refinements archived-at: Thu, 17 Aug 2017 06:54:18 -0000 [SYNCOPE-1143] Some fixes and refinements Project: http://git-wip-us.apache.org/repos/asf/syncope/repo Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/05ada83c Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/05ada83c Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/05ada83c Branch: refs/heads/master Commit: 05ada83cc342178cb4b564a011c13308acc3db53 Parents: 1afd1a7 Author: Francesco Chicchiriccò Authored: Thu Aug 17 08:53:21 2017 +0200 Committer: Francesco Chicchiriccò Committed: Thu Aug 17 08:54:05 2017 +0200 ---------------------------------------------------------------------- .../cli/commands/CommonsResultManager.java | 4 +- .../connector/ConnectorResultManager.java | 3 +- .../ConnInstanceHistoryConfDirectoryPanel.java | 5 +- .../client/console/panels/DirectoryPanel.java | 16 +++++-- .../console/panels/HistoryConfDetails.java | 38 +++++++-------- .../ResourceHistoryConfDirectoryPanel.java | 5 +- .../client/console/panels/VirSchemaDetails.java | 34 +++++++++++--- .../console/rest/ConnectorRestClient.java | 13 +++--- .../client/console/rest/ResourceRestClient.java | 22 +++++---- .../client/console/topology/Topology.java | 6 +-- .../console/topology/TopologyTogglePanel.java | 42 +++++++++++------ .../markup/html/bootstrap/dialog/BaseModal.java | 18 +++++++ .../resources/ResourceConnConfPanel.java | 5 +- .../resources/ResourceProvisionPanel.java | 13 +++--- .../syncope/common/lib/to/ConnInstanceTO.java | 7 +-- .../syncope/common/lib/to/ResourceTO.java | 5 +- .../common/lib/types/ConnConfPropSchema.java | 44 +++++++++++++++++- .../api/service/ConnectorHistoryService.java | 4 +- .../persistence/api/entity/ConnInstance.java | 3 +- .../persistence/jpa/entity/JPAConnInstance.java | 5 +- .../core/provisioning/api/ConnectorFactory.java | 6 +-- .../provisioning/java/ConnectorManager.java | 5 +- .../java/data/ConnInstanceDataBinderImpl.java | 49 +++++++++++++------- .../java/data/ResourceDataBinderImpl.java | 37 ++++++++------- .../syncope/fit/core/ConnectorITCase.java | 2 +- 25 files changed, 257 insertions(+), 134 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/syncope/blob/05ada83c/client/cli/src/main/java/org/apache/syncope/client/cli/commands/CommonsResultManager.java ---------------------------------------------------------------------- diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/CommonsResultManager.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/CommonsResultManager.java index 6631dea..8098e20 100644 --- a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/CommonsResultManager.java +++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/CommonsResultManager.java @@ -19,9 +19,9 @@ package org.apache.syncope.client.cli.commands; import java.util.Arrays; +import java.util.Collection; import java.util.List; import java.util.Map; -import java.util.Set; import org.apache.syncope.client.cli.Command; import org.apache.syncope.client.cli.view.Messages; import org.apache.syncope.client.cli.view.Table; @@ -73,7 +73,7 @@ public abstract class CommonsResultManager { return Messages.commandHelpMessage(name.getAnnotation(Command.class).name()); } - protected void printConfiguration(final Set configurationPropertys) { + protected void printConfiguration(final Collection configurationPropertys) { for (final ConnConfProperty configuration : configurationPropertys) { System.out.println(" name: " + configuration.getSchema().getName()); System.out.println(" values: " + configuration.getValues()); http://git-wip-us.apache.org/repos/asf/syncope/blob/05ada83c/client/cli/src/main/java/org/apache/syncope/client/cli/commands/connector/ConnectorResultManager.java ---------------------------------------------------------------------- diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/connector/ConnectorResultManager.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/connector/ConnectorResultManager.java index 157500f..69d2c58 100644 --- a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/connector/ConnectorResultManager.java +++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/connector/ConnectorResultManager.java @@ -18,6 +18,7 @@ */ package org.apache.syncope.client.cli.commands.connector; +import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Set; @@ -91,7 +92,7 @@ public class ConnectorResultManager extends CommonsResultManager { } } - public void printConfigurationProperties(final Set connConfPropertys) { + public void printConfigurationProperties(final Collection connConfPropertys) { printConfiguration(connConfPropertys); } http://git-wip-us.apache.org/repos/asf/syncope/blob/05ada83c/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnInstanceHistoryConfDirectoryPanel.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnInstanceHistoryConfDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnInstanceHistoryConfDirectoryPanel.java index 66f821d..836c12b 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnInstanceHistoryConfDirectoryPanel.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnInstanceHistoryConfDirectoryPanel.java @@ -65,18 +65,19 @@ public abstract class ConnInstanceHistoryConfDirectoryPanel extends DirectoryPan private final String entityKey; - protected ConnInstanceHistoryConfDirectoryPanel( + public ConnInstanceHistoryConfDirectoryPanel( final BaseModal baseModal, final MultilevelPanel multiLevelPanelRef, final String entityKey, final PageReference pageRef) { - super(MultilevelPanel.FIRST_LEVEL_ID, pageRef, false); + super(MultilevelPanel.FIRST_LEVEL_ID, pageRef, false, false); this.baseModal = baseModal; this.multiLevelPanelRef = multiLevelPanelRef; restClient = new ConnectorHistoryRestClient(); setShowResultPage(false); + disableCheckBoxes(); this.entityKey = entityKey; initResultTable(); http://git-wip-us.apache.org/repos/asf/syncope/blob/05ada83c/client/console/src/main/java/org/apache/syncope/client/console/panels/DirectoryPanel.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/DirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/DirectoryPanel.java index 55cca0f..9bc33d6 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/panels/DirectoryPanel.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/DirectoryPanel.java @@ -109,7 +109,7 @@ public abstract class DirectoryPanel< /** * Create simple unfiltered search result panel. - * Use the available builder for powerfull configuration options. + * Use the available builder for powerful configuration options. * * @param id panel id. * @param pageRef page reference. @@ -119,6 +119,12 @@ public abstract class DirectoryPanel< } public DirectoryPanel(final String id, final PageReference pageRef, final boolean wizardInModal) { + this(id, pageRef, true, wizardInModal); + } + + public DirectoryPanel( + final String id, final PageReference pageRef, final boolean showPaginator, final boolean wizardInModal) { + this(id, new Builder(null, pageRef) { private static final long serialVersionUID = -8424727765826509309L; @@ -129,6 +135,7 @@ public abstract class DirectoryPanel< } }.setFiltered(false), wizardInModal); setPageRef(pageRef); + this.showPaginator = showPaginator; } protected DirectoryPanel(final String id, final Builder builder) { @@ -202,14 +209,13 @@ public abstract class DirectoryPanel< // --------------------------- // Rows-per-page selector // --------------------------- - final Form paginatorForm = new Form<>("paginator"); + Form paginatorForm = new Form<>("paginator"); paginatorForm.setOutputMarkupPlaceholderTag(true); paginatorForm.setVisible(showPaginator); container.add(paginatorForm); - final DropDownChoice rowsChooser = new DropDownChoice<>( + DropDownChoice rowsChooser = new DropDownChoice<>( "rowsChooser", new PropertyModel(this, "rows"), prefMan.getPaginatorChoices()); - rowsChooser.add(new IndicatorAjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) { private static final long serialVersionUID = -1107858522700306810L; @@ -218,7 +224,7 @@ public abstract class DirectoryPanel< protected void onUpdate(final AjaxRequestTarget target) { prefMan.set(getRequest(), getResponse(), paginatorRowsKey(), String.valueOf(rows)); - final EventDataWrapper data = new EventDataWrapper(); + EventDataWrapper data = new EventDataWrapper(); data.setTarget(target); data.setRows(rows); http://git-wip-us.apache.org/repos/asf/syncope/blob/05ada83c/client/console/src/main/java/org/apache/syncope/client/console/panels/HistoryConfDetails.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/HistoryConfDetails.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/HistoryConfDetails.java index aeb088b..00d95b3 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/panels/HistoryConfDetails.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/HistoryConfDetails.java @@ -21,7 +21,7 @@ package org.apache.syncope.client.console.panels; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; import java.util.ArrayList; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import org.apache.commons.collections4.CollectionUtils; @@ -150,25 +150,23 @@ public class HistoryConfDetails extends Multileve return Pair.of(key, json); } - private Map getDropdownNamesMap(final List historyConfTOs) { - Map historyConfMap = new HashMap<>(); - if (selectedHistoryConfTO instanceof ConnInstanceHistoryConfTO) { - for (T historyConfValue : historyConfTOs) { - ConnInstanceHistoryConfTO historyConf = ConnInstanceHistoryConfTO.class.cast(historyConfValue); - historyConfMap.put(historyConf.getKey(), - historyConf.getCreation() != null ? historyConf.getCreator() + " - " + SyncopeConsoleSession. - get().getDateFormat().format( - historyConf.getCreation()) + " - " + historyConf.getKey() : getString("current")); - } - } else if (selectedHistoryConfTO instanceof ResourceHistoryConfTO) { - for (T historyConfValue : historyConfTOs) { - ResourceHistoryConfTO historyConf = ResourceHistoryConfTO.class.cast(historyConfValue); - historyConfMap.put(historyConf.getKey(), - historyConf.getCreation() != null ? historyConf.getCreator() + " - " + SyncopeConsoleSession. - get().getDateFormat().format( - historyConf.getCreation()) + " - " + historyConf.getKey() : getString("current")); + private Map getDropdownNamesMap(final List historyConfTOs) { + Map historyConfMap = new LinkedHashMap<>(); + + String current = null; + for (T historyConf : historyConfTOs) { + if (historyConf.getCreation() == null) { + current = historyConf.getKey(); + } else { + historyConfMap.put(historyConf.getKey(), historyConf.getCreator() + " - " + + SyncopeConsoleSession.get().getDateFormat().format( + historyConf.getCreation()) + " - " + historyConf.getKey()); } } + if (current != null) { + historyConfMap.put(current, getString("current")); + } + return historyConfMap; } @@ -250,10 +248,10 @@ public class HistoryConfDetails extends Multileve conf = (T) new ConnInstanceHistoryConfTO(); ((ConnInstanceHistoryConfTO) conf).setConnInstanceTO(current); } else if (selectedHistoryConfTO instanceof ResourceHistoryConfTO) { - ResourceTO currentRes = new ResourceRestClient().read( + ResourceTO current = new ResourceRestClient().read( ResourceHistoryConfTO.class.cast(selectedHistoryConfTO).getResourceTO().getKey()); conf = (T) new ResourceHistoryConfTO(); - ((ResourceHistoryConfTO) conf).setResourceTO(currentRes); + ((ResourceHistoryConfTO) conf).setResourceTO(current); } if (conf != null) { http://git-wip-us.apache.org/repos/asf/syncope/blob/05ada83c/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceHistoryConfDirectoryPanel.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceHistoryConfDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceHistoryConfDirectoryPanel.java index ab95676..d212d9d 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceHistoryConfDirectoryPanel.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceHistoryConfDirectoryPanel.java @@ -68,18 +68,19 @@ public abstract class ResourceHistoryConfDirectoryPanel extends DirectoryPanel< private final String entityKey; - protected ResourceHistoryConfDirectoryPanel( + public ResourceHistoryConfDirectoryPanel( final BaseModal baseModal, final MultilevelPanel multiLevelPanelRef, final String entityKey, final PageReference pageRef) { - super(MultilevelPanel.FIRST_LEVEL_ID, pageRef, false); + super(MultilevelPanel.FIRST_LEVEL_ID, pageRef, false, false); this.baseModal = baseModal; this.multiLevelPanelRef = multiLevelPanelRef; restClient = new ResourceHistoryRestClient(); setShowResultPage(false); + disableCheckBoxes(); this.entityKey = entityKey; initResultTable(); http://git-wip-us.apache.org/repos/asf/syncope/blob/05ada83c/client/console/src/main/java/org/apache/syncope/client/console/panels/VirSchemaDetails.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/VirSchemaDetails.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/VirSchemaDetails.java index 34cc61c..ceb51be 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/panels/VirSchemaDetails.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/VirSchemaDetails.java @@ -127,20 +127,40 @@ public class VirSchemaDetails extends AbstractSchemaDetailsPanel { @Override protected void onUpdate(final AjaxRequestTarget target) { - if (selectedResource != null && SyncopeConsoleSession.get().owns(StandardEntitlement.CONNECTOR_READ)) { - extAttrName.setChoices(getExtAttrNames()); - target.add(extAttrName); + if (selectedResource != null) { + String adminRealm = getAdminRealm(selectedResource.getKey()); + + if (SyncopeConsoleSession.get().owns(StandardEntitlement.CONNECTOR_READ, adminRealm)) { + extAttrName.setChoices(getExtAttrNames()); + target.add(extAttrName); + } } } }); } + private String getAdminRealm(final String connectorKey) { + String adminRealm = null; + try { + adminRealm = new ConnectorRestClient().read(connectorKey).getAdminRealm(); + } catch (Exception e) { + LOG.error("Could not read Admin Realm for External Resource {}", selectedResource.getKey()); + } + + return adminRealm; + } + private void populateAnyTypes(final String resourceKey) { anyTypes.clear(); - if (resourceKey != null && SyncopeConsoleSession.get().owns(StandardEntitlement.RESOURCE_READ)) { - selectedResource = resourceRestClient.read(resourceKey); - for (ProvisionTO provisionTO : selectedResource.getProvisions()) { - anyTypes.put(provisionTO.getAnyType(), provisionTO.getObjectClass()); + if (resourceKey != null) { + ResourceTO resource = resourceRestClient.read(resourceKey); + String adminRealm = getAdminRealm(resource.getConnector()); + + if (SyncopeConsoleSession.get().owns(StandardEntitlement.RESOURCE_READ, adminRealm)) { + selectedResource = resource; + for (ProvisionTO provisionTO : selectedResource.getProvisions()) { + anyTypes.put(provisionTO.getAnyType(), provisionTO.getObjectClass()); + } } } } http://git-wip-us.apache.org/repos/asf/syncope/blob/05ada83c/client/console/src/main/java/org/apache/syncope/client/console/rest/ConnectorRestClient.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/rest/ConnectorRestClient.java b/client/console/src/main/java/org/apache/syncope/client/console/rest/ConnectorRestClient.java index 7c5c982..5f1d41b 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/rest/ConnectorRestClient.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/rest/ConnectorRestClient.java @@ -19,10 +19,9 @@ package org.apache.syncope.client.console.rest; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; -import java.util.HashSet; import java.util.List; -import java.util.Set; import javax.ws.rs.core.Response; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.IterableUtils; @@ -56,7 +55,7 @@ public class ConnectorRestClient extends BaseRestClient { } public ConnInstanceTO create(final ConnInstanceTO connectorTO) { - Set filteredConf = filterProperties(connectorTO.getConf()); + List filteredConf = filterProperties(connectorTO.getConf()); connectorTO.getConf().clear(); connectorTO.getConf().addAll(filteredConf); @@ -86,7 +85,7 @@ public class ConnectorRestClient extends BaseRestClient { } public List getExtAttrNames( - final String objectClass, final String connectorKey, final Set conf) { + final String objectClass, final String connectorKey, final Collection conf) { ConnInstanceTO connInstanceTO = new ConnInstanceTO(); connInstanceTO.setKey(connectorKey); @@ -125,7 +124,7 @@ public class ConnectorRestClient extends BaseRestClient { } public void update(final ConnInstanceTO connectorTO) { - Set filteredConf = filterProperties(connectorTO.getConf()); + List filteredConf = filterProperties(connectorTO.getConf()); connectorTO.getConf().clear(); connectorTO.getConf().addAll(filteredConf); getService(ConnectorService.class).update(connectorTO); @@ -150,8 +149,8 @@ public class ConnectorRestClient extends BaseRestClient { return bundles; } - private Set filterProperties(final Set properties) { - Set newProperties = new HashSet<>(); + private List filterProperties(final Collection properties) { + List newProperties = new ArrayList<>(); for (ConnConfProperty property : properties) { ConnConfProperty prop = new ConnConfProperty(); http://git-wip-us.apache.org/repos/asf/syncope/blob/05ada83c/client/console/src/main/java/org/apache/syncope/client/console/rest/ResourceRestClient.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/rest/ResourceRestClient.java b/client/console/src/main/java/org/apache/syncope/client/console/rest/ResourceRestClient.java index 6e2c271..d3b6903 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/rest/ResourceRestClient.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/rest/ResourceRestClient.java @@ -92,14 +92,20 @@ public class ResourceRestClient extends BaseRestClient { } public List list() { - List resources = getService(ResourceService.class).list(); - Collections.sort(resources, new Comparator() { - - @Override - public int compare(final ResourceTO o1, final ResourceTO o2) { - return ComparatorUtils.naturalComparator().compare(o1.getKey(), o2.getKey()); - } - }); + List resources = Collections.emptyList(); + try { + resources = getService(ResourceService.class).list(); + Collections.sort(resources, new Comparator() { + + @Override + public int compare(final ResourceTO o1, final ResourceTO o2) { + return ComparatorUtils.naturalComparator().compare(o1.getKey(), o2.getKey()); + } + }); + } catch (Exception e) { + LOG.error("Could not fetch the Resource list", e); + } + return resources; } http://git-wip-us.apache.org/repos/asf/syncope/blob/05ada83c/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 606a32d..071da87 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 @@ -409,7 +409,7 @@ public class Topology extends BasePage { final ListView innerListView = new ListView("resources", new ArrayList<>(connections.get(connectorKey).values())) { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = -3447760771863754342L; private final int size = getModelObject().size() + 1; @@ -505,7 +505,7 @@ public class Topology extends BasePage { newlyCreated = new ListView("newlyCreated", new ArrayList()) { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 4949588177564901031L; @Override protected void populateItem(final ListItem item) { @@ -542,7 +542,7 @@ public class Topology extends BasePage { behaviors.add(new Behavior() { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 2661717818979056044L; @Override public void renderHead(final Component component, final IHeaderResponse response) { http://git-wip-us.apache.org/repos/asf/syncope/blob/05ada83c/client/console/src/main/java/org/apache/syncope/client/console/topology/TopologyTogglePanel.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/topology/TopologyTogglePanel.java b/client/console/src/main/java/org/apache/syncope/client/console/topology/TopologyTogglePanel.java index 8b6b1a5..8ffa39a 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/topology/TopologyTogglePanel.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/topology/TopologyTogglePanel.java @@ -106,9 +106,7 @@ public class TopologyTogglePanel extends TogglePanel { provisionModal = new BaseModal<>("outer"); provisionModal.size(Modal.Size.Large); - if (SyncopeConsoleSession.get().owns(StandardEntitlement.RESOURCE_UPDATE)) { - provisionModal.addSubmitButton(); - } + provisionModal.addSubmitButton(); addOuterObject(provisionModal); historyModal = new BaseModal<>("outer"); @@ -304,19 +302,20 @@ public class TopologyTogglePanel extends TogglePanel { @Override public void onClick(final AjaxRequestTarget target) { - final ConnInstanceTO modelObject = connectorRestClient.read(String.class.cast(node.getKey())); + ConnInstanceTO connInstance = connectorRestClient.read(String.class.cast(node.getKey())); - final IModel model = new CompoundPropertyModel<>(modelObject); + final IModel model = new CompoundPropertyModel<>(connInstance); modal.setFormModel(model); - target.add(modal.setContent(new ConnectorWizardBuilder(modelObject, pageRef). + target.add(modal.setContent(new ConnectorWizardBuilder(connInstance, pageRef). build(BaseModal.CONTENT_ID, - SyncopeConsoleSession.get().owns(StandardEntitlement.CONNECTOR_UPDATE) + SyncopeConsoleSession.get(). + owns(StandardEntitlement.CONNECTOR_UPDATE, connInstance.getAdminRealm()) ? AjaxWizard.Mode.EDIT : AjaxWizard.Mode.READONLY))); modal.header( - new Model<>(MessageFormat.format(getString("connector.edit"), modelObject.getDisplayName()))); + new Model<>(MessageFormat.format(getString("connector.edit"), connInstance.getDisplayName()))); modal.show(true); } @@ -336,9 +335,10 @@ public class TopologyTogglePanel extends TogglePanel { @Override public void onClick(final AjaxRequestTarget target) { String connKey = String.class.cast(node.getKey()); - final ConnInstanceTO modelObject = connectorRestClient.read(String.class.cast(node.getKey())); + ConnInstanceTO connInstance = connectorRestClient.read(connKey); - target.add(historyModal.setContent(new HistoryConfList<>(historyModal, connKey, pageRef, modelObject))); + target.add(historyModal.setContent( + new HistoryConfList<>(historyModal, connKey, pageRef, connInstance))); historyModal.header( new Model<>(MessageFormat.format(getString("connector.menu.history"), node.getDisplayName()))); @@ -389,14 +389,16 @@ public class TopologyTogglePanel extends TogglePanel { @Override public void onClick(final AjaxRequestTarget target) { - ResourceTO modelObject = resourceRestClient.read(node.getKey()); + ResourceTO resource = resourceRestClient.read(node.getKey()); + ConnInstanceTO connInstance = connectorRestClient.read(resource.getConnector()); - IModel model = new CompoundPropertyModel<>(modelObject); + IModel model = new CompoundPropertyModel<>(resource); modal.setFormModel(model); - target.add(modal.setContent(new ResourceWizardBuilder(modelObject, pageRef). + target.add(modal.setContent(new ResourceWizardBuilder(resource, pageRef). build(BaseModal.CONTENT_ID, - SyncopeConsoleSession.get().owns(StandardEntitlement.RESOURCE_UPDATE) + SyncopeConsoleSession.get(). + owns(StandardEntitlement.RESOURCE_UPDATE, connInstance.getAdminRealm()) ? AjaxWizard.Mode.EDIT : AjaxWizard.Mode.READONLY))); @@ -443,11 +445,21 @@ public class TopologyTogglePanel extends TogglePanel { @Override public void onClick(final AjaxRequestTarget target) { ResourceTO resource = resourceRestClient.read(node.getKey()); + ConnInstanceTO connInstance = connectorRestClient.read(resource.getConnector()); + + if (SyncopeConsoleSession.get(). + owns(StandardEntitlement.RESOURCE_UPDATE, connInstance.getAdminRealm())) { + + provisionModal.addSubmitButton(); + } else { + provisionModal.removeSubmitButton(); + } IModel model = new CompoundPropertyModel<>(resource); provisionModal.setFormModel(model); - target.add(provisionModal.setContent(new ResourceProvisionPanel(provisionModal, resource, pageRef))); + target.add(provisionModal.setContent( + new ResourceProvisionPanel(provisionModal, resource, connInstance.getAdminRealm(), pageRef))); provisionModal.header(new Model<>(MessageFormat.format(getString("resource.edit"), node.getKey()))); provisionModal.show(true); http://git-wip-us.apache.org/repos/asf/syncope/blob/05ada83c/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.java index 1df1e6c..968cb57 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.java @@ -24,6 +24,8 @@ import de.agilecoders.wicket.extensions.markup.html.bootstrap.behavior.Draggable 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.syncope.client.console.panels.AbstractModalPanel; import org.apache.syncope.client.console.panels.ModalPanel; import org.apache.syncope.client.console.panels.NotificationPanel; @@ -223,6 +225,22 @@ public class BaseModal extends Modal { return submit; } + public void removeSubmitButton() { + if (!(BaseModal.this.getContent() instanceof SubmitableModalPanel)) { + throw new IllegalStateException(); + } + + CollectionUtils.filterInverse(this.components, new Predicate() { + + @Override + public boolean evaluate(final Component component) { + return SUBMIT.equals(component.getId()); + } + }); + + submitButton = null; + } + @Override protected void onInitialize() { super.onInitialize(); http://git-wip-us.apache.org/repos/asf/syncope/blob/05ada83c/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceConnConfPanel.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceConnConfPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceConnConfPanel.java index 0869da9..a5e397a 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceConnConfPanel.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceConnConfPanel.java @@ -24,7 +24,6 @@ import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Set; import org.apache.syncope.client.console.rest.ConnectorRestClient; import org.apache.syncope.common.lib.to.ResourceTO; import org.apache.syncope.common.lib.types.ConnConfProperty; @@ -49,7 +48,7 @@ public abstract class ResourceConnConfPanel extends AbstractConnConfPanel load() { - final List confOverride = getConnProperties(resourceTO); + List confOverride = getConnProperties(resourceTO); resourceTO.getConfOverride().clear(); resourceTO.getConfOverride().addAll(confOverride); @@ -59,7 +58,7 @@ public abstract class ResourceConnConfPanel extends AbstractConnConfPanel getObject() { - final List res = new ArrayList<>((Set) super.getObject()); + List res = new ArrayList<>(super.getObject()); // re-order properties Collections.sort(res, new Comparator() { http://git-wip-us.apache.org/repos/asf/syncope/blob/05ada83c/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel.java index ceab536..be20666 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel.java @@ -79,6 +79,7 @@ public class ResourceProvisionPanel extends AbstractModalPanel { public ResourceProvisionPanel( final BaseModal modal, final ResourceTO resourceTO, + final String adminRealm, final PageReference pageRef) { super(modal, pageRef); @@ -125,7 +126,7 @@ public class ResourceProvisionPanel extends AbstractModalPanel { @Override protected void customActionOnFinishCallback(final AjaxRequestTarget target) { - checkAddButton(); + checkAddButton(adminRealm); // keep list ordered - SYNCOPE-1154 sortProvisions(); @@ -217,7 +218,7 @@ public class ResourceProvisionPanel extends AbstractModalPanel { resourceTO.getProvisions().remove(provision.getProvisionTO()); } provisions.remove(provision); - checkAddButton(); + checkAddButton(adminRealm); send(ResourceProvisionPanel.this, Broadcast.DEPTH, new ListViewReload<>(target)); } }, ActionLink.ActionType.DELETE, StandardEntitlement.RESOURCE_UPDATE, true); @@ -225,7 +226,7 @@ public class ResourceProvisionPanel extends AbstractModalPanel { builder.addNewItemPanelBuilder(wizard); list = builder.build("provision"); - list.setReadOnly(!SyncopeConsoleSession.get().owns(StandardEntitlement.RESOURCE_UPDATE)); + list.setReadOnly(!SyncopeConsoleSession.get().owns(StandardEntitlement.RESOURCE_UPDATE, adminRealm)); addAjaxLink = new AjaxLink("add") { @@ -261,7 +262,7 @@ public class ResourceProvisionPanel extends AbstractModalPanel { } }; - checkAddButton(); + checkAddButton(adminRealm); add(objectTypeTogglePanel); } @@ -346,9 +347,9 @@ public class ResourceProvisionPanel extends AbstractModalPanel { }; } - private void checkAddButton() { + private void checkAddButton(final String adminRealm) { boolean enabled = - SyncopeConsoleSession.get().owns(StandardEntitlement.RESOURCE_UPDATE) + SyncopeConsoleSession.get().owns(StandardEntitlement.RESOURCE_UPDATE, adminRealm) && !getAnyTypes().getObject().isEmpty(); addAjaxLink.setVisible(enabled); objectTypeTogglePanel.setEnabled(enabled); http://git-wip-us.apache.org/repos/asf/syncope/blob/05ada83c/common/lib/src/main/java/org/apache/syncope/common/lib/to/ConnInstanceTO.java ---------------------------------------------------------------------- diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ConnInstanceTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ConnInstanceTO.java index 9440972..23fb590 100644 --- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ConnInstanceTO.java +++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ConnInstanceTO.java @@ -20,8 +20,9 @@ package org.apache.syncope.common.lib.to; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.ArrayList; import java.util.EnumSet; -import java.util.HashSet; +import java.util.List; import java.util.Set; import javax.ws.rs.PathParam; import javax.xml.bind.annotation.XmlElement; @@ -52,7 +53,7 @@ public class ConnInstanceTO extends AbstractBaseBean implements EntityTO { private String version; - private final Set conf = new HashSet<>(); + private final List conf = new ArrayList<>(); private final Set capabilities = EnumSet.noneOf(ConnectorCapability.class); @@ -116,7 +117,7 @@ public class ConnInstanceTO extends AbstractBaseBean implements EntityTO { @XmlElementWrapper(name = "conf") @XmlElement(name = "property") @JsonProperty("conf") - public Set getConf() { + public List getConf() { return this.conf; } http://git-wip-us.apache.org/repos/asf/syncope/blob/05ada83c/common/lib/src/main/java/org/apache/syncope/common/lib/to/ResourceTO.java ---------------------------------------------------------------------- diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ResourceTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ResourceTO.java index 9ea0029..4bc9c0d 100644 --- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ResourceTO.java +++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ResourceTO.java @@ -22,7 +22,6 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import java.util.ArrayList; import java.util.EnumSet; -import java.util.HashSet; import java.util.List; import java.util.Set; import javax.ws.rs.PathParam; @@ -79,7 +78,7 @@ public class ResourceTO extends AbstractBaseBean implements EntityTO { private String pullPolicy; - private final Set confOverride = new HashSet<>(); + private final List confOverride = new ArrayList<>(); private boolean overrideCapabilities = false; @@ -215,7 +214,7 @@ public class ResourceTO extends AbstractBaseBean implements EntityTO { @XmlElementWrapper(name = "confOverride") @XmlElement(name = "property") @JsonProperty("confOverride") - public Set getConfOverride() { + public List getConfOverride() { return confOverride; } http://git-wip-us.apache.org/repos/asf/syncope/blob/05ada83c/common/lib/src/main/java/org/apache/syncope/common/lib/types/ConnConfPropSchema.java ---------------------------------------------------------------------- diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/types/ConnConfPropSchema.java b/common/lib/src/main/java/org/apache/syncope/common/lib/types/ConnConfPropSchema.java index 8b0dbe6..1958dc6 100644 --- a/common/lib/src/main/java/org/apache/syncope/common/lib/types/ConnConfPropSchema.java +++ b/common/lib/src/main/java/org/apache/syncope/common/lib/types/ConnConfPropSchema.java @@ -21,6 +21,7 @@ package org.apache.syncope.common.lib.types; import com.fasterxml.jackson.annotation.JsonProperty; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; import javax.xml.bind.annotation.XmlRootElement; @@ -117,7 +118,46 @@ public class ConnConfPropSchema extends AbstractBaseBean implements Comparable other.getOrder() ? 1 : this.getOrder() < other.getOrder() - ? -1 - : 0; + ? -1 + : 0; } + + @Override + public int hashCode() { + int hash = 5; + hash = 53 * hash + Objects.hashCode(this.name); + hash = 53 * hash + Objects.hashCode(this.type); + hash = 53 * hash + (this.required ? 1 : 0); + hash = 53 * hash + this.order; + hash = 53 * hash + (this.confidential ? 1 : 0); + return hash; + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final ConnConfPropSchema other = (ConnConfPropSchema) obj; + if (this.required != other.required) { + return false; + } + if (this.order != other.order) { + return false; + } + if (this.confidential != other.confidential) { + return false; + } + if (!Objects.equals(this.name, other.name)) { + return false; + } + return Objects.equals(this.type, other.type); + } + } http://git-wip-us.apache.org/repos/asf/syncope/blob/05ada83c/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ConnectorHistoryService.java ---------------------------------------------------------------------- diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ConnectorHistoryService.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ConnectorHistoryService.java index 28a0b3c..1825d08 100644 --- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ConnectorHistoryService.java +++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ConnectorHistoryService.java @@ -30,7 +30,7 @@ import javax.ws.rs.core.MediaType; import org.apache.syncope.common.lib.to.ConnInstanceHistoryConfTO; /** - * REST operations for connector instance configuration versioning. + * REST operations for connector configuration versioning. */ @Path("connectorsHistory") public interface ConnectorHistoryService extends JAXRSService { @@ -48,7 +48,7 @@ public interface ConnectorHistoryService extends JAXRSService { /** * Restores the connector configuration history instance matching the provided key. - * + * * @param key connector configuration history instance key to be restored */ @POST http://git-wip-us.apache.org/repos/asf/syncope/blob/05ada83c/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/ConnInstance.java ---------------------------------------------------------------------- diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/ConnInstance.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/ConnInstance.java index 908bb39..258ea31 100644 --- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/ConnInstance.java +++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/ConnInstance.java @@ -18,6 +18,7 @@ */ package org.apache.syncope.core.persistence.api.entity; +import java.util.Collection; import java.util.List; import java.util.Set; import org.apache.syncope.common.lib.types.ConnConfProperty; @@ -60,7 +61,7 @@ public interface ConnInstance extends Entity { List getResources(); - void setConf(Set conf); + void setConf(Collection conf); Set getConf(); http://git-wip-us.apache.org/repos/asf/syncope/blob/05ada83c/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAConnInstance.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAConnInstance.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAConnInstance.java index 7678fc2..fb5b88e 100644 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAConnInstance.java +++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAConnInstance.java @@ -19,6 +19,7 @@ package org.apache.syncope.core.persistence.jpa.entity; import java.util.ArrayList; +import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -191,7 +192,7 @@ public class JPAConnInstance extends AbstractGeneratedKeyEntity implements ConnI } @Override - public void setConf(final Set conf) { + public void setConf(final Collection conf) { jsonConf = POJOHelper.serialize(new HashSet<>(conf)); } @@ -227,7 +228,7 @@ public class JPAConnInstance extends AbstractGeneratedKeyEntity implements ConnI // DEFAULT_TIMEOUT will be returned in case of null timeout: // * instances created by the content loader // * or with a timeout nullified explicitely - return connRequestTimeout == null ? Integer.valueOf(DEFAULT_TIMEOUT) : connRequestTimeout; + return connRequestTimeout == null ? DEFAULT_TIMEOUT : connRequestTimeout; } @Override http://git-wip-us.apache.org/repos/asf/syncope/blob/05ada83c/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/ConnectorFactory.java ---------------------------------------------------------------------- diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/ConnectorFactory.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/ConnectorFactory.java index 4c6dd82..0b0beb9 100644 --- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/ConnectorFactory.java +++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/ConnectorFactory.java @@ -18,7 +18,7 @@ */ package org.apache.syncope.core.provisioning.api; -import java.util.Set; +import java.util.Collection; import org.apache.syncope.common.lib.types.ConnConfProperty; import org.apache.syncope.common.lib.types.ConnectorCapability; import org.apache.syncope.core.persistence.api.entity.ConnInstance; @@ -41,8 +41,8 @@ public interface ConnectorFactory { */ ConnInstance buildConnInstanceOverride( ConnInstance connInstance, - Set confOverride, - Set capabilitiesOverride); + Collection confOverride, + Collection capabilitiesOverride); /** * Create connector from given connector instance. http://git-wip-us.apache.org/repos/asf/syncope/blob/05ada83c/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ConnectorManager.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ConnectorManager.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ConnectorManager.java index 901acc2..f3c6e73 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ConnectorManager.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ConnectorManager.java @@ -18,6 +18,7 @@ */ package org.apache.syncope.core.provisioning.java; +import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Locale; @@ -80,8 +81,8 @@ public class ConnectorManager implements ConnectorRegistry, ConnectorFactory, Sy @Override public ConnInstance buildConnInstanceOverride( final ConnInstance connInstance, - final Set confOverride, - final Set capabilitiesOverride) { + final Collection confOverride, + final Collection capabilitiesOverride) { synchronized (this) { if (entityFactory == null) { http://git-wip-us.apache.org/repos/asf/syncope/blob/05ada83c/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ConnInstanceDataBinderImpl.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ConnInstanceDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ConnInstanceDataBinderImpl.java index 0fc31f7..7dfb721 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ConnInstanceDataBinderImpl.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ConnInstanceDataBinderImpl.java @@ -22,6 +22,7 @@ import java.net.URI; import org.apache.syncope.core.provisioning.api.data.ConnInstanceDataBinder; import java.util.Arrays; import java.util.Collection; +import java.util.Collections; import java.util.Date; import java.util.List; import org.apache.commons.lang3.tuple.Pair; @@ -54,7 +55,7 @@ import org.springframework.stereotype.Component; @Component public class ConnInstanceDataBinderImpl implements ConnInstanceDataBinder { - private static final String[] IGNORE_PROPERTIES = { "poolConf", "location", "adminRealm" }; + private static final String[] IGNORE_PROPERTIES = { "poolConf", "location", "adminRealm", "conf" }; @Autowired private ConnIdBundleManager connIdBundleManager; @@ -110,6 +111,7 @@ public class ConnInstanceDataBinderImpl implements ConnInstanceDataBinder { if (connInstanceTO.getLocation() != null) { connInstance.setLocation(connInstanceTO.getLocation()); } + connInstance.setConf(connInstanceTO.getConf()); if (connInstanceTO.getPoolConf() != null) { connInstance.setPoolConf( ConnPoolConfUtils.getConnPoolConf(connInstanceTO.getPoolConf(), entityFactory.newConnPoolConf())); @@ -130,21 +132,24 @@ public class ConnInstanceDataBinderImpl implements ConnInstanceDataBinder { throw new NotFoundException("Connector '" + connInstanceTO.getKey() + "'"); } - // 1. save the current configuration, before update - ConnInstanceHistoryConf connInstanceHistoryConf = entityFactory.newEntity(ConnInstanceHistoryConf.class); - connInstanceHistoryConf.setCreator(AuthContextUtils.getUsername()); - connInstanceHistoryConf.setCreation(new Date()); - connInstanceHistoryConf.setEntity(connInstance); - connInstanceHistoryConf.setConf(getConnInstanceTO(connInstance)); - connInstanceHistoryConfDAO.save(connInstanceHistoryConf); - - // 2. ensure the maximum history size is not exceeded - List history = connInstanceHistoryConfDAO.findByEntity(connInstance); - long maxHistorySize = confDAO.find("connector.conf.history.size", 10L); - if (maxHistorySize < history.size()) { - // always remove the last item since history was obtained by a query with ORDER BY creation DESC - for (int i = 0; i < history.size() - maxHistorySize; i++) { - connInstanceHistoryConfDAO.delete(history.get(history.size() - 1).getKey()); + ConnInstanceTO current = getConnInstanceTO(connInstance); + if (!current.equals(connInstanceTO)) { + // 1. save the current configuration, before update + ConnInstanceHistoryConf connInstanceHistoryConf = entityFactory.newEntity(ConnInstanceHistoryConf.class); + connInstanceHistoryConf.setCreator(AuthContextUtils.getUsername()); + connInstanceHistoryConf.setCreation(new Date()); + connInstanceHistoryConf.setEntity(connInstance); + connInstanceHistoryConf.setConf(current); + connInstanceHistoryConfDAO.save(connInstanceHistoryConf); + + // 2. ensure the maximum history size is not exceeded + List history = connInstanceHistoryConfDAO.findByEntity(connInstance); + long maxHistorySize = confDAO.find("connector.conf.history.size", 10L); + if (maxHistorySize < history.size()) { + // always remove the last item since history was obtained by a query with ORDER BY creation DESC + for (int i = 0; i < history.size() - maxHistorySize; i++) { + connInstanceHistoryConfDAO.delete(history.get(history.size() - 1).getKey()); + } } } @@ -241,9 +246,10 @@ public class ConnInstanceDataBinderImpl implements ConnInstanceDataBinder { BeanUtils.copyProperties(connInstance, connInstanceTO, IGNORE_PROPERTIES); connInstanceTO.setAdminRealm(connInstance.getAdminRealm().getFullPath()); connInstanceTO.setLocation(info.getLeft().toASCIIString()); + connInstanceTO.getConf().addAll(connInstance.getConf()); // refresh stored properties in the given connInstance with direct information from underlying connector ConfigurationProperties properties = connIdBundleManager.getConfigurationProperties(info.getRight()); - for (final String propName : properties.getPropertyNames()) { + for (String propName : properties.getPropertyNames()) { ConnConfPropSchema schema = build(properties.getProperty(propName)); ConnConfProperty property = connInstanceTO.getConf(propName); @@ -253,9 +259,16 @@ public class ConnInstanceDataBinderImpl implements ConnInstanceDataBinder { } property.setSchema(schema); } + Collections.sort(connInstanceTO.getConf()); // pool configuration - if (connInstance.getPoolConf() != null) { + if (connInstance.getPoolConf() != null + && (connInstance.getPoolConf().getMaxIdle() != null + || connInstance.getPoolConf().getMaxObjects() != null + || connInstance.getPoolConf().getMaxWait() != null + || connInstance.getPoolConf().getMinEvictableIdleTimeMillis() != null + || connInstance.getPoolConf().getMinIdle() != null)) { + ConnPoolConfTO poolConf = new ConnPoolConfTO(); BeanUtils.copyProperties(connInstance.getPoolConf(), poolConf); connInstanceTO.setPoolConf(poolConf); http://git-wip-us.apache.org/repos/asf/syncope/blob/05ada83c/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderImpl.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderImpl.java index b21a605..9f8e75d 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderImpl.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderImpl.java @@ -18,6 +18,7 @@ */ package org.apache.syncope.core.provisioning.java.data; +import java.util.Collections; import java.util.Date; import java.util.HashSet; import java.util.Iterator; @@ -116,22 +117,25 @@ public class ResourceDataBinderImpl implements ResourceDataBinder { @Override public ExternalResource update(final ExternalResource resource, final ResourceTO resourceTO) { if (resource.getKey() != null) { - // 1. save the current configuration, before update - ExternalResourceHistoryConf resourceHistoryConf = - entityFactory.newEntity(ExternalResourceHistoryConf.class); - resourceHistoryConf.setCreator(AuthContextUtils.getUsername()); - resourceHistoryConf.setCreation(new Date()); - resourceHistoryConf.setEntity(resource); - resourceHistoryConf.setConf(getResourceTO(resource)); - resourceHistoryConfDAO.save(resourceHistoryConf); - - // 2. ensure the maximum history size is not exceeded - List history = resourceHistoryConfDAO.findByEntity(resource); - long maxHistorySize = confDAO.find("resource.conf.history.size", 10L); - if (maxHistorySize < history.size()) { - // always remove the last item since history was obtained by a query with ORDER BY creation DESC - for (int i = 0; i < history.size() - maxHistorySize; i++) { - resourceHistoryConfDAO.delete(history.get(history.size() - 1).getKey()); + ResourceTO current = getResourceTO(resource); + if (!current.equals(resourceTO)) { + // 1. save the current configuration, before update + ExternalResourceHistoryConf resourceHistoryConf = + entityFactory.newEntity(ExternalResourceHistoryConf.class); + resourceHistoryConf.setCreator(AuthContextUtils.getUsername()); + resourceHistoryConf.setCreation(new Date()); + resourceHistoryConf.setEntity(resource); + resourceHistoryConf.setConf(current); + resourceHistoryConfDAO.save(resourceHistoryConf); + + // 2. ensure the maximum history size is not exceeded + List history = resourceHistoryConfDAO.findByEntity(resource); + long maxHistorySize = confDAO.find("resource.conf.history.size", 10L); + if (maxHistorySize < history.size()) { + // always remove the last item since history was obtained by a query with ORDER BY creation DESC + for (int i = 0; i < history.size() - maxHistorySize; i++) { + resourceHistoryConfDAO.delete(history.get(history.size() - 1).getKey()); + } } } } @@ -579,6 +583,7 @@ public class ResourceDataBinderImpl implements ResourceDataBinder { ? null : resource.getPullPolicy().getKey()); resourceTO.getConfOverride().addAll(resource.getConfOverride()); + Collections.sort(resourceTO.getConfOverride()); resourceTO.setOverrideCapabilities(resource.isOverrideCapabilities()); resourceTO.getCapabilitiesOverride().addAll(resource.getCapabilitiesOverride()); http://git-wip-us.apache.org/repos/asf/syncope/blob/05ada83c/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ConnectorITCase.java ---------------------------------------------------------------------- diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ConnectorITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ConnectorITCase.java index 02e744f..09a2653 100644 --- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ConnectorITCase.java +++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ConnectorITCase.java @@ -319,7 +319,7 @@ public class ConnectorITCase extends AbstractITCase { @Test public void getConnectorConfiguration() { - Set props = connectorService.read( + List props = connectorService.read( "6c2acf1b-b052-46f0-8c56-7a8ad6905edf", Locale.ENGLISH.getLanguage()).getConf(); assertNotNull(props); assertFalse(props.isEmpty());