From 03eb5991685c970bef282434a26f0d67514c6c03 Mon Sep 17 00:00:00 2001 From: honchar Date: Thu, 17 Mar 2016 09:41:09 +0100 Subject: [PATCH 1/8] fixed editing objects through debug pages --- .../midpoint/web/page/admin/configuration/PageDebugList.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugList.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugList.java index e57c6dddaa3..b6b772e9c7f 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugList.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugList.java @@ -511,7 +511,7 @@ private void listObjectsPerformed(ObjectQuery query, AjaxRequestTarget target) { if (selected != null) { provider.setType(selected.getClassDefinition()); -// addOrReplaceTable(provider); + addOrReplaceTable(provider); } // save object type category to session storage, used by back button From ab71d5d87a73dfa662bdb447d778c3586c4a510e Mon Sep 17 00:00:00 2001 From: Viliam Repan Date: Thu, 17 Mar 2016 13:43:00 -0400 Subject: [PATCH 2/8] MID-2839 fixfor user editing (breadcrumbs) --- .../com/evolveum/midpoint/web/page/admin/PageAdminFocus.java | 2 +- .../com/evolveum/midpoint/web/page/admin/users/PageUser.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdminFocus.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdminFocus.java index f4fecf50291..f0c191ba50f 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdminFocus.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdminFocus.java @@ -201,7 +201,7 @@ public void finishProcessing(AjaxRequestTarget target, OperationResult result) { } } - goBackPage(); + redirectBack(); } else { getProgressReporter().showBackButton(target); getProgressReporter().hideAbortButton(target); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUser.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUser.java index e78f79a6017..79d5fdb92d7 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUser.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUser.java @@ -87,7 +87,7 @@ protected void cancelPerformed(AjaxRequestTarget target) { // !userModel.getObject().getFocusPrimaryDelta().isEmpty()){ // showModalWindow(MODAL_ID_CONFIRM_CANCEL, target); // } else{ - goBackPage(); + redirectBack(); // } // }catch(Exception ex){ From 541ed3ce83abba3d2c7c7cab775b5cd7c5a466a6 Mon Sep 17 00:00:00 2001 From: Viliam Repan Date: Thu, 17 Mar 2016 17:10:47 -0400 Subject: [PATCH 3/8] advanced role search --- .../web/component/search/SearchItemPanel.java | 8 +- .../page/admin/PageAdminObjectDetails.java | 22 --- .../web/page/admin/roles/PageRole.java | 3 +- .../web/page/admin/roles/PageRoles.html | 7 +- .../web/page/admin/roles/PageRoles.java | 149 ++++-------------- .../page/admin/roles/dto/RolesSearchDto.java | 64 -------- .../web/page/admin/users/PageUsers.java | 52 ------ .../midpoint/web/session/RolesStorage.java | 22 +-- 8 files changed, 49 insertions(+), 278 deletions(-) delete mode 100644 gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/dto/RolesSearchDto.java diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchItemPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchItemPanel.java index 86b0711aaf2..c8d06ca1958 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchItemPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchItemPanel.java @@ -25,7 +25,6 @@ import com.evolveum.midpoint.web.component.AjaxButton; import com.evolveum.midpoint.web.component.AjaxSubmitButton; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; - import org.apache.commons.lang.StringUtils; import org.apache.wicket.AttributeModifier; import org.apache.wicket.MarkupContainer; @@ -447,10 +446,13 @@ public Object getDisplayValue(DisplayableValue object) { public String getIdValue(DisplayableValue object, int index) { return Integer.toString(index); } - + @Override public DisplayableValue getObject(String id, IModel>> choices) { - return choices.getObject().get(Integer.parseInt(id)); + if (StringUtils.isEmpty(id)) { + return null; + } + return choices.getObject().get(Integer.parseInt(id)); } @Override diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdminObjectDetails.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdminObjectDetails.java index fdf95e0a42f..da0f9322e37 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdminObjectDetails.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdminObjectDetails.java @@ -615,28 +615,6 @@ protected void performAdditionalValidation(PrismObject object, } - // TODO: fix name, confusing. clashes with goBack() - // todo: we should navigate using breadcrumb stack [lazyman] - @Deprecated - public void goBackPage() { - StringValue orgReturn = getPageParameters().get(PARAM_RETURN_PAGE); - if (PageOrgTree.PARAM_ORG_RETURN.equals(orgReturn.toString())) { - setResponsePage(getSessionStorage().getPreviousPage()); - } else if (getPreviousPage() != null) { - goBack(PageDashboard.class); // the class parameter is not necessary, is previousPage is set - } else if (getSessionStorage() != null){ - if (getSessionStorage().getPreviousPageInstance() != null){ - setResponsePage(getSessionStorage().getPreviousPageInstance()); - } else if (getSessionStorage().getPreviousPage() != null){ - setResponsePage(getSessionStorage().getPreviousPage()); - } else { - setResponsePage(getDefaultBackPage()); - } - } else { - setResponsePage(getDefaultBackPage()); - } - } - public abstract PageBase getDefaultBackPage(); public List getObjectFormTypes() { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/PageRole.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/PageRole.java index 04dfb8bc38d..742d73ca082 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/PageRole.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/PageRole.java @@ -197,7 +197,6 @@ protected AbstractObjectMainPanel createMainPanel(String id) { @Override public PageBase getDefaultBackPage() { - return new PageRoles(false, ""); + return new PageRoles(false); } - } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/PageRoles.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/PageRoles.html index 3e6435079d9..513bd60bd4a 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/PageRoles.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/PageRoles.html @@ -26,12 +26,7 @@
-
- - -
+ +
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/PasswordPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/PasswordPanel.java index 0a323faa10c..3db99e6e108 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/PasswordPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/PasswordPanel.java @@ -48,7 +48,10 @@ public class PasswordPanel extends InputPanel { private static final String ID_LINK_CONTAINER = "linkContainer"; private static final String ID_PASSWORD_SET = "passwordSet"; + private static final String ID_PASSWORD_REMOVE = "passwordRemove"; private static final String ID_CHANGE_PASSWORD_LINK = "changePasswordLink"; + private static final String ID_REMOVE_PASSWORD_LINK = "removePasswordLink"; + private static final String ID_REMOVE_BUTTON_CONTAINER = "removeButtonContainer"; private static final String ID_INPUT_CONTAINER = "inputContainer"; private static final String ID_PASSWORD_ONE = "password1"; private static final String ID_PASSWORD_TWO = "password2"; @@ -58,18 +61,18 @@ public class PasswordPanel extends InputPanel { private boolean passwordInputVisble; public PasswordPanel(String id, IModel model) { - this(id, model, false); + this(id, model, false, false); } - public PasswordPanel(String id, IModel model, boolean isReadOnly) { + public PasswordPanel(String id, IModel model, boolean isReadOnly, boolean showRemoveButton) { super(id); - initLayout(model, isReadOnly); + initLayout(model, isReadOnly, showRemoveButton); } - private void initLayout(IModel model, final boolean isReadOnly) { + private void initLayout(final IModel model, final boolean isReadOnly, boolean showRemoveButton) { setOutputMarkupId(true); - + passwordInputVisble = model.getObject() == null; // TODO: remove // LOGGER.trace("PASSWORD model: {}", model.getObject()); @@ -116,11 +119,16 @@ public boolean isVisible() { } }; inputContainer.setOutputMarkupId(true); + linkContainer.setOutputMarkupId(true); add(linkContainer); - Label passwordSetLabel = new Label(ID_PASSWORD_SET, new ResourceModel("passwordPanel.passwordSet")); + final Label passwordSetLabel = new Label(ID_PASSWORD_SET, new ResourceModel("passwordPanel.passwordSet")); linkContainer.add(passwordSetLabel); + final Label passwordRemoveLabel = new Label(ID_PASSWORD_REMOVE, new ResourceModel("passwordPanel.passwordRemoveLabel")); + passwordRemoveLabel.setVisible(false); + linkContainer.add(passwordRemoveLabel); + AjaxLink link = new AjaxLink(ID_CHANGE_PASSWORD_LINK) { @Override public void onClick(AjaxRequestTarget target) { @@ -142,7 +150,20 @@ public boolean isVisible() { link.setBody(new ResourceModel("passwordPanel.passwordChange")); link.setOutputMarkupId(true); linkContainer.add(link); - + + final WebMarkupContainer removeButtonContainer = new WebMarkupContainer(ID_REMOVE_BUTTON_CONTAINER); + AjaxLink removePassword = new AjaxLink(ID_REMOVE_PASSWORD_LINK) { + @Override + public void onClick(AjaxRequestTarget target) { + onRemovePassword(model, target); + } + + }; + removePassword.setVisible(showRemoveButton); + removePassword.setBody(new ResourceModel("passwordPanel.passwordRemove")); + removePassword.setOutputMarkupId(true); + removeButtonContainer.add(removePassword); + add(removeButtonContainer); } private void onLinkClick(AjaxRequestTarget target) { @@ -150,6 +171,18 @@ private void onLinkClick(AjaxRequestTarget target) { target.add(this); } + private void onRemovePassword(IModel model, AjaxRequestTarget target) { + get(ID_LINK_CONTAINER).get(ID_PASSWORD_SET).setVisible(false); + get(ID_LINK_CONTAINER).get(ID_PASSWORD_REMOVE).setVisible(true); + passwordInputVisble = false; + target.add(this); + + ProtectedStringType newValue = new ProtectedStringType(); + byte[] temp = new byte[0]; + newValue.setClearBytes(temp); + model.setObject(null); + } + @Override public List getFormComponents() { List list = new ArrayList(); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/ObjectWrapper.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/ObjectWrapper.java index f981ccdee49..e099647415c 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/ObjectWrapper.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/ObjectWrapper.java @@ -332,6 +332,13 @@ public ObjectDelta getObjectDelta() throws SchemaException { if (itemWrapper instanceof PropertyWrapper) { ItemDelta pDelta = computePropertyDeltas((PropertyWrapper) itemWrapper, containerPath); if (!pDelta.isEmpty()) { + //HACK to remove a password replace delta is to be created + if (containerWrapper.getName().equals(CredentialsType.F_PASSWORD)) { + if (pDelta.getValuesToDelete() != null){ + pDelta.resetValuesToDelete(); + pDelta.setValuesToReplace(new ArrayList()); + } + } delta.addModification(pDelta); } } else if (itemWrapper instanceof ReferenceWrapper) { 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 5628b9fa159..249e3af9aff 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 @@ -39,7 +39,9 @@ import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.web.model.LookupPropertyModel; +import com.evolveum.midpoint.web.page.admin.users.PageUser; import com.evolveum.midpoint.web.page.admin.users.component.AssociationValueChoicePanel; +import com.evolveum.midpoint.web.security.SecurityUtils; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import org.apache.commons.lang.ClassUtils; @@ -454,9 +456,12 @@ private Panel createTypedInputComponent(String id) { panel = new DatePanel(id, new PropertyModel(model, baseExpression)); } else if (ProtectedStringType.COMPLEX_TYPE.equals(valueType)) { + boolean showRemovePasswordButton = true; + if (((PageUser)pageBase).getObjectWrapper().getObject().getOid().equals(SecurityUtils.getPrincipalUser().getOid())){ + showRemovePasswordButton = false; + } panel = new PasswordPanel(id, new PropertyModel(model, baseExpression), - model.getObject().isReadonly()); - + model.getObject().isReadonly(), showRemovePasswordButton); } else if (DOMUtil.XSD_BOOLEAN.equals(valueType)) { panel = new TriStateComboPanel(id, new PropertyModel(model, baseExpression)); diff --git a/gui/admin-gui/src/main/resources/localization/Midpoint.properties b/gui/admin-gui/src/main/resources/localization/Midpoint.properties index 9fa34f484a5..54347907f48 100644 --- a/gui/admin-gui/src/main/resources/localization/Midpoint.properties +++ b/gui/admin-gui/src/main/resources/localization/Midpoint.properties @@ -2185,7 +2185,9 @@ pageWorkItem.trackingData=Tracking data pageWorkItem.workItemCreatedOn=This work item created on\: passwordPanel.error=Passwords don't match. passwordPanel.passwordChange=Change +passwordPanel.passwordRemove=Remove passwordPanel.passwordSet=password is set +passwordPanel.passwordRemoveLabel=password will be removed past.ChangeType.ADD=Added past.ChangeType.DELETE=Deleted past.ChangeType.MODIFY=Modified diff --git a/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/ProtectedStringType.java b/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/ProtectedStringType.java index 9a079d7a99b..076f749152a 100644 --- a/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/ProtectedStringType.java +++ b/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/ProtectedStringType.java @@ -67,7 +67,9 @@ public byte[] getClearBytes() { @Override public void setClearBytes(byte[] bytes) { - setClearValue(bytesToString(bytes)); + if (bytes != null) { + setClearValue(bytesToString(bytes)); + } } @Override From ffc78fb59c1bd587297fc37f0abd99027434a7d0 Mon Sep 17 00:00:00 2001 From: Radovan Semancik Date: Fri, 18 Mar 2016 19:55:24 +0100 Subject: [PATCH 8/8] Fixing eager auxiliary object class fix. This also fixes TestUnix. --- .../model/impl/lens/Construction.java | 2 +- .../midpoint/model/impl/lens/LensContext.java | 6 ++ .../impl/lens/LensProjectionContext.java | 35 ++++--- .../projector/ConsolidationProcessor.java | 91 ++++++++++++------- .../lens/projector/OutboundProcessor.java | 2 +- .../projector/ProjectionValuesProcessor.java | 3 + 6 files changed, 90 insertions(+), 49 deletions(-) diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Construction.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Construction.java index 1eb8525e450..53c74ad525c 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Construction.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Construction.java @@ -831,7 +831,7 @@ public String debugDump(int indent) { @Override public String toString() { return "Construction(" + (refinedObjectClassDefinition == null ? constructionType - : refinedObjectClassDefinition.getShadowDiscriminator()) + ")"; + : refinedObjectClassDefinition.getShadowDiscriminator()) + " in " + source + ")"; } } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensContext.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensContext.java index 9f124c5bd78..ac301986284 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensContext.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensContext.java @@ -602,6 +602,12 @@ public void recomputeProjections() throws SchemaException { projCtx.recompute(); } } + + public void refreshAuxiliaryObjectClassDefinitions() throws SchemaException { + for (LensProjectionContext projCtx: getProjectionContexts()) { + projCtx.refreshAuxiliaryObjectClassDefinitions(); + } + } public void checkAbortRequested() { if (isAbortRequested()) { diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensProjectionContext.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensProjectionContext.java index ed23cf89cc4..088d55cb7c3 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensProjectionContext.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensProjectionContext.java @@ -571,25 +571,30 @@ public RefinedObjectClassDefinition getStructuralObjectClassDefinition() throws public Collection getAuxiliaryObjectClassDefinitions() throws SchemaException { if (auxiliaryObjectClassDefinitions == null) { - RefinedResourceSchema refinedSchema = getRefinedResourceSchema(); - if (refinedSchema == null) { - return null; - } - List auxiliaryObjectClassQNames = new ArrayList<>(); - addAuxiliaryObjectClassNames(auxiliaryObjectClassQNames, getObjectOld()); - addAuxiliaryObjectClassNames(auxiliaryObjectClassQNames, getObjectNew()); - auxiliaryObjectClassDefinitions = new ArrayList<>(auxiliaryObjectClassQNames.size()); - for (QName auxiliaryObjectClassQName: auxiliaryObjectClassQNames) { - RefinedObjectClassDefinition auxiliaryObjectClassDef = refinedSchema.getRefinedDefinition(auxiliaryObjectClassQName); - if (auxiliaryObjectClassDef == null) { - throw new SchemaException("Auxiliary object class "+auxiliaryObjectClassQName+" specified in "+this+" does not exist"); - } - auxiliaryObjectClassDefinitions.add(auxiliaryObjectClassDef); - } + refreshAuxiliaryObjectClassDefinitions(); } return auxiliaryObjectClassDefinitions; } + public void refreshAuxiliaryObjectClassDefinitions() throws SchemaException { + RefinedResourceSchema refinedSchema = getRefinedResourceSchema(); + if (refinedSchema == null) { + return; + } + List auxiliaryObjectClassQNames = new ArrayList<>(); + addAuxiliaryObjectClassNames(auxiliaryObjectClassQNames, getObjectOld()); + addAuxiliaryObjectClassNames(auxiliaryObjectClassQNames, getObjectNew()); + auxiliaryObjectClassDefinitions = new ArrayList<>(auxiliaryObjectClassQNames.size()); + for (QName auxiliaryObjectClassQName: auxiliaryObjectClassQNames) { + RefinedObjectClassDefinition auxiliaryObjectClassDef = refinedSchema.getRefinedDefinition(auxiliaryObjectClassQName); + if (auxiliaryObjectClassDef == null) { + throw new SchemaException("Auxiliary object class "+auxiliaryObjectClassQName+" specified in "+this+" does not exist"); + } + auxiliaryObjectClassDefinitions.add(auxiliaryObjectClassDef); + } + compositeObjectClassDefinition = null; + } + public CompositeRefinedObjectClassDefinition getCompositeObjectClassDefinition() throws SchemaException { if (compositeObjectClassDefinition == null) { RefinedObjectClassDefinition structuralObjectClassDefinition = getStructuralObjectClassDefinition(); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ConsolidationProcessor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ConsolidationProcessor.java index e19aa8f5e6f..727e89a3e1b 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ConsolidationProcessor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ConsolidationProcessor.java @@ -18,8 +18,10 @@ import static com.evolveum.midpoint.common.InternalsConfig.consistencyChecks; +import com.evolveum.midpoint.common.refinery.CompositeRefinedObjectClassDefinition; import com.evolveum.midpoint.common.refinery.RefinedAssociationDefinition; import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition; +import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; import com.evolveum.midpoint.common.refinery.RefinedAttributeDefinition; import com.evolveum.midpoint.model.api.PolicyViolationException; import com.evolveum.midpoint.model.api.context.SynchronizationPolicyDecision; @@ -78,6 +80,7 @@ import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; +import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -229,12 +232,6 @@ public boolean isAuthoritative() { ResourceShadowDiscriminator discr = projCtx.getResourceShadowDiscriminator(); ObjectDelta objectDelta = new ObjectDelta(ShadowType.class, ChangeType.MODIFY, prismContext); objectDelta.setOid(projCtx.getOid()); - - RefinedObjectClassDefinition rOcDef = projCtx.getCompositeObjectClassDefinition(); - if (rOcDef == null) { - LOGGER.error("Definition for account type {} not found in the context, but it should be there, dumping context:\n{}", discr, context.debugDump()); - throw new IllegalStateException("Definition for account type " + discr + " not found in the context, but it should be there"); - } // Do not automatically load the full projection now. Even if we have weak mapping. // That may be a waste of resources if the weak mapping results in no change anyway. @@ -268,35 +265,14 @@ public boolean isAuthoritative() { boolean completeAccount = projCtx.hasFullShadow(); ObjectDelta existingDelta = projCtx.getDelta(); - - // ATTRIBUTES - // Iterate and process each attribute separately. Now that we have squeezed the data we can process each attribute just - // with the data in ItemValueWithOrigin triples. - for (Map.Entry,PrismPropertyDefinition>>> entry : squeezedAttributes.entrySet()) { - QName attributeName = entry.getKey(); - DeltaSetTriple,PrismPropertyDefinition>> triple = entry.getValue(); - PropertyDelta propDelta = consolidateAttribute(rOcDef, discr, existingDelta, projCtx, - addUnchangedValues, completeAccount, attributeName, (DeltaSetTriple)triple); - if (propDelta != null) { - objectDelta.addModification(propDelta); - } - } - - // ASSOCIATIONS - for (Entry,PrismContainerDefinition>>> entry : squeezedAssociations.entrySet()) { - QName associationName = entry.getKey(); - DeltaSetTriple,PrismContainerDefinition>> triple = entry.getValue(); - ContainerDelta containerDelta = consolidateAssociation(rOcDef, discr, existingDelta, projCtx, - addUnchangedValues, completeAccount, associationName, triple); - if (containerDelta != null) { - objectDelta.addModification(containerDelta); - } - } // AUXILIARY OBJECT CLASSES ItemPath auxiliaryObjectClassItemPath = new ItemPath(ShadowType.F_AUXILIARY_OBJECT_CLASS); PrismPropertyDefinition auxiliaryObjectClassPropertyDef = projCtx.getObjectDefinition().findPropertyDefinition(auxiliaryObjectClassItemPath); PropertyDelta auxiliaryObjectClassAPrioriDelta = null; + RefinedResourceSchema refinedSchema = projCtx.getRefinedResourceSchema(); + List auxOcNames = new ArrayList<>(); + List auxOcDefs = new ArrayList<>(); ObjectDelta projDelta = projCtx.getDelta(); if (projDelta != null) { auxiliaryObjectClassAPrioriDelta = projDelta.findPropertyDelta(auxiliaryObjectClassItemPath); @@ -304,12 +280,26 @@ public boolean isAuthoritative() { for (Entry, PrismPropertyDefinition>>> entry : squeezedAuxiliaryObjectClasses.entrySet()) { DeltaSetTriple, PrismPropertyDefinition>> ivwoTriple = entry.getValue(); - LOGGER.trace("CONSOLIDATE auxiliary object classes\n({})", - new Object[]{ discr }); + LOGGER.trace("CONSOLIDATE auxiliary object classes ({})", new Object[]{ discr }); if (LOGGER.isTraceEnabled()) { LOGGER.trace("Auxiliary object class triple:\n{}",ivwoTriple.debugDump()); } + for (ItemValueWithOrigin,PrismPropertyDefinition> ivwo: ivwoTriple.getAllValues()) { + QName auxObjectClassName = ivwo.getItemValue().getValue(); + if (auxOcNames.contains(auxObjectClassName)) { + continue; + } + auxOcNames.add(auxObjectClassName); + RefinedObjectClassDefinition auxOcDef = refinedSchema.getRefinedDefinition(auxObjectClassName); + if (auxOcDef == null) { + LOGGER.error("Auxiliary object class definition {} for {} not found in the schema, but it should be there, dumping context:\n{}", + auxObjectClassName, discr, context.debugDump()); + throw new IllegalStateException("Auxiliary object class definition " + auxObjectClassName + " for "+ discr + " not found in the context, but it should be there"); + } + auxOcDefs.add(auxOcDef); + } + ItemDelta, PrismPropertyDefinition> itemDelta = LensUtil.consolidateTripleToDelta( auxiliaryObjectClassItemPath, ivwoTriple, auxiliaryObjectClassPropertyDef, auxiliaryObjectClassAPrioriDelta, projCtx.getObjectNew(), null, null, addUnchangedValues, completeAccount, false, @@ -324,6 +314,43 @@ public boolean isAuthoritative() { objectDelta.addModification(propDelta); } } + + RefinedObjectClassDefinition structuralObjectClassDefinition = projCtx.getStructuralObjectClassDefinition(); + if (structuralObjectClassDefinition == null) { + LOGGER.error("Structural object class definition for {} not found in the context, but it should be there, dumping context:\n{}", discr, context.debugDump()); + throw new IllegalStateException("Structural object class definition for " + discr + " not found in the context, but it should be there"); + } + + RefinedObjectClassDefinition rOcDef = new CompositeRefinedObjectClassDefinition( + structuralObjectClassDefinition, auxOcDefs); + + if (LOGGER.isTraceEnabled()) { + LOGGER.trace("Object class definition for {} consolidation:\n{}", discr, rOcDef.debugDump()); + } + + // ATTRIBUTES + // Iterate and process each attribute separately. Now that we have squeezed the data we can process each attribute just + // with the data in ItemValueWithOrigin triples. + for (Map.Entry,PrismPropertyDefinition>>> entry : squeezedAttributes.entrySet()) { + QName attributeName = entry.getKey(); + DeltaSetTriple,PrismPropertyDefinition>> triple = entry.getValue(); + PropertyDelta propDelta = consolidateAttribute(rOcDef, discr, existingDelta, projCtx, + addUnchangedValues, completeAccount, attributeName, (DeltaSetTriple)triple); + if (propDelta != null) { + objectDelta.addModification(propDelta); + } + } + + // ASSOCIATIONS + for (Entry,PrismContainerDefinition>>> entry : squeezedAssociations.entrySet()) { + QName associationName = entry.getKey(); + DeltaSetTriple,PrismContainerDefinition>> triple = entry.getValue(); + ContainerDelta containerDelta = consolidateAssociation(rOcDef, discr, existingDelta, projCtx, + addUnchangedValues, completeAccount, associationName, triple); + if (containerDelta != null) { + objectDelta.addModification(containerDelta); + } + } return objectDelta; } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/OutboundProcessor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/OutboundProcessor.java index 4ec65df2c19..9ede514ab14 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/OutboundProcessor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/OutboundProcessor.java @@ -104,7 +104,7 @@ public void processOutbound(LensContext context, LensPr LOGGER.trace("Processing outbound expressions for {} starting", discr); - RefinedObjectClassDefinition rOcDef = projCtx.getCompositeObjectClassDefinition(); + RefinedObjectClassDefinition rOcDef = projCtx.getStructuralObjectClassDefinition(); if (rOcDef == null) { LOGGER.error("Definition for {} not found in the context, but it should be there, dumping context:\n{}", discr, context.debugDump()); throw new IllegalStateException("Definition for " + discr + " not found in the context, but it should be there"); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ProjectionValuesProcessor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ProjectionValuesProcessor.java index a71da90064b..ffa721525de 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ProjectionValuesProcessor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ProjectionValuesProcessor.java @@ -233,6 +233,9 @@ private void processProjections(LensContext context, context.recompute(); if (consistencyChecks) context.checkConsistence(); + // Aux object classes may have changed during consolidation. Make sure we have up-to-date definitions. + context.refreshAuxiliaryObjectClassDefinitions(); + // Check if we need to reset the iteration counter (and token) e.g. because we have rename // we cannot do that before because the mappings are not yet evaluated and the triples and not // consolidated to deltas. We can do it only now. It means that we will waste the first run