Skip to content

Commit

Permalink
Fix showing names in 'add' approvals (MID-4512)
Browse files Browse the repository at this point in the history
When approving object creation, the object has an OID but does not
exist in repository. This caused problems in task details and task
lists pages.

Repository change: now we are storing targetName for references
in the XML form of stored objects (if set by caller).
  • Loading branch information
mederly committed Apr 6, 2018
1 parent 360187c commit 7d7a974
Show file tree
Hide file tree
Showing 8 changed files with 43 additions and 44 deletions.
Expand Up @@ -311,7 +311,15 @@ private void fillInObjectRefAttributes(TaskType taskType, TaskDtoProviderOptions
}

public String getTaskObjectName(TaskType taskType, PageBase pageBase, Task opTask, OperationResult thisOpResult) {
return WebModelServiceUtils.resolveReferenceName(taskType.getObjectRef(), pageBase, opTask, thisOpResult);
OperationResult currentResult;
if (taskType.getWorkflowContext() != null) {
// For workflow-related tasks the task object might not be created yet (MID-4512). The simplest way
// of avoiding displaying the error is to use a separate operation result.
currentResult = new OperationResult(TaskDto.class.getName() + ".getTaskObjectName");
} else {
currentResult = thisOpResult;
}
return WebModelServiceUtils.resolveReferenceName(taskType.getObjectRef(), pageBase, opTask, currentResult);
}

