diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdmin.properties b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdmin.properties index 6e7094c1dcc..8df400ec3d4 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdmin.properties +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdmin.properties @@ -71,6 +71,7 @@ pageTasks.category.ImportFromFile=Import from file pageTasks.category.ImportingAccounts=Importing accounts pageTasks.category.LiveSynchronization=Live synchronization pageTasks.category.Reconciliation=Reconciliation +pageTasks.category.Utility=Utility #legacy pageTasks.category.UserRecomputation=User recomputation pageTasks.category.Recomputation=Recomputation 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 04807e9bdb5..feebf8bdf3d 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 @@ -20,19 +20,15 @@ import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismProperty; import com.evolveum.midpoint.prism.PrismPropertyDefinition; -import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.match.PolyStringNormMatchingRule; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyStringNormalizer; import com.evolveum.midpoint.prism.query.*; import com.evolveum.midpoint.schema.GetOperationOptions; -import com.evolveum.midpoint.schema.ResultHandler; import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.constants.ObjectTypes; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; -import com.evolveum.midpoint.schema.util.ObjectQueryUtil; -import com.evolveum.midpoint.schema.util.ObjectTypeUtil; import com.evolveum.midpoint.security.api.AuthorizationConstants; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.task.api.TaskManager; @@ -71,11 +67,9 @@ import com.evolveum.midpoint.web.util.WebMiscUtil; import com.evolveum.midpoint.web.util.WebModelUtils; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; - import com.evolveum.prism.xml.ns._public.query_3.QueryType; import org.apache.commons.lang.StringUtils; import org.apache.wicket.ajax.AjaxRequestTarget; -import org.apache.wicket.ajax.form.AjaxFormChoiceComponentUpdatingBehavior; import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior; import org.apache.wicket.ajax.form.OnChangeAjaxBehavior; import org.apache.wicket.ajax.markup.html.form.AjaxCheckBox; @@ -92,7 +86,6 @@ import org.apache.wicket.markup.repeater.Item; import org.apache.wicket.model.*; import org.apache.wicket.request.mapper.parameter.PageParameters; -import org.springframework.beans.factory.annotation.Autowired; import javax.xml.namespace.QName; import java.util.*; @@ -136,9 +129,7 @@ public class PageDebugList extends PageAdminConfiguration { private IModel confDialogModel; private IModel> resourcesModel; - private int objectsDeleted = 0; - - public PageDebugList(){ + public PageDebugList() { this(true); } @@ -160,7 +151,7 @@ protected DebugConfDialogDto load() { } }; - resourcesModel= new LoadableModel>() { + resourcesModel = new LoadableModel>() { @Override protected List load() { @@ -201,7 +192,7 @@ public int compare(ObjectViewDto o1, ObjectViewDto o2) { private void initLayout() { DeleteAllDialog deleteAllDialog = new DeleteAllDialog(ID_DELETE_ALL_DIALOG, - createStringResource("pageDebugList.dialog.title.deleteAll")){ + createStringResource("pageDebugList.dialog.title.deleteAll")) { @Override public void yesPerformed(AjaxRequestTarget target) { @@ -234,7 +225,7 @@ public void yesPerformed(AjaxRequestTarget target) { } @Override - public boolean getLabelEscapeModelStrings(){ + public boolean getLabelEscapeModelStrings() { return false; } }; @@ -250,7 +241,7 @@ public boolean getLabelEscapeModelStrings(){ DebugSearchDto dto = searchModel.getObject(); Class type = dto.getType().getClassDefinition(); - addOrReplaceTable(new RepositoryObjectDataProvider(this, type){ + addOrReplaceTable(new RepositoryObjectDataProvider(this, type) { @Override protected void saveProviderPaging(ObjectQuery query, ObjectPaging paging) { @@ -402,26 +393,26 @@ public void onSubmit(AjaxRequestTarget target, Form form) { } })); -// headerMenuItems.add(new InlineMenuItem(createStringResource("pageDebugList.menu.deleteAllType"), true, -// new HeaderMenuAction(this) { -// -// @Override -// public void onSubmit(AjaxRequestTarget target, Form form) { -// deleteAllType(target); -// } -// })); + headerMenuItems.add(new InlineMenuItem(createStringResource("pageDebugList.menu.deleteAllType"), true, + new HeaderMenuAction(this) { + + @Override + public void onSubmit(AjaxRequestTarget target, Form form) { + deleteAllType(target); + } + })); headerMenuItems.add(new InlineMenuItem(createStringResource("pageDebugList.menu.deleteShadowsOnResource"), new Model(true), new AbstractReadOnlyModel() { - @Override - public Boolean getObject() { - DebugSearchDto dto = searchModel.getObject(); - return ObjectTypes.SHADOW.equals(dto.getType()); - } + @Override + public Boolean getObject() { + DebugSearchDto dto = searchModel.getObject(); + return ObjectTypes.SHADOW.equals(dto.getType()); + } - }, false, new HeaderMenuAction(this) { + }, false, new HeaderMenuAction(this) { @Override public void onClick(AjaxRequestTarget target) { @@ -584,7 +575,7 @@ private void listObjectsPerformed(AjaxRequestTarget target) { target.add(table); } - private ObjectQuery createQuery(){ + private ObjectQuery createQuery() { DebugSearchDto dto = searchModel.getObject(); List filters = new ArrayList<>(); @@ -663,130 +654,58 @@ public String getObject() { }; } - private void deleteAllIdentitiesConfirmed(AjaxRequestTarget target,DeleteAllDto dto) { + 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); + try { + if (dto.getDeleteUsers()) { + ObjectQuery query = createDeleteAllUsersQuery(); + deleteObjectsAsync(UserType.COMPLEX_TYPE, query, true, result); + } + if (dto.getDeleteOrgs()) { + deleteObjectsAsync(OrgType.COMPLEX_TYPE, null, true, result); + } + if (dto.getDeleteAccountShadow()) { + deleteAllShadowsConfirmed(result, true); + } + if (dto.getDeleteNonAccountShadow()) { + deleteAllShadowsConfirmed(result, false); + } + } catch (Exception ex) { + result.computeStatus(getString("pageDebugList.message.laxativeProblem")); + LoggingUtils.logException(LOGGER, getString("pageDebugList.message.laxativeProblem"), ex); } - 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() { - - @Override - public boolean handle(PrismObject object, OperationResult parentResult) { - if (!SystemObjectsType.USER_ADMINISTRATOR.value().equals(object.asObjectable().getOid())) { - ObjectDelta delta = ObjectDelta.createDeleteDelta(UserType.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.singleUserDeleteProblem")); - LoggingUtils.logException(LOGGER, getString("pageDebugList.message.singleUserDeleteProblem"), ex); - } - parentResult.addSubresult(r); - } - return true; - } - }; - - try { - getModelService().searchObjectsIterative(UserType.class, null, userHandler, options, task, result); - } catch (Exception ex) { - result.computeStatus(getString("pageDebugList.message.laxativeProblem")); - LoggingUtils.logException(LOGGER, getString("pageDebugList.message.laxativeProblem"), ex); - } - } + private ObjectQuery createDeleteAllUsersQuery() { + InOidFilter inOid = InOidFilter.createInOid(SystemObjectsType.USER_ADMINISTRATOR.value()); + NotFilter not = new NotFilter(inOid); - private void deleteAllOrgUnits(Task task, final OperationResult result, Collection> options){ - try { - deleteObjectsAsync(OrgType.COMPLEX_TYPE, null, result); - } catch (Exception ex) { - result.computeStatus(getString("pageDebugList.message.laxativeProblem")); - LoggingUtils.logException(LOGGER, getString("pageDebugList.message.laxativeProblem"), ex); - } + return ObjectQuery.createObjectQuery(not); } - private void deleteAllAccountShadows(Task task, final OperationResult result, Collection> options, - boolean deleteAccountShadows){ - ResultHandler shadowHandler = new ResultHandler() { + private void deleteAllShadowsConfirmed(OperationResult result, boolean deleteAccountShadows) + throws ObjectAlreadyExistsException, ObjectNotFoundException, SchemaException { - @Override - public boolean handle(PrismObject object, OperationResult parentResult) { - ObjectDelta delta = ObjectDelta.createDeleteDelta(ShadowType.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.singleShadowDeleteProblem")); - LoggingUtils.logException(LOGGER, getString("pageDebugList.message.singleShadowDeleteProblem"), ex); - } - parentResult.addSubresult(r); - return true; - } - }; + ObjectFilter kind = EqualFilter.createEqual(ShadowType.F_KIND, ShadowType.class, + getPrismContext(), null, ShadowKindType.ACCOUNT); - try { - if(deleteAccountShadows){ - ObjectFilter filter = EqualFilter.createEqual(ShadowType.F_KIND, ShadowType.class, getPrismContext(), null, ShadowKindType.ACCOUNT); - ObjectQuery query = ObjectQuery.createObjectQuery(filter); - getModelService().searchObjectsIterative(ShadowType.class, query, shadowHandler, options, task, result); - } else { - ObjectFilter filter = EqualFilter.createEqual(ShadowType.F_KIND, ShadowType.class, getPrismContext(), null, ShadowKindType.ACCOUNT); - ObjectQuery query = ObjectQuery.createObjectQuery(NotFilter.createNot(filter)); - getModelService().searchObjectsIterative(ShadowType.class, query, shadowHandler, options, task, result); - } - - } catch (Exception ex) { - result.computeStatus(getString("pageDebugList.message.laxativeProblem")); - LoggingUtils.logException(LOGGER, getString("pageDebugList.message.laxativeProblem"), ex); + ObjectQuery query; + if (deleteAccountShadows) { + query = ObjectQuery.createObjectQuery(kind); + } else { + query = ObjectQuery.createObjectQuery(NotFilter.createNot(kind)); } - } - private int getObjectsToDelete(){ - DeleteAllDialog dialog = (DeleteAllDialog)get(ID_DELETE_ALL_DIALOG); - return dialog.getObjectsToDelete(); + deleteObjectsAsync(ShadowType.COMPLEX_TYPE, query, true, result); } private void exportSelected(AjaxRequestTarget target, DebugObjectItem item) { @@ -863,8 +782,30 @@ private void deleteAllIdentities(AjaxRequestTarget target) { } private void deleteAllTypeConfirmed(AjaxRequestTarget target) { - //todo implement [lazyman] as background task... - warn("Not implemented yet, will be implemented as background task."); + DebugSearchDto dto = searchModel.getObject(); + + LOGGER.debug("Deleting all of type {}", dto.getType()); + + OperationResult result = new OperationResult(OPERATION_DELETE_OBJECTS); + try { + ObjectQuery query = null; + if (ObjectTypes.USER.equals(dto.getType())) { + query = createDeleteAllUsersQuery(); + } + + QName type = dto.getType().getTypeQName(); + + deleteObjectsAsync(type, query, true, result); + + info(getString("pageDebugList.messsage.deleteAllOfType", dto.getType())); + } catch (Exception ex) { + result.recomputeStatus(); + result.recordFatalError("Couldn't delete objects of type " + dto.getType(), ex); + + LoggingUtils.logException(LOGGER, "Couldn't delete objects of type " + dto.getType(), ex); + } + + showResult(result); target.add(getFeedbackPanel()); } @@ -885,7 +826,7 @@ private void deleteSelectedConfirmed(AjaxRequestTarget target, List rawProp = rawDef.instantiate(); + rawProp.setRealValue(raw); + task.setExtensionProperty(rawProp); + task.savePendingModifications(result); TaskManager taskManager = getTaskManager(); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugList.properties b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugList.properties index a7b05c8b0f1..cdabf470d12 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugList.properties +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugList.properties @@ -49,4 +49,5 @@ resource.nullValid=Choose resource... pageDebugList.menu.deleteShadowsOnResource=Delete all shadows on resource pageDebugList.message.resourceNotSelected=Resource not selected. pageDebugList.messsage.deleteAllResourceShadows=Do your really want to delete all shadows on resource {0}? -pageDebugList.messsage.deleteAllShadowsStarted=Task which deletes all shadows on resource {0} was started. \ No newline at end of file +pageDebugList.messsage.deleteAllShadowsStarted=Task which deletes all shadows on resource {0} was started. +pageDebugList.messsage.deleteAllOfType=Deleting objects of type {0}. \ No newline at end of file diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/QueryConvertor.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/QueryConvertor.java index aa5eab9a51a..e86bb7ac8b6 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/QueryConvertor.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/QueryConvertor.java @@ -666,12 +666,15 @@ public static MapXNode serializeFilter(ObjectFilter filter, XNodeSerializer xnod if (filter instanceof NoneFilter) { return serializeNoneFilter((NoneFilter) filter, xnodeSerializer); } - if (filter instanceof AllFilter) { return serializeAllFilter((AllFilter) filter, xnodeSerializer); } + if (filter instanceof InOidFilter) { + return serializeInOidFilter((InOidFilter) filter, xnodeSerializer); + } + throw new UnsupportedOperationException("Unsupported filter type: " + filter); } @@ -703,8 +706,22 @@ private static MapXNode serializeNotFilter(NotFilter filter, XNodeSerializer xno return map; } - private static MapXNode serializeEqualsFilter(EqualFilter filter, XNodeSerializer xnodeSerializer) throws SchemaException{ + private static MapXNode serializeInOidFilter(InOidFilter filter, XNodeSerializer xnodeSerializer) throws SchemaException { + MapXNode map = new MapXNode(); + ListXNode valuesNode = new ListXNode(); + for (String oid : filter.getOids()) { + XNode val = createPrimitiveXNode(oid, DOMUtil.XSD_STRING); + valuesNode.add(val); + } + map.put(KEY_FILTER_IN_OID, valuesNode); + + //todo expression??? + + return map; + } + + private static MapXNode serializeEqualsFilter(EqualFilter filter, XNodeSerializer xnodeSerializer) throws SchemaException{ MapXNode map = new MapXNode(); map.put(KEY_FILTER_EQUAL, serializeValueFilter(filter, xnodeSerializer)); return map;