From 6606d89d7b59c973bcc87b706850a527e8045244 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Wed, 15 Oct 2014 12:14:35 +0200 Subject: [PATCH] Fixed MID-2058 (Notifications don't display association info when adding account+association). Fixed displaying errors in resource objects failure notifications. Also, now showing errors that occur during "reconcile user" operation. --- .../web/page/admin/users/PageUsers.java | 2 +- .../schema/result/OperationResult.java | 35 ++++++++++++++++++- .../impl/formatters/TextFormatter.java | 15 +++++--- .../consistency/api/ErrorHandler.java | 12 +++++-- .../impl/CommunicationExceptionHandler.java | 6 ++-- .../impl/ConfigurationExceptionHandler.java | 2 +- .../impl/ObjectNotFoundHandler.java | 2 +- .../impl/SchemaExceptionHandler.java | 2 +- .../impl/SecurityViolationHandler.java | 2 +- 9 files changed, 62 insertions(+), 16 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUsers.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUsers.java index aaaece06736..1fc6b9087cf 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUsers.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUsers.java @@ -581,7 +581,7 @@ private void reconcilePerformed(AjaxRequestTarget target, UserListItemDto select ObjectDelta delta = ObjectDelta.createEmptyModifyDelta(UserType.class, user.getOid(), getPrismContext()); Collection> deltas = WebMiscUtil.createDeltaCollection(delta); getModelService().executeChanges(deltas, ModelExecuteOptions.createReconcile(), task, opResult); - opResult.recordSuccess(); + opResult.computeStatusIfUnknown(); } catch (Exception ex) { opResult.recomputeStatus(); opResult.recordFatalError("Couldn't reconcile user " + userShortString + ".", ex); diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/result/OperationResult.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/result/OperationResult.java index 0b3e0fde1c7..95f9af31a29 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/result/OperationResult.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/result/OperationResult.java @@ -21,6 +21,7 @@ import javax.xml.bind.JAXBElement; +import com.evolveum.midpoint.prism.util.CloneUtil; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.Validate; import org.w3c.dom.Document; @@ -62,7 +63,7 @@ * @author Radovan Semancik * */ -public class OperationResult implements Serializable, DebugDumpable { +public class OperationResult implements Serializable, DebugDumpable, Cloneable { private static final long serialVersionUID = -2467406395542291044L; private static final String INDENT_STRING = " "; @@ -1447,4 +1448,36 @@ public int hashCode() { } } + public OperationResult clone() { + OperationResult clone = new OperationResult(operation); + + clone.status = status; + clone.params = CloneUtil.clone(params); + clone.context = CloneUtil.clone(context); + clone.returns = CloneUtil.clone(returns); + clone.token = token; + clone.messageCode = messageCode; + clone.message = message; + clone.localizationMessage = localizationMessage; + clone.localizationArguments = CloneUtil.clone(localizationArguments); + clone.cause = CloneUtil.clone(cause); + clone.count = count; + if (subresults != null) { + clone.subresults = new ArrayList<>(subresults.size()); + for (OperationResult subresult : subresults) { + if (subresult != null) { + clone.subresults.add(subresult.clone()); + } + } + } + clone.details = CloneUtil.clone(details); + clone.summarizeErrors = summarizeErrors; + clone.summarizePartialErrors = summarizePartialErrors; + clone.summarizeSuccesses = summarizeSuccesses; + clone.minor = minor; + + return clone; + } + + } diff --git a/model/notifications-impl/src/main/java/com/evolveum/midpoint/notifications/impl/formatters/TextFormatter.java b/model/notifications-impl/src/main/java/com/evolveum/midpoint/notifications/impl/formatters/TextFormatter.java index d485b9e7a5b..690925cd1ee 100644 --- a/model/notifications-impl/src/main/java/com/evolveum/midpoint/notifications/impl/formatters/TextFormatter.java +++ b/model/notifications-impl/src/main/java/com/evolveum/midpoint/notifications/impl/formatters/TextFormatter.java @@ -176,17 +176,22 @@ public String formatAccountAttributes(ShadowType shadowType, List hidd if (shadowType.getAttributes() != null) { formatContainerValue(retval, "", shadowType.getAttributes().asPrismContainerValue(), false, hiddenAttributes, showOperationalAttributes); } - if (shadowType.getAssociation() != null) { - for (ShadowAssociationType shadowAssociationType : shadowType.getAssociation()) { - formatContainerValue(retval, "", shadowAssociationType.asPrismContainerValue(), false, hiddenAttributes, showOperationalAttributes); - } - } if (shadowType.getCredentials() != null) { formatContainerValue(retval, "", shadowType.getCredentials().asPrismContainerValue(), false, hiddenAttributes, showOperationalAttributes); } if (shadowType.getActivation() != null) { formatContainerValue(retval, "", shadowType.getActivation().asPrismContainerValue(), false, hiddenAttributes, showOperationalAttributes); } + if (shadowType.getAssociation() != null) { + boolean first = true; + for (ShadowAssociationType shadowAssociationType : shadowType.getAssociation()) { + if (first) retval.append("\n"); else first = false; + retval.append("Association:\n"); + formatContainerValue(retval, " ", shadowAssociationType.asPrismContainerValue(), false, hiddenAttributes, showOperationalAttributes); + retval.append("\n"); + } + } + return retval.toString(); } diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/consistency/api/ErrorHandler.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/consistency/api/ErrorHandler.java index 529d68687aa..e4fccdd8947 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/consistency/api/ErrorHandler.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/consistency/api/ErrorHandler.java @@ -103,7 +103,7 @@ protected Integer getAttemptNumber(ShadowType shadow) { return attemptNumber; } - protected ResourceOperationDescription createOperationDescription(ShadowType shadowType, ResourceType resource, ObjectDelta delta, Task task, OperationResult result) { + protected ResourceOperationDescription createOperationDescription(ShadowType shadowType, Exception ex, ResourceType resource, ObjectDelta delta, Task task, OperationResult result) { ResourceOperationDescription operationDescription = new ResourceOperationDescription(); operationDescription.setCurrentShadow(shadowType.asPrismObject()); if (resource != null){ @@ -113,7 +113,15 @@ protected ResourceOperationDescription createOperationDescription(ShadowType sha operationDescription.setSourceChannel(task.getChannel()); } operationDescription.setObjectDelta(delta); - operationDescription.setResult(result); + + // fill-in the message if necessary + OperationResult storedResult = result != null ? result.clone() : new OperationResult("dummy"); // actually, the result shouldn't be null anyway + storedResult.computeStatusIfUnknown(); + if (storedResult.getMessage() == null && ex != null) { + storedResult.recordStatus(storedResult.getStatus(), ex.getMessage(), ex); + } + operationDescription.setResult(storedResult); + return operationDescription; } diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/consistency/impl/CommunicationExceptionHandler.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/consistency/impl/CommunicationExceptionHandler.java index 4de16a1bc25..3547e39870f 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/consistency/impl/CommunicationExceptionHandler.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/consistency/impl/CommunicationExceptionHandler.java @@ -158,7 +158,7 @@ public T handleError(T shadow, FailedOperation op, Except // task = taskManager.createTaskInstance(); delta = ObjectDelta.createAddDelta(shadow.asPrismObject()); - operationDescription = createOperationDescription(shadow, resource, delta, task, operationResult); + operationDescription = createOperationDescription(shadow, ex, resource, delta, task, operationResult); changeNotificationDispatcher.notifyInProgress(operationDescription, task, parentResult); return shadow; case MODIFY: @@ -196,7 +196,7 @@ public T handleError(T shadow, FailedOperation op, Except + ", because resource is unreachable. Modifications will be applied when the resource goes online"); // task = taskManager.createTaskInstance(); // - operationDescription = createOperationDescription(shadow, shadow.getResource(), delta, task, operationResult); + operationDescription = createOperationDescription(shadow, ex, shadow.getResource(), delta, task, operationResult); changeNotificationDispatcher.notifyInProgress(operationDescription, task, parentResult); return shadow; case DELETE: @@ -217,7 +217,7 @@ public T handleError(T shadow, FailedOperation op, Except // task = taskManager.createTaskInstance(); // task.setChannel(QNameUtil.qNameToUri(SchemaConstants.CHANGE_CHANNEL_DISCOVERY)); delta = ObjectDelta.createDeleteDelta(shadow.asPrismObject().getCompileTimeClass(), shadow.getOid(), prismContext); - operationDescription = createOperationDescription(shadow, shadow.getResource(), delta, task, operationResult); + operationDescription = createOperationDescription(shadow, ex, shadow.getResource(), delta, task, operationResult); changeNotificationDispatcher.notifyInProgress(operationDescription, task, parentResult); return shadow; case GET: diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/consistency/impl/ConfigurationExceptionHandler.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/consistency/impl/ConfigurationExceptionHandler.java index c505b61a8cf..3f2b23df3d0 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/consistency/impl/ConfigurationExceptionHandler.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/consistency/impl/ConfigurationExceptionHandler.java @@ -74,7 +74,7 @@ public T handleError(T shadow, FailedOperation op, Except if (op != FailedOperation.GET){ // Task task = taskManager.createTaskInstance(); - ResourceOperationDescription operationDescription = createOperationDescription(shadow, shadow.getResource(), + ResourceOperationDescription operationDescription = createOperationDescription(shadow, ex, shadow.getResource(), delta, task, parentResult); changeNotificationDispatcher.notifyFailure(operationDescription, task, parentResult); } diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/consistency/impl/ObjectNotFoundHandler.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/consistency/impl/ObjectNotFoundHandler.java index 5b88a217905..04734e3950d 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/consistency/impl/ObjectNotFoundHandler.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/consistency/impl/ObjectNotFoundHandler.java @@ -135,7 +135,7 @@ public T handleError(T shadow, FailedOperation op, Except LOGGER.trace("Shadow deleted from the repository. Inconsistencies are now removed."); result.computeStatus(); delta = ObjectDelta.createDeleteDelta(shadow.getClass(), shadow.getOid(), prismContext); - ResourceOperationDescription operationDescritpion = createOperationDescription(shadow, shadow.getResource(), delta, task, result); + ResourceOperationDescription operationDescritpion = createOperationDescription(shadow, ex, shadow.getResource(), delta, task, result); changeNotificationDispatcher.notifySuccess(operationDescritpion, task, result); return shadow; case MODIFY: diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/consistency/impl/SchemaExceptionHandler.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/consistency/impl/SchemaExceptionHandler.java index c248125a358..00bb187453d 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/consistency/impl/SchemaExceptionHandler.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/consistency/impl/SchemaExceptionHandler.java @@ -76,7 +76,7 @@ public T handleError(T shadow, FailedOperation op, Except if (op != FailedOperation.GET) { // Task task = taskManager.createTaskInstance(); - ResourceOperationDescription operationDescription = createOperationDescription(shadow, + ResourceOperationDescription operationDescription = createOperationDescription(shadow, ex, shadow.getResource(), delta, task, parentResult); changeNotificationDispatcher.notifyFailure(operationDescription, task, parentResult); } diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/consistency/impl/SecurityViolationHandler.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/consistency/impl/SecurityViolationHandler.java index 7ffa4464fc7..4ad56b57971 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/consistency/impl/SecurityViolationHandler.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/consistency/impl/SecurityViolationHandler.java @@ -76,7 +76,7 @@ public T handleError(T shadow, FailedOperation op, Except if (op != FailedOperation.GET){ // Task task = taskManager.createTaskInstance(); - ResourceOperationDescription operationDescription = createOperationDescription(shadow, shadow.getResource(), + ResourceOperationDescription operationDescription = createOperationDescription(shadow, ex, shadow.getResource(), delta, task, parentResult); changeNotificationDispatcher.notifyFailure(operationDescription, task, parentResult); }