Skip to content

Commit

Permalink
Use ItemDefinitionTransformer in SchemaTransformator
Browse files Browse the repository at this point in the history
Implemented minimal subset of "MutableDefinition" contracts to
satisfy GUI and other tests.
  • Loading branch information
tonydamage committed May 27, 2021
1 parent 4384822 commit 5423dbd
Show file tree
Hide file tree
Showing 10 changed files with 1,134 additions and 135 deletions.
Expand Up @@ -15,11 +15,12 @@
import com.evolveum.midpoint.model.impl.lens.LensElementContext;
import com.evolveum.midpoint.model.impl.lens.LensFocusContext;
import com.evolveum.midpoint.model.impl.lens.LensProjectionContext;
import com.evolveum.midpoint.model.impl.schema.transform.TransformableContainerDefinition;
import com.evolveum.midpoint.model.impl.schema.transform.DefinitionsToTransformable;
import com.evolveum.midpoint.model.impl.schema.transform.TransformableItemDefinition;
import com.evolveum.midpoint.model.impl.schema.transform.TransformableObjectDefinition;
import com.evolveum.midpoint.prism.*;
import com.evolveum.midpoint.prism.PrismItemAccessDefinition.Mutable;
import com.evolveum.midpoint.prism.ItemDefinitionTransformer.TransformableItem;
import com.evolveum.midpoint.prism.ItemDefinitionTransformer.TransformableValue;
import com.evolveum.midpoint.prism.delta.ContainerDelta;
import com.evolveum.midpoint.prism.delta.ItemDelta;
import com.evolveum.midpoint.prism.delta.ObjectDelta;
Expand Down Expand Up @@ -47,6 +48,8 @@
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import com.evolveum.prism.xml.ns._public.types_3.ItemPathType;
import com.google.common.base.Preconditions;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.Validate;
Expand Down Expand Up @@ -199,7 +202,8 @@ <O extends ObjectType> void applySchemasAndSecurity(PrismObject<O> object, GetOp

ObjectSecurityConstraints securityConstraints = compileSecurityConstraints(object, task, result);

PrismObjectDefinition<O> objectDefinition = TransformableObjectDefinition.of(object);
transform(object, new DefinitionsToTransformable());
PrismObjectDefinition<O> objectDefinition = object.getDefinition();

if (phase == null) {
if (!GetOperationOptions.isExecutionPhase(rootOptions)) {
Expand Down Expand Up @@ -247,6 +251,11 @@ <O extends ObjectType> void applySchemasAndSecurity(PrismObject<O> object, GetOp
LOGGER.trace("applySchemasAndSecurity finishing"); // to allow folding in log viewer
}

private void transform(Item<?,?> object, ItemDefinitionTransformer transformation) {
Preconditions.checkArgument(object instanceof TransformableItem, "Value must be %s", TransformableValue.class.getSimpleName());
((TransformableItem) object).transformDefinition(null, transformation);
}

<O extends ObjectType> void applySchemasAndSecurity(LensContext<O> context,
AuthorizationPhaseType phase, Task task, OperationResult parentResult) throws SecurityViolationException, SchemaException, ConfigurationException, ObjectNotFoundException, ExpressionEvaluationException, CommunicationException {
LOGGER.trace("applySchemasAndSecurity({}) starting", context);
Expand Down Expand Up @@ -393,13 +402,10 @@ private void applySecurityConstraints(PrismContainerValue<?> pcv, ObjectSecurity
if (pcv.hasNoItems()) {
return;
}
// FIX PCV type for subtypes
TransformableContainerDefinition.ensureMutableType(pcv);
List<Item> itemsToRemove = new ArrayList<>();
for (Item<?, ?> item : pcv.getItems()) {
ItemPath itemPath = item.getPath();
@SuppressWarnings({ "unchecked", "rawtypes" })
ItemDefinition<?> itemDef = ensureMutableDefinition((Item) item);
ItemDefinition<?> itemDef = item.getDefinition();
if (itemDef != null && itemDef.isElaborate()) {
LOGGER.trace("applySecurityConstraints(item): {}: skip (elaborate)", itemPath);
continue;
Expand All @@ -411,6 +417,7 @@ private void applySecurityConstraints(PrismContainerValue<?> pcv, ObjectSecurity
LOGGER.trace("applySecurityConstraints(item): {}: decisions R={}, A={}, M={}",
itemPath, itemReadDecision, itemAddDecision, itemModifyDecision);
if (applyToDefinitions && itemDef != null) {
itemDef = ensureMutableDefinition((Item) item);
if (itemReadDecision != AuthorizationDecisionType.ALLOW) {
mutable(itemDef).setCanRead(false);
}
Expand Down Expand Up @@ -457,6 +464,10 @@ private <D extends ItemDefinition<?>> D ensureMutableDefinition(Item<?, D> item)
if (TransformableItemDefinition.isMutableAccess(original)) {
return original;
}
if (true) {
throw new IllegalStateException("Transformer did not applied transformable properly");
}

D replace = TransformableItemDefinition.publicFrom(original);
try {
item.applyDefinition(replace, true);
Expand All @@ -466,8 +477,8 @@ private <D extends ItemDefinition<?>> D ensureMutableDefinition(Item<?, D> item)
return replace;
}

private Mutable mutable(ItemDefinition<?> itemDef) {
return TransformableItemDefinition.access(itemDef);
private MutableItemDefinition<?> mutable(ItemDefinition<?> itemDef) {
return itemDef.toMutable();
}

private <O extends ObjectType> void applySecurityConstraints(ObjectDelta<O> objectDelta, ObjectSecurityConstraints securityConstraints, AuthorizationPhaseType phase,
Expand Down Expand Up @@ -849,6 +860,10 @@ private UserInterfaceElementVisibilityType reduceItems(PrismContainerDefinition<
return containerVisibility;
}

if (containerDefinition.getItemName().getLocalPart().equals("extension")) {
containerDefinition.getItemName();
}

Collection<ItemName> itemsToDelete;
if (containerVisibility == HIDDEN) {
// Delete everything
Expand Down
@@ -0,0 +1,48 @@
package com.evolveum.midpoint.model.impl.schema.transform;

import com.evolveum.midpoint.prism.ComplexTypeDefinition;
import com.evolveum.midpoint.prism.ItemDefinition;
import com.evolveum.midpoint.prism.ItemDefinitionTransformer;
import com.evolveum.midpoint.prism.TypeDefinition;
import com.evolveum.midpoint.schema.processor.ResourceAttributeContainerDefinition;
import com.evolveum.midpoint.schema.processor.ResourceAttributeDefinition;

public class DefinitionsToTransformable implements ItemDefinitionTransformer {

@Override
public <T extends TypeDefinition> T applyValue(ComplexTypeDefinition parentDef, ItemDefinition<?> itemDef,
T valueDef) {
if (valueDef instanceof ComplexTypeDefinition) {
if (itemDef instanceof TransformableContainerDefinition) {
TransformableComplexTypeDefinition maybe = ((TransformableContainerDefinition) itemDef).getComplexTypeDefinition();
if (valueDef.getTypeName().equals(maybe.getTypeName())) {
return (T) maybe;
}
}
return (T) TransformableComplexTypeDefinition.from((ComplexTypeDefinition) valueDef);
}
return valueDef;
}


@Override
public <I extends ItemDefinition<?>> I transformItem(ComplexTypeDefinition parentDef, I currentDef) {
if (currentDef == null || currentDef instanceof TransformableItemDefinition) {
return currentDef;
}
// Parent is transformable
if (parentDef instanceof TransformableComplexTypeDefinition) {
if (currentDef instanceof ResourceAttributeDefinition) {
return (I) TransformablePropertyDefinition.of((ResourceAttributeDefinition) currentDef);
}
if (currentDef instanceof ResourceAttributeContainerDefinition) {
return (I) TransformableContainerDefinition.of((ResourceAttributeContainerDefinition) currentDef);
}
ItemDefinition<?> defFromParent = parentDef.findLocalItemDefinition(currentDef.getItemName());
if (defFromParent != null) {
return (I) defFromParent;
}
}
return TransformableItemDefinition.publicFrom(currentDef);
}
}

0 comments on commit 5423dbd

Please sign in to comment.