private void fillInParentTaskAttributes(TaskType taskType,
Expand Down
Expand Up @@ -54,7 +54,7 @@ public void setSerializeCompositeObjects(boolean serializeCompositeObjects) {
this.serializeCompositeObjects = serializeCompositeObjects;
}

public static SerializationOptions createSerializeCompositeObjects(){
public static SerializationOptions createSerializeCompositeObjects() {
SerializationOptions serializationOptions = new SerializationOptions();
serializationOptions.setSerializeCompositeObjects(true);
return serializationOptions;
Expand Down
Expand Up @@ -112,7 +112,7 @@ public TaskRunResult run(Task task) {
ObjectReferenceType objectReferenceType = new ObjectReferenceType();
objectReferenceType.setType(type);
objectReferenceType.setOid(oid);

// TODO set also targetName [but it seems that this task handler is not used anymore]
if (task.getObjectRef() == null) {
task.setObjectRef(objectReferenceType);
} else {
Expand All @@ -123,23 +123,17 @@ public TaskRunResult run(Task task) {
try {
dependents = wfTask.listDependents(result);
dependents.add(wfTask.getParentJob(result));
} catch (SchemaException e) {
return reportException("Couldn't get dependents from job " + wfTask, task, result, e);
} catch (ObjectNotFoundException e) {
} catch (SchemaException | ObjectNotFoundException e) {
return reportException("Couldn't get dependents from job " + wfTask, task, result, e);
}

for (WfTask dependent : dependents) {
if (dependent.getTask().getObjectRef() == null) {
try {
dependent.getTask().setObjectRefImmediate(objectReferenceType, result);
} catch (ObjectNotFoundException e) {
} catch (ObjectNotFoundException | SchemaException | ObjectAlreadyExistsException e) {
// note we DO NOT return, because we want to set all references we can
reportException("Couldn't set object reference on job " + dependent, task, result, e);
} catch (SchemaException e) {
reportException("Couldn't set object reference on job " + dependent, task, result, e);
} catch (ObjectAlreadyExistsException e) {
reportException("Couldn't set object reference on job " + dependent, task, result, e);
}
} else {
LOGGER.warn("object reference in job " + dependent + " is already set, although it shouldn't be");
Expand Down
Expand Up @@ -372,7 +372,8 @@ public Task createTask(WfTaskController taskController, Task parentTask, WfConfi
task.setCategory(TaskCategory.WORKFLOW);

if (taskObject != null) {
task.setObjectRef(taskObject.getOid(), taskObject.getDefinition().getTypeName());
//noinspection unchecked
task.setObjectRef(ObjectTypeUtil.createObjectRef(taskObject));
} else if (parentTask != null && parentTask.getObjectRef() != null) {
task.setObjectRef(parentTask.getObjectRef().clone());
}
Expand Down
Expand Up @@ -22,6 +22,7 @@
import com.evolveum.midpoint.prism.delta.ObjectDelta;
import com.evolveum.midpoint.prism.delta.ReferenceDelta;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.prism.polystring.PolyString;
import com.evolveum.midpoint.prism.util.PrismTestUtil;
import com.evolveum.midpoint.repo.api.RepoAddOptions;
import com.evolveum.midpoint.repo.sql.type.XMLGregorianCalendarType;
Expand Down Expand Up @@ -126,10 +127,22 @@ public void addGetDSEESyncDoubleTest() throws Exception {
public void simpleAddGetTest() throws Exception {
LOGGER.info("===[ simpleAddGetTest ]===");
final File OBJECTS_FILE = new File(FOLDER_BASIC, "objects.xml");
addGetCompare(OBJECTS_FILE);
List<PrismObject<?>> objects = addGetCompare(OBJECTS_FILE);

boolean foundAtestuserX00003 = false;
for (PrismObject<?> object : objects) {
// adhoc check whether reference.targetName is preserved
if ("atestuserX00003".equals(PolyString.getOrig(object.getName()))) {
String personaName = PolyString.getOrig(((UserType) object.asObjectable()).getPersonaRef().get(0).getTargetName());
assertEquals("Wrong personaRef.targetName on atestuserX00003", "u-000", personaName);
foundAtestuserX00003 = true;
break;
}
}
assertTrue("User atestuserX00003 was not found", foundAtestuserX00003);
}

private void addGetCompare(File file) throws Exception {
private List<PrismObject<?>> addGetCompare(File file) throws Exception {
List<PrismObject<? extends Objectable>> elements = prismContext.parserFor(file).parseObjects();
List<String> oids = new ArrayList<>();

Expand All @@ -141,9 +154,9 @@ private void addGetCompare(File file) throws Exception {
object.getCompileTimeClass().getSimpleName()});
oids.add(repositoryService.addObject(object, null, result));
}
LOGGER.info("Time to add objects ({}): {}", new Object[]{elements.size(),
(System.currentTimeMillis() - time),});
LOGGER.info("Time to add objects ({}): {}", elements.size(), System.currentTimeMillis() - time);

List<PrismObject<?>> objectsRead = new ArrayList<>();
int count = 0;
elements = prismContext.parserFor(file).parseObjects();
for (int i = 0; i < elements.size(); i++) {
Expand Down Expand Up @@ -171,10 +184,8 @@ private void addGetCompare(File file) throws Exception {
System.out.println("OLD: " + object.findProperty(ObjectType.F_NAME).getValue());
System.out.println("NEW: " + newObject.findProperty(ObjectType.F_NAME).getValue());

objectsRead.add(newObject);
ObjectDelta delta = object.diff(newObject);
if (delta == null) {
continue;
}

count += delta.getModifications().size();
if (delta.getModifications().size() > 0) {
Expand All @@ -186,8 +197,8 @@ private void addGetCompare(File file) throws Exception {
continue;
}
}
LOGGER.error(">>> {} Found {} changes for {}\n{}", new Object[]{(i + 1),
delta.getModifications().size(), newObject.toString(), delta.debugDump(3)});
LOGGER.error(">>> {} Found {} changes for {}\n{}", (i + 1),
delta.getModifications().size(), newObject.toString(), delta.debugDump(3));
ItemDelta id = (ItemDelta) delta.getModifications().iterator().next();
if (id.isReplace()) {
LOGGER.debug("{}", id.getValuesToReplace().iterator().next());
Expand All @@ -199,8 +210,8 @@ private void addGetCompare(File file) throws Exception {
throw new RuntimeException("Exception during processing of "+object+": "+ex.getMessage(), ex);
}
}

AssertJUnit.assertEquals("Found changes during add/get test " + count, 0, count);
return objectsRead;
}

private Integer size(PrismContainerValue value) {
Expand Down
Expand Up @@ -164,7 +164,7 @@
<roleMembershipRef oid="r123" type="c:RoleType"/>
<roleMembershipRef oid="r456" type="c:RoleType"/>
<delegatedRef oid="r789" type="c:RoleType"/>
<personaRef oid="u000" type="c:UserType"/>
<personaRef oid="u000" type="c:UserType"><targetName>u-000</targetName></personaRef>

<fullName>
<t:orig>Test UserX00003</t:orig>
Expand Down
Expand Up @@ -16,10 +16,7 @@

package com.evolveum.midpoint.repo.sql.helpers;

import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.PrismObjectDefinition;
import com.evolveum.midpoint.prism.PrismReference;
import com.evolveum.midpoint.prism.*;
import com.evolveum.midpoint.prism.delta.ItemDelta;
import com.evolveum.midpoint.prism.delta.ObjectDelta;
import com.evolveum.midpoint.prism.delta.ReferenceDelta;
Expand Down Expand Up @@ -263,7 +260,8 @@ public <T extends ObjectType> void updateFullObject(RObject object, PrismObject<
// Its' because we're removing some properties during save operation and if save fails,
// overwrite attempt (for example using object importer) might try to delete existing object
// and then try to save this object one more time.
String xml = prismContext.serializeObjectToString(savedObject, PrismContext.LANG_XML);
SerializationOptions options = SerializationOptions.createSerializeReferenceNames();
String xml = prismContext.xmlSerializer().options(options).serialize(savedObject);
savedObject = prismContext.parseObject(xml);

if (FocusType.class.isAssignableFrom(savedObject.getCompileTimeClass())) {
Expand All @@ -274,7 +272,7 @@ public <T extends ObjectType> void updateFullObject(RObject object, PrismObject<
savedObject.removeContainer(AccessCertificationCampaignType.F_CASE);
}

xml = prismContext.serializeObjectToString(savedObject, PrismContext.LANG_XML);
xml = prismContext.xmlSerializer().options(options).serialize(savedObject);
byte[] fullObject = RUtil.getByteArrayFromXml(xml, getConfiguration().isUseZip());

LOGGER.trace("Storing full object\n{}", xml);
Expand Down
Expand Up @@ -1547,26 +1547,13 @@ public void setObjectRefImmediate(ObjectReferenceType value, OperationResult par
}

public void setObjectRefTransient(ObjectReferenceType objectRefType) {
PrismReference objectRef;
try {
objectRef = taskPrism.findOrCreateReference(TaskType.F_OBJECT_REF);
} catch (SchemaException e) {
// This should not happen
throw new IllegalStateException("Internal schema error: " + e.getMessage(), e);
}
objectRef.getValue().setOid(objectRefType.getOid());
objectRef.getValue().setTargetType(objectRefType.getType());
taskPrism.asObjectable().setObjectRef(objectRefType != null ? objectRefType.clone() : null);
}

private ReferenceDelta setObjectRefAndPrepareDelta(ObjectReferenceType value) {
setObjectRefTransient(value);

PrismReferenceValue prismReferenceValue = new PrismReferenceValue();
prismReferenceValue.setOid(value.getOid());
prismReferenceValue.setTargetType(value.getType());

return isPersistent() ? ReferenceDelta.createModificationReplace(TaskType.F_OBJECT_REF,
taskManager.getTaskObjectDefinition(), prismReferenceValue) : null;
taskManager.getTaskObjectDefinition(), value.clone().asReferenceValue()) : null;
}

@Override
Expand Down

0 comments on commit 7d7a974

Please sign in to comment.