From 449b33ef86701a46fee0d3bc7dc7c76b292d06ff Mon Sep 17 00:00:00 2001 From: Viliam Repan Date: Thu, 25 Jun 2015 14:21:27 +0200 Subject: [PATCH] more work on laxative deletes --- .../admin/configuration/PageDebugList.java | 149 ++++++++---------- 1 file changed, 70 insertions(+), 79 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugList.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugList.java index 0ffbff54332..04807e9bdb5 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugList.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugList.java @@ -37,6 +37,9 @@ import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.task.api.TaskManager; import com.evolveum.midpoint.util.DOMUtil; +import com.evolveum.midpoint.util.exception.ObjectAlreadyExistsException; +import com.evolveum.midpoint.util.exception.ObjectNotFoundException; +import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.logging.LoggingUtils; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; @@ -204,36 +207,7 @@ private void initLayout() { public void yesPerformed(AjaxRequestTarget target) { close(target); - Collection> options = new ArrayList<>(); - GetOperationOptions opt = GetOperationOptions.createRaw(); - options.add(SelectorOptions.create(ItemPath.EMPTY_PATH, opt)); - - Task task = createSimpleTask(OPERATION_LAXATIVE_DELETE); - OperationResult result = new OperationResult(OPERATION_LAXATIVE_DELETE); - - objectsDeleted = 0; - DeleteAllDto dto = getModel().getObject(); - - if(dto.getDeleteUsers()){ - deleteAllUsers(task, result, options); - } - if(dto.getDeleteOrgs()){ - deleteAllOrgUnits(task, result, options); - } - if(dto.getDeleteAccountShadow()){ - deleteAllAccountShadows(task, result, options, true); - } - if(dto.getDeleteNonAccountShadow()){ - deleteAllAccountShadows(task, result, options, false); - } - - LOGGER.info("Deleted {} out of {} objects.", objectsDeleted, getObjectsToDelete()); - - target.add(getListTable()); - target.add(getFeedbackPanel()); - - result.recomputeStatus(); - showResult(result); + deleteAllIdentitiesConfirmed(target, getModel().getObject()); } }; add(deleteAllDialog); @@ -689,6 +663,38 @@ public String getObject() { }; } + private void deleteAllIdentitiesConfirmed(AjaxRequestTarget target,DeleteAllDto dto) { + Collection> options = new ArrayList<>(); + GetOperationOptions opt = GetOperationOptions.createRaw(); + options.add(SelectorOptions.create(ItemPath.EMPTY_PATH, opt)); + + Task task = createSimpleTask(OPERATION_LAXATIVE_DELETE); + OperationResult result = new OperationResult(OPERATION_LAXATIVE_DELETE); + + objectsDeleted = 0; + + if(dto.getDeleteUsers()){ + deleteAllUsers(task, result, options); + } + if(dto.getDeleteOrgs()){ + deleteAllOrgUnits(task, result, options); + } + if(dto.getDeleteAccountShadow()){ + deleteAllAccountShadows(task, result, options, true); + } + if(dto.getDeleteNonAccountShadow()){ + deleteAllAccountShadows(task, result, options, false); + } + + LOGGER.info("Deleted {} out of {} objects.", objectsDeleted, getObjectsToDelete()); + + target.add(getListTable()); + target.add(getFeedbackPanel()); + + result.recomputeStatus(); + showResult(result); + } + private void deleteAllUsers(Task task, final OperationResult result, Collection> options){ ResultHandler userHandler = new ResultHandler() { @@ -726,34 +732,8 @@ public boolean handle(PrismObject object, OperationResult parentResult) { } private void deleteAllOrgUnits(Task task, final OperationResult result, Collection> options){ - ResultHandler userHandler = new ResultHandler() { - - @Override - public boolean handle(PrismObject object, OperationResult parentResult) { - ObjectDelta delta = ObjectDelta.createDeleteDelta(OrgType.class, object.asObjectable().getOid(), getPrismContext()); - Task task = createSimpleTask(OPERATION_LAXATIVE_DELETE); - OperationResult r = result.createMinorSubresult(OPERATION_LAXATIVE_DELETE); - - try { - getModelService().executeChanges(WebMiscUtil.createDeltaCollection(delta), ModelExecuteOptions.createRaw(), task, r); - objectsDeleted++; - - if (objectsDeleted % DELETE_LOG_INTERVAL == 0) - LOGGER.info("Deleted {} out of {} objects.", objectsDeleted, getObjectsToDelete()); - - r.recordSuccess(); - } catch (Exception ex) { - r.computeStatus(getString("pageDebugList.message.singleOrgDeleteProblem")); - LoggingUtils.logException(LOGGER, getString("pageDebugList.message.singleOrgDeleteProblem"), ex); - } - parentResult.addSubresult(r); - - return true; - } - }; - try { - getModelService().searchObjectsIterative(OrgType.class, null, userHandler, options, task, result); + deleteObjectsAsync(OrgType.COMPLEX_TYPE, null, result); } catch (Exception ex) { result.computeStatus(getString("pageDebugList.message.laxativeProblem")); LoggingUtils.logException(LOGGER, getString("pageDebugList.message.laxativeProblem"), ex); @@ -879,7 +859,6 @@ private void deleteSelected(AjaxRequestTarget target, DebugObjectItem item) { private void deleteAllIdentities(AjaxRequestTarget target) { DeleteAllDialog dialog = (DeleteAllDialog) get(ID_DELETE_ALL_DIALOG); -// dialog.getModel().setObject(dialog.createMessage()); dialog.show(target); } @@ -940,33 +919,14 @@ private void deleteAllShadowsOnResourceConfirmed(AjaxRequestTarget target) { OperationResult result = new OperationResult(OPERATION_DELETE_SHADOWS); try { - Task task = createSimpleTask(OPERATION_DELETE_SHADOWS); - // toto this should be a constant referenced from somewhere - task.setHandlerUri("http://midpoint.evolveum.com/xml/ns/public/model/synchronization/task/delete/handler-3"); - RefFilter ref = RefFilter.createReferenceEqual(ShadowType.F_RESOURCE_REF, ShadowType.class, getPrismContext(), dto.getResource().getOid()); ObjectQuery objectQuery = new ObjectQuery(); objectQuery.setFilter(ref); - QueryType query = QueryJaxbConvertor.createQueryType(objectQuery, getPrismContext()); - QName type = ShadowType.COMPLEX_TYPE; - - PrismPropertyDefinition queryDef = new PrismPropertyDefinition(SchemaConstants.MODEL_EXTENSION_OBJECT_QUERY, - QueryType.COMPLEX_TYPE, getPrismContext()); - PrismProperty queryProp = queryDef.instantiate(); - queryProp.setRealValue(query); - task.setExtensionProperty(queryProp); - - PrismPropertyDefinition typeDef = new PrismPropertyDefinition(SchemaConstants.MODEL_EXTENSION_OBJECT_TYPE, - DOMUtil.XSD_QNAME, getPrismContext()); - PrismProperty typeProp = typeDef.instantiate(); - typeProp.setRealValue(type); - task.setExtensionProperty(typeProp); - task.savePendingModifications(result); + QName type = ShadowType.COMPLEX_TYPE; - TaskManager taskManager = getTaskManager(); - taskManager.switchToBackground(task, result); + deleteObjectsAsync(type, objectQuery, result); info(getString("pageDebugList.messsage.deleteAllShadowsStarted", dto.getResource().getName())); } catch (Exception ex) { @@ -979,4 +939,35 @@ private void deleteAllShadowsOnResourceConfirmed(AjaxRequestTarget target) { showResult(result); target.add(getFeedbackPanel()); } + + private void deleteObjectsAsync(QName type, ObjectQuery objectQuery, OperationResult result) + throws SchemaException, ObjectAlreadyExistsException, ObjectNotFoundException { + + Task task = createSimpleTask(result.getOperation()); + // toto this should be a constant referenced from somewhere + task.setHandlerUri("http://midpoint.evolveum.com/xml/ns/public/model/synchronization/task/delete/handler-3"); + + if (objectQuery == null) { + objectQuery = new ObjectQuery(); + } + + QueryType query = QueryJaxbConvertor.createQueryType(objectQuery, getPrismContext());; + + PrismPropertyDefinition queryDef = new PrismPropertyDefinition(SchemaConstants.MODEL_EXTENSION_OBJECT_QUERY, + QueryType.COMPLEX_TYPE, getPrismContext()); + PrismProperty queryProp = queryDef.instantiate(); + queryProp.setRealValue(query); + task.setExtensionProperty(queryProp); + + PrismPropertyDefinition typeDef = new PrismPropertyDefinition(SchemaConstants.MODEL_EXTENSION_OBJECT_TYPE, + DOMUtil.XSD_QNAME, getPrismContext()); + PrismProperty typeProp = typeDef.instantiate(); + typeProp.setRealValue(type); + task.setExtensionProperty(typeProp); + + task.savePendingModifications(result); + + TaskManager taskManager = getTaskManager(); + taskManager.switchToBackground(task, result); + } }