From 46dc660d017dfe33081442b978f92ec70554e76f Mon Sep 17 00:00:00 2001 From: Viliam Repan Date: Fri, 19 Jun 2015 19:51:24 +0200 Subject: [PATCH] MID-2413 shadow filtering/delete on debug pages --- .../admin/configuration/PageDebugList.html | 7 + .../admin/configuration/PageDebugList.java | 156 +++++++++++++++--- .../configuration/PageDebugList.properties | 6 +- .../configuration/dto/DebugConfDialogDto.java | 2 +- .../configuration/dto/DebugSearchDto.java | 11 ++ .../admin/resources/PageAdminResources.java | 32 ++-- .../midpoint/prism/query/RefFilter.java | 2 +- 7 files changed, 172 insertions(+), 44 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugList.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugList.html index d9241b71d0a..09ec5706c03 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugList.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugList.html @@ -28,6 +28,13 @@ + + +
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 52d5d85daed..8c44fd275d7 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 @@ -47,12 +47,14 @@ import com.evolveum.midpoint.web.component.dialog.DeleteAllDto; import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItem; import com.evolveum.midpoint.web.component.util.LoadableModel; +import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; import com.evolveum.midpoint.web.page.admin.configuration.component.DebugButtonPanel; import com.evolveum.midpoint.web.page.admin.configuration.component.HeaderMenuAction; import com.evolveum.midpoint.web.page.admin.configuration.component.PageDebugDownloadBehaviour; import com.evolveum.midpoint.web.page.admin.configuration.dto.DebugConfDialogDto; import com.evolveum.midpoint.web.page.admin.configuration.dto.DebugObjectItem; import com.evolveum.midpoint.web.page.admin.configuration.dto.DebugSearchDto; +import com.evolveum.midpoint.web.page.admin.dto.ObjectViewDto; import com.evolveum.midpoint.web.session.ConfigurationStorage; import com.evolveum.midpoint.web.session.UserProfileStorage; import com.evolveum.midpoint.web.util.ObjectTypeGuiDescriptor; @@ -96,6 +98,8 @@ public class PageDebugList extends PageAdminConfiguration { private static final String OPERATION_LAXATIVE_DELETE = DOT_CLASS + "laxativeDelete"; + private static final String OPERATION_LOAD_RESOURCES = DOT_CLASS + "loadResources"; + private static final String ID_CONFIRM_DELETE_POPUP = "confirmDeletePopup"; private static final String ID_MAIN_FORM = "mainForm"; private static final String ID_ZIP_CHECK = "zipCheck"; @@ -106,6 +110,7 @@ public class PageDebugList extends PageAdminConfiguration { private static final String ID_SEARCH_FORM = "searchForm"; private static final String ID_BASIC_SEARCH = "basicSearch"; private static final String ID_DELETE_ALL_DIALOG = "confirmDeleteAll"; + private static final String ID_RESOURCE = "resource"; private static final Integer DELETE_LOG_INTERVAL = 50; @@ -113,6 +118,7 @@ public class PageDebugList extends PageAdminConfiguration { private IModel searchModel; // confirmation dialog model private IModel confDialogModel; + private IModel> resourcesModel; private int objectsDeleted = 0; @@ -138,10 +144,45 @@ protected DebugConfDialogDto load() { } }; + resourcesModel= new LoadableModel>() { + + @Override + protected List load() { + return loadResources(); + } + }; + getSessionStorage().clearPagingInSession(clearPagingInSession); initLayout(); } + private List loadResources() { + List objects = new ArrayList<>(); + + try { + OperationResult result = new OperationResult(OPERATION_LOAD_RESOURCES); + List> list = WebModelUtils.searchObjects(ResourceType.class, null, + SelectorOptions.createCollection(GetOperationOptions.createRaw()), result, this, null); + + for (PrismObject obj : list) { + ObjectViewDto dto = new ObjectViewDto(obj.getOid(), WebMiscUtil.getName(obj)); + objects.add(dto); + } + } catch (Exception ex) { + //todo implement error handling + } + + Collections.sort(objects, new Comparator() { + + @Override + public int compare(ObjectViewDto o1, ObjectViewDto o2) { + return String.CASE_INSENSITIVE_ORDER.compare(o1.getName(), o2.getName()); + } + }); + + return objects; + } + private void initLayout() { DeleteAllDialog deleteAllDialog = new DeleteAllDialog(ID_DELETE_ALL_DIALOG, createStringResource("pageDebugList.dialog.title.deleteAll")){ @@ -380,6 +421,24 @@ public void onSubmit(AjaxRequestTarget target, Form form) { // } // })); + 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()); + } + + }, false, new HeaderMenuAction(this) { + + @Override + public void onClick(AjaxRequestTarget target) { + deleteAllShadowsOnResource(target); + } + })); + headerMenuItems.add(new InlineMenuItem()); headerMenuItems.add(new InlineMenuItem(createStringResource("pageDebugList.menu.deleteAllIdentities"), true, @@ -399,7 +458,25 @@ private boolean hasToZip() { return zipCheck.getModelObject(); } - private void initSearchForm(Form searchForm) { + private IChoiceRenderer createResourceRenderer() { + return new IChoiceRenderer() { + + @Override + public Object getDisplayValue(ObjectViewDto object) { + if (object == null) { + return getString("pageDebugList.resource"); + } + return object.getName(); + } + + @Override + public String getIdValue(ObjectViewDto object, int index) { + return Integer.toString(index); + } + }; + } + + private void initSearchForm(final Form searchForm) { IChoiceRenderer renderer = new IChoiceRenderer() { @Override @@ -423,10 +500,24 @@ public String getIdValue(ObjectTypes object, int index) { @Override protected void onUpdate(AjaxRequestTarget target) { + target.add(searchForm); listObjectsPerformed(target); } }); + DropDownChoice resource = new DropDownChoice(ID_RESOURCE, new PropertyModel(searchModel, DebugSearchDto.F_RESOURCE_OID), + resourcesModel, createResourceRenderer()); + resource.setNullValid(true); + resource.add(new VisibleEnableBehaviour() { + + @Override + public boolean isVisible() { + DebugSearchDto dto = searchModel.getObject(); + return ObjectTypes.SHADOW.equals(dto.getType()); + } + }); + searchForm.add(resource); + BasicSearchPanel basicSearch = new BasicSearchPanel(ID_BASIC_SEARCH) { @Override @@ -498,21 +589,34 @@ private void listObjectsPerformed(AjaxRequestTarget target) { private ObjectQuery createQuery(){ DebugSearchDto dto = searchModel.getObject(); - String nameText = dto.getText(); - ObjectQuery query = new ObjectQuery(); - if (StringUtils.isNotEmpty(nameText)) { - PolyStringNormalizer normalizer = getPrismContext().getDefaultPolyStringNormalizer(); - String normalizedString = normalizer.normalize(nameText); + List filters = new ArrayList<>(); + if (dto.getResource() != null) { + String oid = dto.getResource().getOid(); + RefFilter ref = RefFilter.createReferenceEqual(ShadowType.F_RESOURCE_REF, ShadowType.class, + getPrismContext(), oid); + filters.add(ref); + } + + if (StringUtils.isNotEmpty(dto.getText())) { + String nameText = dto.getText(); + PolyStringNormalizer normalizer = getPrismContext().getDefaultPolyStringNormalizer(); + String normalizedString = normalizer.normalize(nameText); - ObjectFilter substring = SubstringFilter.createSubstring(ObjectType.F_NAME, ObjectType.class, getPrismContext(), - PolyStringNormMatchingRule.NAME, normalizedString); - query.setFilter(substring); + ObjectFilter substring = SubstringFilter.createSubstring(ObjectType.F_NAME, ObjectType.class, + getPrismContext(), PolyStringNormMatchingRule.NAME, normalizedString); + filters.add(substring); + } - return query; + if (filters.isEmpty()) { + return null; } - return null; + ObjectFilter filter = filters.size() > 1 ? AndFilter.createAnd(filters) : filters.get(0); + ObjectQuery query = new ObjectQuery(); + query.setFilter(filter); + + return query; } private void objectEditPerformed(AjaxRequestTarget target, String oid, Class type) { @@ -776,20 +880,28 @@ private void deleteSelectedConfirmed(AjaxRequestTarget target, List> taskList = WebModelUtils.searchObjects(TaskType.class, query, - result, this); + query = new ObjectQuery(); + query.setFilter(AndFilter.createAnd(refFilter, filterHandleUri)); - if(taskList.size() != 1){ - error(getString("pageResource.message.invalidTaskSearch")); - } else { - oldTask = taskList.get(0); - saveTask(oldTask, result); - } + List> taskList = WebModelUtils.searchObjects(TaskType.class, query, + result, this); - }catch (SchemaException e){ - LoggingUtils.logException(LOGGER, "Couldn't create reference query for task.", e); - error("Couldn't create reference query for task." + e.getMessage()); + if(taskList.size() != 1){ + error(getString("pageResource.message.invalidTaskSearch")); + } else { + oldTask = taskList.get(0); + saveTask(oldTask, result); } result.recomputeStatus(); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/RefFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/RefFilter.java index 91ff1af2fd2..ae52b632c7f 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/RefFilter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/RefFilter.java @@ -91,7 +91,7 @@ public static RefFilter createReferenceEqual(ItemPath path, PrismReferenceDefini // beware, creating reference with (oid, ObjectType) may result in not matching a concrete reference of e.g. (oid, RoleType) public static RefFilter createReferenceEqual(QName propertyName, Class type, PrismContext prismContext, - String... oids) throws SchemaException { + String... oids) { ItemPath path = new ItemPath(propertyName); PrismReferenceDefinition refDefinition = (PrismReferenceDefinition) findItemDefinition(path, type, prismContext); return createReferenceEqual(path, refDefinition, oids);