Skip to content

Commit

Permalink
ExpressionUtil: better exception message in getFilterExpression, cleanup
Browse files Browse the repository at this point in the history
  • Loading branch information
virgo47 committed Jul 6, 2022
1 parent e798315 commit cb7be0e
Showing 1 changed file with 31 additions and 42 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,13 @@
*/
package com.evolveum.midpoint.repo.common.expression;

import static com.evolveum.midpoint.schema.util.ObjectTypeUtil.asPrismObject;

import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import javax.xml.namespace.QName;

import com.evolveum.midpoint.prism.schema.SchemaRegistry;

import groovy.lang.GString;
import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull;
Expand All @@ -29,6 +29,7 @@
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.prism.polystring.PolyString;
import com.evolveum.midpoint.prism.query.*;
import com.evolveum.midpoint.prism.schema.SchemaRegistry;
import com.evolveum.midpoint.prism.util.ItemDeltaItem;
import com.evolveum.midpoint.prism.util.JavaTypeConverter;
import com.evolveum.midpoint.prism.util.ObjectDeltaObject;
Expand Down Expand Up @@ -61,19 +62,13 @@
import com.evolveum.prism.xml.ns._public.types_3.ItemPathType;
import com.evolveum.prism.xml.ns._public.types_3.ProtectedStringType;

import static com.evolveum.midpoint.schema.util.ObjectTypeUtil.asPrismObject;

