diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/Item.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/Item.java index 46c8fcdf224..79be40a3c87 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/Item.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/Item.java @@ -237,6 +237,10 @@ public V getValue(int index) { return values.get(index); } + public abstract X getRealValue(); + + public abstract Collection getRealValues(); + public boolean hasValue(PrismValue value, boolean ignoreMetadata) { return (findValue(value, ignoreMetadata) != null); } 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 151da17ce28..198fbcfbe15 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 @@ -112,6 +112,28 @@ public boolean canRepresent(Class compileTimeClass) { public List> getValues() { return (List>) super.getValues(); } + + @Override + public Collection getRealValues() { + if (getValues() == null) { + return null; + } + List realValues = new ArrayList<>(getValues().size()); + for (PrismContainerValue value : getValues()) { + realValues.add(value.asContainerable()); + } + + return realValues; + + } + + @Override + public C getRealValue() { + if (getValue() == null) { + return null; + } + return getValue().asContainerable(); + } public PrismContainerValue getValue() { if (getValues().size() == 1) { 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 fed6596f738..b4dd94e90eb 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 @@ -1583,16 +1583,4 @@ public static List> toPcvList(L return rv; } - public static List fromPcvList(List> values) { - if (values == null) { - return null; - } - List realValues = new ArrayList<>(values.size()); - for (PrismContainerValue value : values) { - realValues.add(value.asContainerable()); - } - - return realValues; - - } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismProperty.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismProperty.java index 27fdc8207cf..8105fbb3c8d 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismProperty.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismProperty.java @@ -129,6 +129,7 @@ public List> getValues(Class type) { return (List) getValues(); } + @Override public Collection getRealValues() { Collection realValues = new ArrayList(getValues().size()); for (PrismPropertyValue pValue: getValues()) { @@ -140,6 +141,7 @@ public Collection getRealValues() { /** * Type override, also for compatibility. */ + public Collection getRealValues(Class type) { Collection realValues = new ArrayList(getValues().size()); for (PrismPropertyValue pValue: getValues()) { @@ -164,6 +166,7 @@ public PrismPropertyValue getAnyValue() { return values.iterator().next(); } + @Override public T getRealValue() { if (getValue() == null) { return null; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReference.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReference.java index 20846a2688a..1ba348ac0f0 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReference.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReference.java @@ -16,6 +16,8 @@ package com.evolveum.midpoint.prism; +import java.util.ArrayList; +import java.util.Collection; import java.util.List; import javax.xml.namespace.QName; @@ -100,6 +102,26 @@ private PrismReferenceValue getValue(String oid) { } return null; } + + @Override + public Referencable getRealValue() { + if (getValue() == null) { + return null; + } + return getValue().asReferencable(); + } + + @Override + public Collection getRealValues() { + if (getValues() == null) { + return null; + } + List realValues = new ArrayList<>(getValues().size()); + for (PrismReferenceValue refVal : getValues()) { + realValues.add(refVal.asReferencable()); + } + return realValues; + } public boolean add(PrismReferenceValue value) { diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/ExpressionUtil.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/ExpressionUtil.java index 8d617cb848b..52058875570 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/ExpressionUtil.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/ExpressionUtil.java @@ -15,6 +15,7 @@ */ package com.evolveum.midpoint.model.common.expression; +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; @@ -263,6 +264,34 @@ public static Object convertVariableValue(Object originalValue, String variableN return prop.getValues(); } } + if (originalValue instanceof PrismReference) { + PrismReference prop = (PrismReference)originalValue; + PrismReferenceDefinition def = prop.getDefinition(); + if (def != null) { + if (def.isSingleValue()) { + return prop.getRealValue(); + } else { + return prop.getRealValues(); + } + } else { + return prop.getValues(); + } + } + if (originalValue instanceof PrismContainer) { + PrismContainer container = (PrismContainer)originalValue; + PrismContainerDefinition def = container.getDefinition(); + if (def != null) { + if (def.isSingleValue()) { + return container.getRealValue(); + } else { + return container.getRealValues(); + + } + } else { + return container.getValues(); + } + } + return originalValue; } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/CredentialsProcessor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/CredentialsProcessor.java index 7a28b34b80e..ea5e1c83a93 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/CredentialsProcessor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/CredentialsProcessor.java @@ -428,8 +428,7 @@ private List getSortedHistoryList( if (historyEntries.isEmpty()) { return new ArrayList<>(); } - List historyEntryValues = PrismContainerValue - .fromPcvList(historyEntries.getValues()); + List historyEntryValues = (List) historyEntries.getRealValues(); Collections.sort(historyEntryValues, new Comparator() { diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/PasswordPolicyProcessor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/PasswordPolicyProcessor.java index 5abaedac3ee..2a2e0050077 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/PasswordPolicyProcessor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/PasswordPolicyProcessor.java @@ -17,6 +17,7 @@ package com.evolveum.midpoint.model.impl.lens.projector; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import org.apache.commons.lang3.StringUtils; @@ -176,7 +177,7 @@ private List determineOldPasswordValues(PrismObjec return null; } - List historyEntryValues = PrismContainerValue.fromPcvList(historyEntries.getValues()); + Collection historyEntryValues = historyEntries.getRealValues(); oldPasswords = new ArrayList<>(historyEntryValues.size()); for (PasswordHistoryEntryType historyEntryValue : historyEntryValues) { try {