Skip to content

Commit

Permalink
OperationResults fixes, tests
Browse files Browse the repository at this point in the history
  • Loading branch information
semancik committed Aug 18, 2017
1 parent daca8f1 commit 1807a21
Show file tree
Hide file tree
Showing 5 changed files with 214 additions and 36 deletions.
Expand Up @@ -29,6 +29,8 @@
import com.evolveum.midpoint.prism.util.CloneUtil;

import com.evolveum.midpoint.util.DebugUtil;

import org.apache.commons.lang.BooleanUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.Validate;
import org.w3c.dom.Document;
Expand Down Expand Up @@ -98,6 +100,7 @@ public class OperationResult implements Serializable, DebugDumpable, Cloneable {
public static final String PARAM_OBJECT = "object";
public static final String PARAM_QUERY = "query";
public static final String PARAM_PROJECTION = "projection";
public static final String PARAM_LANGUAGE = "language";

public static final String RETURN_COUNT = "count";
public static final String RETURN_BACKGROUND_TASK_OID = "backgroundTaskOid";
Expand Down Expand Up @@ -727,6 +730,10 @@ public void recordNotApplicableIfUnknown() {
status = OperationResultStatus.NOT_APPLICABLE;
}
}

public boolean isMinor() {
return minor;
}

/**
* Method returns {@link Map} with operation parameters. Parameters keys are
Expand Down Expand Up @@ -1207,11 +1214,6 @@ public List<String> getDetail() {
return details;
}

@Override
public String toString() {
return "R(" + operation + " " + status + " " + message + ")";
}

public static OperationResult createOperationResult(OperationResultType result) throws SchemaException {
if (result == null) {
return null;
Expand All @@ -1237,6 +1239,7 @@ public static OperationResult createOperationResult(OperationResultType result)
OperationResultStatus.parseStatusType(result.getStatus()), result.getToken(),
result.getMessageCode(), result.getMessage(), localizedMessage, localizedArguments, null,
subresults);
opResult.setMinor(BooleanUtils.isTrue(result.isMinor()));
if (result.getCount() != null) {
opResult.setCount(result.getCount());
}
Expand All @@ -1251,18 +1254,21 @@ public OperationResultType createOperationResultType() {
}

private OperationResultType createOperationResultType(OperationResult opResult) {
OperationResultType result = new OperationResultType();
result.setToken(opResult.getToken());
result.setStatus(OperationResultStatus.createStatusType(opResult.getStatus()));
OperationResultType resultType = new OperationResultType();
resultType.setToken(opResult.getToken());
resultType.setStatus(OperationResultStatus.createStatusType(opResult.getStatus()));
if (opResult.isMinor()) {
resultType.setMinor(true);
}
if (opResult.getCount() != 1) {
result.setCount(opResult.getCount());
resultType.setCount(opResult.getCount());
}
if (opResult.getHiddenRecordsCount() != 0) {
result.setHiddenRecordsCount(opResult.getHiddenRecordsCount());
resultType.setHiddenRecordsCount(opResult.getHiddenRecordsCount());
}
result.setOperation(opResult.getOperation());
result.setMessage(opResult.getMessage());
result.setMessageCode(opResult.getMessageCode());
resultType.setOperation(opResult.getOperation());
resultType.setMessage(opResult.getMessage());
resultType.setMessageCode(opResult.getMessageCode());

if (opResult.getCause() != null || !opResult.details.isEmpty()) {
StringBuilder detailsb = new StringBuilder();
Expand All @@ -1289,7 +1295,7 @@ private OperationResultType createOperationResultType(OperationResult opResult)
}
}

result.setDetails(detailsb.toString());
resultType.setDetails(detailsb.toString());
}

if (StringUtils.isNotEmpty(opResult.getLocalizationMessage())) {
Expand All @@ -1298,18 +1304,18 @@ private OperationResultType createOperationResultType(OperationResult opResult)
if (opResult.getLocalizationArguments() != null) {
message.getArgument().addAll(opResult.getLocalizationArguments());
}
result.setLocalizedMessage(message);
resultType.setLocalizedMessage(message);
}

result.setParams(ParamsTypeUtil.toParamsType(opResult.getParams()));
result.setContext(ParamsTypeUtil.toParamsType(opResult.getContext()));
result.setReturns(ParamsTypeUtil.toParamsType(opResult.getReturns()));
resultType.setParams(ParamsTypeUtil.toParamsType(opResult.getParams()));
resultType.setContext(ParamsTypeUtil.toParamsType(opResult.getContext()));
resultType.setReturns(ParamsTypeUtil.toParamsType(opResult.getReturns()));

for (OperationResult subResult : opResult.getSubresults()) {
result.getPartialResults().add(opResult.createOperationResultType(subResult));
resultType.getPartialResults().add(opResult.createOperationResultType(subResult));
}

return result;
return resultType;
}

public void summarize() {
Expand Down Expand Up @@ -1730,4 +1736,161 @@ public static int getSubresultStripThreshold() {
public static void setSubresultStripThreshold(Integer value) {
subresultStripThreshold = value != null ? value : DEFAULT_SUBRESULT_STRIP_THRESHOLD;
}

@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ ((asynchronousOperationReference == null) ? 0 : asynchronousOperationReference.hashCode());
result = prime * result + ((cause == null) ? 0 : cause.hashCode());
result = prime * result + ((context == null) ? 0 : context.hashCode());
result = prime * result + count;
result = prime * result + ((details == null) ? 0 : details.hashCode());
result = prime * result + hiddenRecordsCount;
result = prime * result + ((localizationArguments == null) ? 0 : localizationArguments.hashCode());
result = prime * result + ((localizationMessage == null) ? 0 : localizationMessage.hashCode());
result = prime * result + ((message == null) ? 0 : message.hashCode());
result = prime * result + ((messageCode == null) ? 0 : messageCode.hashCode());
result = prime * result + (minor ? 1231 : 1237);
result = prime * result + ((operation == null) ? 0 : operation.hashCode());
result = prime * result + ((params == null) ? 0 : params.hashCode());
result = prime * result + ((returns == null) ? 0 : returns.hashCode());
result = prime * result + ((status == null) ? 0 : status.hashCode());
result = prime * result + ((subresults == null) ? 0 : subresults.hashCode());
result = prime * result + (summarizeErrors ? 1231 : 1237);
result = prime * result + (summarizePartialErrors ? 1231 : 1237);
result = prime * result + (summarizeSuccesses ? 1231 : 1237);
result = prime * result + (int) (token ^ (token >>> 32));
return result;
}

@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
OperationResult other = (OperationResult) obj;
if (asynchronousOperationReference == null) {
if (other.asynchronousOperationReference != null) {
return false;
}
} else if (!asynchronousOperationReference.equals(other.asynchronousOperationReference)) {
return false;
}
if (cause == null) {
if (other.cause != null) {
return false;
}
} else if (!cause.equals(other.cause)) {
return false;
}
if (context == null) {
if (other.context != null) {
return false;
}
} else if (!context.equals(other.context)) {
return false;
}
if (count != other.count) {
return false;
}
if (details == null) {
if (other.details != null) {
return false;
}
} else if (!details.equals(other.details)) {
return false;
}
if (hiddenRecordsCount != other.hiddenRecordsCount) {
return false;
}
if (localizationArguments == null) {
if (other.localizationArguments != null) {
return false;
}
} else if (!localizationArguments.equals(other.localizationArguments)) {
return false;
}
if (localizationMessage == null) {
if (other.localizationMessage != null) {
return false;
}
} else if (!localizationMessage.equals(other.localizationMessage)) {
return false;
}
if (message == null) {
if (other.message != null) {
return false;
}
} else if (!message.equals(other.message)) {
return false;
}
if (messageCode == null) {
if (other.messageCode != null) {
return false;
}
} else if (!messageCode.equals(other.messageCode)) {
return false;
}
if (minor != other.minor) {
return false;
}
if (operation == null) {
if (other.operation != null) {
return false;
}
} else if (!operation.equals(other.operation)) {
return false;
}
if (params == null) {
if (other.params != null) {
return false;
}
} else if (!params.equals(other.params)) {
return false;
}
if (returns == null) {
if (other.returns != null) {
return false;
}
} else if (!returns.equals(other.returns)) {
return false;
}
if (status != other.status) {
return false;
}
if (subresults == null) {
if (other.subresults != null) {
return false;
}
} else if (!subresults.equals(other.subresults)) {
return false;
}
if (summarizeErrors != other.summarizeErrors) {
return false;
}
if (summarizePartialErrors != other.summarizePartialErrors) {
return false;
}
if (summarizeSuccesses != other.summarizeSuccesses) {
return false;
}
if (token != other.token) {
return false;
}
return true;
}

@Override
public String toString() {
return "R(" + operation + " " + status + " " + message + ")";
}

}
Expand Up @@ -10607,6 +10607,7 @@
<xsd:sequence>
<xsd:element name="operation" type="xsd:string"/>
<xsd:element name="status" type="tns:OperationResultStatusType"/>
<xsd:element name="minor" type="xsd:boolean" minOccurs="0" default="false"/>
<xsd:element name="count" type="xsd:int" minOccurs="0" default="1"/>
<xsd:element name="hiddenRecordsCount" type="xsd:int" minOccurs="0" default="0"/>
<xsd:element name="params" type="tns:ParamsType" minOccurs="0"/>
Expand Down
Expand Up @@ -15,8 +15,10 @@
*/
package com.evolveum.midpoint.schema;