/**
* @author semancik
*/
public class ExpressionUtil {

private static final Trace LOGGER = TraceManager.getTrace(ExpressionUtil.class);

/**
* Slightly more powerful version of "convert" as compared to
* JavaTypeConverter. This version can also encrypt/decrypt and also handles
* polystrings.
* JavaTypeConverter. This version can also encrypt/decrypt and also handles poly-strings.
*/
public static <I, O> O convertValue(Class<O> finalExpectedJavaType, Function<Object, Object> additionalConvertor, I inputVal,
Protector protector,
Expand Down Expand Up @@ -161,10 +156,13 @@ public static TypedValue<?> resolvePathGetTypedValue(ItemPath path, VariablesMap
.resolve(result);
}

@SuppressWarnings("unchecked")
public static <V extends PrismValue> Collection<V> computeTargetValues(
VariableBindingDefinitionType target,
TypedValue defaultTargetContext, VariablesMap variables, ObjectResolver objectResolver, String contextDesc,
PrismContext prismContext, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException, ExpressionEvaluationException {
VariableBindingDefinitionType target, TypedValue<?> defaultTargetContext,
VariablesMap variables, ObjectResolver objectResolver, String contextDesc,
PrismContext prismContext, Task task, OperationResult result)
throws SchemaException, ObjectNotFoundException, CommunicationException,
ConfigurationException, SecurityViolationException, ExpressionEvaluationException {
if (target == null) {
// Is this correct? What about default targets?
return null;
Expand All @@ -181,7 +179,7 @@ public static <V extends PrismValue> Collection<V> computeTargetValues(
if (object == null) {
return new ArrayList<>();
} else if (object instanceof Item) {
return ((Item) object).getValues();
return ((Item<V, ?>) object).getValues();
} else if (object instanceof PrismValue) {
return (List<V>) Collections.singletonList((PrismValue) object);
} else if (object instanceof ItemDeltaItem) {
Expand Down Expand Up @@ -252,8 +250,7 @@ private static TypedValue<?> convertItemToRealValues(TypedValue<?> typedValue, P
if (value instanceof PrismObject<?>) {
typedValue.setValue(((PrismObject<?>) value).asObjectable());
return typedValue;
} else if (value instanceof PrismProperty<?>) {
PrismProperty<?> prop = (PrismProperty<?>) value;
} else if (value instanceof PrismProperty<?> prop) {
PrismPropertyDefinition<?> def = prop.getDefinition();
if (def != null) {
if (def.isSingleValue()) {
Expand All @@ -267,8 +264,7 @@ private static TypedValue<?> convertItemToRealValues(TypedValue<?> typedValue, P
prop.getElementName(), PrimitiveType.STRING.getQname());
return new TypedValue<>(prop.getRealValues(), fakeDef);
}
} else if (value instanceof PrismReference) {
PrismReference ref = (PrismReference) value;
} else if (value instanceof PrismReference ref) {
PrismReferenceDefinition def = ref.getDefinition();
if (def != null) {
if (def.isSingleValue()) {
Expand All @@ -280,8 +276,7 @@ private static TypedValue<?> convertItemToRealValues(TypedValue<?> typedValue, P
PrismReferenceDefinition fakeDef = prismContext.definitionFactory().createReferenceDefinition(ref.getElementName(), ObjectType.COMPLEX_TYPE);
return new TypedValue<>(ref.getRealValues(), fakeDef);
}
} else if (value instanceof PrismContainer<?>) {
PrismContainer<?> container = (PrismContainer<?>) value;
} else if (value instanceof PrismContainer<?> container) {
PrismContainerDefinition<?> def = container.getDefinition();
Class<?> containerCompileTimeClass = container.getCompileTimeClass();
if (containerCompileTimeClass == null) {
Expand Down Expand Up @@ -320,8 +315,8 @@ private static TypedValue<?> convertPrismValuesToRealValue(TypedValue<?> typedVa
if (!(collection instanceof Collection)) {
return typedValue;
}
List realValues = new ArrayList();
((Collection) collection).forEach(value -> realValues.add(convertPrismValueToRealValue(value)));
List<Object> realValues = new ArrayList<>();
((Collection<?>) collection).forEach(value -> realValues.add(convertPrismValueToRealValue(value)));
typedValue.setValue(realValues);
return typedValue;
}
Expand All @@ -332,8 +327,7 @@ private static TypedValue<?> convertPrismValueToRealValue(TypedValue<?> typedVal
}

private static Object convertPrismValueToRealValue(Object value) {
if (value instanceof PrismContainerValue<?>) {
PrismContainerValue<?> cval = ((PrismContainerValue<?>) value);
if (value instanceof PrismContainerValue<?> cval) {
Class<?> containerCompileTimeClass = cval.getCompileTimeClass();
if (containerCompileTimeClass == null) {
// Dynamic schema. We do not have anything to convert to. Leave it as PrismContainerValue
Expand Down Expand Up @@ -386,7 +380,7 @@ private static TypedValue<?> resolveReference(TypedValue referenceTypedValue, St
if (objectVariableMode == ObjectVariableModeType.PRISM_REFERENCE) {
if (resolvedTypedValue != null && resolvedTypedValue.getValue() instanceof PrismObject) {
PrismReferenceValue value = reference.asReferenceValue();
value.setObject((PrismObject) resolvedTypedValue.getValue());
value.setObject((PrismObject<?>) resolvedTypedValue.getValue());
return new TypedValue<>(value, value.getDefinition());
} else {
return referenceTypedValue;
Expand Down Expand Up @@ -551,8 +545,7 @@ public static boolean hasExpressions(@Nullable ObjectFilter filter) {
}
Holder<Boolean> result = new Holder<>(false);
filter.accept(f -> {
if (f instanceof ValueFilter) {
ValueFilter<?, ?> vf = (ValueFilter<?, ?>) f;
if (f instanceof ValueFilter<?, ?> vf) {
if (vf.getExpression() != null) {
result.setValue(true);
}
Expand Down Expand Up @@ -581,7 +574,7 @@ private static ObjectFilter evaluateFilterExpressionsInternal(ObjectFilter filte
return FilterCreationUtil.createNone(prismContext);
}

ExpressionType valueExpression = getExpression(expressionWrapper, shortDesc);
ExpressionType valueExpression = getFilterExpression(expressionWrapper, shortDesc);

try {
Collection<String> expressionResult = evaluateStringExpression(variables, prismContext,
Expand Down Expand Up @@ -610,7 +603,7 @@ private static ObjectFilter evaluateFilterExpressionsInternal(ObjectFilter filte
if (expressionMissing(expressionWrapper, filter, shortDesc)) {
return filter.clone();
}
ExpressionType valueExpression = getExpression(expressionWrapper, shortDesc);
ExpressionType valueExpression = getFilterExpression(expressionWrapper, shortDesc);

try {
Collection<String> expressionResult = evaluateStringExpression(variables, prismContext,
Expand Down Expand Up @@ -644,9 +637,7 @@ private static ObjectFilter evaluateFilterExpressionsInternal(ObjectFilter filte
}
return evaluatedFilter;

} else if (filter instanceof ValueFilter) {
ValueFilter valueFilter = (ValueFilter) filter;

} else if (filter instanceof ValueFilter valueFilter) {
if (valueFilter.getValues() != null && !valueFilter.getValues().isEmpty()) {
// We have value. Nothing to evaluate.
return valueFilter.clone();
Expand All @@ -656,7 +647,7 @@ private static ObjectFilter evaluateFilterExpressionsInternal(ObjectFilter filte
if (expressionMissing(expressionWrapper, filter, shortDesc)) {
return valueFilter.clone();
}
ExpressionType valueExpression = getExpression(expressionWrapper, shortDesc);
ExpressionType valueExpression = getFilterExpression(expressionWrapper, shortDesc);

try {
ItemDefinition outputDefinition = ((ValueFilter) filter).getDefinition();
Expand Down Expand Up @@ -727,14 +718,12 @@ private static ObjectFilter evaluateFilterExpressionsInternal(ObjectFilter filte
expressionProfile, expressionFactory, prismContext, shortDesc, task, result);
evaluatedFilter.setFilter(evaluatedSubFilter);
return evaluatedFilter;
} else if (filter instanceof ReferencedByFilter) {
var orig = (ReferencedByFilter) filter;
} else if (filter instanceof ReferencedByFilter orig) {
var subfilter = evaluateFilterExpressionsInternal(orig.getFilter(), variables,
expressionProfile, expressionFactory, prismContext, shortDesc, task, result);
return ReferencedByFilterImpl.create(orig.getType().getTypeName(),
orig.getPath(), subfilter, orig.getRelation());
} else if (filter instanceof OwnedByFilter) {
var orig = (OwnedByFilter) filter;
} else if (filter instanceof OwnedByFilter orig) {
var subfilter = evaluateFilterExpressionsInternal(orig.getFilter(), variables,
expressionProfile, expressionFactory, prismContext, shortDesc, task, result);
return OwnedByFilterImpl.create(orig.getType(), orig.getPath(), subfilter);
Expand All @@ -755,10 +744,10 @@ private static boolean expressionMissing(ExpressionWrapper expressionWrapper, Ob
return false;
}

private static ExpressionType getExpression(ExpressionWrapper expressionWrapper, String shortDesc) throws SchemaException {
private static ExpressionType getFilterExpression(ExpressionWrapper expressionWrapper, String shortDesc) throws SchemaException {
if (!(expressionWrapper.getExpression() instanceof ExpressionType)) {
throw new SchemaException("Unexpected expression type "
+ expressionWrapper.getExpression().getClass() + " in element " + expressionWrapper.getElementName() + " filter in " + shortDesc);
throw new SchemaException("Unexpected filter expression type "
+ expressionWrapper.getExpression().getClass() + " in element '" + expressionWrapper.getElementName() + "' in " + shortDesc);
}
return (ExpressionType) expressionWrapper.getExpression();
}
Expand Down Expand Up @@ -892,7 +881,7 @@ public static Collection<String> evaluateStringExpression(VariablesMap variables
return null;
}

return PrismValueCollectionsUtil.getRealValuesOfCollection((Collection) nonNegativeValues);
return PrismValueCollectionsUtil.getRealValuesOfCollection(nonNegativeValues);
// return nonNegativeValues.iterator().next();
}

Expand Down Expand Up @@ -1144,7 +1133,7 @@ public static <T, V extends PrismValue> V convertToPrismValue(T value, ItemDefin

} else if (value instanceof PrismContainerValue<?>) {
try {
prismContext.adopt((PrismContainerValue) value);
prismContext.adopt((PrismContainerValue<Containerable>) value);
((PrismContainerValue) value).applyDefinition(definition);
} catch (SchemaException e) {
throw new ExpressionEvaluationException(e.getMessage() + " " + contextDescription, e);
Expand Down Expand Up @@ -1326,7 +1315,7 @@ public static VariablesMap getDefaultVariablesMap(
return variables;
}

public static <O extends ObjectType> void addDefaultVariablesMap(
public static void addDefaultVariablesMap(
VariablesMap variables,
PrismObject<? extends ObjectType> focus,
PrismObject<? extends ShadowType> shadow,
Expand Down

0 comments on commit cb7be0e

Please sign in to comment.