From 321f3cd0c13e00a94b043aeade013a700b5c628e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20L=C3=ADzner?= Date: Sat, 18 Feb 2017 19:49:01 +0100 Subject: [PATCH] New option for LiveSync task: retryLiveSyncErrors --- .../server/handlers/LiveSyncHandlerPanel.html | 8 +++++ .../server/handlers/LiveSyncHandlerPanel.java | 16 +++++++++- .../handlers/ResourceRelatedHandlerPanel.java | 3 +- .../dto/ResourceRelatedHandlerDto.java | 30 ++++++++++++++++--- .../localization/Midpoint.properties | 1 + .../schema/constants/SchemaConstants.java | 2 ++ .../xml/ns/public/model/extension-3.xsd | 16 ++++++++++ .../provisioning/impl/ShadowCache.java | 13 ++++++-- 8 files changed, 81 insertions(+), 8 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/LiveSyncHandlerPanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/LiveSyncHandlerPanel.html index 7097f4aa6fc..366e588d210 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/LiveSyncHandlerPanel.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/LiveSyncHandlerPanel.html @@ -23,6 +23,14 @@
+ + + + + + diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/LiveSyncHandlerPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/LiveSyncHandlerPanel.java index 6bc74605e31..a31c421ef73 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/LiveSyncHandlerPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/LiveSyncHandlerPanel.java @@ -20,9 +20,11 @@ import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; import com.evolveum.midpoint.web.page.admin.server.PageTaskEdit; import com.evolveum.midpoint.web.page.admin.server.handlers.dto.LiveSyncHandlerDto; +import com.evolveum.midpoint.web.page.admin.server.handlers.dto.ResourceRelatedHandlerDto; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; +import org.apache.wicket.markup.html.form.CheckBox; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import org.apache.wicket.model.PropertyModel; @@ -37,7 +39,11 @@ public class LiveSyncHandlerPanel extends ResourceRelatedHandlerPanel handlerDtoModel, PageTaskEdit parentPage) { super(id, handlerDtoModel, parentPage); initLayout(parentPage); @@ -68,6 +74,14 @@ public boolean isVisible() { deleteTokenPanel.setRenderBodyOnly(true); tokenContainer.add(deleteTokenPanel); add(tokenContainer); + + WebMarkupContainer retryContainer = new WebMarkupContainer(ID_TOKEN_RETRY_CONTAINER); + add(retryContainer); + WebMarkupContainer retryCheckboxContainer = new WebMarkupContainer(ID_TOKEN_RETRY_CHECKBOX_CONTAINER); + retryContainer.add(retryCheckboxContainer); + CheckBox retryCheckbox = new CheckBox(ID_TOKEN_RETRY_CHECKBOX, new PropertyModel(getModel(), ResourceRelatedHandlerDto.F_TOKEN_RETRY_UNHANDLED_ERR)); + retryCheckbox.add(enabledIfEdit); + retryCheckboxContainer.add(retryCheckbox); } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/ResourceRelatedHandlerPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/ResourceRelatedHandlerPanel.java index 9fec27719ab..b8019d118f7 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/ResourceRelatedHandlerPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/ResourceRelatedHandlerPanel.java @@ -85,6 +85,7 @@ public class ResourceRelatedHandlerPanel ex private static final String ID_DRY_RUN = "dryRun"; private PageTaskEdit parentPage; + protected VisibleEnableBehaviour enabledIfEdit; public ResourceRelatedHandlerPanel(String id, IModel handlerDtoModel, PageTaskEdit parentPage) { super(id, handlerDtoModel); @@ -106,7 +107,7 @@ public boolean isVisible() { return !parentPage.isEdit(); } }; - final VisibleEnableBehaviour enabledIfEdit = new VisibleEnableBehaviour() { + enabledIfEdit = new VisibleEnableBehaviour() { @Override public boolean isEnabled() { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/dto/ResourceRelatedHandlerDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/dto/ResourceRelatedHandlerDto.java index 2bc0d224653..9ec5a84d78b 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/dto/ResourceRelatedHandlerDto.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/handlers/dto/ResourceRelatedHandlerDto.java @@ -41,6 +41,7 @@ public class ResourceRelatedHandlerDto extends HandlerDto implements HandlerDtoE public static final String F_INTENT = "intent"; public static final String F_OBJECT_CLASS = "objectClass"; public static final String F_RESOURCE_REFERENCE = "resourceRef"; + public static final String F_TOKEN_RETRY_UNHANDLED_ERR = "retryUnhandledErr"; private static final String CLASS_DOT = ResourceRelatedHandlerDto.class.getName() + "."; private static final String OPERATION_LOAD_RESOURCE = CLASS_DOT + "loadResource"; @@ -53,6 +54,7 @@ public class ResourceRelatedHandlerDto extends HandlerDto implements HandlerDtoE private String objectClass; private List objectClassList; private TaskAddResourcesDto resourceRef; + private boolean retryUnhandledErr; private ResourceRelatedHandlerDto(TaskDto taskDto) { super(taskDto); @@ -93,6 +95,13 @@ private void fillFromExtension(TaskType taskType) { if(objectClassItem != null && objectClassItem.getRealValue() != null){ objectClass = objectClassItem.getRealValue().getLocalPart(); } + + PrismProperty retrySyncItem = task.getExtension().findProperty(SchemaConstants.SYNC_TOKEN_RETRY_UNHANDLED); + if (retrySyncItem == null || retrySyncItem.getRealValue() == null) { + retryUnhandledErr = true; + } else { + retryUnhandledErr = retrySyncItem.getRealValue(); + } } public boolean isDryRun() { @@ -102,6 +111,14 @@ public boolean isDryRun() { public void setDryRun(boolean dryRun) { this.dryRun = dryRun; } + + public boolean isRetryUnhandledErr() { + return retryUnhandledErr; + } + + public void setRetryUnhandledErr(boolean retryUnhandledErr) { + this.retryUnhandledErr = retryUnhandledErr; + } public String getIntent() { return intent; @@ -198,12 +215,16 @@ public void setResource(TaskAddResourcesDto resource) { resourceObjectRef.setType(ResourceType.COMPLEX_TYPE); rv.add(DeltaBuilder.deltaFor(TaskType.class, prismContext) .item(TaskType.F_OBJECT_REF).replace(resourceObjectRef.asReferenceValue()).asItemDelta()); - } - + } + if (orig.isDryRun() != curr.isDryRun()) { addExtensionDelta(rv, SchemaConstants.MODEL_EXTENSION_DRY_RUN, curr.isDryRun(), prismContext); - } - + } + + if (orig.isRetryUnhandledErr() != curr.isRetryUnhandledErr()) { + addExtensionDelta(rv, SchemaConstants.SYNC_TOKEN_RETRY_UNHANDLED, curr.isRetryUnhandledErr(), prismContext); + } + if (orig.getKind() != curr.getKind()) { addExtensionDelta(rv, SchemaConstants.MODEL_EXTENSION_KIND, curr.getKind(), prismContext); } @@ -240,6 +261,7 @@ public HandlerDtoEditableState getEditableState() { public ResourceRelatedHandlerDto clone() { ResourceRelatedHandlerDto clone = new ResourceRelatedHandlerDto(taskDto); clone.dryRun = dryRun; + clone.retryUnhandledErr = retryUnhandledErr; clone.kind = kind; clone.intent = intent; clone.objectClass = objectClass; diff --git a/gui/admin-gui/src/main/resources/localization/Midpoint.properties b/gui/admin-gui/src/main/resources/localization/Midpoint.properties index 9e56e2cd645..2d970dcd2de 100644 --- a/gui/admin-gui/src/main/resources/localization/Midpoint.properties +++ b/gui/admin-gui/src/main/resources/localization/Midpoint.properties @@ -1944,6 +1944,7 @@ pageTaskEdit.objectType=Object type pageTaskEdit.objectQuery=Object query pageTaskEdit.objectRef=Object reference pageTaskEdit.token=Synchronization token +pageTaskEdit.retryUnhandledErr=Retry unhandled errors pageTaskEdit.resourceRef=Resource reference pageTaskEdit.oid=OID pageTaskEdit.opResult.message=Message diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/constants/SchemaConstants.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/constants/SchemaConstants.java index 4a727e5b060..02164a919a0 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/constants/SchemaConstants.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/constants/SchemaConstants.java @@ -219,6 +219,7 @@ public abstract class SchemaConstants { public static final String NS_PROVISIONING = NS_MIDPOINT_PUBLIC + "/provisioning"; public static final String NS_PROVISIONING_LIVE_SYNC = NS_PROVISIONING + "/liveSync-3"; public static final QName SYNC_TOKEN = new QName(NS_PROVISIONING_LIVE_SYNC, "token"); + // Synchronization constants public static final String NS_PROVISIONING_CHANNEL = NS_PROVISIONING + "/channels-3"; public static final QName CHANGE_CHANNEL_LIVE_SYNC = new QName(NS_PROVISIONING_CHANNEL, "liveSync"); @@ -253,6 +254,7 @@ public abstract class SchemaConstants { NS_MODEL_EXTENSION, "freshnessInterval"); // unused? TODO consider // removing public static final QName MODEL_EXTENSION_DRY_RUN = new QName(NS_MODEL_EXTENSION, "dryRun"); + public static final QName SYNC_TOKEN_RETRY_UNHANDLED = new QName(NS_MODEL_EXTENSION, "retryLiveSyncErrors"); public static final QName MODEL_EXTENSION_FINISH_OPERATIONS_ONLY = new QName(NS_MODEL_EXTENSION, "finishOperationsOnly"); public static final QName MODEL_EXTENSION_KIND = new QName(NS_MODEL_EXTENSION, "kind"); public static final QName MODEL_EXTENSION_INTENT = new QName(NS_MODEL_EXTENSION, "intent"); diff --git a/infra/schema/src/main/resources/xml/ns/public/model/extension-3.xsd b/infra/schema/src/main/resources/xml/ns/public/model/extension-3.xsd index c936189d02f..d3b1046c498 100644 --- a/infra/schema/src/main/resources/xml/ns/public/model/extension-3.xsd +++ b/infra/schema/src/main/resources/xml/ns/public/model/extension-3.xsd @@ -81,6 +81,22 @@ + + + + + Indicates if the LiveSync retries non-handled errors in the next run. Handled-errors are always treated as success and never retried. + Retry is implemented by not refreshing LiveSync token to the new value. If set to false, sync token is always refreshed to the last processed entry. + This is true by default. + + + Dry run + 800 + 0 + 1 + + + diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowCache.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowCache.java index 969afaead34..a92ba9b6d18 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowCache.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowCache.java @@ -1288,8 +1288,17 @@ public int synchronize(ResourceShadowDiscriminator shadowCoordinates, PrismPrope continue; } boolean isSuccess = processSynchronization(shadowCtx, change, parentResult); - - if (isSuccess) { + + boolean retryUnhandledError = true; + if (task.getExtension() != null) { + PrismProperty tokenRetryUnhandledErrProperty = task.getExtensionProperty(SchemaConstants.SYNC_TOKEN_RETRY_UNHANDLED); + + if (tokenRetryUnhandledErrProperty != null) { + retryUnhandledError = (boolean) tokenRetryUnhandledErrProperty.getRealValue(); + } + } + + if (!retryUnhandledError || isSuccess) { // // get updated token from change, // // create property modification from new token // // and replace old token with the new one