Skip to content

Commit

Permalink
Add map->extension convenience methods
Browse files Browse the repository at this point in the history
See basic.setExtensionRealValues(pcv, map) and
ObjectTypeUtil.mapToExtensionItems(...).
  • Loading branch information
mederly committed Sep 4, 2018
1 parent 63da9cd commit 69c3828
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 32 deletions.
Expand Up @@ -44,13 +44,8 @@

import javax.xml.datatype.XMLGregorianCalendar;
import javax.xml.namespace.QName;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.*;

import static java.util.Collections.emptySet;
import static java.util.Collections.singleton;
import static org.apache.commons.collections4.CollectionUtils.emptyIfNull;

/**
Expand Down Expand Up @@ -872,4 +867,40 @@ public static <O extends ObjectType> XMLGregorianCalendar getLastTouchTimestamp(
}
return metadata.getCreateTimestamp();
}

@NotNull
public static List<Item<?, ?>> mapToExtensionItems(Map<QName, Object> values, PrismContainerDefinition<?> extensionDefinition,
PrismContext prismContext) throws SchemaException {
List<Item<?, ?>> extensionItems = new ArrayList<>();
for (Map.Entry<QName, Object> entry : values.entrySet()) {
ItemDefinition<Item<PrismValue, ItemDefinition>> def = extensionDefinition != null
? extensionDefinition.findItemDefinition(entry.getKey())
: null;
if (def == null) {
//noinspection unchecked
def = prismContext.getSchemaRegistry().findItemDefinitionByElementName(entry.getKey()); // a bit of hack here
if (def == null) {
throw new SchemaException("No definition of " + entry.getKey() + " in task extension");
}
}
Item<PrismValue, ItemDefinition> extensionItem = def.instantiate();
if (entry.getValue() != null) {
if (entry.getValue() instanceof Collection) {
for (Object value : (Collection) entry.getValue()) {
addRealValue(extensionItem, value);
}
} else {
addRealValue(extensionItem, entry.getValue());
}
}
extensionItems.add(extensionItem);
}
return extensionItems;
}

private static void addRealValue(Item<PrismValue, ItemDefinition> extensionItem, Object value) throws SchemaException {
if (value != null) {
extensionItem.add(PrismValue.fromRealValue(value).clone());
}
}
}
Expand Up @@ -20,12 +20,7 @@
import java.text.Normalizer;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

Expand All @@ -37,8 +32,10 @@
import javax.naming.ldap.LdapName;
import javax.naming.ldap.Rdn;
import javax.xml.datatype.XMLGregorianCalendar;
import javax.xml.namespace.QName;

import com.evolveum.midpoint.prism.*;
import com.evolveum.midpoint.util.QNameUtil;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import com.evolveum.prism.xml.ns._public.types_3.ItemPathType;
import org.apache.commons.io.FileUtils;
Expand Down Expand Up @@ -551,6 +548,16 @@ public Collection<String> getAttributeStringValues(ShadowType shadow, javax.xml.
return ShadowUtil.getAttributeValues(shadow, attributeQname, String.class);
}

public void setExtensionRealValues(PrismContainerValue<?> containerValue, Map<String, Object> map) throws SchemaException {
PrismContainer<Containerable> ext = containerValue.findOrCreateContainer(ObjectType.F_EXTENSION);
Map<QName, Object> qnameKeyedMap = new HashMap<>();
map.forEach((uri, value) -> qnameKeyedMap.put(QNameUtil.uriToQName(uri, true), value));
List<Item<?, ?>> items = ObjectTypeUtil.mapToExtensionItems(qnameKeyedMap, ext.getDefinition(), prismContext);
for (Item<?, ?> item : items) {
ext.getValue().addReplaceExisting(item);
}
}

public <T> T getIdentifierValue(ShadowType shadow) throws SchemaException {
if (shadow == null) {
return null;
Expand Down
Expand Up @@ -28,6 +28,7 @@
import javax.xml.namespace.QName;

import com.evolveum.midpoint.prism.*;
import com.evolveum.midpoint.repo.common.expression.*;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import org.apache.commons.lang.BooleanUtils;
import org.apache.commons.lang.Validate;
Expand Down Expand Up @@ -104,10 +105,6 @@
import com.evolveum.midpoint.repo.api.RepositoryService;
import com.evolveum.midpoint.repo.cache.RepositoryCache;
import com.evolveum.midpoint.repo.common.CacheRegistry;
import com.evolveum.midpoint.repo.common.expression.ExpressionFactory;
import com.evolveum.midpoint.repo.common.expression.ExpressionVariables;
import com.evolveum.midpoint.repo.common.expression.ItemDeltaItem;
import com.evolveum.midpoint.repo.common.expression.ObjectDeltaObject;
import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.ObjectDeltaOperation;
import com.evolveum.midpoint.schema.ResourceShadowDiscriminator;
Expand Down Expand Up @@ -1722,24 +1719,10 @@ public TaskType submitTaskFromTemplate(String templateTaskOid, List<Item<?, ?>>
public TaskType submitTaskFromTemplate(String templateTaskOid, Map<QName, Object> extensionValues, Task opTask, OperationResult parentResult)
throws CommunicationException, ObjectNotFoundException, SchemaException, SecurityViolationException,
ConfigurationException, ExpressionEvaluationException, ObjectAlreadyExistsException, PolicyViolationException {
List<Item<?, ?>> extensionItems = new ArrayList<>();
PrismContainerDefinition<?> extDef = prismContext.getSchemaRegistry()
.findObjectDefinitionByCompileTimeClass(TaskType.class).findContainerDefinition(TaskType.F_EXTENSION);
for (Map.Entry<QName, Object> entry : extensionValues.entrySet()) {
ItemDefinition<Item<PrismValue, ItemDefinition>> def = extDef.findItemDefinition(entry.getKey());
if (def == null) {
//noinspection unchecked
def = prismContext.getSchemaRegistry().findItemDefinitionByElementName(entry.getKey()); // a bit of hack here
if (def == null) {
throw new SchemaException("No definition of " + entry.getKey() + " in task extension");
}
}
Item<PrismValue, ItemDefinition> extensionItem = def.instantiate();
if (entry.getValue() != null) {
extensionItem.add(PrismValue.fromRealValue(entry.getValue()).clone());
}
extensionItems.add(extensionItem);
}
List<Item<?, ?>> extensionItems = ObjectTypeUtil.mapToExtensionItems(extensionValues, extDef, prismContext);
return submitTaskFromTemplate(templateTaskOid, extensionItems, opTask, parentResult);
}

}

0 comments on commit 69c3828

Please sign in to comment.