From 58537f3b7ad00fdeba47594f494f215ef791d9cc Mon Sep 17 00:00:00 2001 From: Erik Suta Date: Wed, 8 Oct 2014 11:26:49 +0200 Subject: [PATCH 1/9] Resource Wizard bugfix - removing obsolete field for settuping Connextor version in NameStep --- .../component/wizard/resource/NameStep.html | 1 - .../component/wizard/resource/NameStep.java | 144 +----------------- 2 files changed, 6 insertions(+), 139 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/NameStep.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/NameStep.html index 5572a12eb06..d1d0d15375c 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/NameStep.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/NameStep.html @@ -21,6 +21,5 @@
-
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/NameStep.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/NameStep.java index cc52bec17e9..fd38c4f916e 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/NameStep.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/NameStep.java @@ -20,13 +20,11 @@ import com.evolveum.midpoint.model.api.ModelService; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismReference; -import com.evolveum.midpoint.prism.PrismReferenceValue; import com.evolveum.midpoint.prism.delta.DiffUtil; import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; -import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.logging.LoggingUtils; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; @@ -35,7 +33,6 @@ import com.evolveum.midpoint.web.component.form.TextFormGroup; import com.evolveum.midpoint.web.component.util.LoadableModel; import com.evolveum.midpoint.web.component.util.PrismPropertyModel; -import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; import com.evolveum.midpoint.web.component.wizard.WizardStep; import com.evolveum.midpoint.web.component.wizard.resource.dto.ConnectorHostTypeComparator; import com.evolveum.midpoint.web.page.PageBase; @@ -82,7 +79,6 @@ public class NameStep extends WizardStep { //filtered, based on selection private LoadableModel>> connectorTypes; - private LoadableModel>> connectorVersions; public NameStep(IModel> model) { this.resourceModel = model; @@ -121,66 +117,6 @@ private void initLayout() { DropDownFormGroup> connectorType = createConnectorTypeDropDown(location.getModel()); add(connectorType); - - DropDownFormGroup> connectorVersion = createConnectorVersionDropDown(location.getModel(), - connectorType.getModel()); - add(connectorVersion); - } - - private DropDownFormGroup createConnectorVersionDropDown(final IModel> connectorHostTypeModel, - final IModel> connectorTypeModel) { - connectorVersions = new LoadableModel>>(false) { - - @Override - protected List> load() { - return loadConnectorVersions(connectorHostTypeModel.getObject(), connectorTypeModel.getObject()); - } - }; - - DropDownFormGroup> formGroup = new DropDownFormGroup>( - ID_CONNECTOR_VERSION, createUsedConnectorModel(), connectorVersions, - new IChoiceRenderer>() { - - @Override - public Object getDisplayValue(PrismObject object) { - String version = object.getPropertyRealValue(ConnectorType.F_CONNECTOR_VERSION, String.class); - if (StringUtils.isEmpty(version)) { - return NameStep.this.getString("NameStep.unknownVersion"); - } - - return version; - } - - @Override - public String getIdValue(PrismObject object, int index) { - return Integer.toString(index); - } - } - , createStringResource("NameStep.connectorVersion"), "col-md-3", "col-md-3", true) { - - @Override - protected DropDownChoice createDropDown(String id, IModel>> choices, - IChoiceRenderer> renderer, boolean required) { - DropDownChoice choice = super.createDropDown(id, choices, renderer, required); - choice.setOutputMarkupId(true); - choice.add(new AjaxFormComponentUpdatingBehavior("onchange") { - - @Override - protected void onUpdate(AjaxRequestTarget target) { - } - }); - choice.add(new VisibleEnableBehaviour() { - - @Override - public boolean isEnabled() { - return connectorTypeModel.getObject() != null; - } - }); - return choice; - } - }; - - return formGroup; } private IModel> createConnectorHostModel() { @@ -258,38 +194,6 @@ private PrismObject getConnectorFromResource(List> createUsedConnectorModel() { - return new IModel>() { - - @Override - public PrismObject getObject() { - List> connectors = connectorsModel.getObject(); - return getConnectorFromResource(connectors); - } - - @Override - public void setObject(PrismObject object) { - try { - PrismObject resource = resourceModel.getObject(); - PrismReference ref = resource.findOrCreateReference(ResourceType.F_CONNECTOR_REF); - if (object == null) { - resource.removeReference(ResourceType.F_CONNECTOR_REF); - } else { - PrismReferenceValue val = new PrismReferenceValue(); - val.setObject(object); - ref.replace(val); - } - } catch (SchemaException ex) { - LoggingUtils.logException(LOGGER, "Couldn't create connector reference in resource", ex); - } - } - - @Override - public void detach() { - } - }; - } - private IModel> createReadonlyUsedConnectorModel() { return new IModel>() { @@ -320,15 +224,15 @@ public void detach() { private DropDownFormGroup> createConnectorTypeDropDown( final IModel> hostModel) { - connectorTypes = new LoadableModel(false) { + connectorTypes = new LoadableModel>>(false) { @Override - protected Object load() { + protected List> load() { return loadConnectorTypes(hostModel.getObject()); } }; - DropDownFormGroup> formGroup = new DropDownFormGroup>( + return new DropDownFormGroup>( ID_CONNECTOR_TYPE, createReadonlyUsedConnectorModel(), connectorTypes, new IChoiceRenderer>() { @@ -348,23 +252,14 @@ protected DropDownChoice createDropDown(String id, IModel> renderer, boolean required) { DropDownChoice choice = super.createDropDown(id, choices, renderer, required); choice.setOutputMarkupId(true); - choice.add(new AjaxFormComponentUpdatingBehavior("onchange") { - @Override - protected void onUpdate(AjaxRequestTarget target) { - changeConnectorTypePerformed(target); - } - }); return choice; } }; - - return formGroup; } private DropDownFormGroup> createLocationDropDown() { - DropDownFormGroup> formGroup = - new DropDownFormGroup>(ID_LOCATION, createConnectorHostModel(), + return new DropDownFormGroup>(ID_LOCATION, createConnectorHostModel(), connectorHostsModel, new IChoiceRenderer>() { @Override @@ -396,8 +291,6 @@ protected void onUpdate(AjaxRequestTarget target) { return choice; } }; - - return formGroup; } private List> loadConnectorTypes(PrismObject host) { @@ -423,8 +316,8 @@ private List> filterConnectorTypes(PrismObject alreadyAddedTypes = new HashSet(); - List> filtered = new ArrayList>(); + Set alreadyAddedTypes = new HashSet<>(); + List> filtered = new ArrayList<>(); for (PrismObject connector : connectors) { if (host != null && !isConnectorOnHost(connector, host)) { continue; @@ -444,23 +337,6 @@ private List> filterConnectorTypes(PrismObject> loadConnectorVersions(PrismObject host, - PrismObject connector) { - List> filtered = filterConnectorTypes(host, connector); - - Collections.sort(filtered, new Comparator>() { - @Override - public int compare(PrismObject c1, PrismObject c2) { - String v1 = c1.getPropertyRealValue(ConnectorType.F_CONNECTOR_VERSION, String.class); - String v2 = c1.getPropertyRealValue(ConnectorType.F_CONNECTOR_VERSION, String.class); - - return String.CASE_INSENSITIVE_ORDER.compare(v1, v2); - } - }); - - return filtered; - } - private boolean isConnectorOnHost(PrismObject connector, PrismObject host) { PrismReference hostRef = connector.findReference(ConnectorType.F_CONNECTOR_HOST_REF); if (hostRef == null && host == null) { @@ -478,13 +354,6 @@ private boolean isConnectorOnHost(PrismObject connector, PrismObj return false; } - private void changeConnectorTypePerformed(AjaxRequestTarget target) { - connectorVersions.reset(); - - DropDownFormGroup group = (DropDownFormGroup) get(ID_CONNECTOR_VERSION); - target.add(group.getInput()); - } - private void discoverConnectorsPerformed(AjaxRequestTarget target) { DropDownChoice location = (DropDownChoice) get(ID_LOCATION); ConnectorHostType host = location.getModelObject(); @@ -495,7 +364,6 @@ private void discoverConnectorsPerformed(AjaxRequestTarget target) { } connectorTypes.reset(); - connectorVersions.reset(); PageBase page = (PageBase) getPage(); From 59bda72bb2323c49ad2af9934878b8bac3c222b3 Mon Sep 17 00:00:00 2001 From: Erik Suta Date: Wed, 8 Oct 2014 11:37:52 +0200 Subject: [PATCH 2/9] Resource Wizard update - NameStep - changing connector type label from "Type" to "Connector" --- .../component/wizard/resource/NameStep_en_US.utf8.properties | 2 +- .../component/wizard/resource/NameStep_es_ES.utf8.properties | 2 +- .../component/wizard/resource/NameStep_sk_SK.utf8.properties | 2 +- .../midpoint/web/component/wizard/resource/NameStep.properties | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/gui/admin-gui-en-US/src/main/resources/com/evolveum/midpoint/web/component/wizard/resource/NameStep_en_US.utf8.properties b/gui/admin-gui-en-US/src/main/resources/com/evolveum/midpoint/web/component/wizard/resource/NameStep_en_US.utf8.properties index 37e81742733..a0f11521006 100644 --- a/gui/admin-gui-en-US/src/main/resources/com/evolveum/midpoint/web/component/wizard/resource/NameStep_en_US.utf8.properties +++ b/gui/admin-gui-en-US/src/main/resources/com/evolveum/midpoint/web/component/wizard/resource/NameStep_en_US.utf8.properties @@ -3,7 +3,7 @@ NameStep.connectorBundle=Bundle NameStep.connectorInformation=Information NameStep.connectorName=Connector name NameStep.connectorNotSelected=Connector was not selected. -NameStep.connectorType=Type +NameStep.connectorType=Connector NameStep.connectorVersion=Connector version NameStep.hostNotUsed=Not used NameStep.location=Location diff --git a/gui/admin-gui-es-ES/src/main/resources/com/evolveum/midpoint/web/component/wizard/resource/NameStep_es_ES.utf8.properties b/gui/admin-gui-es-ES/src/main/resources/com/evolveum/midpoint/web/component/wizard/resource/NameStep_es_ES.utf8.properties index 5a39fe69e79..d6feace88a7 100644 --- a/gui/admin-gui-es-ES/src/main/resources/com/evolveum/midpoint/web/component/wizard/resource/NameStep_es_ES.utf8.properties +++ b/gui/admin-gui-es-ES/src/main/resources/com/evolveum/midpoint/web/component/wizard/resource/NameStep_es_ES.utf8.properties @@ -4,7 +4,7 @@ NameStep.connectorHost=Connector host NameStep.connectorInformation=Information NameStep.connectorName=Connector name NameStep.connectorNotSelected=Connector was not selected. -NameStep.connectorType=Connector type +NameStep.connectorType=Connector NameStep.connectorVersion=Connector version NameStep.description=Description NameStep.hostNotUsed=Not used diff --git a/gui/admin-gui-sk-SK/src/main/resources/com/evolveum/midpoint/web/component/wizard/resource/NameStep_sk_SK.utf8.properties b/gui/admin-gui-sk-SK/src/main/resources/com/evolveum/midpoint/web/component/wizard/resource/NameStep_sk_SK.utf8.properties index 0b071c0078d..ea5c03740dc 100644 --- a/gui/admin-gui-sk-SK/src/main/resources/com/evolveum/midpoint/web/component/wizard/resource/NameStep_sk_SK.utf8.properties +++ b/gui/admin-gui-sk-SK/src/main/resources/com/evolveum/midpoint/web/component/wizard/resource/NameStep_sk_SK.utf8.properties @@ -4,7 +4,7 @@ NameStep.connectorHost=Connector host NameStep.connectorInformation=Information NameStep.connectorName=Connector name NameStep.connectorNotSelected=Connector was not selected. -NameStep.connectorType=Type +NameStep.connectorType=Connector NameStep.connectorVersion=Connector version NameStep.description=Description NameStep.hostNotUsed=Not used diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/NameStep.properties b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/NameStep.properties index 46ea643c15e..b75c0365136 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/NameStep.properties +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/NameStep.properties @@ -23,7 +23,7 @@ NameStep.connectorName=Connector name NameStep.connectorVersion=Connector version NameStep.undefinedVersion=Undefined version NameStep.undefinedName=Undefined name -NameStep.connectorType=Connector type +NameStep.connectorType=Connector NameStep.connectorBundle=Bundle NameStep.connectorInformation=Information NameStep.connectorNotSelected=Connector was not selected. From c7a19fdd08c702c03923cb7f7a3e1874c4402c1a Mon Sep 17 00:00:00 2001 From: Erik Suta Date: Wed, 8 Oct 2014 11:57:45 +0200 Subject: [PATCH 3/9] Resource Wizard update - changing navigation menu based on requirements --- .../midpoint/web/page/admin/PageAdmin.java | 17 ++--------------- .../web/page/admin/PageAdmin.properties | 2 +- 2 files changed, 3 insertions(+), 16 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdmin.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdmin.java index b18ce80f9d7..cea15541617 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdmin.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdmin.java @@ -143,21 +143,8 @@ private MenuBarItem createServerTasksItems() { private MenuBarItem createResourcesItems() { MenuBarItem resources = new MenuBarItem(createStringResource("PageAdmin.menu.top.resources"), null); resources.addMenuItem(new MenuItem(createStringResource("PageAdmin.menu.top.resources.list"), PageResources.class)); - //todo delete this [lazyman] - resources.addMenuItem(new MenuItem(createStringResource("PageAdmin.menu.top.resources.new"), PageResourceEdit.class)); - resources.addMenuItem(new MenuItem(createStringResource("PageAdmin.menu.top.resources.wizard"), PageResourceWizard.class)); -// - -// items.add(new BottomMenuItem(createStringResource("pageAdminResources.detailsResource"), PageResource.class, -// new PageVisibleDisabledBehaviour(this, PageResource.class))); -// items.add(new BottomMenuItem(createResourceWizardLabel(), PageResourceEdit.class, -// createWizardVisibleBehaviour())); -// items.add(new BottomMenuItem(createStringResource("pageAdminResources.importResource"), -// PageResourceImport.class, new PageVisibleDisabledBehaviour(this, PageResourceImport.class))); -// items.add(new BottomMenuItem(createStringResource("pageAdminResources.contentAccounts"), -// PageContentAccounts.class, new PageVisibleDisabledBehaviour(this, PageContentAccounts.class))); -// items.add(new BottomMenuItem(createStringResource("pageAdminResources.accountDetails"), PageAccount.class, -// new PageVisibleDisabledBehaviour(this, PageAccount.class))); + resources.addMenuItem(new MenuItem(createStringResource("PageAdmin.menu.top.resources.new"), PageResourceWizard.class)); + resources.addMenuItem(new MenuItem(createStringResource("PageAdmin.menu.top.resources.import"), PageImportObject.class)); return resources; } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdmin.properties b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdmin.properties index 705f0a9fa89..692785368dc 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdmin.properties +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdmin.properties @@ -90,7 +90,7 @@ PageAdmin.menu.top.roles.new=New role PageAdmin.menu.top.resources=Resources PageAdmin.menu.top.resources.list=List resources PageAdmin.menu.top.resources.new=New Resource -PageAdmin.menu.top.resources.wizard=Resource wizard +PageAdmin.menu.top.resources.import=Import Resource Definition PageAdmin.menu.top.workItems=Work items PageAdmin.menu.top.workItems.list=My work items PageAdmin.menu.top.workItems.listClaimable=Work items claimable by me From 00a43aa203a7b4238900e0919ab8ec204f32e04c Mon Sep 17 00:00:00 2001 From: Erik Suta Date: Wed, 8 Oct 2014 16:49:03 +0200 Subject: [PATCH 4/9] Resource Wizard update - fixing mapping label creation and a few minor issues on the way --- .../ResourceActivationEditor.java | 32 ++++------- .../ResourceAssociationEditor.java | 31 ++++++----- .../ResourceAssociationEditor.properties | 2 +- .../ResourceAttributeEditor.java | 29 ++-------- .../ResourceAttributeEditor.properties | 2 +- .../ResourceCredentialsEditor.java | 31 ++++++----- .../wizard/resource/dto/MappingTypeDto.java | 54 +++++++++++-------- .../security/MidPointApplication.properties | 1 + .../midpoint/web/util/ExpressionUtil.java | 39 +++++++++++++- 9 files changed, 120 insertions(+), 101 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceActivationEditor.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceActivationEditor.java index 378766b0eab..3f2f8174b8a 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceActivationEditor.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceActivationEditor.java @@ -16,15 +16,17 @@ package com.evolveum.midpoint.web.component.wizard.resource.component.schemahandling; +import com.evolveum.midpoint.util.logging.Trace; +import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.web.component.form.multivalue.MultiValueTextEditPanel; import com.evolveum.midpoint.web.component.util.SimplePanel; import com.evolveum.midpoint.web.component.wizard.resource.component.schemahandling.modal.MappingEditorDialog; +import com.evolveum.midpoint.web.component.wizard.resource.dto.MappingTypeDto; import com.evolveum.midpoint.web.util.WebMiscUtil; import com.evolveum.midpoint.xml.ns._public.common.common_3.AttributeFetchStrategyType; import com.evolveum.midpoint.xml.ns._public.common.common_3.MappingType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceActivationDefinitionType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceBidirectionalMappingType; -import org.apache.commons.lang.StringUtils; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow; import org.apache.wicket.markup.html.form.DropDownChoice; @@ -40,6 +42,8 @@ * */ public class ResourceActivationEditor extends SimplePanel{ + private static final Trace LOGGER = TraceManager.getTrace(ResourceActivationEditor.class); + private static final String ID_EXISTENCE_FS = "existenceFetchStrategy"; private static final String ID_EXISTENCE_OUT = "existenceOutbound"; private static final String ID_EXISTENCE_IN = "existenceInbound"; @@ -120,17 +124,8 @@ protected IModel createTextModel(final IModel model) { @Override public String getObject() { - MappingType mapping = model.getObject(); - - if(mapping == null){ - return null; - } - - if(mapping.getName() != null && StringUtils.isNotEmpty(mapping.getName())){ - return mapping.getName(); - } else { - return getString("MultiValueField.nameNotSpecified"); - } + return MappingTypeDto.createMappingLabel(model.getObject(), LOGGER, getPageBase().getPrismContext(), + getString("MappingType.label.placeholder"), getString("MultiValueField.nameNotSpecified")); } }; } @@ -156,17 +151,8 @@ protected IModel createTextModel(final IModel model) { @Override public String getObject() { - MappingType mapping = model.getObject(); - - if(mapping == null){ - return null; - } - - if(mapping.getName() != null && StringUtils.isNotEmpty(mapping.getName())){ - return mapping.getName(); - } else { - return getString("MultiValueField.nameNotSpecified"); - } + return MappingTypeDto.createMappingLabel(model.getObject(), LOGGER, getPageBase().getPrismContext(), + getString("MappingType.label.placeholder"), getString("MultiValueField.nameNotSpecified")); } }; } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceAssociationEditor.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceAssociationEditor.java index 7ce51098326..4f2e25bc41d 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceAssociationEditor.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceAssociationEditor.java @@ -17,7 +17,6 @@ package com.evolveum.midpoint.web.component.wizard.resource.component.schemahandling; import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.match.MatchingRuleRegistry; import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition; import com.evolveum.midpoint.schema.processor.ResourceAttributeDefinition; import com.evolveum.midpoint.schema.processor.ResourceSchema; @@ -32,10 +31,10 @@ import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; import com.evolveum.midpoint.web.component.wizard.resource.component.schemahandling.modal.LimitationsEditorDialog; import com.evolveum.midpoint.web.component.wizard.resource.component.schemahandling.modal.MappingEditorDialog; +import com.evolveum.midpoint.web.component.wizard.resource.dto.MappingTypeDto; import com.evolveum.midpoint.web.page.admin.resources.PageResources; import com.evolveum.midpoint.web.util.WebMiscUtil; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; -import org.apache.commons.lang.StringUtils; import org.apache.wicket.RestartResponseException; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior; @@ -298,7 +297,20 @@ public String getIdValue(QName object, int index) { add(matchingRule); TextField outboundLabel = new TextField<>(ID_OUTBOUND_LABEL, - new PropertyModel(getModel(), "outbound.name")); + new AbstractReadOnlyModel() { + + @Override + public String getObject() { + ResourceObjectAssociationType association = getModel().getObject(); + + if(association == null){ + return null; + } + + return MappingTypeDto.createMappingLabel(association.getOutbound(), LOGGER, getPageBase().getPrismContext(), + getString("MappingType.label.placeholder"), getString("MultiValueField.nameNotSpecified")); + } + }); outboundLabel.setOutputMarkupId(true); outboundLabel.setEnabled(false); add(outboundLabel); @@ -322,17 +334,8 @@ protected IModel createTextModel(final IModel model) { @Override public String getObject() { - MappingType mapping = model.getObject(); - - if(mapping == null){ - return null; - } - - if(mapping.getName() != null && StringUtils.isNotEmpty(mapping.getName())){ - return mapping.getName(); - } else { - return getString("MultiValueField.nameNotSpecified"); - } + return MappingTypeDto.createMappingLabel(model.getObject(), LOGGER, getPageBase().getPrismContext(), + getString("MappingType.label.placeholder"), getString("MultiValueField.nameNotSpecified")); } }; } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceAssociationEditor.properties b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceAssociationEditor.properties index 059e44dfdf0..7d0cadcec86 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceAssociationEditor.properties +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceAssociationEditor.properties @@ -52,6 +52,6 @@ kind.nullValid=Choose One direction.nullvalid=Choose One associationAttribute.nullValid=Choose One valueAttribute.nullValid=Choose One -fetchSrategy.nullValid=Choose One +fetchStrategy.nullValid=Choose One matchingRule.nullValid=Choose One diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceAttributeEditor.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceAttributeEditor.java index 915b7126042..d29b54f28dd 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceAttributeEditor.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceAttributeEditor.java @@ -16,7 +16,6 @@ package com.evolveum.midpoint.web.component.wizard.resource.component.schemahandling; import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.match.MatchingRuleRegistry; import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition; import com.evolveum.midpoint.schema.processor.ResourceAttributeDefinition; import com.evolveum.midpoint.schema.processor.ResourceSchema; @@ -30,10 +29,10 @@ import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; import com.evolveum.midpoint.web.component.wizard.resource.component.schemahandling.modal.LimitationsEditorDialog; import com.evolveum.midpoint.web.component.wizard.resource.component.schemahandling.modal.MappingEditorDialog; +import com.evolveum.midpoint.web.component.wizard.resource.dto.MappingTypeDto; import com.evolveum.midpoint.web.page.admin.resources.PageResources; import com.evolveum.midpoint.web.util.WebMiscUtil; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; -import org.apache.commons.lang.StringUtils; import org.apache.wicket.RestartResponseException; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior; @@ -232,17 +231,8 @@ public String getObject() { return null; } - MappingType outbound = attributeDefinition.getOutbound(); - - if(outbound == null){ - return null; - } - - if(outbound.getName() != null && StringUtils.isNotEmpty(outbound.getName())){ - return outbound.getName(); - } else { - return getString("MultiValueField.nameNotSpecified"); - } + return MappingTypeDto.createMappingLabel(attributeDefinition.getOutbound(), LOGGER, getPageBase().getPrismContext(), + getString("MappingType.label.placeholder"), getString("MultiValueField.nameNotSpecified")); } }); outboundLabel.setEnabled(false); @@ -268,17 +258,8 @@ protected IModel createTextModel(final IModel model) { @Override public String getObject() { - MappingType mapping = model.getObject(); - - if(mapping == null){ - return null; - } - - if(mapping.getName() != null && StringUtils.isNotEmpty(mapping.getName())){ - return mapping.getName(); - } else { - return getString("MultiValueField.nameNotSpecified"); - } + return MappingTypeDto.createMappingLabel(model.getObject(), LOGGER, getPageBase().getPrismContext(), + getString("MappingType.label.placeholder"), getString("MultiValueField.nameNotSpecified")); } }; } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceAttributeEditor.properties b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceAttributeEditor.properties index 19925ed883f..97567cd18a9 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceAttributeEditor.properties +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceAttributeEditor.properties @@ -32,4 +32,4 @@ ResourceAttributeEditor.message.cantParseSchema=Couldn't parse resource schema AttributeFetchStrategyType.IMPLICIT=Implicit AttributeFetchStrategyType.EXPLICIT=Explicit matchingRule.nullValid=Choose One -fetchStrategy.nulLValid=Choose One +fetchStrategy.nullValid=Choose One diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceCredentialsEditor.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceCredentialsEditor.java index a83f1590ce4..f4dfe75fcd8 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceCredentialsEditor.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceCredentialsEditor.java @@ -26,9 +26,9 @@ import com.evolveum.midpoint.web.component.form.multivalue.MultiValueTextEditPanel; import com.evolveum.midpoint.web.component.util.SimplePanel; import com.evolveum.midpoint.web.component.wizard.resource.component.schemahandling.modal.MappingEditorDialog; +import com.evolveum.midpoint.web.component.wizard.resource.dto.MappingTypeDto; import com.evolveum.midpoint.web.util.WebMiscUtil; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; -import org.apache.commons.lang.StringUtils; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink; import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow; @@ -89,8 +89,20 @@ protected void initLayout(){ new EnumChoiceRenderer(this)); add(fetchStrategy); - TextField outboundLabel = new TextField<>(ID_OUTBOUND_LABEL, - new PropertyModel(getModel(), "password.outbound.name")); + TextField outboundLabel = new TextField<>(ID_OUTBOUND_LABEL, new AbstractReadOnlyModel() { + + @Override + public String getObject() { + ResourceCredentialsDefinitionType credentials = getModel().getObject(); + + if(credentials == null || credentials.getPassword() == null){ + return null; + } + + return MappingTypeDto.createMappingLabel(credentials.getPassword().getOutbound(), LOGGER, getPageBase().getPrismContext(), + getString("MappingType.label.placeholder"), getString("MultiValueField.nameNotSpecified")); + } + }); outboundLabel.setEnabled(false); outboundLabel.setOutputMarkupId(true); add(outboundLabel); @@ -114,17 +126,8 @@ protected IModel createTextModel(final IModel model) { @Override public String getObject() { - MappingType mapping = model.getObject(); - - if(mapping == null){ - return null; - } - - if(mapping.getName() != null && StringUtils.isNotEmpty(mapping.getName())){ - return mapping.getName(); - } else { - return getString("MultiValueField.nameNotSpecified"); - } + return MappingTypeDto.createMappingLabel(model.getObject(), LOGGER, getPageBase().getPrismContext(), + getString("MappingType.label.placeholder"), getString("MultiValueField.nameNotSpecified")); } }; } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/dto/MappingTypeDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/dto/MappingTypeDto.java index 8c0d97dae62..e5ed0bdbaa3 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/dto/MappingTypeDto.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/dto/MappingTypeDto.java @@ -24,6 +24,7 @@ import com.evolveum.midpoint.web.util.ExpressionUtil; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import com.evolveum.prism.xml.ns._public.types_3.ItemPathType; +import org.apache.commons.lang.StringUtils; import javax.xml.bind.JAXBElement; import java.io.Serializable; @@ -109,30 +110,11 @@ public MappingTypeDto(MappingType mapping, PrismContext prismContext){ } private void loadExpressions(PrismContext context){ - if(mappingObject.getExpression() != null && mappingObject.getExpression().getExpressionEvaluator() != null - && !mappingObject.getExpression().getExpressionEvaluator().isEmpty()){ + expression = ExpressionUtil.loadExpression(mappingObject, context, LOGGER); - try { - if(mappingObject.getExpression().getExpressionEvaluator().size() == 1){ - expression = context.serializeAtomicValue(mappingObject.getExpression().getExpressionEvaluator().get(0), PrismContext.LANG_XML); - } else{ - StringBuilder sb = new StringBuilder(); - for(JAXBElement element: mappingObject.getExpression().getExpressionEvaluator()){ - String subElement = context.serializeAtomicValue(element, PrismContext.LANG_XML); - sb.append(subElement).append("\n"); - } - expression = sb.toString(); - } - - expressionType = ExpressionUtil.getExpressionType(expression); - if(expressionType != null && expressionType.equals(ExpressionUtil.ExpressionEvaluatorType.SCRIPT)){ - expressionLanguage = ExpressionUtil.getExpressionLanguage(expression); - } - } catch (SchemaException e) { - //TODO - how can we show this error to user? - LoggingUtils.logException(LOGGER, "Could not load expressions from mapping.", e, e.getStackTrace()); - expression = e.getMessage(); - } + expressionType = ExpressionUtil.getExpressionType(expression); + if(expressionType != null && expressionType.equals(ExpressionUtil.ExpressionEvaluatorType.SCRIPT)){ + expressionLanguage = ExpressionUtil.getExpressionLanguage(expression); } } @@ -373,4 +355,30 @@ public int hashCode() { result = 31 * result + (conditionPolicyRef != null ? conditionPolicyRef.hashCode() : 0); return result; } + + /** + * TODO - find a better place for this method, it probably shouldn't be here + * */ + public static String createMappingLabel(MappingType mapping, Trace LOGGER, PrismContext context, + String placeholder, String nameNotSpecified ){ + if(mapping == null){ + return placeholder; + } + + StringBuilder sb = new StringBuilder(); + if(mapping.getName() != null && StringUtils.isNotEmpty(mapping.getName())){ + sb.append(mapping.getName()); + } else { + sb.append(nameNotSpecified); + } + + if(mapping.getExpression() != null && mapping.getExpression().getExpressionEvaluator() != null){ + sb.append(" ("); + sb.append(ExpressionUtil.getExpressionType(ExpressionUtil.loadExpression(mapping, context, LOGGER))); + sb.append(")"); + } + + return sb.toString(); + } + } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/security/MidPointApplication.properties b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/security/MidPointApplication.properties index bac8df89fe8..266d9c4c52a 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/security/MidPointApplication.properties +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/security/MidPointApplication.properties @@ -538,5 +538,6 @@ operation.com.evolveum.midpoint.model.controller.ModelController.searchObjects=S operation.com.evolveum.midpoint.model.impl.controller.ModelDiagController.repositorySelfTest.user=Repository self test, user (Model) operation.com.evolveum.midpoint.common.crypto.CryptoUtil.securitySelfTest=Security self test +MappingType.label.placeholder=Create new mapping TextField.universal.placeholder=Insert value MultiValueField.nameNotSpecified=(Name not specified) \ No newline at end of file diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/util/ExpressionUtil.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/util/ExpressionUtil.java index 1be5b673bc8..96aad3a7a1d 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/util/ExpressionUtil.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/util/ExpressionUtil.java @@ -16,8 +16,15 @@ package com.evolveum.midpoint.web.util; +import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.midpoint.util.logging.LoggingUtils; +import com.evolveum.midpoint.util.logging.Trace; +import com.evolveum.midpoint.xml.ns._public.common.common_3.MappingType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; +import javax.xml.bind.JAXBElement; + /** * @author shood * */ @@ -77,6 +84,7 @@ public void setLanguage(String language) { public static final String ELEMENT_SCRIPT = ""; public static final String ELEMENT_GENERATE = ""; + public static final String ELEMENT_GENERATE_WITH_NS = " element: mapping.getExpression().getExpressionEvaluator()){ + String subElement = prismContext.serializeAtomicValue(element, PrismContext.LANG_XML); + sb.append(subElement).append("\n"); + } + expression = sb.toString(); + } + } catch (SchemaException e) { + //TODO - how can we show this error to user? + LoggingUtils.logException(LOGGER, "Could not load expressions from mapping.", e, e.getStackTrace()); + expression = e.getMessage(); + } + } + + return expression; + } } From c9c8ca7c796b349ff8b3d53592eb66a651f8731f Mon Sep 17 00:00:00 2001 From: Erik Suta Date: Wed, 8 Oct 2014 17:35:16 +0200 Subject: [PATCH 5/9] Resource Wizard update - adding arrows to accordion items in wizard to indicate, that item is collapsable --- .../ResourceActivationEditor.html | 20 +++++++++++++++---- .../ResourceAssociationEditor.html | 2 ++ .../ResourceDependencyEditor.html | 5 ++++- .../ResourceDependencyEditor.java | 2 +- .../ResourceIterationEditor.html | 15 +++++++++++--- .../ResourceProtectedEditor.html | 4 +++- .../ResourceProtectedEditor.java | 2 +- .../modal/LimitationsEditorDialog.html | 11 +++++++--- .../modal/LimitationsEditorDialog.java | 2 +- 9 files changed, 48 insertions(+), 15 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceActivationEditor.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceActivationEditor.html index c551f4cbcdf..19e86649ecb 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceActivationEditor.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceActivationEditor.html @@ -25,7 +25,10 @@

@@ -63,7 +66,10 @@

@@ -102,7 +108,10 @@

@@ -141,7 +150,10 @@

diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceAssociationEditor.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceAssociationEditor.html index 23e6a319900..014b49c143f 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceAssociationEditor.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceAssociationEditor.html @@ -30,6 +30,7 @@

+

@@ -100,6 +101,7 @@

+

diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceDependencyEditor.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceDependencyEditor.html index e87722148e9..27c2852eb5c 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceDependencyEditor.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceDependencyEditor.html @@ -28,9 +28,12 @@

diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceDependencyEditor.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceDependencyEditor.java index 80f911c6fe4..a1d7184a44d 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceDependencyEditor.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceDependencyEditor.java @@ -121,7 +121,7 @@ public void onClick(AjaxRequestTarget target) { deleteDependencyPerformed(target, item); } }; - item.add(delete); + linkContainer.add(delete); WebMarkupContainer dependencyBody = new WebMarkupContainer(ID_DEPENDENCY_BODY); dependencyBody.setOutputMarkupId(true); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceIterationEditor.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceIterationEditor.html index a815f280a04..4aadd3c2096 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceIterationEditor.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceIterationEditor.html @@ -35,7 +35,10 @@

