Skip to content

Commit

Permalink
Merge branch 'master' of https://github.com/Evolveum/midpoint
Browse files Browse the repository at this point in the history
  • Loading branch information
KaterynaHonchar committed Dec 13, 2016
2 parents 649b858 + 999f6e4 commit 7bfa0e1
Show file tree
Hide file tree
Showing 11 changed files with 208 additions and 95 deletions.
Expand Up @@ -133,6 +133,7 @@ private PrismObject<ResourceType> loadResource() {
OperationResult result = new OperationResult(OPERATION_LOAD_RESOURCE);
Collection<SelectorOptions<GetOperationOptions>> resolveConnectorOption = SelectorOptions
.createCollection(ResourceType.F_CONNECTOR, GetOperationOptions.createResolve());
resolveConnectorOption.add(SelectorOptions.create(GetOperationOptions.createNoFetch()));
PrismObject<ResourceType> resource = WebModelServiceUtils.loadObject(ResourceType.class, resourceOid,
resolveConnectorOption, this, task, result);

Expand Down
Expand Up @@ -1050,16 +1050,17 @@ void diffItems(PrismContainerValue<C> thisValue, PrismContainerValue<C> other,

if (thisValue.getItems() != null) {
for (Item<?,?> thisItem: thisValue.getItems()) {
Item otherItem = other.findItem(thisItem.getElementName());
if (!isLiteral) {
ItemDefinition itemDef = thisItem.getDefinition();
if (itemDef == null && other.getDefinition() != null) {
itemDef = other.getDefinition().findItemDefinition(thisItem.getElementName());
}
if (isOperationalOnly(thisItem, itemDef)) {
if (isOperationalOnly(thisItem, itemDef)
&& (otherItem == null || isOperationalOnly(otherItem, itemDef))) {
continue;
}
}
Item otherItem = other.findItem(thisItem.getElementName());
// The "delete" delta will also result from the following diff
thisItem.diffInternal(otherItem, deltas, ignoreMetadata, isLiteral);
}
Expand Down Expand Up @@ -1109,7 +1110,7 @@ private boolean isOperationalOnly(Item item, ItemDefinition itemDef) {
if (subitems != null) {
for (Item<?, ?> subitem: subitems) {
ItemDefinition subItemDef = subitem.getDefinition();
if (subItemDef == null) {
if (subItemDef == null && itemDef != null) {
subItemDef = ((PrismContainerDefinition)itemDef).findItemDefinition(subitem.getElementName());
}
if (subItemDef == null) {
Expand Down
Expand Up @@ -47,6 +47,7 @@
import org.xml.sax.SAXException;

import java.io.IOException;
import java.util.Date;

import javax.xml.namespace.QName;

Expand Down Expand Up @@ -172,6 +173,30 @@ public void testAssignmentEquals() throws Exception {
assertTrue(a1e.equals(a1m));
}

@Test
public void testAssignmentEquivalent() throws Exception {
System.out.println("\n\n===[ testAssignmentEquivalent ]===\n");
PrismContext prismContext = PrismTestUtil.getPrismContext();

AssignmentType a1 = new AssignmentType(prismContext);
ActivationType a1a = new ActivationType(prismContext);
a1a.setValidFrom(XmlTypeConverter.createXMLGregorianCalendar(new Date()));
a1a.setEffectiveStatus(ActivationStatusType.ENABLED);
a1.setActivation(a1a);

AssignmentType a2 = new AssignmentType(prismContext);
ActivationType a2a = new ActivationType(prismContext);
a2a.setEffectiveStatus(ActivationStatusType.ENABLED);
a2.setActivation(a2a);

// WHEN
assertFalse(a1.equals(a2));
assertFalse(a1.asPrismContainerValue().equivalent(a2.asPrismContainerValue())); // a bit redundant

assertFalse(a2.equals(a1));
assertFalse(a2.asPrismContainerValue().equivalent(a1.asPrismContainerValue())); // a bit redundant
}

@Test
public void testContextlessAssignmentEquals() throws Exception {
System.out.println("\n\n===[ testContextlessAssignmentEquals ]===\n");
Expand Down
Expand Up @@ -16,14 +16,13 @@

package com.evolveum.midpoint.model.common.expression.script.xpath;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.xml.namespace.QName;
import javax.xml.xpath.XPathVariableResolver;

import com.evolveum.midpoint.prism.lex.dom.DomLexicalProcessor;

import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
Expand Down Expand Up @@ -148,43 +147,14 @@ public static Object convertToXml(Object variableValue, QName variableName, fina
Element valueElement = prismContext.domSerializer().serialize(value, prismProperty.getElementName());
elementList.add(valueElement);
}
NodeList nodeList = new NodeList() {
@Override
public Node item(int index) {
return elementList.get(index);
}
@Override
public int getLength() {
return elementList.size();
}
};
NodeList nodeList = new AdHocNodeList(elementList);
variableValue = nodeList;

} else if (variableValue instanceof PrismValue) {
PrismValue pval = (PrismValue)variableValue;
if (pval.getParent() == null) {
// Set a fake parent to allow serialization
pval.setParent(new Itemable() {
@Override
public PrismContext getPrismContext() {
return prismContext;
}

@Override
public ItemPath getPath() {
return null;
}

@Override
public QName getElementName() {
return FAKE_VARIABLE_QNAME;
}

@Override
public ItemDefinition getDefinition() {
return null;
}
});
pval.setParent(new AdHocItemable(prismContext));
}
variableValue = prismContext.domSerializer().serialize(pval, variableName);
}
Expand Down Expand Up @@ -220,4 +190,50 @@ public ItemDefinition getDefinition() {
+" with value "+variableValue+" in "+contextDescription, e);
}
}

private static class AdHocNodeList implements NodeList, Serializable {
private final List<Element> elementList;

public AdHocNodeList(List<Element> elementList) {
this.elementList = elementList;
}

@Override
public Node item(int index) {
return elementList.get(index);
}

@Override
public int getLength() {
return elementList.size();
}
}

private static class AdHocItemable implements Itemable, Serializable {
private final PrismContext prismContext;

public AdHocItemable(PrismContext prismContext) {
this.prismContext = prismContext;
}

@Override
public PrismContext getPrismContext() {
return prismContext;
}

@Override
public ItemPath getPath() {
return null;
}

@Override
public QName getElementName() {
return FAKE_VARIABLE_QNAME;
}

@Override
public ItemDefinition getDefinition() {
return null;
}
}
}
Expand Up @@ -331,7 +331,7 @@ public TaskRunResult runInternal(Task coordinatorTask) {
reconciliationTaskResultListener.process(reconResult);
}

TaskHandlerUtil.appendLastFailuresInformation(OperationConstants.RECONCILIATION, coordinatorTask.getLastFailures(), opResult);
TaskHandlerUtil.appendLastFailuresInformation(OperationConstants.RECONCILIATION, coordinatorTask, opResult);
return runResult;
}

Expand Down Expand Up @@ -407,15 +407,15 @@ private void processInterruption(TaskRunResult runResult, PrismObject<ResourceTy
}
runResult.setProgress(task.getProgress());
runResult.setRunResultStatus(TaskRunResultStatus.INTERRUPTED); // not strictly necessary, because using task.canRun() == false the task manager knows we were interrupted
TaskHandlerUtil.appendLastFailuresInformation(OperationConstants.RECONCILIATION, task.getLastFailures(), opResult); // TODO implement more seriously
TaskHandlerUtil.appendLastFailuresInformation(OperationConstants.RECONCILIATION, task, opResult); // TODO implement more seriously
}

private void processErrorFinal(TaskRunResult runResult, String errorDesc, Exception ex,
TaskRunResultStatus runResultStatus, PrismObject<ResourceType> resource, Task task, OperationResult opResult) {
String message = errorDesc+": "+ex.getMessage();
LOGGER.error("Reconciliation: {}", new Object[]{message, ex});
opResult.recordFatalError(message, ex);
TaskHandlerUtil.appendLastFailuresInformation(OperationConstants.RECONCILIATION, task.getLastFailures(), opResult); // TODO implement more seriously
TaskHandlerUtil.appendLastFailuresInformation(OperationConstants.RECONCILIATION, task, opResult); // TODO implement more seriously
runResult.setRunResultStatus(runResultStatus);
runResult.setProgress(task.getProgress());

Expand Down
Expand Up @@ -19,6 +19,7 @@
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.result.OperationResultStatus;
import com.evolveum.midpoint.schema.statistics.IterativeTaskInformation;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;

Expand All @@ -31,14 +32,25 @@ public class TaskHandlerUtil {

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

public static void appendLastFailuresInformation(String operationNamePrefix, List<String> failures, OperationResult result) {
public static void appendLastFailuresInformation(String operationNamePrefix, Task task, OperationResult result) {
appendLastFailuresInformation(operationNamePrefix, task, false, result);
for (Task subtask : task.getLightweightAsynchronousSubtasks()) {
appendLastFailuresInformation(operationNamePrefix, subtask, true, result);
}
}
private static void appendLastFailuresInformation(String operationNamePrefix, Task task, boolean subtask, OperationResult result) {
List<String> failures = task.getLastFailures();
if (!failures.isEmpty()) {
StringBuilder sb = new StringBuilder();
if (failures.size() < IterativeTaskInformation.LAST_FAILURES_KEPT) {
sb.append("Failures (").append(failures.size()).append("):\n");
sb.append("Failures (").append(failures.size()).append(")");
} else {
sb.append("Last ").append(IterativeTaskInformation.LAST_FAILURES_KEPT).append(" failures:\n");
sb.append("Last ").append(IterativeTaskInformation.LAST_FAILURES_KEPT).append(" failures");
}
if (subtask) {
sb.append(" in subtask ").append(task.getName());
}
sb.append(":\n");
failures.forEach(f -> sb.append(f).append("\n"));
result.createSubresult(operationNamePrefix + ".errors")
.recordStatus(OperationResultStatus.NOT_APPLICABLE, sb.toString());
Expand Down
Expand Up @@ -335,7 +335,7 @@ public TaskRunResult runInternal(Task coordinatorTask) {
}

opResult.createSubresult(taskOperationPrefix + ".statistics").recordStatus(OperationResultStatus.SUCCESS, statistics);
TaskHandlerUtil.appendLastFailuresInformation(taskOperationPrefix, coordinatorTask.getLastFailures(), opResult);
TaskHandlerUtil.appendLastFailuresInformation(taskOperationPrefix, coordinatorTask, opResult);

LOGGER.info("{}", finishMessage + statistics);
}
Expand Down

0 comments on commit 7bfa0e1

Please sign in to comment.