import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.util.PrismTestUtil;
import com.evolveum.midpoint.schema.constants.MidPointConstants;
import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.result.OperationResultStatus;
import com.evolveum.midpoint.util.PrettyPrinter;
Expand Down Expand Up @@ -50,23 +52,23 @@ public void testCleanup() throws Exception {
// GIVEN (checks also conversions during result construction)

OperationResult root = new OperationResult("dummy");
checkResultConversion(root);
checkResultConversion(root, true);

OperationResult sub1 = root.createSubresult("sub1");
checkResultConversion(root);
checkResultConversion(root, true);

OperationResult sub11 = sub1.createMinorSubresult("sub11");
OperationResult sub12 = sub1.createMinorSubresult("sub12");
OperationResult sub13 = sub1.createSubresult("sub13");

OperationResult sub2 = root.createSubresult("sub2");
sub2.recordFatalError("Fatal");
checkResultConversion(root);
checkResultConversion(root, true);

sub11.recordSuccess();
sub12.recordWarning("Warning");
sub13.recordSuccess();
checkResultConversion(root);
checkResultConversion(root, true);

// WHEN
sub1.computeStatus();
Expand All @@ -80,7 +82,7 @@ public void testCleanup() throws Exception {
assertEquals("Wrong status of sub1", OperationResultStatus.WARNING, sub1.getStatus()); // because of sub12
assertEquals("Wrong # of sub1 subresults", 2, sub1.getSubresults().size());

checkResultConversion(root);
checkResultConversion(root, true);
}

@Test
Expand Down Expand Up @@ -113,7 +115,7 @@ public void testSummarizeByHiding() throws Exception {
assertEquals("Wrong status in summary", OperationResultStatus.SUCCESS, summary.getStatus());
assertEquals("Wrong hidden records count in summary", 20, summary.getHiddenRecordsCount());

checkResultConversion(root);
checkResultConversion(root, true);
}

@Test
Expand Down Expand Up @@ -148,7 +150,7 @@ public void testExplicitSummarization() throws Exception {
assertEquals("Wrong message in summary", "message", summary.getMessage());
assertEquals("Wrong count in summary", 30, summary.getCount());

checkResultConversion(root);
checkResultConversion(root, false); // summarization settings are not serialized
}

@Test
Expand Down Expand Up @@ -201,17 +203,22 @@ public void testIncrementalSummarization() throws Exception {
}
}