@@ -114,7 +117,10 @@

@@ -193,7 +199,10 @@

diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceProtectedEditor.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceProtectedEditor.html index 4b88fba0afb..f7b26d8c30f 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceProtectedEditor.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceProtectedEditor.html @@ -28,9 +28,11 @@

diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceProtectedEditor.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceProtectedEditor.java index dbf66e346cf..9394eec29a4 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceProtectedEditor.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/ResourceProtectedEditor.java @@ -116,7 +116,7 @@ public void onClick(AjaxRequestTarget target) { deleteDependencyPerformed(target, item); } }; - item.add(delete); + linkCont.add(delete); WebMarkupContainer accountBody = new WebMarkupContainer(ID_ACCOUNT_BODY); accountBody.setOutputMarkupId(true); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/modal/LimitationsEditorDialog.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/modal/LimitationsEditorDialog.html index 8936864fdbc..96ace2c24d3 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/modal/LimitationsEditorDialog.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/modal/LimitationsEditorDialog.html @@ -37,11 +37,16 @@ diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/modal/LimitationsEditorDialog.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/modal/LimitationsEditorDialog.java index 3e084a5bc8a..d99debd3b40 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/modal/LimitationsEditorDialog.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/component/schemahandling/modal/LimitationsEditorDialog.java @@ -150,7 +150,7 @@ public void onClick(AjaxRequestTarget target) { deleteLimitationPerformed(target, item); } }; - item.add(delete); + linkContainer.add(delete); WebMarkupContainer limitationBody = new WebMarkupContainer(ID_BODY); limitationBody.setOutputMarkupId(true); From 35c8a36d6abdf94ade89bc498d1da6390f6c9feb Mon Sep 17 00:00:00 2001 From: Erik Suta Date: Wed, 8 Oct 2014 18:02:12 +0200 Subject: [PATCH 6/9] Resource Wizard update - adding arrows and different delete icons to side-collapsible menus (capabilities, sync objects object types) --- .../component/wizard/resource/CapabilityStep.html | 11 +++++++---- .../component/wizard/resource/CapabilityStep.java | 2 +- .../wizard/resource/SchemaHandlingStep.html | 15 +++++++-------- .../wizard/resource/SchemaHandlingStep.java | 2 +- .../wizard/resource/SynchronizationStep.html | 13 +++++++------ .../wizard/resource/SynchronizationStep.java | 2 +- 6 files changed, 24 insertions(+), 21 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/CapabilityStep.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/CapabilityStep.html index 41bb11ad679..147de72955a 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/CapabilityStep.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/CapabilityStep.html @@ -26,14 +26,17 @@ - -
+ + +   + - -
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/CapabilityStep.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/CapabilityStep.java index 877920aa0f3..1e82ae5d8bc 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/CapabilityStep.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/CapabilityStep.java @@ -196,7 +196,7 @@ public void onClick(AjaxRequestTarget target) { deleteCapabilityPerformed(target, dto); } }; - capabilityRow.add(deleteLink); + name.add(deleteLink); capabilityRow.add(AttributeModifier.replace("class", new AbstractReadOnlyModel() { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/SchemaHandlingStep.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/SchemaHandlingStep.html index cd2b8923260..31ba2e30c2a 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/SchemaHandlingStep.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/SchemaHandlingStep.html @@ -20,24 +20,23 @@
- -

- -
+ + +   + - - - -
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/SchemaHandlingStep.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/SchemaHandlingStep.java index f43b8e1fd48..a66d0c43191 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/SchemaHandlingStep.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/SchemaHandlingStep.java @@ -219,7 +219,7 @@ public void onClick(AjaxRequestTarget target) { deleteObjectTypePerformed(target, objectType); } }; - item.add(delete); + link.add(delete); item.add(AttributeModifier.replace("class", new AbstractReadOnlyModel() { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/SynchronizationStep.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/SynchronizationStep.html index 632743e5929..86716e776c2 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/SynchronizationStep.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/SynchronizationStep.html @@ -26,16 +26,17 @@

- -
+ + +   + - - - -
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/SynchronizationStep.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/SynchronizationStep.java index 444bf4cf771..dec93c3981c 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/SynchronizationStep.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/SynchronizationStep.java @@ -228,7 +228,7 @@ public void onClick(AjaxRequestTarget target){ deleteSyncObjectPerformed(target, syncObject); } }; - item.add(delete); + link.add(delete); item.add(AttributeModifier.replace("class", new AbstractReadOnlyModel() { From 0068f82ec55645e5006cd714e17c3265a49fe246 Mon Sep 17 00:00:00 2001 From: Radovan Semancik Date: Thu, 9 Oct 2014 22:45:45 +0200 Subject: [PATCH 7/9] Improved error checking during connector initialization --- .../ucf/impl/ConnectorFactoryIcfImpl.java | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/ucf/impl/ConnectorFactoryIcfImpl.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/ucf/impl/ConnectorFactoryIcfImpl.java index 7348c4f8821..cb79d60a539 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/ucf/impl/ConnectorFactoryIcfImpl.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/ucf/impl/ConnectorFactoryIcfImpl.java @@ -525,7 +525,11 @@ private Set scanDirectory(String path) { // Test if this path is single jar or need to do deep examination if (isThisJarFileBundle(dir)) { try { - bundle.add(dir.toURI().toURL()); + if (isThisBundleCompatible(dir.toURI().toURL())) { + bundle.add(dir.toURI().toURL()); + } else { + LOGGER.warn("Skip loading budle {} due error occured", dir.toURI().toURL()); + } } catch (MalformedURLException e) { LOGGER.error("This never happend we hope.", e); throw new SystemException(e); @@ -573,7 +577,15 @@ private Boolean isThisBundleCompatible(URL bundleUrl) { if (null == bundleUrl) return false; try { - ConnectorInfoManagerFactory.getInstance().getLocalManager(bundleUrl); + ConnectorInfoManager localManager = ConnectorInfoManagerFactory.getInstance().getLocalManager(bundleUrl); + List connectorInfos = localManager.getConnectorInfos(); + if (connectorInfos == null || connectorInfos.isEmpty()) { + LOGGER.error("Strange error happened. ConnId is not accepting bundle {}. But no error is indicated.", bundleUrl); + return false; + } else { + LOGGER.trace("Found {} compatible connectors in bundle {}", connectorInfos.size(), bundleUrl); + return true; + } } catch (Exception ex) { if (LOGGER.isDebugEnabled()) { LOGGER.error("Error instantiating ICF bundle using URL '{}': {}", new Object[] { bundleUrl, ex.getMessage()}, ex); @@ -582,7 +594,6 @@ private Boolean isThisBundleCompatible(URL bundleUrl) { } return false; } - return true; } /** From c2884081b12ee6e82dbe989903233af548731a9c Mon Sep 17 00:00:00 2001 From: Erik Suta Date: Fri, 10 Oct 2014 10:13:22 +0200 Subject: [PATCH 8/9] MID-1993 - fix for typo in code, that was causing this issue. --- .../evolveum/midpoint/web/component/prism/PrismValuePanel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/PrismValuePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/PrismValuePanel.java index 07b7765fe68..fb1355170ae 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/PrismValuePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/PrismValuePanel.java @@ -436,7 +436,7 @@ private String createAssociationTooltipText(PrismProperty property){ PrismObject shadowPrism = (PrismObject)property.getParent().getParent(); ShadowType shadow = shadowPrism.asObjectable(); - if(shadow.getActivation() != null){ + if(shadow.getAttributes() != null){ ShadowAttributesType attributes = shadow.getAttributes(); AnyArrayList attrs = (AnyArrayList)attributes.getAny(); From cc4b4f6eadedf26d53bce58933f01db8f40ebd37 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Fri, 10 Oct 2014 17:30:20 +0200 Subject: [PATCH 9/9] Working around duplicate records returned from a special kind of OR-style attribute-related query. --- .../midpoint/schema/util/ObjectQueryUtil.java | 10 +- .../provisioning/test/impl/TestDummy.java | 90 ++++-- .../repo/sql/QueryInterpreterTest.java | 49 ++++ .../midpoint/repo/sql/query/QueryEngine.java | 3 + .../sql/query/{ => custom}/CustomQuery.java | 3 +- .../query/{ => custom}/OrgFilterQuery.java | 7 +- .../custom/ShadowQueryWithDisjunction.java | 260 ++++++++++++++++++ 7 files changed, 397 insertions(+), 25 deletions(-) rename repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query/{ => custom}/CustomQuery.java (95%) rename repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query/{ => custom}/OrgFilterQuery.java (96%) create mode 100644 repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query/custom/ShadowQueryWithDisjunction.java diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ObjectQueryUtil.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ObjectQueryUtil.java index 17d23855778..e89adf32e00 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ObjectQueryUtil.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ObjectQueryUtil.java @@ -94,8 +94,14 @@ public static ObjectQuery createResourceAndAccountQuery(String resourceOid, QNam createObjectClassFilter(objectClass, prismContext)); return ObjectQuery.createObjectQuery(and); } - - public static ObjectFilter createResourceFilter(String resourceOid, PrismContext prismContext) throws SchemaException { + + public static ObjectQuery createResourceQuery(String resourceOid, PrismContext prismContext) throws SchemaException { + Validate.notNull(resourceOid, "Resource where to search must not be null."); + Validate.notNull(prismContext, "Prism context must not be null."); + return ObjectQuery.createObjectQuery(createResourceFilter(resourceOid, prismContext)); + } + + public static ObjectFilter createResourceFilter(String resourceOid, PrismContext prismContext) throws SchemaException { return RefFilter.createReferenceEqual(ShadowType.F_RESOURCE_REF, ShadowType.class, prismContext, resourceOid); } diff --git a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestDummy.java b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestDummy.java index 8c5a5a4eeda..e5e223f05c1 100644 --- a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestDummy.java +++ b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestDummy.java @@ -44,6 +44,7 @@ import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.prism.query.OrFilter; import org.apache.commons.lang.StringUtils; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ContextConfiguration; @@ -2299,7 +2300,7 @@ public void test159GetAccount() throws Exception { public void test160SearchNull() throws Exception { final String TEST_NAME = "test160SearchNull"; TestUtil.displayTestTile(TEST_NAME); - testSeachIterative(TEST_NAME, null, null, true, + testSeachIterative(TEST_NAME, null, null, true, true, false, "meathook", "daemon", "morgan", "Will"); } @@ -2398,7 +2399,19 @@ public void test168aSearchIcfNameExactNoFetch() throws Exception { ACCOUNT_WILL_USERNAME); } - protected void testSeachIterativeSingleAttrFilter(final String TEST_NAME, String attrName, T attrVal, + // TEMPORARY todo move to more appropriate place (model-intest?) + @Test + public void test168bSearchIcfNameAndUidExactNoFetch() throws Exception { + final String TEST_NAME = "test168bSearchIcfNameAndUidExactNoFetch"; + TestUtil.displayTestTile(TEST_NAME); + testSeachIterativeAlternativeAttrFilter(TEST_NAME, ConnectorFactoryIcfImpl.ICFS_NAME, ACCOUNT_WILL_USERNAME, + ConnectorFactoryIcfImpl.ICFS_UID, willIcfUid, + GetOperationOptions.createNoFetch(), false, + ACCOUNT_WILL_USERNAME); + } + + + protected void testSeachIterativeSingleAttrFilter(final String TEST_NAME, String attrName, T attrVal, GetOperationOptions rootOptions, boolean fullShadow, String... expectedAccountIds) throws Exception { testSeachIterativeSingleAttrFilter(TEST_NAME, dummyResourceCtl.getAttributeQName(attrName), attrVal, rootOptions, fullShadow, expectedAccountIds); @@ -2415,22 +2428,52 @@ protected void testSeachIterativeSingleAttrFilter(final String TEST_NAME, QN ResourceAttributeDefinition attrDef = objectClassDef.findAttributeDefinition(attrQName); ObjectFilter filter = EqualFilter.createEqual(new ItemPath(ShadowType.F_ATTRIBUTES, attrDef.getName()), attrDef, attrPVal); - testSeachIterative(TEST_NAME, filter, rootOptions, fullShadow, expectedAccountNames); - } - - private void testSeachIterative(final String TEST_NAME, ObjectFilter attrFilter, GetOperationOptions rootOptions, - final boolean fullShadow, String... expectedAccountNames) throws Exception { + testSeachIterative(TEST_NAME, filter, rootOptions, fullShadow, true, false, expectedAccountNames); + } + + protected void testSeachIterativeAlternativeAttrFilter(final String TEST_NAME, QName attr1QName, T attr1Val, + QName attr2QName, T attr2Val, + GetOperationOptions rootOptions, boolean fullShadow, String... expectedAccountNames) throws Exception { + PrismPropertyValue attr1PVal = null; + if (attr1Val != null) { + attr1PVal = new PrismPropertyValue(attr1Val); + } + PrismPropertyValue attr2PVal = null; + if (attr2Val != null) { + attr2PVal = new PrismPropertyValue(attr2Val); + } + ResourceSchema resourceSchema = RefinedResourceSchema.getResourceSchema(resource, prismContext); + ObjectClassComplexTypeDefinition objectClassDef = resourceSchema.findObjectClassDefinition(SchemaTestConstants.ACCOUNT_OBJECT_CLASS_LOCAL_NAME); + ResourceAttributeDefinition attr1Def = objectClassDef.findAttributeDefinition(attr1QName); + ObjectFilter filter1 = EqualFilter.createEqual(new ItemPath(ShadowType.F_ATTRIBUTES, attr1Def.getName()), attr1Def, attr1PVal); + ResourceAttributeDefinition attr2Def = objectClassDef.findAttributeDefinition(attr2QName); + ObjectFilter filter2 = EqualFilter.createEqual(new ItemPath(ShadowType.F_ATTRIBUTES, attr2Def.getName()), attr2Def, attr2PVal); + + testSeachIterative(TEST_NAME, OrFilter.createOr(filter1, filter2), rootOptions, fullShadow, false, true, expectedAccountNames); + } + + + private void testSeachIterative(final String TEST_NAME, ObjectFilter attrFilter, GetOperationOptions rootOptions, + final boolean fullShadow, boolean useObjectClassFilter, final boolean useRepo, String... expectedAccountNames) throws Exception { OperationResult result = new OperationResult(TestDummy.class.getName() + "." + TEST_NAME); - ObjectQuery query = ObjectQueryUtil.createResourceAndAccountQuery(RESOURCE_DUMMY_OID, new QName(ResourceTypeUtil.getResourceNamespace(resourceType), - ConnectorFactoryIcfImpl.ACCOUNT_OBJECT_CLASS_LOCAL_NAME), prismContext); - - if (attrFilter != null) { - AndFilter filter = (AndFilter) query.getFilter(); - filter.getConditions().add(attrFilter); - } + ObjectQuery query; + if (useObjectClassFilter) { + query = ObjectQueryUtil.createResourceAndAccountQuery(RESOURCE_DUMMY_OID, new QName(ResourceTypeUtil.getResourceNamespace(resourceType), + ConnectorFactoryIcfImpl.ACCOUNT_OBJECT_CLASS_LOCAL_NAME), prismContext); + if (attrFilter != null) { + AndFilter filter = (AndFilter) query.getFilter(); + filter.getConditions().add(attrFilter); + } + } else { + query = ObjectQueryUtil.createResourceQuery(RESOURCE_DUMMY_OID, prismContext); + if (attrFilter != null) { + query.setFilter(AndFilter.createAnd(query.getFilter(), attrFilter)); + } + } + display("Query", query); final List> foundObjects = new ArrayList>(); @@ -2442,8 +2485,10 @@ public boolean handle(PrismObject object, OperationResult parentResu ObjectType objectType = object.asObjectable(); assertTrue(objectType instanceof ShadowType); - ShadowType shadow = (ShadowType) objectType; - checkAccountShadow(shadow, parentResult, fullShadow); + if (!useRepo) { + ShadowType shadow = (ShadowType) objectType; + checkAccountShadow(shadow, parentResult, fullShadow); + } return true; } }; @@ -2451,7 +2496,11 @@ public boolean handle(PrismObject object, OperationResult parentResu Collection> options = SelectorOptions.createCollection(rootOptions); // WHEN - provisioningService.searchObjectsIterative(ShadowType.class, query, options, handler, result); + if (useRepo) { + repositoryService.searchObjectsIterative(ShadowType.class, query, handler, null, result); + } else { + provisioningService.searchObjectsIterative(ShadowType.class, query, options, handler, result); + } // THEN result.computeStatus(); @@ -2474,9 +2523,10 @@ public boolean handle(PrismObject object, OperationResult parentResu } assertEquals("Wrong number of found objects ("+foundObjects+"): "+foundObjects, expectedAccountNames.length, foundObjects.size()); - checkConsistency(foundObjects); - - assertSteadyResource(); + if (!useRepo) { + checkConsistency(foundObjects); + } + assertSteadyResource(); } @Test diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreterTest.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreterTest.java index 240f4552ded..e6fc493c7bd 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreterTest.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreterTest.java @@ -19,6 +19,7 @@ import com.evolveum.midpoint.prism.Objectable; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismObjectDefinition; +import com.evolveum.midpoint.prism.PrismPropertyDefinition; import com.evolveum.midpoint.prism.match.PolyStringNormMatchingRule; import com.evolveum.midpoint.prism.match.PolyStringOrigMatchingRule; import com.evolveum.midpoint.prism.path.ItemPath; @@ -35,12 +36,17 @@ import com.evolveum.midpoint.repo.sql.data.common.type.RAssignmentExtensionType; import com.evolveum.midpoint.repo.sql.data.common.type.RObjectExtensionType; import com.evolveum.midpoint.repo.sql.data.common.type.RParentOrgRef; +import com.evolveum.midpoint.repo.sql.query.QueryEngine; import com.evolveum.midpoint.repo.sql.query.QueryException; +import com.evolveum.midpoint.repo.sql.query.RQuery; +import com.evolveum.midpoint.repo.sql.query.RQueryCriteriaImpl; import com.evolveum.midpoint.repo.sql.type.XMLGregorianCalendarType; import com.evolveum.midpoint.repo.sql.util.HibernateToSqlTranslator; import com.evolveum.midpoint.schema.MidPointPrismContextFactory; +import com.evolveum.midpoint.schema.SchemaConstantsGenerated; import com.evolveum.midpoint.schema.constants.MidPointConstants; import com.evolveum.midpoint.schema.result.OperationResult; +import com.evolveum.midpoint.util.DOMUtil; import com.evolveum.midpoint.util.PrettyPrinter; import com.evolveum.midpoint.util.QNameUtil; import com.evolveum.midpoint.util.exception.SchemaException; @@ -1563,4 +1569,47 @@ public void test420QueryGenericString() throws Exception { close(session); } } + +// @Test +// public void atest100() throws Exception { +// Session session = open(); +// +// try { +// String expected = null;//HibernateToSqlTranslator.toSql(main); +// +// List secondaryEquals = new ArrayList<>(); +// EqualFilter eq = EqualFilter.createEqual(new ItemPath(ShadowType.F_ATTRIBUTES, SchemaConstantsGenerated.ICF_S_UID), +// new PrismPropertyDefinition(SchemaConstantsGenerated.ICF_S_UID, DOMUtil.XSD_STRING, prismContext), +// "8daaeeae-f0c7-41c9-b258-2a3351aa8876"); +// secondaryEquals.add(eq); +// eq = EqualFilter.createEqual(new ItemPath(ShadowType.F_ATTRIBUTES, SchemaConstantsGenerated.ICF_S_NAME), +// new PrismPropertyDefinition(SchemaConstantsGenerated.ICF_S_NAME, DOMUtil.XSD_STRING, prismContext), +// "some-name"); +// secondaryEquals.add(eq); +// +// OrFilter secondaryIdentifierFilter = OrFilter.createOr((List) secondaryEquals); +// RefFilter ref = RefFilter.createReferenceEqual(ShadowType.F_RESOURCE_REF, ShadowType.class, +// prismContext, "ef2bc95b-76e0-48e2-86d6-3d4f02d3e1a2"); +// +// AndFilter filter = AndFilter.createAnd(ref, secondaryIdentifierFilter); +// ObjectQuery query = ObjectQuery.createObjectQuery(filter); +// LOGGER.debug("Query\n{}", query); +// +// QueryEngine engine = new QueryEngine(repositoryService.getConfiguration(), prismContext); +// RQuery rQuery = engine.interpret(query, ShadowType.class, null, false, session); +// RQueryCriteriaImpl rci = (RQueryCriteriaImpl) rQuery; +// System.out.println(rci); +// System.out.println(rci.getCriteria()); +// //just test if DB will handle it or throws some exception +// List l = rQuery.list(); +// LOGGER.info(">>>>>>>>asdfasdfasdfasdf{}",l.size()); +// +// String real = getInterpretedQuery(session, ShadowType.class, query); +// +// LOGGER.info("exp. query>\n{}\nreal query>\n{}", new Object[]{expected, real}); +// AssertJUnit.assertEquals(expected, real); +// } finally { +// close(session); +// } +// } } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query/QueryEngine.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query/QueryEngine.java index ff6e56d9f30..5e7605298df 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query/QueryEngine.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query/QueryEngine.java @@ -3,6 +3,8 @@ import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.repo.sql.SqlRepositoryConfiguration; +import com.evolveum.midpoint.repo.sql.query.custom.CustomQuery; +import com.evolveum.midpoint.repo.sql.query.custom.ShadowQueryWithDisjunction; import com.evolveum.midpoint.repo.sql.util.GetObjectResult; import com.evolveum.midpoint.schema.GetOperationOptions; import com.evolveum.midpoint.schema.SelectorOptions; @@ -24,6 +26,7 @@ public class QueryEngine { private static final List queryLibrary = new ArrayList<>(); static { + queryLibrary.add(new ShadowQueryWithDisjunction()); // queryLibrary.add(new OrgFilterQuery()); } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query/CustomQuery.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query/custom/CustomQuery.java similarity index 95% rename from repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query/CustomQuery.java rename to repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query/custom/CustomQuery.java index 2f357c17459..ce8b3343ee6 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query/CustomQuery.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query/custom/CustomQuery.java @@ -14,11 +14,12 @@ * limitations under the License. */ -package com.evolveum.midpoint.repo.sql.query; +package com.evolveum.midpoint.repo.sql.query.custom; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.repo.sql.SqlRepositoryConfiguration; +import com.evolveum.midpoint.repo.sql.query.RQuery; import com.evolveum.midpoint.schema.GetOperationOptions; import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query/OrgFilterQuery.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query/custom/OrgFilterQuery.java similarity index 96% rename from repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query/OrgFilterQuery.java rename to repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query/custom/OrgFilterQuery.java index a8c5fa8f716..e70469f19cc 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query/OrgFilterQuery.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query/custom/OrgFilterQuery.java @@ -14,10 +14,12 @@ * limitations under the License. */ -package com.evolveum.midpoint.repo.sql.query; +package com.evolveum.midpoint.repo.sql.query.custom; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.query.OrgFilter; +import com.evolveum.midpoint.repo.sql.query.RQuery; +import com.evolveum.midpoint.repo.sql.query.RQueryImpl; import com.evolveum.midpoint.repo.sql.util.ClassMapper; import com.evolveum.midpoint.repo.sql.util.GetObjectResult; import com.evolveum.midpoint.schema.GetOperationOptions; @@ -26,7 +28,6 @@ import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; -import org.apache.commons.lang.ObjectUtils; import org.hibernate.Query; import org.hibernate.Session; @@ -34,6 +35,8 @@ /** * @author lazyman + * + * CURRENTLY UNUSED. */ public class OrgFilterQuery extends CustomQuery { diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query/custom/ShadowQueryWithDisjunction.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query/custom/ShadowQueryWithDisjunction.java new file mode 100644 index 00000000000..2c3649801ee --- /dev/null +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query/custom/ShadowQueryWithDisjunction.java @@ -0,0 +1,260 @@ +/* + * Copyright (c) 2010-2014 Evolveum + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.evolveum.midpoint.repo.sql.query.custom; + +import com.evolveum.midpoint.prism.PrismPropertyValue; +import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.prism.polystring.PolyString; +import com.evolveum.midpoint.prism.query.AndFilter; +import com.evolveum.midpoint.prism.query.EqualFilter; +import com.evolveum.midpoint.prism.query.ObjectFilter; +import com.evolveum.midpoint.prism.query.ObjectPaging; +import com.evolveum.midpoint.prism.query.ObjectQuery; +import com.evolveum.midpoint.prism.query.OrFilter; +import com.evolveum.midpoint.prism.query.RefFilter; +import com.evolveum.midpoint.repo.sql.data.common.type.RObjectExtensionType; +import com.evolveum.midpoint.repo.sql.query.QueryDefinitionRegistry; +import com.evolveum.midpoint.repo.sql.query.RQuery; +import com.evolveum.midpoint.repo.sql.query.RQueryCriteriaImpl; +import com.evolveum.midpoint.repo.sql.query.definition.Definition; +import com.evolveum.midpoint.repo.sql.query.definition.EntityDefinition; +import com.evolveum.midpoint.repo.sql.util.ClassMapper; +import com.evolveum.midpoint.repo.sql.util.GetObjectResult; +import com.evolveum.midpoint.repo.sql.util.RUtil; +import com.evolveum.midpoint.schema.GetOperationOptions; +import com.evolveum.midpoint.schema.SchemaConstantsGenerated; +import com.evolveum.midpoint.schema.SelectorOptions; +import com.evolveum.midpoint.util.logging.Trace; +import com.evolveum.midpoint.util.logging.TraceManager; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; +import org.hibernate.Criteria; +import org.hibernate.Session; +import org.hibernate.criterion.Conjunction; +import org.hibernate.criterion.Criterion; +import org.hibernate.criterion.DetachedCriteria; +import org.hibernate.criterion.Disjunction; +import org.hibernate.criterion.Order; +import org.hibernate.criterion.ProjectionList; +import org.hibernate.criterion.Projections; +import org.hibernate.criterion.Restrictions; +import org.hibernate.criterion.Subqueries; +import org.hibernate.sql.JoinType; + +import javax.xml.namespace.QName; +import java.util.Collection; + +/** + * A hack oriented towards queries in the form + * resourceRef = X && (attributes/uid = Y || attributes/name = Z) + * + * The reason is that default implementation of such queries returns shadows that comply with + * both branches of the disjunction twice. Changing the way of dealing with such queries seriously + * is not possible at this moment (moreover, it brings along unclear performance consequences). + * Therefore this hack. + * + * @author mederly + */ +public class ShadowQueryWithDisjunction extends CustomQuery { + + private static final Trace LOGGER = TraceManager.getTrace(ShadowQueryWithDisjunction.class); + + static private class ParsedQuery { + RefFilter refFilter; + EqualFilter eqUidFilter, eqNameFilter; + } + + @Override + public boolean match(ObjectQuery objectQuery, Class type, + Collection> options, boolean countingObjects) { + + if (!ShadowType.class.equals(type)) { + return false; + } + return parse(objectQuery) != null; + } + + private ParsedQuery parse(ObjectQuery objectQuery) { + + if (objectQuery == null || !(objectQuery.getFilter() instanceof AndFilter)) { + return null; + } + + AndFilter andFilter = (AndFilter) objectQuery.getFilter(); + + RefFilter refFilter = null; + OrFilter orFilter = null; + for (ObjectFilter filter : andFilter.getConditions()) { + if (filter instanceof RefFilter) { + refFilter = (RefFilter) filter; + } else if (filter instanceof OrFilter) { + orFilter = (OrFilter) filter; + } else { + return null; + } + } + if (refFilter == null || orFilter == null) { + return null; + } + if (!new ItemPath(ShadowType.F_RESOURCE_REF).equivalent(refFilter.getPath())) { + return null; + } + if (refFilter.getValues() == null || refFilter.getValues().size() != 1) { + return null; + } + + EqualFilter eqUidFilter = null; + EqualFilter eqNameFilter = null; + ItemPath uidPath = new ItemPath(ShadowType.F_ATTRIBUTES, SchemaConstantsGenerated.ICF_S_UID); + ItemPath namePath = new ItemPath(ShadowType.F_ATTRIBUTES, SchemaConstantsGenerated.ICF_S_NAME); + for (ObjectFilter filter : orFilter.getConditions()) { + if (!(filter instanceof EqualFilter)) { + return null; + } + EqualFilter equalFilter = (EqualFilter) filter; + if (uidPath.equivalent(equalFilter.getPath())) { + eqUidFilter = equalFilter; + } else if (namePath.equivalent(equalFilter.getPath())) { + eqNameFilter = equalFilter; + } else { + return null; + } + } + if (eqUidFilter == null || eqNameFilter == null) { + return null; + } + if (eqUidFilter.getValues() == null || eqUidFilter.getValues().size() != 1) { + return null; + } + if (eqNameFilter.getValues() == null || eqNameFilter.getValues().size() != 1) { + return null; + } + ParsedQuery parsedQuery = new ParsedQuery(); + parsedQuery.refFilter = refFilter; + parsedQuery.eqNameFilter = eqNameFilter; + parsedQuery.eqUidFilter = eqUidFilter; + return parsedQuery; + } + + @Override + public RQuery createQuery(ObjectQuery objectQuery, Class type, + Collection> options, boolean countingObjects, + Session session) { + + + DetachedCriteria c1 = DetachedCriteria.forClass(ClassMapper.getHQLTypeClass(ShadowType.class), "s"); + c1.createCriteria("strings", "s1", JoinType.LEFT_OUTER_JOIN); + + ParsedQuery parsedQuery = parse(objectQuery); + Conjunction conjunction = Restrictions.conjunction(); + conjunction.add(Restrictions.eq("resourceRef.targetOid", parsedQuery.refFilter.getValues().get(0).getOid())); + Disjunction disjunction = Restrictions.disjunction(); + disjunction.add(createAttributeEq(parsedQuery.eqUidFilter, SchemaConstantsGenerated.ICF_S_UID)); + disjunction.add(createAttributeEq(parsedQuery.eqNameFilter, SchemaConstantsGenerated.ICF_S_NAME)); + conjunction.add(disjunction); + c1.add(conjunction); + + if (countingObjects) { + c1.setProjection(Projections.countDistinct("s.oid")); + return new RQueryCriteriaImpl(c1.getExecutableCriteria(session)); + } + + c1.setProjection(Projections.distinct(Projections.property("s.oid"))); + + Criteria cMain = session.createCriteria(ClassMapper.getHQLTypeClass(ShadowType.class), "o"); + cMain.add(Subqueries.propertyIn("oid", c1)); + + if (objectQuery != null && objectQuery.getPaging() != null) { + cMain = updatePagingAndSorting(cMain, type, objectQuery.getPaging()); + } + + ProjectionList projections = Projections.projectionList(); + projections.add(Projections.property("fullObject")); + projections.add(Projections.property("stringsCount")); + projections.add(Projections.property("longsCount")); + projections.add(Projections.property("datesCount")); + projections.add(Projections.property("referencesCount")); + projections.add(Projections.property("polysCount")); + + cMain.setProjection(projections); + + cMain.setResultTransformer(GetObjectResult.RESULT_TRANSFORMER); + return new RQueryCriteriaImpl(cMain); + } + + private Criterion createAttributeEq(EqualFilter attributeEqFilter, QName attributeName) { + Conjunction conjunction = Restrictions.conjunction(); + conjunction.add(Restrictions.eq("s1.ownerType", RObjectExtensionType.ATTRIBUTES)); + conjunction.add(Restrictions.eq("s1.name", RUtil.qnameToString(attributeName))); + conjunction.add(Restrictions.eq("s1.value", ((PrismPropertyValue) attributeEqFilter.getValues().get(0)).getValue())); + return conjunction; + } + + // copied from QueryInterpreter, todo refactor to some util class + public Criteria updatePagingAndSorting(Criteria query, Class type, ObjectPaging paging) { + if (paging == null) { + return query; + } + if (paging.getOffset() != null) { + query = query.setFirstResult(paging.getOffset()); + } + if (paging.getMaxSize() != null) { + query = query.setMaxResults(paging.getMaxSize()); + } + + if (paging.getDirection() == null && paging.getOrderBy() == null) { + return query; + } + + QueryDefinitionRegistry registry = QueryDefinitionRegistry.getInstance(); + // PropertyPath path = new + // XPathHolder(paging.getOrderBy()).toPropertyPath(); + if (paging.getOrderBy() == null) { + LOGGER.warn("Ordering by property path with size not equal 1 is not supported '" + paging.getOrderBy() + + "'."); + return query; + } + EntityDefinition definition = registry.findDefinition(type, null, EntityDefinition.class); + Definition def = definition.findDefinition(paging.getOrderBy(), Definition.class); + if (def == null) { + LOGGER.warn("Unknown path '" + paging.getOrderBy() + "', couldn't find definition for it, " + + "list will not be ordered by it."); + return query; + } + + String propertyName = def.getJpaName(); + if (PolyString.class.equals(def.getJaxbType())) { + propertyName += ".orig"; + } + + if (paging.getDirection() != null) { + switch (paging.getDirection()) { + case ASCENDING: + query = query.addOrder(Order.asc(propertyName)); + break; + case DESCENDING: + query = query.addOrder(Order.desc(propertyName)); + break; + } + } else { + query = query.addOrder(Order.asc(propertyName)); + } + + + return query; + } +}