Skip to content

Commit

Permalink
MID-4180 operation result hook, error handling
Browse files Browse the repository at this point in the history
  • Loading branch information
1azyman committed Oct 20, 2017
1 parent fac6627 commit f5f59b3
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 19 deletions.
Expand Up @@ -119,7 +119,6 @@
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 @@ -158,7 +157,6 @@
import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.ObjectName;
import java.awt.*;
import java.io.Serializable;
import java.util.*;
import java.util.List;
Expand Down Expand Up @@ -1044,11 +1042,13 @@ 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;
OperationResult scriptResult = executeResultScriptHook(result);
if (scriptResult == null) {
return null;
}

result = scriptResult;

OpResult opResult = OpResult.getOpResult((PageBase) getPage(), result);
opResult.determineBackgroundTaskVisibility(this);
switch (opResult.getStatus()) {
Expand Down Expand Up @@ -1095,10 +1095,15 @@ private OperationResult executeResultScriptHook(OperationResult result) {
OperationResult topResult = task.getResult();
try {
ExpressionFactory factory = getExpressionFactory();
Expression expression = factory.makeExpression(expressionType, null, contextDesc, task, topResult);
PrismPropertyDefinition<String> outputDefinition = new PrismPropertyDefinitionImpl<>(
ExpressionConstants.OUTPUT_ELEMENT_NAME, OperationResultType.COMPLEX_TYPE, getPrismContext());
Expression expression = factory.makeExpression(expressionType, outputDefinition, contextDesc, task, topResult);

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

OperationResultType resultType = result.createOperationResultType();

variables.addVariableDefinition(ExpressionConstants.VAR_INPUT, resultType);

ExpressionEvaluationContext context = new ExpressionEvaluationContext(null, variables, contextDesc, task, topResult);
PrismValueDeltaSetTriple<PrismPropertyValue<?>> outputTriple = expression.evaluate(context);
Expand All @@ -1115,9 +1120,18 @@ private OperationResult executeResultScriptHook(OperationResult result) {
throw new SchemaException("Expression " + contextDesc + " produced more than one value");
}

return values.iterator().next().getRealValue();
OperationResultType newResultType = values.iterator().next().getRealValue();
if (newResultType == null) {
return null;
}

return OperationResult.createOperationResult(newResultType);
} catch (SchemaException | ExpressionEvaluationException | ObjectNotFoundException e) {
result.recordFatalError(e);
topResult.recordFatalError(e);
if (StringUtils.isEmpty(result.getMessage())) {
topResult.setMessage("Couldn't process operation result script hook.");
}
topResult.addSubresult(result);
LoggingUtils.logUnexpectedException(LOGGER, contextDesc, e);
if (InternalsConfig.nonCriticalExceptionsAreFatal()) {
throw new SystemException(e.getMessage(), e);
Expand Down
Expand Up @@ -34,7 +34,7 @@
*/
@PageDescriptor(url = "/result")
public class PageOperationResult extends PageBase {
private static final long serialVersionUID = 1L;
private static final long serialVersionUID = 1L;

private static final String ID_BACK = "back";

Expand All @@ -54,21 +54,24 @@ public PageOperationResult(OperationResult result) {
}

private void initLayout() {
if (result != null) {
OpResult opresult = showResult(result);
opresult.setShowMoreAll(true);
}
if (result != null) {
OpResult opresult = showResult(result);
if (opresult != null) {
opresult.setShowMoreAll(true);
} else {
warn(getString("PageOperationResult.noResultAvailable"));
}
}

AjaxButton back = new AjaxButton(ID_BACK, createStringResource("PageError.button.back")) {
private static final long serialVersionUID = 1L;
AjaxButton back = new AjaxButton(ID_BACK, createStringResource("PageError.button.back")) {
private static final long serialVersionUID = 1L;

@Override
@Override
public void onClick(AjaxRequestTarget target) {
backPerformed(target);
}
};
add(back);

}

private void backPerformed(AjaxRequestTarget target) {
Expand Down
Expand Up @@ -3797,4 +3797,5 @@ ExclusionPolicyConstraintPanel.exclusionTitle=Exclusion
ValuePolicyBasicPanel.valuePolicy.name=Name
ValuePolicyBasicPanel.valuePolicy.description=Description
comboInput.nullValid=Choose one
ContainerPanel.containerProperties=Properties
ContainerPanel.containerProperties=Properties
PageOperationResult.noResultAvailable=No operation result available. It was probably "deleted" via script hook.
Expand Up @@ -121,6 +121,10 @@ private static void applyAdminGuiConfiguration(AdminGuiConfigurationType composi
}
}
}

if (adminGuiConfiguration.getFeedbackMessagesHook() != null) {
composite.setFeedbackMessagesHook(adminGuiConfiguration.getFeedbackMessagesHook().clone());
}
}

private static void joinForms(ObjectFormsType objectForms, ObjectFormType newForm) {
Expand Down

0 comments on commit f5f59b3

Please sign in to comment.