checkResultConversion(root);
checkResultConversion(root, true);
}

private void checkResultConversion(OperationResult result) throws SchemaException {
private void checkResultConversion(OperationResult result, boolean assertEquals) throws SchemaException {
// WHEN
OperationResultType resultType = result.createOperationResultType();
OperationResult result1 = OperationResult.createOperationResult(resultType);
OperationResultType resultType1 = result1.createOperationResultType();
String serialized = PrismTestUtil.getPrismContext().serializerFor(PrismContext.LANG_XML).serializeAnyData(resultType, SchemaConstants.C_RESULT);
System.out.println("Converted OperationResultType\n" + serialized);
OperationResult resultRoundTrip = OperationResult.createOperationResult(resultType);
OperationResultType resultTypeRoundTrip = resultRoundTrip.createOperationResultType();

// THEN
assertEquals("Operation result conversion changes the result", resultType, resultType1);
assertEquals("Operation result conversion changes the result (OperationResultType)", resultType, resultTypeRoundTrip);
if (assertEquals) {
assertEquals("Operation result conversion changes the result (OperationResult)", result, resultRoundTrip);
}
}

}
Expand Up @@ -1527,7 +1527,7 @@ public void importObjectsFromStream(InputStream input, String language, ImportOp
RepositoryCache.enter();
OperationResult result = parentResult.createSubresult(IMPORT_OBJECTS_FROM_STREAM);
result.addArbitraryObjectAsParam(OperationResult.PARAM_OPTIONS, options);
result.addParam("language", language);
result.addParam(OperationResult.PARAM_LANGUAGE, language);
try {
objectImporter.importObjects(input, language, options, task, result);
if (LOGGER.isTraceEnabled()) {
Expand Down

0 comments on commit 1807a21

Please sign in to comment.