diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/CompositeRefinedObjectClassDefinitionImpl.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/CompositeRefinedObjectClassDefinitionImpl.java index ce3679f153b..3aa3a5f8b9a 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/CompositeRefinedObjectClassDefinitionImpl.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/CompositeRefinedObjectClassDefinitionImpl.java @@ -419,7 +419,6 @@ public List getIgnoredNamespaces() { return structuralObjectClassDefinition.getIgnoredNamespaces(); } - @Override public LayerRefinedObjectClassDefinition forLayer(LayerType layerType) { throw new UnsupportedOperationException("TODO implement if needed"); @@ -509,19 +508,19 @@ public Class getTypeClass() { @Override public boolean containsAttributeDefinition(ItemPathType pathType) { - return getDefinitionsStream() + return getRefinedObjectClassDefinitionsStream() .filter(def -> containsAttributeDefinition(pathType)) .findAny() .isPresent(); } - private Stream getDefinitionsStream() { + private Stream getRefinedObjectClassDefinitionsStream() { return Stream.concat(Stream.of(structuralObjectClassDefinition), auxiliaryObjectClassDefinitions.stream()); } @Override public boolean containsAttributeDefinition(QName attributeName) { - return getDefinitionsStream() + return getRefinedObjectClassDefinitionsStream() .filter(def -> containsAttributeDefinition(attributeName)) .findAny() .isPresent(); @@ -533,8 +532,8 @@ public ObjectQuery createShadowSearchQuery(String resourceOid) throws SchemaExce } @Override - public PrismObject createBlankShadow() { - return structuralObjectClassDefinition.createBlankShadow(); + public PrismObject createBlankShadow(RefinedObjectClassDefinition definition) { + return structuralObjectClassDefinition.createBlankShadow(definition); } @Override @@ -544,17 +543,27 @@ public ResourceShadowDiscriminator getShadowDiscriminator() { @Override public Collection getNamesOfAttributesWithOutboundExpressions() { - throw new UnsupportedOperationException("TODO implement if needed"); + Set names = new HashSet<>(); + getRefinedObjectClassDefinitionsStream().forEach( + def -> names.addAll(def.getNamesOfAttributesWithOutboundExpressions()) + ); + return names; } @Override public Collection getNamesOfAttributesWithInboundExpressions() { - throw new UnsupportedOperationException("TODO implement if needed"); + Set names = new HashSet<>(); + getRefinedObjectClassDefinitionsStream().forEach( + def -> names.addAll(def.getNamesOfAttributesWithInboundExpressions()) + ); + return names; } @Override - public ResourcePasswordDefinitionType getPasswordDefinition() { - throw new UnsupportedOperationException("TODO implement if needed"); + public ResourcePasswordDefinitionType getPasswordDefinition() { // TODO what if there is a conflict? + return getRefinedObjectClassDefinitionsStream() + .map(def -> def.getPasswordDefinition()) + .findFirst().orElse(null); } @NotNull diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedObjectClassDefinitionImpl.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedObjectClassDefinitionImpl.java index 7e8c971a45b..7b4073e7b97 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedObjectClassDefinitionImpl.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedObjectClassDefinitionImpl.java @@ -311,8 +311,8 @@ public boolean isEmpty() { } @Override - public PrismObject createBlankShadow() { - return refinedObjectClassDefinition.createBlankShadow(); + public PrismObject createBlankShadow(RefinedObjectClassDefinition definition) { + return refinedObjectClassDefinition.createBlankShadow(definition); } @Override diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinition.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinition.java index 4a0a3a6fa8c..c3eef428b27 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinition.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinition.java @@ -135,7 +135,11 @@ default Collection getEntitlementAssociationDefini //region Generating and matching artifacts ======================================================== PrismObjectDefinition getObjectDefinition(); - PrismObject createBlankShadow(); + default PrismObject createBlankShadow() { + return createBlankShadow(this); + } + + PrismObject createBlankShadow(RefinedObjectClassDefinition definition); ResourceShadowDiscriminator getShadowDiscriminator(); diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinitionImpl.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinitionImpl.java index 7e326de399a..7c80cf7cda2 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinitionImpl.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinitionImpl.java @@ -337,7 +337,7 @@ static PrismObjectDefinition constructObjectDefinition(RefinedObject } @Override - public PrismObject createBlankShadow() { + public PrismObject createBlankShadow(RefinedObjectClassDefinition definition) { PrismObject accountShadow; try { accountShadow = getPrismContext().createObject(ShadowType.class); @@ -354,7 +354,7 @@ public PrismObject createBlankShadow() { // Setup definition PrismObjectDefinition newDefinition = accountShadow.getDefinition().cloneWithReplacedDefinition( - ShadowType.F_ATTRIBUTES, toResourceAttributeContainerDefinition()); + ShadowType.F_ATTRIBUTES, definition.toResourceAttributeContainerDefinition()); accountShadow.setDefinition(newDefinition); return accountShadow; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainer.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainer.java index cadebf4dfb2..97ac19dd904 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainer.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainer.java @@ -342,6 +342,11 @@ public PrismContainerDefinition getDefinition() { public void setDefinition(PrismContainerDefinition definition) { checkMutability(); this.definition = definition; + if (definition != null) { + for (PrismContainerValue value : getValues()) { + value.replaceComplexTypeDefinition(definition.getComplexTypeDefinition()); + } + } } @Override diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java index 18836999169..9ef8ca6c3b9 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java @@ -1433,6 +1433,12 @@ public ComplexTypeDefinition getComplexTypeDefinition() { return complexTypeDefinition; } + // will correctly work only if argument is not null (otherwise the CTD will be determined on next call to getCTD) + void replaceComplexTypeDefinition(ComplexTypeDefinition complexTypeDefinition) { + this.complexTypeDefinition = complexTypeDefinition; + } + + private ComplexTypeDefinition determineComplexTypeDefinition() { PrismContainerable parent = getParent(); ComplexTypeDefinition parentCTD = parent != null && parent.getDefinition() != null ? @@ -1485,4 +1491,22 @@ public Class getRealClass() { public T getRealValue() { return (T) asContainerable(); } + + /** + * Returns a single-valued container (with a single-valued definition) holding just this value. + * @param itemName Item name for newly-created container. + * @return + */ + public PrismContainer asSingleValuedContainer(@NotNull QName itemName) throws SchemaException { + PrismContext prismContext = getPrismContext(); + Validate.notNull(prismContext, "Prism context is null"); + + PrismContainerDefinitionImpl definition = new PrismContainerDefinitionImpl<>(itemName, + getComplexTypeDefinition(), prismContext); + definition.setMaxOccurs(1); + + PrismContainer pc = definition.instantiate(); + pc.add(clone()); + return pc; + } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReferenceValue.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReferenceValue.java index 5d6dff328a7..657a44b05ea 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReferenceValue.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReferenceValue.java @@ -531,6 +531,9 @@ public PrismReferenceValue asReferenceValue() { public void setupReferenceValue(PrismReferenceValue value) { referenceValue = value; } + public String getOid() { // used by some scripts + return referenceValue.getOid(); + } }; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanInspector.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanInspector.java index f63cfa2fa36..935a569e96b 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanInspector.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismBeanInspector.java @@ -208,12 +208,7 @@ public Field get(Class c, Method m) { private Map> _findEnumFieldName = Collections.synchronizedMap(new HashMap()); String findEnumFieldName(Class classType, String primValue) { - return find2(_findEnumFieldName, classType, primValue, new Getter2() { - @Override - public String get(Class c, String v) { - return findEnumFieldNameUncached(c, v); - } - }); + return find2(_findEnumFieldName, classType, primValue, (c, v) -> findEnumFieldNameUncached(c, v)); } private Map> _findEnumFieldValue = Collections.synchronizedMap(new HashMap()); @@ -567,7 +562,7 @@ private List getPropOrderUncached(Class beanClass) { private String findEnumFieldNameUncached(Class classType, T primValue){ for (Field field: classType.getDeclaredFields()) { XmlEnumValue xmlEnumValue = field.getAnnotation(XmlEnumValue.class); - if (xmlEnumValue != null && xmlEnumValue.value() != null && xmlEnumValue.value().equals(primValue)) { + if (xmlEnumValue != null && xmlEnumValue.value().equals(primValue)) { return field.getName(); } } 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 24f9d76ec77..407b61a70eb 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 @@ -755,9 +755,9 @@ public void recompute() throws SchemaException { } if (base == null && accDelta.isModify()) { - RefinedObjectClassDefinition rAccountDef = getCompositeObjectClassDefinition(); - if (rAccountDef != null) { - base = (PrismObject) rAccountDef.createBlankShadow(); + RefinedObjectClassDefinition rOCD = getCompositeObjectClassDefinition(); + if (rOCD != null) { + base = rOCD.createBlankShadow(); } } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensUtil.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensUtil.java index 35c75c150c5..246413a1436 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensUtil.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensUtil.java @@ -32,6 +32,7 @@ import com.evolveum.midpoint.model.common.expression.*; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.polystring.PrismDefaultPolyStringNormalizer; +import com.evolveum.midpoint.schema.SchemaConstantsGenerated; import com.evolveum.midpoint.schema.util.ObjectResolver; import com.evolveum.midpoint.util.DebugUtil; import com.evolveum.midpoint.util.exception.*; @@ -77,6 +78,7 @@ import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; +import org.jetbrains.annotations.NotNull; /** * @author semancik @@ -1212,21 +1214,16 @@ private static void checkObjectPolicy(LensFocusContext } } - public static PrismContainer createAssignmentSingleValueContainerClone(AssignmentType assignmentType) throws SchemaException { - PrismContainerValue assignmentCVal = assignmentType.asPrismContainerValue(); - PrismContainerDefinition def = assignmentCVal.getParent().getDefinition().clone(); + public static PrismContainer createAssignmentSingleValueContainerClone(@NotNull AssignmentType assignmentType) throws SchemaException { // Make it appear to be single-value. Therefore paths without segment IDs will work. - ((PrismContainerDefinitionImpl) def).setMaxOccurs(1); - PrismContainer assignmentCont = def.instantiate(); - assignmentCont.add(assignmentCVal.clone()); - return assignmentCont; + return assignmentType.asPrismContainerValue().asSingleValuedContainer(SchemaConstantsGenerated.C_ASSIGNMENT); } public static AssignmentType getAssignmentType(ItemDeltaItem,PrismContainerDefinition> assignmentIdi, boolean old) { if (old) { - return ((PrismContainer)assignmentIdi.getItemOld()).getValue(0).asContainerable(); + return assignmentIdi.getItemOld().getValue(0).asContainerable(); } else { - return ((PrismContainer)assignmentIdi.getItemNew()).getValue(0).asContainerable(); + return assignmentIdi.getItemNew().getValue(0).asContainerable(); } } diff --git a/model/model-impl/src/test/resources/expr/account-xpath-evaluation.xml b/model/model-impl/src/test/resources/expr/account-xpath-evaluation.xml index a394b00ab2b..fc15a8b9139 100644 --- a/model/model-impl/src/test/resources/expr/account-xpath-evaluation.xml +++ b/model/model-impl/src/test/resources/expr/account-xpath-evaluation.xml @@ -334,6 +334,7 @@ jan prvy uid=janko nemenny,ou=people,dc=example,dc=com prvy + janco James Jr. unchanged James Jr.