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 Oct 19, 2017
2 parents 1f262dd + aa2ff31 commit 1b02c6a
Show file tree
Hide file tree
Showing 20 changed files with 929 additions and 248 deletions.
Expand Up @@ -32,15 +32,18 @@
import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils;
import com.evolveum.midpoint.model.api.*;
import com.evolveum.midpoint.model.api.validator.ResourceValidator;
import com.evolveum.midpoint.prism.Objectable;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.*;
import com.evolveum.midpoint.prism.delta.PrismValueDeltaSetTriple;
import com.evolveum.midpoint.prism.match.MatchingRuleRegistry;
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.prism.query.builder.QueryBuilder;
import com.evolveum.midpoint.prism.query.builder.S_FilterEntryOrEmpty;
import com.evolveum.midpoint.repo.common.expression.Expression;
import com.evolveum.midpoint.repo.common.expression.ExpressionEvaluationContext;
import com.evolveum.midpoint.repo.common.expression.ExpressionFactory;
import com.evolveum.midpoint.repo.common.expression.ExpressionVariables;
import com.evolveum.midpoint.report.api.ReportManager;
import com.evolveum.midpoint.schema.constants.ExpressionConstants;
import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.schema.internals.InternalsConfig;
import com.evolveum.midpoint.schema.result.OperationConstants;
Expand Down Expand Up @@ -110,6 +113,7 @@
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.Validate;
import org.apache.poi.ss.formula.functions.T;
import org.apache.wicket.*;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
Expand Down Expand Up @@ -1002,6 +1006,11 @@ public OpResult showResult(OperationResult result, String errorMessageKey, boole
Validate.notNull(result, "Operation result must not be null.");
Validate.notNull(result.getStatus(), "Operation result status must not be null.");

Object scriptResult = executeResultScriptHook(result);
if (scriptResult instanceof OperationResult) {
result = (OperationResult) scriptResult;
}

OpResult opResult = OpResult.getOpResult((PageBase) getPage(), result);
opResult.determineBackgroundTaskVisibility(this);
switch (opResult.getStatus()) {
Expand Down Expand Up @@ -1030,6 +1039,56 @@ public OpResult showResult(OperationResult result, String errorMessageKey, boole
return opResult;
}

private OperationResult executeResultScriptHook(OperationResult result) {
AdminGuiConfigurationType adminGuiConfiguration = getAdminGuiConfiguration();
if (adminGuiConfiguration == null || adminGuiConfiguration.getFeedbackMessagesHook() == null) {
return result;
}

FeedbackMessagesHookType hook = adminGuiConfiguration.getFeedbackMessagesHook();
ExpressionType expressionType = hook.getOperationResultHook();
if (expressionType == null) {
return result;
}

String contextDesc = "operation result (" + result.getOperation() + ") script hook";

Task task = getPageTask();
OperationResult topResult = task.getResult();
try {
ExpressionFactory factory = getExpressionFactory();
Expression expression = factory.makeExpression(expressionType, null, contextDesc, task, topResult);

ExpressionVariables variables = new ExpressionVariables();
variables.addVariableDefinition(ExpressionConstants.VAR_INPUT, result);

ExpressionEvaluationContext context = new ExpressionEvaluationContext(null, variables, contextDesc, task, topResult);
PrismValueDeltaSetTriple<PrismPropertyValue<?>> outputTriple = expression.evaluate(context);
if (outputTriple == null) {
return null;
}

Collection<PrismPropertyValue<?>> values = outputTriple.getNonNegativeValues();
if (values == null || values.isEmpty()) {
return null;
}

if (values.size() > 1) {
throw new SchemaException("Expression " + contextDesc + " produced more than one value");
}

return values.iterator().next().getRealValue();
} catch (SchemaException | ExpressionEvaluationException | ObjectNotFoundException e) {
result.recordFatalError(e);
LoggingUtils.logUnexpectedException(LOGGER, contextDesc, e);
if (InternalsConfig.nonCriticalExceptionsAreFatal()) {
throw new SystemException(e.getMessage(), e);
} else {
return topResult;
}
}
}

// common result processing
protected void processResult(AjaxRequestTarget target, OperationResult result, boolean showSuccess) {
result.computeStatusIfUnknown();
Expand Down
Expand Up @@ -254,7 +254,7 @@ public void test150CreateWrapperShadow() throws Exception {
ContainerValueWrapper<ShadowAttributesType> attributesContainerValueWrapper = attributesContainerWrapper.getValues().iterator().next();
WrapperTestUtil.assertPropertyWrapper(attributesContainerValueWrapper, dummyResourceCtl.getAttributeFullnameQName(), USER_JACK_FULL_NAME);
WrapperTestUtil.assertPropertyWrapper(attributesContainerValueWrapper, SchemaConstants.ICFS_NAME, USER_JACK_USERNAME);
assertEquals("wrong number of items in "+attributesContainerWrapper, 16, attributesContainerValueWrapper.getItems().size());
assertEquals("wrong number of items in "+attributesContainerWrapper, 17, attributesContainerValueWrapper.getItems().size());

ContainerWrapper<ActivationType> activationContainerWrapper = objectWrapper.findContainerWrapper(new ItemPath(UserType.F_ACTIVATION));
assertEquals("wrong number of values in "+activationContainerWrapper, 1, activationContainerWrapper.getValues().size());
Expand Down Expand Up @@ -335,7 +335,7 @@ public void test220AssignRoleLandluberToWally() throws Exception {
ContainerValueWrapper<ShadowAttributesType> attributesContainerValueWrapper = attributesContainerWrapper.getValues().iterator().next();
WrapperTestUtil.assertPropertyWrapper(attributesContainerValueWrapper, dummyResourceCtl.getAttributeFullnameQName(), USER_WALLY_FULLNAME);
WrapperTestUtil.assertPropertyWrapper(attributesContainerValueWrapper, SchemaConstants.ICFS_NAME, USER_WALLY_NAME);
assertEquals("wrong number of items in "+attributesContainerWrapper, 16, attributesContainerValueWrapper.getItems().size());
assertEquals("wrong number of items in "+attributesContainerWrapper, 17, attributesContainerValueWrapper.getItems().size());

ContainerWrapper<ActivationType> activationContainerWrapper = objectWrapper.findContainerWrapper(new ItemPath(UserType.F_ACTIVATION));
WrapperTestUtil.assertWrapper(activationContainerWrapper, "ShadowType.activation", UserType.F_ACTIVATION, shadow, ContainerStatus.MODIFYING);
Expand Down
Expand Up @@ -19,7 +19,6 @@
import java.util.*;
import java.util.Map.Entry;

import javax.xml.bind.JAXBElement;
import javax.xml.namespace.QName;

import com.evolveum.midpoint.prism.PrismObject;
Expand All @@ -28,28 +27,20 @@
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.prism.util.CloneUtil;

import com.evolveum.midpoint.util.DebugUtil;
import com.evolveum.midpoint.schema.util.LocalizationUtil;
import com.evolveum.midpoint.util.*;

import com.evolveum.midpoint.xml.ns._public.common.common_3.LocalizableMessageType;
import org.apache.commons.lang.BooleanUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.Validate;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

import com.evolveum.midpoint.prism.xml.XmlTypeConverter;
import com.evolveum.midpoint.schema.constants.ObjectTypes;
import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.schema.util.ParamsTypeUtil;
import com.evolveum.midpoint.schema.util.SchemaDebugUtil;
import com.evolveum.midpoint.util.DOMUtil;
import com.evolveum.midpoint.util.DebugDumpable;
import com.evolveum.midpoint.util.MiscUtil;
import com.evolveum.midpoint.util.QNameUtil;
import com.evolveum.midpoint.util.exception.CommonException;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.xml.ns._public.common.common_3.LocalizedMessageType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationResultType;

Expand Down Expand Up @@ -123,8 +114,7 @@ public class OperationResult implements Serializable, DebugDumpable, Cloneable {
private long token;
private String messageCode;
private String message;
private String localizationMessage;
private List<Serializable> localizationArguments;
private LocalizableMessage userFriendlyMessage;
private Throwable cause;
private int count = 1;
private int hiddenRecordsCount;
Expand Down Expand Up @@ -187,22 +177,14 @@ public OperationResult(String operation, Map<String, Collection<String>> params,
}

public OperationResult(String operation, Map<String, Collection<String>> params, OperationResultStatus status,
long token, String messageCode, String message, String localizationMessage, Throwable cause,
List<OperationResult> subresults) {
this(operation, params, status, token, messageCode, message, localizationMessage, null, cause,
long token, String messageCode, String message, LocalizableMessage userFriendlyMessage, Throwable cause, List<OperationResult> subresults) {
this(operation, params, null, null, status, token, messageCode, message, userFriendlyMessage, cause,
subresults);
}

public OperationResult(String operation, Map<String, Collection<String>> params, OperationResultStatus status,
long token, String messageCode, String message, String localizationMessage,
List<Serializable> localizationArguments, Throwable cause, List<OperationResult> subresults) {
this(operation, params, null, null, status, token, messageCode, message, localizationMessage, null, cause,
subresults);
}

public OperationResult(String operation, Map<String, Collection<String>> params, Map<String, Collection<String>> context, Map<String, Collection<String>> returns, OperationResultStatus status,
long token, String messageCode, String message, String localizationMessage,
List<Serializable> localizationArguments, Throwable cause, List<OperationResult> subresults) {
public OperationResult(String operation, Map<String, Collection<String>> params, Map<String, Collection<String>> context,
Map<String, Collection<String>> returns, OperationResultStatus status, long token, String messageCode,
String message, LocalizableMessage userFriendlyMessage, Throwable cause, List<OperationResult> subresults) {
if (StringUtils.isEmpty(operation)) {
throw new IllegalArgumentException("Operation argument must not be null or empty.");
}
Expand All @@ -217,8 +199,7 @@ public OperationResult(String operation, Map<String, Collection<String>> params,
this.token = token;
this.messageCode = messageCode;
this.message = message;
this.localizationMessage = localizationMessage;
this.localizationArguments = localizationArguments;
this.userFriendlyMessage = userFriendlyMessage;
this.cause = cause;
this.subresults = subresults;
this.details = new ArrayList<>();
Expand Down Expand Up @@ -1079,18 +1060,12 @@ public void setMessage(String message) {
this.message = message;
}

/**
* @return Method returns message key for translation, can be null.
*/
public String getLocalizationMessage() {
return localizationMessage;
public LocalizableMessage getUserFriendlyMessage() {
return userFriendlyMessage;
}

/**
* @return Method returns arguments if needed for localization, can be null.
*/
public List<Serializable> getLocalizationArguments() {
return localizationArguments;
public void setUserFriendlyMessage(LocalizableMessage userFriendlyMessage) {
this.userFriendlyMessage = userFriendlyMessage;
}

/**
Expand Down Expand Up @@ -1263,13 +1238,15 @@ public static OperationResult createOperationResult(OperationResultType result)
}
}

LocalizedMessageType message = result.getLocalizedMessage();
String localizedMessage = message == null ? null : message.getKey();
List<Serializable> localizedArguments = message == null ? null : (List<Serializable>) (List) message.getArgument(); // FIXME: brutal hack
LocalizableMessage localizableMessage = null;
LocalizableMessageType message = result.getLocalizedMessage();
if (message != null) {
localizableMessage = LocalizationUtil.parseLocalizableMessageType(message);
}

OperationResult opResult = new OperationResult(result.getOperation(), params, context, returns,
OperationResultStatus.parseStatusType(result.getStatus()), result.getToken(),
result.getMessageCode(), result.getMessage(), localizedMessage, localizedArguments, null,
result.getMessageCode(), result.getMessage(), localizableMessage, null,
subresults);
opResult.setMinor(BooleanUtils.isTrue(result.isMinor()));
if (result.getCount() != null) {
Expand Down Expand Up @@ -1330,13 +1307,9 @@ private OperationResultType createOperationResultType(OperationResult opResult)
resultType.setDetails(detailsb.toString());
}

if (StringUtils.isNotEmpty(opResult.getLocalizationMessage())) {
LocalizedMessageType message = new LocalizedMessageType();
message.setKey(opResult.getLocalizationMessage());
if (opResult.getLocalizationArguments() != null) {
message.getArgument().addAll(opResult.getLocalizationArguments());
}
resultType.setLocalizedMessage(message);
if (opResult.getUserFriendlyMessage() != null) {
LocalizableMessageType msg = LocalizationUtil.createLocalizableMessageType(opResult.getUserFriendlyMessage());
resultType.setLocalizedMessage(msg);
}

resultType.setParams(ParamsTypeUtil.toParamsType(opResult.getParams()));
Expand Down Expand Up @@ -1734,8 +1707,7 @@ public OperationResult clone() {
clone.token = token;
clone.messageCode = messageCode;
clone.message = message;
clone.localizationMessage = localizationMessage;
clone.localizationArguments = CloneUtil.clone(localizationArguments);
clone.userFriendlyMessage = CloneUtil.clone(userFriendlyMessage);
clone.cause = CloneUtil.clone(cause);
clone.count = count;
clone.hiddenRecordsCount = hiddenRecordsCount;
Expand Down Expand Up @@ -1782,8 +1754,7 @@ public int 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 + ((userFriendlyMessage == null) ? 0 : userFriendlyMessage.hashCode());
result = prime * result + ((message == null) ? 0 : message.hashCode());
result = prime * result + ((messageCode == null) ? 0 : messageCode.hashCode());
result = prime * result + (minor ? 1231 : 1237);
Expand Down Expand Up @@ -1845,18 +1816,11 @@ public boolean equals(Object obj) {
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) {
if (userFriendlyMessage == null) {
if (other.userFriendlyMessage != null) {
return false;
}
} else if (!localizationMessage.equals(other.localizationMessage)) {
} else if (!userFriendlyMessage.equals(other.userFriendlyMessage)) {
return false;
}
if (message == null) {
Expand Down
Expand Up @@ -21,16 +21,10 @@

import javax.xml.bind.JAXBElement;

import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import org.apache.commons.lang.StringUtils;
import org.w3c.dom.Element;

import com.evolveum.midpoint.xml.ns._public.common.common_3.EntryType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.LocalizedMessageType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectFactory;
import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationResultStatusType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationResultType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ParamsType;

/**
*
* @author lazyman
Expand Down Expand Up @@ -79,15 +73,20 @@ public static OperationResultType createOperationResult(String operation,
}

ObjectFactory factory = new ObjectFactory();
LocalizedMessageType localizedMessageType = factory.createLocalizedMessageType();
LocalizableMessageType localizedMessageType = factory.createLocalizableMessageType();
result.setLocalizedMessage(localizedMessageType);
localizedMessageType.setKey(localizedMessage);
if (localizedArguments == null || localizedArguments.length == 0) {
return result;
}

for (Object object : localizedArguments) {
localizedMessageType.getArgument().add(object);
LocalizableMessageArgumentType arg = new LocalizableMessageArgumentType();
if (object != null) {
arg.setValue(object.toString());
}

localizedMessageType.getArgument().add(arg);
}

return result;
Expand Down

0 comments on commit 1b02c6a

Please sign in to comment.