[SYNCOPE-806] Resource provisioning validated, and management of aux classes in Provision instances added
Project: http://git-wip-us.apache.org/repos/asf/syncope/repo Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/692e1f91 Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/692e1f91 Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/692e1f91 Branch: refs/heads/master Commit: 692e1f91c67d8eeaa731392d42daa03b1df07248 Parents: 756e5c5 Author: Francesco Chicchiriccò <[email protected]> Authored: Tue Apr 5 15:46:37 2016 +0200 Committer: Francesco Chicchiriccò <[email protected]> Committed: Tue Apr 5 15:46:37 2016 +0200 ---------------------------------------------------------------------- .../console/approvals/ApprovalDetails.java | 2 +- .../panels/ProvisionAuxClassesPanel.java | 62 +++++++ .../console/panels/ResourceMappingPanel.java | 30 +-- .../client/console/panels/ResourceModal.java | 12 +- .../panels/search/AbstractSearchPanel.java | 2 +- .../console/rest/AnyTypeClassRestClient.java | 4 + .../client/console/rest/AnyTypeRestClient.java | 4 +- .../wicket/markup/html/form/ActionLink.java | 1 - .../markup/html/form/ActionLinksPanel.java | 24 --- .../markup/html/form/AjaxPalettePanel.java | 12 +- .../client/console/wizards/any/Ownership.java | 4 +- .../provision/ProvisionWizardBuilder.java | 19 +- .../panels/ProvisionAuxClassesPanel.html | 23 +++ .../console/panels/ResourceModal.properties | 2 +- .../console/panels/ResourceModal_it.properties | 2 +- .../panels/ResourceModal_pt_BR.properties | 2 +- .../markup/html/form/ActionLinksPanel.html | 5 - .../ProvisionWizardBuilder$AuxClasses.html | 23 +++ ...ProvisionWizardBuilder$AuxClasses.properties | 20 ++ ...visionWizardBuilder$AuxClasses_it.properties | 19 ++ ...ionWizardBuilder$AuxClasses_pt_BR.properties | 20 ++ ...isionWizardBuilder$ConnObjectLink.properties | 4 +- ...onWizardBuilder$ConnObjectLink_it.properties | 4 +- ...izardBuilder$ConnObjectLink_pt_BR.properties | 4 +- .../ProvisionWizardBuilder$Mapping.properties | 2 +- ...ProvisionWizardBuilder$Mapping_it.properties | 2 +- ...visionWizardBuilder$Mapping_pt_BR.properties | 2 +- .../ProvisionWizardBuilder$ObjectType.html | 1 - .../syncope/common/lib/to/ProvisionTO.java | 9 + .../api/dao/ExternalResourceDAO.java | 3 + .../core/persistence/api/dao/GroupDAO.java | 2 +- .../api/entity/resource/Provision.java | 6 + .../persistence/jpa/dao/JPAAnyTypeClassDAO.java | 11 +- .../jpa/dao/JPAExternalResourceDAO.java | 11 ++ .../core/persistence/jpa/dao/JPAGroupDAO.java | 2 +- .../jpa/entity/resource/JPAProvision.java | 25 +++ .../test/resources/domains/MasterContent.xml | 5 + .../java/data/ResourceDataBinderImpl.java | 186 +++++++++++++------ .../syncope/fit/console/TopologyITCase.java | 12 +- .../apache/syncope/fit/core/PushTaskITCase.java | 3 +- .../apache/syncope/fit/core/ResourceITCase.java | 15 +- .../apache/syncope/fit/core/VirAttrITCase.java | 58 +++--- 42 files changed, 473 insertions(+), 186 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/client/console/src/main/java/org/apache/syncope/client/console/approvals/ApprovalDetails.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/approvals/ApprovalDetails.java b/client/console/src/main/java/org/apache/syncope/client/console/approvals/ApprovalDetails.java index ec8cbcf..7c954fd 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/approvals/ApprovalDetails.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/approvals/ApprovalDetails.java @@ -38,7 +38,7 @@ public class ApprovalDetails extends MultilevelPanel.SecondLevel { super(MultilevelPanel.SECOND_LEVEL_ID); final UserTO userTO = new UserRestClient().read(formTO.getUserKey()); - final List<String> anyTypeClasses = new AnyTypeRestClient().get(AnyTypeKind.USER.name()).getClasses(); + final List<String> anyTypeClasses = new AnyTypeRestClient().read(AnyTypeKind.USER.name()).getClasses(); final AjaxWizard<AnyHandler<UserTO>> wizard = new UserWizardBuilder("wizard", userTO, anyTypeClasses, pageRef).build(AjaxWizard.Mode.READONLY); http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/client/console/src/main/java/org/apache/syncope/client/console/panels/ProvisionAuxClassesPanel.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ProvisionAuxClassesPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ProvisionAuxClassesPanel.java new file mode 100644 index 0000000..3e7116c --- /dev/null +++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ProvisionAuxClassesPanel.java @@ -0,0 +1,62 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.syncope.client.console.panels; + +import java.util.ArrayList; +import java.util.List; +import org.apache.syncope.client.console.rest.AnyTypeClassRestClient; +import org.apache.syncope.client.console.rest.AnyTypeRestClient; +import org.apache.syncope.client.console.wicket.markup.html.form.AjaxPalettePanel; +import org.apache.syncope.common.lib.to.AnyTypeClassTO; +import org.apache.syncope.common.lib.to.AnyTypeTO; +import org.apache.syncope.common.lib.to.ProvisionTO; +import org.apache.wicket.markup.html.panel.Panel; +import org.apache.wicket.model.PropertyModel; +import org.apache.wicket.model.util.ListModel; + +public class ProvisionAuxClassesPanel extends Panel { + + private static final long serialVersionUID = -3962956154520358784L; + + private final ProvisionTO provisionTO; + + public ProvisionAuxClassesPanel(final String id, final ProvisionTO provisionTO) { + super(id); + setOutputMarkupId(true); + + this.provisionTO = provisionTO; + } + + @Override + protected void onBeforeRender() { + super.onBeforeRender(); + + AnyTypeTO anyType = new AnyTypeRestClient().read(provisionTO.getAnyType()); + List<String> choices = new ArrayList<>(); + for (AnyTypeClassTO aux : new AnyTypeClassRestClient().list()) { + if (!anyType.getClasses().contains(aux.getKey())) { + choices.add(aux.getKey()); + } + } + addOrReplace(new AjaxPalettePanel.Builder<String>().build("auxClasses", + new PropertyModel<List<String>>(provisionTO, "auxClasses"), + new ListModel<>(choices)).hideLabel().setOutputMarkupId(true)); + } + +} http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceMappingPanel.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceMappingPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceMappingPanel.java index 09d99d0..30188f9 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceMappingPanel.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceMappingPanel.java @@ -22,13 +22,11 @@ import de.agilecoders.wicket.core.markup.html.bootstrap.components.TooltipConfig import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.HashSet; import java.util.List; import java.util.Set; -import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.IterableUtils; import org.apache.commons.collections4.Predicate; import org.apache.syncope.client.console.commons.ConnIdSpecialAttributeName; @@ -531,32 +529,22 @@ public class ResourceMappingPanel extends Panel { * @param toBeUpdated drop down choice to be updated. */ private void setAttrNames(final IntMappingType type, final AjaxDropDownChoicePanel<String> toBeUpdated) { - toBeUpdated.setRequired(true); toBeUpdated.setEnabled(true); if (type == null || type.getAnyTypeKind() == null) { toBeUpdated.setChoices(Collections.<String>emptyList()); } else { - Collection<AnyTypeTO> anyTypeTOs = type.getAnyTypeKind() == AnyTypeKind.ANY_OBJECT - ? CollectionUtils.select(anyTypeRestClient.list(), new Predicate<AnyTypeTO>() { - - @Override - public boolean evaluate(final AnyTypeTO object) { - return object.getKind() == AnyTypeKind.ANY_OBJECT; - } - }) - : Collections.singletonList(anyTypeRestClient.get(type.getAnyTypeKind().name())); + AnyTypeTO anyTypeTO = anyTypeRestClient.read(provisionTO.getAnyType()); - final List<AnyTypeClassTO> anyTypeClassTOs = new ArrayList<>(); - for (AnyTypeTO anyTypeTO : anyTypeTOs) { - anyTypeClassTOs.addAll(anyTypeClassRestClient.list(anyTypeTO.getClasses())); + List<AnyTypeClassTO> anyTypeClassTOs = new ArrayList<>(); + anyTypeClassTOs.addAll(anyTypeClassRestClient.list(anyTypeTO.getClasses())); + for (String auxClass : provisionTO.getAuxClasses()) { + anyTypeClassTOs.add(anyTypeClassRestClient.read(auxClass)); } List<String> choices; - switch (type) { - // user attribute names case UserPlainSchema: case GroupPlainSchema: case AnyObjectPlainSchema: @@ -639,14 +627,14 @@ public class ResourceMappingPanel extends Panel { /** * Get all attribute types from a selected attribute type. * - * @param entity entity. + * @param kind entity. * @return all attribute types. */ - private List<IntMappingType> getAttributeTypes(final AnyTypeKind entity) { + private List<IntMappingType> getAttributeTypes(final AnyTypeKind kind) { final List<IntMappingType> res = new ArrayList<>(); - if (entity != null) { - res.addAll(IntMappingType.getAttributeTypes(entity)); + if (kind != null) { + res.addAll(IntMappingType.getAttributeTypes(kind)); } return res; http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceModal.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceModal.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceModal.java index c0df4ac..ba29fb9 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceModal.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceModal.java @@ -116,7 +116,7 @@ public class ResourceModal<T extends Serializable> extends AbstractResourceModal }; builder.setItems(model.getObject().getProvisions()); - builder.includes("anyType", "objectClass"); + builder.includes("anyType", "objectClass", "auxClasses"); builder.setReuseItem(false); builder. @@ -132,16 +132,6 @@ public class ResourceModal<T extends Serializable> extends AbstractResourceModal }, ActionLink.ActionType.MAPPING, StandardEntitlement.RESOURCE_UPDATE). addAction(new ActionLink<ProvisionTO>() { - private static final long serialVersionUID = -3722207913631435514L; - - @Override - public void onClick(final AjaxRequestTarget target, final ProvisionTO provisionTO) { - send(pageRef.getPage(), Broadcast.DEPTH, - new AjaxWizard.NewItemActionEvent<>(provisionTO, 3, target)); - } - }, ActionLink.ActionType.ACCOUNT_LINK, StandardEntitlement.RESOURCE_UPDATE). - addAction(new ActionLink<ProvisionTO>() { - private static final long serialVersionUID = -3722207913631435524L; @Override http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/client/console/src/main/java/org/apache/syncope/client/console/panels/search/AbstractSearchPanel.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/search/AbstractSearchPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/search/AbstractSearchPanel.java index b3918e1..3d05eee 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/panels/search/AbstractSearchPanel.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/search/AbstractSearchPanel.java @@ -166,7 +166,7 @@ public abstract class AbstractSearchPanel extends Panel { @Override protected List<String> load() { return CollectionUtils.collect( - schemaRestClient.getSchemas(SchemaType.PLAIN, anyTypeRestClient.get(type).getClasses(). + schemaRestClient.getSchemas(SchemaType.PLAIN, anyTypeRestClient.read(type).getClasses(). toArray(new String[] {})), EntityTOUtils.<String, AbstractSchemaTO>keyTransformer(), new ArrayList<String>()); http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/client/console/src/main/java/org/apache/syncope/client/console/rest/AnyTypeClassRestClient.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/rest/AnyTypeClassRestClient.java b/client/console/src/main/java/org/apache/syncope/client/console/rest/AnyTypeClassRestClient.java index 2f9d0f1..26b8601 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/rest/AnyTypeClassRestClient.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/rest/AnyTypeClassRestClient.java @@ -30,6 +30,10 @@ public class AnyTypeClassRestClient extends BaseRestClient { private static final long serialVersionUID = -2211371717449597247L; + public AnyTypeClassTO read(final String key) { + return getService(AnyTypeClassService.class).read(key); + } + public List<AnyTypeClassTO> list() { List<AnyTypeClassTO> types = Collections.emptyList(); http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/client/console/src/main/java/org/apache/syncope/client/console/rest/AnyTypeRestClient.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/rest/AnyTypeRestClient.java b/client/console/src/main/java/org/apache/syncope/client/console/rest/AnyTypeRestClient.java index 33b9552..06b45df 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/rest/AnyTypeRestClient.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/rest/AnyTypeRestClient.java @@ -28,11 +28,11 @@ public class AnyTypeRestClient extends BaseRestClient { private static final long serialVersionUID = -2211371717449597247L; - public AnyTypeTO get(final String kind) { + public AnyTypeTO read(final String key) { AnyTypeTO type = null; try { - type = getService(AnyTypeService.class).read(kind); + type = getService(AnyTypeService.class).read(key); } catch (SyncopeClientException e) { LOG.error("While reading all any types", e); } http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLink.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLink.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLink.java index 9bd19ee..ed30b69 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLink.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLink.java @@ -41,7 +41,6 @@ public abstract class ActionLink<T extends Serializable> implements Serializable public enum ActionType { MAPPING("update"), - ACCOUNT_LINK("update"), MUSTCHANGEPASSWORD("update"), RESET_TIME("update"), CLONE("create"), http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.java index 52e1ada..4040bf6 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.java @@ -56,7 +56,6 @@ public final class ActionLinksPanel<T extends Serializable> extends Panel { super.add(new Fragment("panelManageUsers", "emptyFragment", this)); super.add(new Fragment("panelManageGroups", "emptyFragment", this)); super.add(new Fragment("panelMapping", "emptyFragment", this)); - super.add(new Fragment("panelAccountLink", "emptyFragment", this)); super.add(new Fragment("panelMustChangePassword", "emptyFragment", this)); super.add(new Fragment("panelResetTime", "emptyFragment", this)); super.add(new Fragment("panelClone", "emptyFragment", this)); @@ -194,25 +193,6 @@ public final class ActionLinksPanel<T extends Serializable> extends Panel { }.setVisible(link.isEnabled(model.getObject()))); break; - case ACCOUNT_LINK: - fragment = new Fragment("panelAccountLink", "fragmentAccountLink", this); - - fragment.addOrReplace(new IndicatingAjaxLink<Void>("accountLinkLink") { - - private static final long serialVersionUID = -7978723352517770644L; - - @Override - public void onClick(final AjaxRequestTarget target) { - link.onClick(target, model.getObject()); - } - - @Override - public String getAjaxIndicatorMarkupId() { - return disableIndicator ? StringUtils.EMPTY : super.getAjaxIndicatorMarkupId(); - } - }.setVisible(link.isEnabled(model.getObject()))); - break; - case MUSTCHANGEPASSWORD: fragment = new Fragment("panelMustChangePassword", "fragmentMustChangePassword", this); @@ -808,10 +788,6 @@ public final class ActionLinksPanel<T extends Serializable> extends Panel { super.addOrReplace(new Fragment("panelMapping", "emptyFragment", this)); break; - case ACCOUNT_LINK: - super.addOrReplace(new Fragment("panelAccountLink", "emptyFragment", this)); - break; - case MUSTCHANGEPASSWORD: super.addOrReplace(new Fragment("panelMustChangePassword", "emptyFragment", this)); break; http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxPalettePanel.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxPalettePanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxPalettePanel.java index d84397d..0af6e61 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxPalettePanel.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxPalettePanel.java @@ -78,7 +78,7 @@ public class AjaxPalettePanel<T extends Serializable> extends AbstractFieldPanel choicesModel = new PaletteLoadableDetachableModel(builder) { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = -108100712154481840L; @Override protected List<T> getChoices() { @@ -174,7 +174,7 @@ public class AjaxPalettePanel<T extends Serializable> extends AbstractFieldPanel form.add(new AjaxSubmitLink("search") { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = -1765773642975892072L; @Override protected void onAfterSubmit(final AjaxRequestTarget target, final Form<?> form) { @@ -184,6 +184,10 @@ public class AjaxPalettePanel<T extends Serializable> extends AbstractFieldPanel }); } + public LoadableDetachableModel<List<T>> getChoicesModel() { + return choicesModel; + } + @Override public AjaxPalettePanel<T> setModelObject(final List<T> object) { palette.setDefaultModelObject(object); @@ -196,7 +200,7 @@ public class AjaxPalettePanel<T extends Serializable> extends AbstractFieldPanel public static class Builder<T extends Serializable> implements Serializable { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 991248996001040352L; private IChoiceRenderer<T> renderer; @@ -275,7 +279,7 @@ public class AjaxPalettePanel<T extends Serializable> extends AbstractFieldPanel private abstract class PaletteLoadableDetachableModel extends LoadableDetachableModel<List<T>> { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = -7745220313769774616L; private final Builder<T> builder; http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Ownership.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Ownership.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Ownership.java index 58e9efa..69df4ba 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Ownership.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Ownership.java @@ -157,7 +157,7 @@ public class Ownership extends WizardStep { new ListModel<>(new ArrayList<SearchClause>())).required(false).enableSearch().build("groupsearch"); groupSearchFragment.add(groupSearchPanel.setRenderBodyOnly(true)); - AnyTypeTO anyTypeTO = anyTypeRestClient.get(AnyTypeKind.GROUP.name()); + AnyTypeTO anyTypeTO = anyTypeRestClient.read(AnyTypeKind.GROUP.name()); groupDirectoryPanel = GroupSelectionDirectoryPanel.class.cast(new GroupSelectionDirectoryPanel.Builder( anyTypeClassRestClient.list(anyTypeTO.getClasses()), @@ -171,7 +171,7 @@ public class Ownership extends WizardStep { new ListModel<>(new ArrayList<SearchClause>())).required(false).enableSearch().build("usersearch")); userSearchFragment.add(userSearchPanel.setRenderBodyOnly(true)); - anyTypeTO = anyTypeRestClient.get(AnyTypeKind.USER.name()); + anyTypeTO = anyTypeRestClient.read(AnyTypeKind.USER.name()); userDirectoryPanel = UserSelectionDirectoryPanel.class.cast(new UserSelectionDirectoryPanel.Builder( anyTypeClassRestClient.list(anyTypeTO.getClasses()), http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/client/console/src/main/java/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder.java index 99eb7c5..73d6bfb 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder.java @@ -26,6 +26,7 @@ import org.apache.commons.collections4.Predicate; import org.apache.commons.collections4.Transformer; import org.apache.commons.lang3.StringUtils; import org.apache.syncope.client.console.commons.Constants; +import org.apache.syncope.client.console.panels.ProvisionAuxClassesPanel; import org.apache.syncope.client.console.panels.ResourceMappingPanel; import org.apache.syncope.client.console.rest.AnyTypeRestClient; import org.apache.syncope.client.console.wicket.ajax.form.IndicatorAjaxFormComponentUpdatingBehavior; @@ -139,6 +140,21 @@ public class ProvisionWizardBuilder extends AjaxWizardBuilder<ProvisionTO> imple } /** + * AuxClasses definition step. + */ + private final class AuxClasses extends WizardStep { + + private static final long serialVersionUID = 5315236191866427500L; + + AuxClasses(final ProvisionTO item) { + setTitleModel(new ResourceModel("auxClasses.title")); + setSummaryModel(new StringResourceModel("auxClasses.summary", this, new Model<>(item))); + + add(new ProvisionAuxClassesPanel("auxClasses", item)); + } + } + + /** * Mapping definition step. */ private final class Mapping extends WizardStep { @@ -146,7 +162,7 @@ public class ProvisionWizardBuilder extends AjaxWizardBuilder<ProvisionTO> imple private static final long serialVersionUID = 3454904947720856253L; Mapping(final ProvisionTO item) { - setTitleModel(new ResourceModel("mapping.title", "Mapping")); + setTitleModel(new ResourceModel("mapping.title")); setSummaryModel(new StringResourceModel("mapping.summary", this, new Model<>(item))); add(new ResourceMappingPanel("mapping", resourceTO, item)); @@ -225,6 +241,7 @@ public class ProvisionWizardBuilder extends AjaxWizardBuilder<ProvisionTO> imple @Override protected WizardModel buildModelSteps(final ProvisionTO modelObject, final WizardModel wizardModel) { wizardModel.add(new ObjectType(modelObject)); + wizardModel.add(new AuxClasses(modelObject)); wizardModel.add(new Mapping(modelObject)); wizardModel.add(new ConnObjectLink(modelObject)); return wizardModel; http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/client/console/src/main/resources/org/apache/syncope/client/console/panels/ProvisionAuxClassesPanel.html ---------------------------------------------------------------------- diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ProvisionAuxClassesPanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ProvisionAuxClassesPanel.html new file mode 100644 index 0000000..3be0e43 --- /dev/null +++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ProvisionAuxClassesPanel.html @@ -0,0 +1,23 @@ +<!-- +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied. See the License for the +specific language governing permissions and limitations +under the License. +--> +<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org"> + <wicket:panel> + <span wicket:id="auxClasses"/> + </wicket:panel> +</html> http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal.properties ---------------------------------------------------------------------- diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal.properties index 38500a7..5b21e1f 100644 --- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal.properties +++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal.properties @@ -64,5 +64,5 @@ anyType=Object Type objectClass= Object Class __ACCOUNT__=ACCOUNT __GROUP__=GROUP -listview.caption=Provisioning configuration instances connectorCapabilities=Connector Capabilities +auxClasses=Auxiliary Classes http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal_it.properties ---------------------------------------------------------------------- diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal_it.properties index afb7798..1f7d76a 100644 --- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal_it.properties +++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal_it.properties @@ -63,5 +63,5 @@ anyType=Oggetto objectClass=Classe __ACCOUNT__=ACCOUNT __GROUP__=GROUP -listview.caption=Istanze di configurazione del provisioning connectorCapabilities=Capabilitiey Connettore +auxClasses=Classi Ausiliarie http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal_pt_BR.properties ---------------------------------------------------------------------- diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal_pt_BR.properties index 31989cd..db984d9 100644 --- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal_pt_BR.properties +++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal_pt_BR.properties @@ -63,5 +63,5 @@ anyType=Objeto objectClass=Classe __ACCOUNT__=ACCOUNT __GROUP__=GROUP -listview.caption=Inst\u00e2ncias de provisionamento de recursos connectorCapabilities=Capacidades do Conector +auxClasses=Classes Auxiliares http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.html ---------------------------------------------------------------------- diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.html index cc36119..50d3c6c 100644 --- a/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.html +++ b/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.html @@ -38,7 +38,6 @@ under the License. <span wicket:id="panelNotFound">[plus]</span> <span wicket:id="panelView">[plus]</span> <span wicket:id="panelMapping">[plus]</span> - <span wicket:id="panelAccountLink">[plus]</span> <span wicket:id="panelResetTime">[plus]</span> <span wicket:id="panelClone">[plus]</span> <span wicket:id="panelCreate">[plus]</span> @@ -87,10 +86,6 @@ under the License. <a href="#" wicket:id="mappingLink" class="btn"><i class="fa fa-exchange" alt="mapping icon" title="Mapping"></i></a> </wicket:fragment> - <wicket:fragment wicket:id="fragmentAccountLink"> - <a href="#" wicket:id="accountLinkLink" class="btn"><i class="fa fa-external-link" alt="account link icon" title="Account Link"></i></a> - </wicket:fragment> - <wicket:fragment wicket:id="fragmentResetTime"> <a href="#" wicket:id="resetTimeLink" class="btn"><i class="fa fa-hourglass-start" alt="reset time icon" title="Reset Time"></i></a> </wicket:fragment> http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$AuxClasses.html ---------------------------------------------------------------------- diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$AuxClasses.html b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$AuxClasses.html new file mode 100644 index 0000000..9b03dd7 --- /dev/null +++ b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$AuxClasses.html @@ -0,0 +1,23 @@ +<!-- +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied. See the License for the +specific language governing permissions and limitations +under the License. +--> +<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org"> + <wicket:panel> + <span wicket:id="auxClasses"/> + </wicket:panel> +</html> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$AuxClasses.properties ---------------------------------------------------------------------- diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$AuxClasses.properties b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$AuxClasses.properties new file mode 100644 index 0000000..8223360 --- /dev/null +++ b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$AuxClasses.properties @@ -0,0 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +auxClasses.title=Auxiliary Classes +auxClasses.summary= + http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$AuxClasses_it.properties ---------------------------------------------------------------------- diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$AuxClasses_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$AuxClasses_it.properties new file mode 100644 index 0000000..372ef2d --- /dev/null +++ b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$AuxClasses_it.properties @@ -0,0 +1,19 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +auxClasses.title=Classi Ausiliarie +auxClasses.summary= http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$AuxClasses_pt_BR.properties ---------------------------------------------------------------------- diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$AuxClasses_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$AuxClasses_pt_BR.properties new file mode 100644 index 0000000..0946b9d --- /dev/null +++ b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$AuxClasses_pt_BR.properties @@ -0,0 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +auxClasses.title=Classes Auxiliares +auxClasses.summary= + http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$ConnObjectLink.properties ---------------------------------------------------------------------- diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$ConnObjectLink.properties b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$ConnObjectLink.properties index e2df31e..dad26b4 100644 --- a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$ConnObjectLink.properties +++ b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$ConnObjectLink.properties @@ -15,6 +15,6 @@ # specific language governing permissions and limitations # under the License. -link.title=Specify the connector object link (if required) +link.title=Connector object link (if required) link.summary= - +connObjectLinkCheckbox=Use ConnObjectLink http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$ConnObjectLink_it.properties ---------------------------------------------------------------------- diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$ConnObjectLink_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$ConnObjectLink_it.properties index e2df31e..cf74d19 100644 --- a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$ConnObjectLink_it.properties +++ b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$ConnObjectLink_it.properties @@ -15,6 +15,6 @@ # specific language governing permissions and limitations # under the License. -link.title=Specify the connector object link (if required) +link.title=Connector object link (se necessario) link.summary= - +connObjectLinkCheckbox=Usa ConnObjectLink http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$ConnObjectLink_pt_BR.properties ---------------------------------------------------------------------- diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$ConnObjectLink_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$ConnObjectLink_pt_BR.properties index e2df31e..305b0b7 100644 --- a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$ConnObjectLink_pt_BR.properties +++ b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$ConnObjectLink_pt_BR.properties @@ -15,6 +15,6 @@ # specific language governing permissions and limitations # under the License. -link.title=Specify the connector object link (if required) +link.title=Connector object link (se necess\u00e1rio) link.summary= - +connObjectLinkCheckbox=Usar ConnObjectLink http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$Mapping.properties ---------------------------------------------------------------------- diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$Mapping.properties b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$Mapping.properties index 8dc0c10..99d1add 100644 --- a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$Mapping.properties +++ b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$Mapping.properties @@ -15,6 +15,6 @@ # specific language governing permissions and limitations # under the License. -mapping.title=Specify the mapping for this provisioning object +mapping.title=Mapping mapping.summary= http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$Mapping_it.properties ---------------------------------------------------------------------- diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$Mapping_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$Mapping_it.properties index 63e44ce..fde5de0 100644 --- a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$Mapping_it.properties +++ b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$Mapping_it.properties @@ -15,5 +15,5 @@ # specific language governing permissions and limitations # under the License. -mapping.title=Specify the mapping for this provisioning object +mapping.title=Mapping mapping.summary= http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$Mapping_pt_BR.properties ---------------------------------------------------------------------- diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$Mapping_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$Mapping_pt_BR.properties index 8dc0c10..99d1add 100644 --- a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$Mapping_pt_BR.properties +++ b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$Mapping_pt_BR.properties @@ -15,6 +15,6 @@ # specific language governing permissions and limitations # under the License. -mapping.title=Specify the mapping for this provisioning object +mapping.title=Mapping mapping.summary= http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$ObjectType.html ---------------------------------------------------------------------- diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$ObjectType.html b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$ObjectType.html index 7b505e4..1b951d3 100644 --- a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$ObjectType.html +++ b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$ObjectType.html @@ -20,7 +20,6 @@ under the License. <wicket:panel> <div wicket:id="container"> <div class="form-group"> - <label>Object Type</label> <span wicket:id="type"/> </div> <div class="form-group"> http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/common/lib/src/main/java/org/apache/syncope/common/lib/to/ProvisionTO.java ---------------------------------------------------------------------- diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ProvisionTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ProvisionTO.java index b39d543..7a683d5 100644 --- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ProvisionTO.java +++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ProvisionTO.java @@ -39,6 +39,8 @@ public class ProvisionTO extends AbstractBaseBean implements EntityTO<Long> { private String objectClass; + private final List<String> auxClasses = new ArrayList<>(); + private String syncToken; private MappingTO mapping; @@ -71,6 +73,13 @@ public class ProvisionTO extends AbstractBaseBean implements EntityTO<Long> { this.objectClass = objectClass; } + @XmlElementWrapper(name = "auxClasses") + @XmlElement(name = "class") + @JsonProperty("auxClasses") + public List<String> getAuxClasses() { + return auxClasses; + } + public String getSyncToken() { return syncToken; } http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/ExternalResourceDAO.java ---------------------------------------------------------------------- diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/ExternalResourceDAO.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/ExternalResourceDAO.java index 6c443e8..b92e9f2 100644 --- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/ExternalResourceDAO.java +++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/ExternalResourceDAO.java @@ -20,6 +20,7 @@ package org.apache.syncope.core.persistence.api.dao; import java.util.List; import org.apache.syncope.common.lib.types.IntMappingType; +import org.apache.syncope.core.persistence.api.entity.AnyTypeClass; import org.apache.syncope.core.persistence.api.entity.Policy; import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource; import org.apache.syncope.core.persistence.api.entity.resource.Provision; @@ -32,6 +33,8 @@ public interface ExternalResourceDAO extends DAO<ExternalResource, String> { Provision findProvision(Long key); + List<Provision> findProvisionsByAuxClass(AnyTypeClass anyTypeClass); + List<ExternalResource> findByPolicy(Policy policy); List<ExternalResource> findWithoutPolicy(Class<? extends Policy> policyClass); http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/GroupDAO.java ---------------------------------------------------------------------- diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/GroupDAO.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/GroupDAO.java index d372fbc..1de4ba2 100644 --- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/GroupDAO.java +++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/GroupDAO.java @@ -63,7 +63,7 @@ public interface GroupDAO extends AnyDAO<Group> { */ Map<Long, PropagationByResource> findUsersWithTransitiveResources(Long groupKey); - List<TypeExtension> findTypeExtensionByAnyTypeClass(AnyTypeClass anyTypeClass); + List<TypeExtension> findTypeExtensions(AnyTypeClass anyTypeClass); void refreshDynMemberships(AnyObject anyObject); http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/resource/Provision.java ---------------------------------------------------------------------- diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/resource/Provision.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/resource/Provision.java index f1b33fe..30cd970 100644 --- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/resource/Provision.java +++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/resource/Provision.java @@ -18,7 +18,9 @@ */ package org.apache.syncope.core.persistence.api.entity.resource; +import java.util.List; import org.apache.syncope.core.persistence.api.entity.AnyType; +import org.apache.syncope.core.persistence.api.entity.AnyTypeClass; import org.apache.syncope.core.persistence.api.entity.Entity; import org.identityconnectors.framework.common.objects.ObjectClass; import org.identityconnectors.framework.common.objects.SyncToken; @@ -37,6 +39,10 @@ public interface Provision extends Entity<Long> { void setObjectClass(ObjectClass objectClass); + boolean add(AnyTypeClass anyTypeClass); + + List<? extends AnyTypeClass> getAuxClasses(); + SyncToken getSyncToken(); String getSerializedSyncToken(); http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyTypeClassDAO.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyTypeClassDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyTypeClassDAO.java index 8efb01f..ee301f5 100644 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyTypeClassDAO.java +++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyTypeClassDAO.java @@ -24,6 +24,7 @@ import javax.persistence.TypedQuery; import org.apache.syncope.core.persistence.api.dao.AnyTypeClassDAO; import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO; import org.apache.syncope.core.persistence.api.dao.DerSchemaDAO; +import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO; import org.apache.syncope.core.persistence.api.dao.GroupDAO; import org.apache.syncope.core.persistence.api.dao.PlainSchemaDAO; import org.apache.syncope.core.persistence.api.dao.VirSchemaDAO; @@ -33,6 +34,7 @@ import org.apache.syncope.core.persistence.api.entity.DerSchema; import org.apache.syncope.core.persistence.api.entity.PlainSchema; import org.apache.syncope.core.persistence.api.entity.VirSchema; import org.apache.syncope.core.persistence.api.entity.group.TypeExtension; +import org.apache.syncope.core.persistence.api.entity.resource.Provision; import org.apache.syncope.core.persistence.jpa.entity.JPAAnyTypeClass; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; @@ -55,6 +57,9 @@ public class JPAAnyTypeClassDAO extends AbstractDAO<AnyTypeClass, String> implem @Autowired private GroupDAO groupDAO; + @Autowired + private ExternalResourceDAO resourceDAO; + @Override public AnyTypeClass find(final String key) { return entityManager().find(JPAAnyTypeClass.class, key); @@ -105,7 +110,7 @@ public class JPAAnyTypeClassDAO extends AbstractDAO<AnyTypeClass, String> implem type.getClasses().remove(anyTypeClass); } - for (TypeExtension typeExt : groupDAO.findTypeExtensionByAnyTypeClass(anyTypeClass)) { + for (TypeExtension typeExt : groupDAO.findTypeExtensions(anyTypeClass)) { typeExt.getAuxClasses().remove(anyTypeClass); if (typeExt.getAuxClasses().isEmpty()) { @@ -114,6 +119,10 @@ public class JPAAnyTypeClassDAO extends AbstractDAO<AnyTypeClass, String> implem } } + for (Provision provision : resourceDAO.findProvisionsByAuxClass(anyTypeClass)) { + provision.getAuxClasses().remove(anyTypeClass); + } + entityManager().remove(anyTypeClass); } http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAExternalResourceDAO.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAExternalResourceDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAExternalResourceDAO.java index be02327..1f08938 100644 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAExternalResourceDAO.java +++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAExternalResourceDAO.java @@ -33,6 +33,7 @@ import org.apache.syncope.core.persistence.api.dao.GroupDAO; import org.apache.syncope.core.persistence.api.dao.TaskDAO; import org.apache.syncope.core.persistence.api.dao.UserDAO; import org.apache.syncope.core.persistence.api.dao.VirSchemaDAO; +import org.apache.syncope.core.persistence.api.entity.AnyTypeClass; import org.apache.syncope.core.persistence.api.entity.policy.AccountPolicy; import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource; import org.apache.syncope.core.persistence.api.entity.resource.MappingItem; @@ -94,6 +95,16 @@ public class JPAExternalResourceDAO extends AbstractDAO<ExternalResource, String return entityManager().find(JPAProvision.class, key); } + @Override + public List<Provision> findProvisionsByAuxClass(final AnyTypeClass anyTypeClass) { + TypedQuery<Provision> query = entityManager().createQuery( + "SELECT e FROM " + JPAProvision.class.getSimpleName() + + " e WHERE :anyTypeClass MEMBER OF e.auxClasses", Provision.class); + query.setParameter("anyTypeClass", anyTypeClass); + + return query.getResultList(); + } + private StringBuilder getByPolicyQuery(final Class<? extends Policy> policyClass) { StringBuilder query = new StringBuilder("SELECT e FROM "). append(JPAExternalResource.class.getSimpleName()). http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java index 9a6fe41..990962a 100644 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java +++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java @@ -284,7 +284,7 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> implements GroupDAO { } @Override - public List<TypeExtension> findTypeExtensionByAnyTypeClass(final AnyTypeClass anyTypeClass) { + public List<TypeExtension> findTypeExtensions(final AnyTypeClass anyTypeClass) { TypedQuery<TypeExtension> query = entityManager().createQuery( "SELECT e FROM " + JPATypeExtension.class.getSimpleName() + " e WHERE :anyTypeClass MEMBER OF e.auxClasses", TypeExtension.class); http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAProvision.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAProvision.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAProvision.java index ec50d2c..4ae1043 100644 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAProvision.java +++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAProvision.java @@ -18,11 +18,16 @@ */ package org.apache.syncope.core.persistence.jpa.entity.resource; +import java.util.ArrayList; +import java.util.List; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.JoinTable; import javax.persistence.Lob; +import javax.persistence.ManyToMany; import javax.persistence.ManyToOne; import javax.persistence.OneToOne; import javax.persistence.Table; @@ -30,11 +35,13 @@ import javax.persistence.UniqueConstraint; import javax.validation.constraints.NotNull; import org.apache.syncope.core.provisioning.api.serialization.POJOHelper; import org.apache.syncope.core.persistence.api.entity.AnyType; +import org.apache.syncope.core.persistence.api.entity.AnyTypeClass; import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource; import org.apache.syncope.core.persistence.api.entity.resource.Mapping; import org.apache.syncope.core.persistence.api.entity.resource.Provision; import org.apache.syncope.core.persistence.jpa.entity.AbstractEntity; import org.apache.syncope.core.persistence.jpa.entity.JPAAnyType; +import org.apache.syncope.core.persistence.jpa.entity.JPAAnyTypeClass; import org.identityconnectors.framework.common.objects.ObjectClass; import org.identityconnectors.framework.common.objects.SyncToken; @@ -59,6 +66,13 @@ public class JPAProvision extends AbstractEntity<Long> implements Provision { @NotNull private String objectClass; + @ManyToMany(fetch = FetchType.EAGER) + @JoinTable(joinColumns = + @JoinColumn(name = "provision_id"), + inverseJoinColumns = + @JoinColumn(name = "anyTypeClass_name")) + private List<JPAAnyTypeClass> auxClasses = new ArrayList<>(); + @Lob private String serializedSyncToken; @@ -105,6 +119,17 @@ public class JPAProvision extends AbstractEntity<Long> implements Provision { } @Override + public boolean add(final AnyTypeClass auxClass) { + checkType(auxClass, JPAAnyTypeClass.class); + return auxClasses.contains((JPAAnyTypeClass) auxClass) || auxClasses.add((JPAAnyTypeClass) auxClass); + } + + @Override + public List<? extends AnyTypeClass> getAuxClasses() { + return auxClasses; + } + + @Override public SyncToken getSyncToken() { return serializedSyncToken == null ? null http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/core/persistence-jpa/src/test/resources/domains/MasterContent.xml ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/test/resources/domains/MasterContent.xml b/core/persistence-jpa/src/test/resources/domains/MasterContent.xml index 4505541..9873f32 100644 --- a/core/persistence-jpa/src/test/resources/domains/MasterContent.xml +++ b/core/persistence-jpa/src/test/resources/domains/MasterContent.xml @@ -819,6 +819,9 @@ under the License. connObjectKey="0" password="1" purpose="PROPAGATION"/> <Provision id="9" resource_name="resource-csv" anyType_name="USER" objectClass="__ACCOUNT__"/> + <Provision_AnyTypeClass provision_id="9" anyTypeClass_name="csv"/> + <Provision_AnyTypeClass provision_id="9" anyTypeClass_name="generic membership"/> + <Provision_AnyTypeClass provision_id="9" anyTypeClass_name="minimal group"/> <Mapping id="9" provision_id="9"/> <MappingItem id="200" extAttrName="id" mapping_id="9" intMappingType="Username" mandatoryCondition="true" @@ -862,6 +865,8 @@ under the License. connObjectKey="0" password="1" purpose="BOTH"/> <Provision id="11" resource_name="resource-ldap" anyType_name="USER" objectClass="__ACCOUNT__"/> + <Provision_AnyTypeClass provision_id="11" anyTypeClass_name="generic membership"/> + <Provision_AnyTypeClass provision_id="11" anyTypeClass_name="minimal group"/> <Mapping id="11" provision_id="11" connObjectLink="'uid=' + username + ',ou=people,o=isp'"/> <MappingItem id="311" connObjectKey="1" password="0" mapping_id="11" http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderImpl.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderImpl.java index b4aa8b2..51ebfa5 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderImpl.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderImpl.java @@ -18,20 +18,21 @@ */ package org.apache.syncope.core.provisioning.java.data; -import org.apache.syncope.core.provisioning.api.data.ResourceDataBinder; -import java.util.Collection; import java.util.HashSet; import java.util.Iterator; -import java.util.Set; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.IteratorUtils; import org.apache.commons.lang3.SerializationUtils; import org.apache.syncope.common.lib.SyncopeClientCompositeException; import org.apache.syncope.common.lib.SyncopeClientException; +import org.apache.syncope.common.lib.to.AnyTypeClassTO; import org.apache.syncope.common.lib.to.MappingItemTO; import org.apache.syncope.common.lib.to.MappingTO; import org.apache.syncope.common.lib.to.ProvisionTO; import org.apache.syncope.common.lib.to.ResourceTO; import org.apache.syncope.common.lib.types.ClientExceptionType; import org.apache.syncope.common.lib.types.IntMappingType; +import org.apache.syncope.core.persistence.api.dao.AnyTypeClassDAO; import org.apache.syncope.core.persistence.api.dao.ConnInstanceDAO; import org.apache.syncope.core.persistence.api.dao.PolicyDAO; import org.apache.syncope.core.persistence.api.entity.policy.AccountPolicy; @@ -42,18 +43,23 @@ import org.apache.syncope.core.persistence.api.entity.resource.Mapping; import org.apache.syncope.core.persistence.api.entity.resource.MappingItem; import org.apache.syncope.core.persistence.api.entity.policy.PasswordPolicy; import org.apache.syncope.core.provisioning.java.jexl.JexlUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.apache.syncope.core.spring.BeanUtils; import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO; import org.apache.syncope.core.persistence.api.dao.VirSchemaDAO; import org.apache.syncope.core.persistence.api.entity.AnyType; +import org.apache.syncope.core.persistence.api.entity.AnyTypeClass; +import org.apache.syncope.core.persistence.api.entity.DerSchema; +import org.apache.syncope.core.persistence.api.entity.PlainSchema; import org.apache.syncope.core.persistence.api.entity.VirSchema; +import org.apache.syncope.core.persistence.api.entity.policy.PullPolicy; import org.apache.syncope.core.persistence.api.entity.resource.Provision; +import org.apache.syncope.core.provisioning.api.data.ResourceDataBinder; +import org.apache.syncope.core.provisioning.api.utils.EntityUtils; import org.identityconnectors.framework.common.objects.ObjectClass; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import org.apache.syncope.core.persistence.api.entity.policy.PullPolicy; @Component public class ResourceDataBinderImpl implements ResourceDataBinder { @@ -75,6 +81,9 @@ public class ResourceDataBinderImpl implements ResourceDataBinder { private VirSchemaDAO virSchemaDAO; @Autowired + private AnyTypeClassDAO anyTypeClassDAO; + + @Autowired private EntityFactory entityFactory; @Override @@ -127,6 +136,23 @@ public class ResourceDataBinderImpl implements ResourceDataBinder { } provision.setObjectClass(new ObjectClass(provisionTO.getObjectClass())); + // add all classes contained in the TO + for (String name : provisionTO.getAuxClasses()) { + AnyTypeClass anyTypeClass = anyTypeClassDAO.find(name); + if (anyTypeClass == null) { + LOG.warn("Ignoring invalid {}: {}", AnyTypeClass.class.getSimpleName(), name); + } else { + provision.add(anyTypeClass); + } + } + // remove all classes not contained in the TO + for (Iterator<? extends AnyTypeClass> itor = provision.getAuxClasses().iterator(); itor.hasNext();) { + AnyTypeClass anyTypeClass = itor.next(); + if (!provisionTO.getAuxClasses().contains(anyTypeClass.getKey())) { + itor.remove(); + } + } + if (provisionTO.getSyncToken() == null) { provision.setSyncToken(null); } @@ -142,7 +168,29 @@ public class ResourceDataBinderImpl implements ResourceDataBinder { } else { mapping.getItems().clear(); } - populateMapping(provisionTO.getMapping(), mapping, entityFactory.newEntity(MappingItem.class)); + + AnyTypeClassTO allowedSchemas = new AnyTypeClassTO(); + for (Iterator<AnyTypeClass> itor = IteratorUtils.chainedIterator( + provision.getAnyType().getClasses().iterator(), + provision.getAuxClasses().iterator()); itor.hasNext();) { + + AnyTypeClass anyTypeClass = itor.next(); + allowedSchemas.getPlainSchemas().addAll( + CollectionUtils.collect(anyTypeClass.getPlainSchemas(), + EntityUtils.<String, PlainSchema>keyTransformer())); + allowedSchemas.getDerSchemas().addAll( + CollectionUtils.collect(anyTypeClass.getDerSchemas(), + EntityUtils.<String, DerSchema>keyTransformer())); + allowedSchemas.getVirSchemas().addAll( + CollectionUtils.collect(anyTypeClass.getVirSchemas(), + EntityUtils.<String, VirSchema>keyTransformer())); + } + + populateMapping( + provisionTO.getMapping(), + mapping, + entityFactory.newEntity(MappingItem.class), + allowedSchemas); } if (provisionTO.getVirSchemas().isEmpty()) { @@ -201,70 +249,92 @@ public class ResourceDataBinderImpl implements ResourceDataBinder { return resource; } - @SuppressWarnings({ "unchecked", "rawtypes" }) - private void populateMapping(final MappingTO mappingTO, final Mapping mapping, final MappingItem prototype) { + private void populateMapping( + final MappingTO mappingTO, + final Mapping mapping, + final MappingItem prototype, + final AnyTypeClassTO allowedSchemas) { + mapping.setConnObjectLink(mappingTO.getConnObjectLink()); - for (MappingItem item : getMappingItems(mappingTO.getItems(), prototype)) { - item.setMapping(mapping); - if (item.isConnObjectKey()) { - mapping.setConnObjectKeyItem(item); + SyncopeClientCompositeException scce = SyncopeClientException.buildComposite(); + SyncopeClientException invalidMapping = SyncopeClientException.build(ClientExceptionType.InvalidMapping); + SyncopeClientException requiredValuesMissing = + SyncopeClientException.build(ClientExceptionType.RequiredValuesMissing); + + for (MappingItemTO itemTO : mappingTO.getItems()) { + if (itemTO == null || itemTO.getIntMappingType() == null) { + LOG.error("Null {} or missing {}", + MappingItemTO.class.getSimpleName(), IntMappingType.class.getSimpleName()); + invalidMapping.getElements().add( + "Null " + MappingItemTO.class.getSimpleName() + + " or missing " + IntMappingType.class.getSimpleName()); } else { - mapping.add(item); - } - } - } - - private Set<MappingItem> getMappingItems(final Collection<MappingItemTO> itemTOs, final MappingItem prototype) { - Set<MappingItem> items = new HashSet<>(itemTOs.size()); - for (MappingItemTO itemTO : itemTOs) { - items.add(getMappingItem(itemTO, prototype)); - } - - return items; - } + if (itemTO.getIntAttrName() == null) { + if (IntMappingType.getEmbedded().contains(itemTO.getIntMappingType())) { + itemTO.setIntAttrName(itemTO.getIntMappingType().toString()); + } else { + requiredValuesMissing.getElements().add("intAttrName"); + scce.addException(requiredValuesMissing); + } + } - private MappingItem getMappingItem(final MappingItemTO itemTO, final MappingItem prototype) { - if (itemTO == null || itemTO.getIntMappingType() == null) { - LOG.error("Null mappingTO provided"); - return null; - } + boolean allowed; + switch (itemTO.getIntMappingType()) { + case UserPlainSchema: + case GroupPlainSchema: + case AnyObjectPlainSchema: + allowed = allowedSchemas.getPlainSchemas().contains(itemTO.getIntAttrName()); + break; + + case UserDerivedSchema: + case GroupDerivedSchema: + case AnyObjectDerivedSchema: + allowed = allowedSchemas.getDerSchemas().contains(itemTO.getIntAttrName()); + break; + + case UserVirtualSchema: + case GroupVirtualSchema: + case AnyObjectVirtualSchema: + allowed = allowedSchemas.getVirSchemas().contains(itemTO.getIntAttrName()); + break; + + default: + allowed = true; + } - SyncopeClientCompositeException scce = SyncopeClientException.buildComposite(); + if (allowed) { + // no mandatory condition implies mandatory condition false + if (!JexlUtils.isExpressionValid(itemTO.getMandatoryCondition() == null + ? "false" : itemTO.getMandatoryCondition())) { - SyncopeClientException requiredValuesMissing = SyncopeClientException.build( - ClientExceptionType.RequiredValuesMissing); + SyncopeClientException invalidMandatoryCondition = + SyncopeClientException.build(ClientExceptionType.InvalidValues); + invalidMandatoryCondition.getElements().add(itemTO.getMandatoryCondition()); + scce.addException(invalidMandatoryCondition); + } - if (itemTO.getIntAttrName() == null) { - if (IntMappingType.getEmbedded().contains(itemTO.getIntMappingType())) { - itemTO.setIntAttrName(itemTO.getIntMappingType().toString()); - } else { - requiredValuesMissing.getElements().add("intAttrName"); + MappingItem item = SerializationUtils.clone(prototype); + BeanUtils.copyProperties(itemTO, item, MAPPINGITEM_IGNORE_PROPERTIES); + item.setMapping(mapping); + if (item.isConnObjectKey()) { + mapping.setConnObjectKeyItem(item); + } else { + mapping.add(item); + } + } else { + LOG.error("{} not allowed", itemTO.getIntAttrName()); + invalidMapping.getElements().add(itemTO.getIntAttrName() + " not allowed"); + } } } - // Throw composite exception if there is at least one element set in the composing exceptions - if (!requiredValuesMissing.isEmpty()) { - scce.addException(requiredValuesMissing); + if (!invalidMapping.getElements().isEmpty()) { + scce.addException(invalidMapping); } - - // no mandatory condition implies mandatory condition false - if (!JexlUtils.isExpressionValid(itemTO.getMandatoryCondition() == null - ? "false" : itemTO.getMandatoryCondition())) { - - SyncopeClientException invalidMandatoryCondition = SyncopeClientException.build( - ClientExceptionType.InvalidValues); - invalidMandatoryCondition.getElements().add(itemTO.getMandatoryCondition()); - scce.addException(invalidMandatoryCondition); - } - if (scce.hasExceptions()) { throw scce; } - - MappingItem item = SerializationUtils.clone(prototype); - BeanUtils.copyProperties(itemTO, item, MAPPINGITEM_IGNORE_PROPERTIES); - return item; } private void populateMappingTO(final Mapping mapping, final MappingTO mappingTO) { @@ -308,6 +378,8 @@ public class ResourceDataBinderImpl implements ResourceDataBinder { provisionTO.setKey(provision.getKey()); provisionTO.setAnyType(provision.getAnyType().getKey()); provisionTO.setObjectClass(provision.getObjectClass().getObjectClassValue()); + provisionTO.getAuxClasses().addAll(CollectionUtils.collect( + provision.getAuxClasses(), EntityUtils.<String, AnyTypeClass>keyTransformer())); provisionTO.setSyncToken(provision.getSerializedSyncToken()); if (provision.getMapping() != null) { http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/fit/core-reference/src/test/java/org/apache/syncope/fit/console/TopologyITCase.java ---------------------------------------------------------------------- diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/TopologyITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/TopologyITCase.java index ef0f7c6..edfcf04 100644 --- a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/TopologyITCase.java +++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/TopologyITCase.java @@ -65,7 +65,7 @@ public class TopologyITCase extends AbstractConsoleITCase { @Test public void editProvisioning() { wicketTester.clickLink("body:topologyLI:topology"); - + Component component = findComponentByProp("key", "body:resources", "ws-target-resource-1"); assertNotNull(component); wicketTester.executeAjaxEvent(component.getPageRelativePath() + ":res", Constants.ON_CLICK); @@ -77,6 +77,11 @@ public class TopologyITCase extends AbstractConsoleITCase { wicketTester.clickLink("body:toggle:outerObjectsRepeater:0:outer:form:content:tabbedPanel:panel:container:" + "content:group:beans:0:actions:panelMapping:mappingLink"); + FormTester formTester = wicketTester.newFormTester( + "body:toggle:outerObjectsRepeater:0:outer:form:content:tabbedPanel:panel:container:" + + "content:wizard:form"); + formTester.submit("buttons:next"); + wicketTester.assertComponent("body:toggle:outerObjectsRepeater:0:outer:form:content:tabbedPanel:panel:" + "container:content:wizard:form:view:mapping:mappingContainer:mappings:1", WebMarkupContainer.class); } @@ -101,7 +106,7 @@ public class TopologyITCase extends AbstractConsoleITCase { @Test public void editPushTask() { wicketTester.clickLink("body:topologyLI:topology"); - + Component component = findComponentByProp("key", "body:resources", "resource-ldap"); assertNotNull(component); wicketTester.executeAjaxEvent(component.getPageRelativePath() + ":res", Constants.ON_CLICK); @@ -110,10 +115,9 @@ public class TopologyITCase extends AbstractConsoleITCase { + "first:container:content:searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable:" + "body:rows:1:cells:9:cell:panelEdit:editLink"); - final FormTester formTester = wicketTester.newFormTester( + FormTester formTester = wicketTester.newFormTester( "body:toggle:outerObjectsRepeater:1:outer:form:content:" + "tasks:firstLevelContainer:first:container:content:wizard:form"); - formTester.setValue("view:description:textField", "test"); formTester.submit("buttons:finish"); http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PushTaskITCase.java ---------------------------------------------------------------------- diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PushTaskITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PushTaskITCase.java index 90c98e8..0c7f380 100644 --- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PushTaskITCase.java +++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PushTaskITCase.java @@ -261,7 +261,7 @@ public class PushTaskITCase extends AbstractTaskITCase { assertNotNull(schemaTO); AnyTypeClassTO typeClass = new AnyTypeClassTO(); - typeClass.setKey("SYNCOPE-598"); + typeClass.setKey("SYNCOPE-598" + getUUIDString()); typeClass.getPlainSchemas().add(schemaTO.getKey()); anyTypeClassService.create(typeClass); @@ -288,6 +288,7 @@ public class PushTaskITCase extends AbstractTaskITCase { ProvisionTO provisionTO = new ProvisionTO(); provisionTO.setAnyType(AnyTypeKind.GROUP.name()); provisionTO.setObjectClass(ObjectClass.GROUP_NAME); + provisionTO.getAuxClasses().add(typeClass.getKey()); resourceTO.getProvisions().add(provisionTO); MappingTO mapping = new MappingTO(); http://git-wip-us.apache.org/repos/asf/syncope/blob/692e1f91/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ResourceITCase.java ---------------------------------------------------------------------- diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ResourceITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ResourceITCase.java index b3010ff..e9923ef 100644 --- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ResourceITCase.java +++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ResourceITCase.java @@ -93,9 +93,9 @@ public class ResourceITCase extends AbstractITCase { item = new MappingItemTO(); item.setExtAttrName("fullname"); item.setIntAttrName("cn"); - item.setIntMappingType(IntMappingType.UserPlainSchema); + item.setIntMappingType(IntMappingType.UserDerivedSchema); item.setConnObjectKey(false); - item.setPurpose(MappingPurpose.BOTH); + item.setPurpose(MappingPurpose.PROPAGATION); mapping.add(item); return resourceTO; @@ -153,9 +153,9 @@ public class ResourceITCase extends AbstractITCase { item = new MappingItemTO(); item.setExtAttrName("fullname"); item.setIntAttrName("cn"); - item.setIntMappingType(IntMappingType.UserPlainSchema); + item.setIntMappingType(IntMappingType.UserDerivedSchema); item.setConnObjectKey(false); - item.setPurpose(MappingPurpose.BOTH); + item.setPurpose(MappingPurpose.PROPAGATION); mapping.add(item); resourceTO.setKey(resourceName); @@ -262,8 +262,10 @@ public class ResourceITCase extends AbstractITCase { createResource(resourceTO); fail("Create should not have worked"); } catch (SyncopeClientException e) { - assertEquals(ClientExceptionType.RequiredValuesMissing, e.getType()); - assertEquals("intAttrName", e.getElements().iterator().next()); + assertEquals(ClientExceptionType.Composite, e.getType()); + SyncopeClientException rvm = e.asComposite().getException(ClientExceptionType.RequiredValuesMissing); + assertNotNull(rvm); + assertEquals("intAttrName", rvm.getElements().iterator().next()); } } @@ -644,7 +646,6 @@ public class ResourceITCase extends AbstractITCase { fail(); } catch (SyncopeClientException e) { assertEquals(ClientExceptionType.InvalidExternalResource, e.getType()); - assertTrue(e.getElements().iterator().next().contains(EntityViolationType.InvalidName.name())); } }
