From 130a4411b1edcc9b07172ff701d92a9d090a3391 Mon Sep 17 00:00:00 2001 From: Erik Suta Date: Thu, 17 Jul 2014 15:00:21 +0200 Subject: [PATCH] MID-1912 - several GUI improvements for gen sync in pageShadowDetails and pageAccountContents + complex search in shadows. Improving searches in several other pages. --- .../admin/configuration/PageAccounts.html | 52 ++- .../admin/configuration/PageAccounts.java | 397 +++++++++++++++++- .../configuration/PageAccounts.properties | 11 +- .../dto/AccountDetailsSearchDto.java | 80 ++++ .../web/page/admin/reports/PageReports.java | 29 +- .../content/PageContentAccounts.java | 14 +- .../content/PageContentAccounts.properties | 3 + .../dto/AccountContentDataProvider.java | 5 + .../content/dto/AccountContentDto.java | 39 ++ .../web/page/admin/roles/PageRoles.java | 56 +-- .../web/session/ConfigurationStorage.java | 34 ++ 11 files changed, 640 insertions(+), 80 deletions(-) create mode 100644 gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/dto/AccountDetailsSearchDto.java diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageAccounts.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageAccounts.html index 4e4197585c6..8358c45d547 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageAccounts.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageAccounts.html @@ -16,9 +16,29 @@ --> + + + + + + -
+
@@ -68,17 +88,36 @@

+ + +

+ +
+
+ + +
-

+
+ + +
+ +
+ + +
- - - -
+
@@ -89,6 +128,7 @@

+ \ No newline at end of file diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageAccounts.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageAccounts.java index f41abdcee24..82f38328417 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageAccounts.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageAccounts.java @@ -19,10 +19,15 @@ import com.evolveum.midpoint.common.configuration.api.MidpointConfiguration; import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition; import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; +import com.evolveum.midpoint.prism.Definition; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; +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.*; +import com.evolveum.midpoint.schema.processor.ResourceSchema; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.security.api.AuthorizationConstants; import com.evolveum.midpoint.task.api.Task; @@ -32,37 +37,46 @@ import com.evolveum.midpoint.web.application.AuthorizationAction; import com.evolveum.midpoint.web.application.PageDescriptor; import com.evolveum.midpoint.web.component.AjaxDownloadBehaviorFromFile; +import com.evolveum.midpoint.web.component.BasicSearchPanel; import com.evolveum.midpoint.web.component.data.ObjectDataProvider; import com.evolveum.midpoint.web.component.data.TablePanel; import com.evolveum.midpoint.web.component.util.LoadableModel; import com.evolveum.midpoint.web.component.util.SelectableBean; import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; +import com.evolveum.midpoint.web.page.admin.configuration.dto.AccountDetailsSearchDto; import com.evolveum.midpoint.web.page.admin.home.PageDashboard; import com.evolveum.midpoint.web.page.admin.configuration.dto.ResourceItemDto; +import com.evolveum.midpoint.web.session.ConfigurationStorage; import com.evolveum.midpoint.web.session.UserProfileStorage; import com.evolveum.midpoint.web.util.WebMiscUtil; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowKindType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.SynchronizationSituationType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import org.apache.commons.io.IOUtils; +import org.apache.commons.lang.StringUtils; +import org.apache.wicket.AttributeModifier; +import org.apache.wicket.Component; import org.apache.wicket.RestartResponseException; import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.ajax.form.OnChangeAjaxBehavior; import org.apache.wicket.ajax.markup.html.AjaxLink; import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink; +import org.apache.wicket.extensions.ajax.markup.html.autocomplete.AutoCompleteTextField; +import org.apache.wicket.extensions.markup.html.repeater.data.table.DataTable; import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn; import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; -import org.apache.wicket.markup.html.form.DropDownChoice; -import org.apache.wicket.markup.html.form.Form; -import org.apache.wicket.markup.html.form.IChoiceRenderer; +import org.apache.wicket.markup.html.form.*; import org.apache.wicket.markup.html.list.ListItem; import org.apache.wicket.markup.html.list.ListView; +import org.apache.wicket.model.AbstractReadOnlyModel; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; +import org.apache.wicket.model.PropertyModel; import org.apache.wicket.util.file.File; +import org.apache.wicket.util.string.Strings; +import org.apache.wicket.validation.IValidatable; +import org.apache.wicket.validation.IValidator; import javax.xml.namespace.QName; @@ -87,8 +101,11 @@ public class PageAccounts extends PageAdminConfiguration { private static final String OPERATION_EXPORT = DOT_CLASS + "export"; private static final String OPERATION_EXPORT_ACCOUNT = DOT_CLASS + "exportAccount"; private static final String OPERATION_GET_TOTALS = DOT_CLASS + "getTotals"; + private static final String OPERATION_GET_INTENTS = DOT_CLASS + "getResourceIntentList"; + private static final String OPERATION_GET_OBJECT_CLASS = DOT_CLASS + "getResourceObjectClassList"; private static final String ID_MAIN_FORM = "mainForm"; + private static final String ID_FORM_ACCOUNT = "accountForm"; private static final String ID_RESOURCES = "resources"; private static final String ID_LIST_SYNC_DETAILS = "listSyncDetails"; private static final String ID_EXPORT = "export"; @@ -107,9 +124,17 @@ public class PageAccounts extends PageAdminConfiguration { private static final String ID_UNLINKED = "unlinked"; private static final String ID_ACCOUNTS_CONTAINER = "accountsContainer"; private static final String ID_NOTHING = "nothing"; + private static final String ID_SEARCH_FORM = "searchForm"; + private static final String ID_SEARCH_KIND = "kindSearch"; + private static final String ID_SEARCH_INTENT = "intentSearch"; + private static final String ID_SEARCH_OBJECT_CLASS = "objectClassSearch"; + private static final String ID_SEARCH_BASIC = "basicSearch"; + + private static final Integer AUTO_COMPLETE_LIST_SIZE = 10; private IModel> resourcesModel; private LoadableModel> filesModel; + private IModel searchModel; private IModel resourceModel = new Model(); private LoadableModel totalModel; @@ -123,6 +148,21 @@ public class PageAccounts extends PageAdminConfiguration { private File downloadFile; public PageAccounts() { + searchModel = new LoadableModel() { + + @Override + protected AccountDetailsSearchDto load() { + ConfigurationStorage storage = getSessionStorage().getConfiguration(); + AccountDetailsSearchDto dto = storage.getAccountSearchDto(); + + if(dto == null){ + dto = new AccountDetailsSearchDto(); + } + + return dto; + } + }; + resourcesModel = new LoadableModel>() { @Override @@ -136,8 +176,26 @@ protected List load() { private void initLayout() { Form form = new Form(ID_MAIN_FORM); + form.setOutputMarkupId(true); add(form); + Form accForm = new Form(ID_FORM_ACCOUNT); + accForm.setOutputMarkupId(true); + add(accForm); + + Form searchForm = new Form(ID_SEARCH_FORM); + initSearchForm(searchForm); + searchForm.setOutputMarkupPlaceholderTag(true); + searchForm.setOutputMarkupId(true); + searchForm.add(new VisibleEnableBehaviour() { + + @Override + public boolean isVisible() { + return resourceModel.getObject() != null; + } + }); + add(searchForm); + DropDownChoice resources = new DropDownChoice( ID_RESOURCES, resourceModel, resourcesModel, new IChoiceRenderer() { @@ -158,7 +216,7 @@ public String getIdValue(ResourceItemDto object, int index) { }); form.add(resources); - initLinks(form); + initLinks(form, accForm); initTotals(form); final AjaxDownloadBehaviorFromFile ajaxDownloadBehavior = new AjaxDownloadBehaviorFromFile(true) { @@ -173,7 +231,7 @@ protected File initFile() { WebMarkupContainer filesContainer = new WebMarkupContainer(ID_FILES_CONTAINER); filesContainer.setOutputMarkupId(true); - form.add(filesContainer); + accForm.add(filesContainer); filesModel = createFilesModel(); ListView files = new ListView(ID_FILES, filesModel) { @@ -196,7 +254,7 @@ public void onClick(AjaxRequestTarget target) { WebMarkupContainer accountsContainer = new WebMarkupContainer(ID_ACCOUNTS_CONTAINER); accountsContainer.setOutputMarkupId(true); - form.add(accountsContainer); + accForm.add(accountsContainer); ObjectDataProvider provider = new ObjectDataProvider(this, ShadowType.class); provider.setOptions(SelectorOptions.createCollection(GetOperationOptions.createRaw())); @@ -213,6 +271,158 @@ public boolean isVisible() { accountsContainer.add(accounts); } + private void initSearchForm(Form searchForm){ + DropDownChoice kind = new DropDownChoice(ID_SEARCH_KIND, + new PropertyModel(searchModel, AccountDetailsSearchDto.F_KIND), + WebMiscUtil.createReadonlyModelFromEnum(ShadowKindType.class), new EnumChoiceRenderer(this)); + kind.add(new OnChangeAjaxBehavior() { + + @Override + protected void onUpdate(AjaxRequestTarget target) { + searchPerformed(target); + } + }); + kind.setOutputMarkupId(true); + kind.setNullValid(true); + searchForm.add(kind); + + DropDownChoice intent = new DropDownChoice(ID_SEARCH_INTENT, + new PropertyModel(searchModel, AccountDetailsSearchDto.F_INTENT), + createIntentChoices(), new IChoiceRenderer() { + + @Override + public String getDisplayValue(String object) { + return object; + } + + @Override + public String getIdValue(String object, int index) { + return Integer.toString(index); + } + }); + intent.setNullValid(true); + intent.add(new OnChangeAjaxBehavior() { + + @Override + protected void onUpdate(AjaxRequestTarget target) { + searchPerformed(target); + } + }); + intent.setOutputMarkupId(true); + searchForm.add(intent); + + //TODO - consider adding some on-enter behavior or sth like that + AutoCompleteTextField objectClass = new AutoCompleteTextField(ID_SEARCH_OBJECT_CLASS, + new PropertyModel(searchModel, AccountDetailsSearchDto.F_OBJECT_CLASS)) { + + @Override + protected Iterator getChoices(String input) { + if(Strings.isEmpty(input)){ + List emptyList = Collections.emptyList(); + return emptyList.iterator(); + } + + AccountDetailsSearchDto dto = searchModel.getObject(); + List accountObjectClassList = dto.getObjectClassList(); + List choices = new ArrayList<>(AUTO_COMPLETE_LIST_SIZE); + + for(QName s: accountObjectClassList){ + if(s.getLocalPart().toLowerCase().startsWith(input.toLowerCase())){ + choices.add(s.getLocalPart()); + + if(choices.size() == AUTO_COMPLETE_LIST_SIZE){ + break; + } + } + } + + return choices.iterator(); + } + }; + objectClass.add(AttributeModifier.replace("placeholder", createStringResource("PageAccounts.accounts.objectClass"))); + objectClass.setOutputMarkupId(true); + objectClass.add(createObjectClassValidator()); + searchForm.add(objectClass); + + BasicSearchPanel basicSearch = new BasicSearchPanel(ID_SEARCH_BASIC) { + + @Override + protected IModel createSearchTextModel() { + return new PropertyModel<>(searchModel, AccountDetailsSearchDto.F_SEARCH_TEXT); + } + + @Override + protected void searchPerformed(AjaxRequestTarget target) { + PageAccounts.this.searchPerformed(target); + } + + @Override + protected void clearSearchPerformed(AjaxRequestTarget target) { + PageAccounts.this.clearSearchPerformed(target); + } + }; + basicSearch.setOutputMarkupId(true); + searchForm.add(basicSearch); + } + + private IValidator createObjectClassValidator(){ + return new IValidator() { + + @Override + public void validate(IValidatable validatable) { + String value = validatable.getValue(); + AccountDetailsSearchDto dto = searchModel.getObject(); + List accountObjectClassList = dto.getObjectClassList(); + List accountObjectClassListString = new ArrayList<>(); + + for(QName objectClass: accountObjectClassList){ + accountObjectClassListString.add(objectClass.getLocalPart()); + } + + if(!accountObjectClassListString.contains(value)){ + error(createStringResource("PageAccounts.message.validationError", value).getString()); + } + } + }; + } + + private IModel> createIntentChoices(){ + return new AbstractReadOnlyModel>() { + + @Override + public List getObject() { + List intentList = new ArrayList<>(); + ResourceItemDto dto = resourceModel.getObject(); + PrismObject resourcePrism; + + if(dto == null){ + return intentList; + } + + String oid = dto.getOid(); + OperationResult result = new OperationResult(OPERATION_GET_INTENTS); + + try { + resourcePrism = getModelService().getObject(ResourceType.class, oid, null, + createSimpleTask(OPERATION_GET_INTENTS), result); + ResourceType resource = resourcePrism.asObjectable(); + SchemaHandlingType schemaHandling = resource.getSchemaHandling(); + + for(ResourceObjectTypeDefinitionType r: schemaHandling.getObjectType()){ + intentList.add(r.getIntent()); + } + + } catch (Exception e){ + LoggingUtils.logException(LOGGER, "Couldn't load intents from resource.", e); + error("Couldn't load intents from resource."); + return null; + } + + return intentList; + } + }; + } + private void initTotals(Form form) { WebMarkupContainer totals = new WebMarkupContainer(ID_TOTALS); totals.setOutputMarkupId(true); @@ -270,7 +480,9 @@ private LoadableModel createTotalsModel(final SynchronizationSituationT @Override protected Integer load() { - ObjectFilter resourceFilter = createResourceQueryFilter(); +// ObjectFilter resourceFilter = createResourceQueryFilter(); + ObjectFilter resourceFilter = createObjectQuery().getFilter(); + if (resourceFilter == null) { return 0; } @@ -324,7 +536,7 @@ public boolean accept(java.io.File dir, String name) { } if (filesArray == null) { - return new ArrayList(); + return new ArrayList<>(); } List list = Arrays.asList(filesArray); @@ -335,7 +547,7 @@ public boolean accept(java.io.File dir, String name) { }; } - private void initLinks(Form form) { + private void initLinks(Form form, Form accForm) { AjaxSubmitLink listSyncDetails = new AjaxSubmitLink(ID_LIST_SYNC_DETAILS) { @Override @@ -371,16 +583,22 @@ public void onClick(AjaxRequestTarget target) { clearExportPerformed(target); } }; - form.add(clearExport); + accForm.add(clearExport); } private List createAccountsColumns() { - List columns = new ArrayList(); + List columns = new ArrayList<>(); columns.add(new PropertyColumn(createStringResource("PageAccounts.accounts.oid"), SelectableBean.F_VALUE + ".oid")); columns.add(new PropertyColumn(createStringResource("PageAccounts.accounts.name"), ShadowType.F_NAME.getLocalPart(), SelectableBean.F_VALUE + ".name")); + columns.add(new PropertyColumn(createStringResource("PageAccounts.accounts.kind"), + ShadowType.F_KIND.getLocalPart(), SelectableBean.F_VALUE + ".kind")); + columns.add(new PropertyColumn(createStringResource("PageAccounts.accounts.intent"), + ShadowType.F_INTENT.getLocalPart(), SelectableBean.F_VALUE + ".intent")); + columns.add(new PropertyColumn(createStringResource("PageAccounts.accounts.objectClass"), + ShadowType.F_OBJECT_CLASS.getLocalPart(), SelectableBean.F_VALUE + ".objectClass")); columns.add(new PropertyColumn(createStringResource("PageAccounts.accounts.synchronizationSituation"), ShadowType.F_SYNCHRONIZATION_SITUATION.getLocalPart(), SelectableBean.F_VALUE + ".synchronizationSituation")); columns.add(new PropertyColumn(createStringResource("PageAccounts.accounts.synchronizationTimestamp"), @@ -466,16 +684,63 @@ private List loadResources() { return resources; } + private Component getAccountsContainer(){ + return get(createComponentPath(ID_FORM_ACCOUNT, ID_ACCOUNTS_CONTAINER)); + } + + private TablePanel getAccountsTable(){ + return (TablePanel) get(createComponentPath(ID_FORM_ACCOUNT, ID_ACCOUNTS_CONTAINER, ID_ACCOUNTS)); + } + + private Form getSearchPanel(){ + return (Form) get(ID_SEARCH_FORM); + } + + private Component getTotalsPanel(){ + return get(createComponentPath(ID_MAIN_FORM, ID_TOTALS)); + } + + private void loadResourceObjectClass(){ + AccountDetailsSearchDto dto = searchModel.getObject(); + PrismObject resourcePrism; + OperationResult result = new OperationResult(OPERATION_GET_OBJECT_CLASS); + List accountObjectClassList = new ArrayList<>(); + + ResourceItemDto resourceDto = resourceModel.getObject(); + String oid = resourceDto.getOid(); + + try { + resourcePrism = getModelService().getObject(ResourceType.class, oid, null, + createSimpleTask(OPERATION_GET_INTENTS), result); + + ResourceSchema schema = RefinedResourceSchema.getResourceSchema(resourcePrism, getPrismContext()); + schema.getObjectClassDefinitions(); + + for(Definition def: schema.getDefinitions()){ + accountObjectClassList.add(def.getTypeName()); + } + + dto.setObjectClassList(accountObjectClassList); + } catch (Exception e){ + LoggingUtils.logException(LOGGER, "Couldn't load object class list from resource.", e); + error("Couldn't load object class list from resource."); + } + } + private void listSyncDetailsPerformed(AjaxRequestTarget target) { refreshSyncTotalsModels(); + loadResourceObjectClass(); - TablePanel table = (TablePanel) get(createComponentPath(ID_MAIN_FORM, ID_ACCOUNTS_CONTAINER, ID_ACCOUNTS)); + TablePanel table = getAccountsTable(); ObjectDataProvider provider = (ObjectDataProvider) table.getDataTable().getDataProvider(); provider.setQuery(ObjectQuery.createObjectQuery(createResourceQueryFilter())); table.getDataTable().setCurrentPage(0); - target.add(get(createComponentPath(ID_MAIN_FORM, ID_ACCOUNTS_CONTAINER)), - get(createComponentPath(ID_MAIN_FORM, ID_TOTALS)), getFeedbackPanel()); + target.add(getAccountsContainer(), + getTotalsPanel(), + getFeedbackPanel(), + getSearchPanel(), + get(createComponentPath(ID_SEARCH_FORM, ID_SEARCH_INTENT))); } private void exportPerformed(AjaxRequestTarget target) { @@ -592,4 +857,100 @@ private void downloadPerformed(AjaxRequestTarget target, String fileName, downloadBehavior.initiate(target); } + + private void searchPerformed(AjaxRequestTarget target){ + refreshSyncTotalsModels(); + + ObjectQuery query = createObjectQuery(); + TablePanel panel = getAccountsTable(); + DataTable table = panel.getDataTable(); + ObjectDataProvider provider = (ObjectDataProvider)table.getDataProvider(); + provider.setQuery(query); + + ConfigurationStorage storage = getSessionStorage().getConfiguration(); + storage.setAccountSearchDto(searchModel.getObject()); + storage.setAccountDetailsPaging(null); + + panel.setCurrentPage(null); + + target.add(getTotalsPanel()); + target.add(getFeedbackPanel()); + target.add(getAccountsContainer()); + } + + private ObjectQuery createObjectQuery(){ + AccountDetailsSearchDto dto = searchModel.getObject(); + ObjectQuery query = new ObjectQuery(); + + List filters = new ArrayList<>(); + String searchText = dto.getText(); + ShadowKindType kind = dto.getKind(); + String intent = dto.getIntent(); + String objectClass = dto.getObjectClass(); + + if(StringUtils.isNotEmpty(searchText)){ + PolyStringNormalizer normalizer = getPrismContext().getDefaultPolyStringNormalizer(); + String normalized = normalizer.normalize(searchText); + + ObjectFilter substring = SubstringFilter.createSubstring(ShadowType.F_NAME, ShadowType.class, getPrismContext(), + PolyStringNormMatchingRule.NAME, normalized); + filters.add(substring); + } + + if(kind != null){ + ObjectFilter kindFilter = EqualFilter.createEqual(ShadowType.F_KIND, ShadowType.class, getPrismContext(), + null, kind); + filters.add(kindFilter); + } + + if(StringUtils.isNotEmpty(intent)){ + ObjectFilter intentFilter = EqualFilter.createEqual(ShadowType.F_INTENT, ShadowType.class, getPrismContext(), + null, intent); + filters.add(intentFilter); + } + + if(StringUtils.isNotEmpty(objectClass)){ + QName objClass = new QName(objectClass); + + for(QName q: dto.getObjectClassList()){ + if(objectClass.equals(q.getLocalPart())){ + objClass = q; + } + } + + ObjectFilter objectClassFilter = EqualFilter.createEqual(ShadowType.F_OBJECT_CLASS, ShadowType.class, getPrismContext(), + null, objClass); + filters.add(objectClassFilter); + } + + AndFilter searchFilter; + if(!filters.isEmpty()){ + searchFilter = AndFilter.createAnd(filters); + query.setFilter(AndFilter.createAnd(searchFilter, createResourceQueryFilter())); + } else { + query.setFilter(createResourceQueryFilter()); + } + + return query; + } + + private void clearSearchPerformed(AjaxRequestTarget target){ + refreshSyncTotalsModels(); + searchModel.setObject(new AccountDetailsSearchDto()); + + TablePanel panel = getAccountsTable(); + DataTable table = panel.getDataTable(); + ObjectDataProvider provider = (ObjectDataProvider) table.getDataProvider(); + provider.setQuery(ObjectQuery.createObjectQuery(createResourceQueryFilter())); + + ConfigurationStorage storage = getSessionStorage().getConfiguration(); + storage.setAccountSearchDto(searchModel.getObject()); + storage.setAccountDetailsPaging(null); + + panel.setCurrentPage(storage.getAccountDetailsPaging()); + + target.add(getTotalsPanel()); + target.add(getSearchPanel()); + target.add(getAccountsContainer()); + } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageAccounts.properties b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageAccounts.properties index 01a01f9b95b..3f2429b143d 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageAccounts.properties +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageAccounts.properties @@ -32,9 +32,18 @@ PageAccounts.nothing=Nothing PageAccounts.shadows=Shadows PageAccounts.accounts.oid=Oid PageAccounts.accounts.name=Name +PageAccounts.accounts.kind=Kind +PageAccounts.accounts.intent=Intent +PageAccounts.accounts.owner=Owner +PageAccounts.accounts.objectClass=Object class PageAccounts.accounts.synchronizationSituation=Situation PageAccounts.accounts.synchronizationTimestamp=Timestamp PageAccounts.accounts.description=Description PageAccounts.exportException=Error occurred during export, reason {0} PageAccounts.button.clearExportFolder=Clear export folder -PageAccounts.exportFileDoesntExist=Couldn't create file {0} \ No newline at end of file +PageAccounts.exportFileDoesntExist=Couldn't create file {0} +PageAccounts.message.validationError=Searched objectClass value: '{0}' is not valid. Please provide valid objectClass value. +ShadowKindType.ACCOUNT=Account +ShadowKindType.ENTITLEMENT=Entitlement +ShadowKindType.GENERIC=Generic +nullValid=Choose one \ No newline at end of file diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/dto/AccountDetailsSearchDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/dto/AccountDetailsSearchDto.java new file mode 100644 index 00000000000..34350be634d --- /dev/null +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/dto/AccountDetailsSearchDto.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2010-2013 Evolveum + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.evolveum.midpoint.web.page.admin.configuration.dto; + +import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowKindType; + +import javax.xml.namespace.QName; +import java.io.Serializable; +import java.util.List; + +/** + * @author shood + * */ +public class AccountDetailsSearchDto implements Serializable{ + + public static final String F_SEARCH_TEXT = "text"; + public static final String F_KIND = "kind"; + public static final String F_INTENT = "intent"; + public static final String F_OBJECT_CLASS = "objectClass"; + + private String text; + private ShadowKindType kind; + private String intent; + private String objectClass; + private List objectClassList; + + public List getObjectClassList() { + return objectClassList; + } + + public void setObjectClassList(List objectClassList) { + this.objectClassList = objectClassList; + } + + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } + + public ShadowKindType getKind() { + return kind; + } + + public void setKind(ShadowKindType kind) { + this.kind = kind; + } + + public String getIntent() { + return intent; + } + + public void setIntent(String intent) { + this.intent = intent; + } + + public String getObjectClass() { + return objectClass; + } + + public void setObjectClass(String objectClass) { + this.objectClass = null; + } +} diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/PageReports.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/PageReports.java index ae4702bc295..223cc7c3f5e 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/PageReports.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/PageReports.java @@ -290,6 +290,7 @@ private ObjectQuery createQuery(){ String text = dto.getText(); Boolean parent = !dto.isParent(); ObjectQuery query = new ObjectQuery(); + List filters = new ArrayList<>(); if(StringUtils.isNotEmpty(text)){ PolyStringNormalizer normalizer = getPrismContext().getDefaultPolyStringNormalizer(); @@ -298,23 +299,19 @@ private ObjectQuery createQuery(){ ObjectFilter substring = SubstringFilter.createSubstring(ReportType.F_NAME, ReportType.class, getPrismContext(), PolyStringNormMatchingRule.NAME, normalizedText); - if(parent == true){ - EqualFilter boolFilter = EqualFilter.createEqual(ReportType.F_PARENT, ReportType.class, - getPrismContext(), null, parent); + filters.add(substring); + } - query.setFilter(AndFilter.createAnd(substring, boolFilter)); - } else { - query.setFilter(substring); - } - } else{ - if(parent == true){ - EqualFilter boolFilter = EqualFilter.createEqual(ReportType.F_PARENT, ReportType.class, - getPrismContext(), null, parent); - - query.setFilter(boolFilter); - } else{ - query = null; - } + if(parent == true){ + EqualFilter parentFilter = EqualFilter.createEqual(ReportType.F_PARENT, ReportType.class, + getPrismContext(), null, parent); + filters.add(parentFilter); + } + + if(!filters.isEmpty()){ + query.setFilter(AndFilter.createAnd(filters)); + } else { + query = null; } return query; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/content/PageContentAccounts.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/content/PageContentAccounts.java index 6a5c91c8b39..6e445621bfb 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/content/PageContentAccounts.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/content/PageContentAccounts.java @@ -70,6 +70,7 @@ import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn; import org.apache.wicket.extensions.markup.html.repeater.data.table.DataTable; import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn; +import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.CheckBox; import org.apache.wicket.markup.html.form.Form; @@ -251,7 +252,7 @@ private List initColumns() { columns.add(column); column = new LinkColumn( - createStringResource("pageContentAccounts.name"), "accountName") { + createStringResource("pageContentAccounts.name"), AccountContentDto.F_ACCOUNT_NAME) { @Override public void onClick(AjaxRequestTarget target, IModel rowModel) { @@ -278,7 +279,16 @@ public void populateItem(Item> cellItem, }; columns.add(column); - column = new EnumPropertyColumn(createStringResource("pageContentAccounts.situation"), "situation") { + column = new PropertyColumn(createStringResource("pageContentAccounts.kind"), AccountContentDto.F_KIND); + columns.add(column); + + column = new PropertyColumn(createStringResource("pageContentAccounts.intent"), AccountContentDto.F_INTENT); + columns.add(column); + + column = new PropertyColumn(createStringResource("pageContentAccounts.objectClass"), AccountContentDto.F_OBJECT_CLASS); + columns.add(column); + + column = new EnumPropertyColumn(createStringResource("pageContentAccounts.situation"), AccountContentDto.F_SITUATION) { @Override protected String translate(Enum en) { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/content/PageContentAccounts.properties b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/content/PageContentAccounts.properties index c9f3b3c80cb..c77b51c62ab 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/content/PageContentAccounts.properties +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/content/PageContentAccounts.properties @@ -17,6 +17,9 @@ page.title=Accounts page.subTitle=on {0} pageContentAccounts.search=Search pageContentAccounts.name=Name +pageContentAccounts.kind=Kind +pageContentAccounts.intent=Intent +pageContentAccounts.objectClass=Object class pageContentAccounts.situation=Situation pageContentAccounts.identifiers=Identifiers pageContentAccounts.owner=Owner diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/content/dto/AccountContentDataProvider.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/content/dto/AccountContentDataProvider.java index 1ab5c3a8f0e..3169dad2f9a 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/content/dto/AccountContentDataProvider.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/content/dto/AccountContentDataProvider.java @@ -136,6 +136,7 @@ private AccountContentDto createAccountContentDto(PrismObject object AccountContentDto dto = new AccountContentDto(); dto.setAccountName(WebMiscUtil.getName(object)); dto.setAccountOid(object.getOid()); + ShadowType shadow = object.asObjectable(); Collection> identifiers = ShadowUtil.getIdentifiers(object); if (identifiers != null) { @@ -153,6 +154,10 @@ private AccountContentDto createAccountContentDto(PrismObject object dto.setSituation(WebMiscUtil.getValue(object, ShadowType.F_SYNCHRONIZATION_SITUATION, SynchronizationSituationType.class)); + dto.setKind(shadow.getKind()); + dto.setIntent(shadow.getIntent()); + dto.setObjectClass(shadow.getObjectClass().toString()); + addInlineMenuToDto(dto); return dto; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/content/dto/AccountContentDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/content/dto/AccountContentDto.java index 8d5d8308c42..15310400259 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/content/dto/AccountContentDto.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/content/dto/AccountContentDto.java @@ -20,6 +20,7 @@ import com.evolveum.midpoint.web.component.data.column.InlineMenuable; import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItem; import com.evolveum.midpoint.web.component.util.Selectable; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowKindType; import com.evolveum.midpoint.xml.ns._public.common.common_3.SynchronizationSituationType; import java.io.Serializable; @@ -31,6 +32,16 @@ */ public class AccountContentDto extends Selectable implements InlineMenuable { + public static final String F_ACCOUNT_OID = "accountOid"; + public static final String F_ACCOUNT_NAME = "accountName"; + public static final String F_IDENTIFIERS = "identifiers"; + public static final String F_SITUATION = "situation"; + public static final String F_OWNER_OID = "ownerOid"; + public static final String F_OWNER_NAME = "ownerName"; + public static final String F_INTENT = "intent"; + public static final String F_OBJECT_CLASS = "objectClass"; + public static final String F_KIND = "kind"; + private String accountOid; private String accountName; @@ -39,6 +50,10 @@ public class AccountContentDto extends Selectable implements InlineMenuable { private String ownerOid; private String ownerName; + private String intent; + private String objectClass; + private ShadowKindType kind; + private List menu = new ArrayList(); @@ -93,6 +108,30 @@ public void setSituation(SynchronizationSituationType situation) { this.situation = situation; } + public String getIntent() { + return intent; + } + + public void setIntent(String intent) { + this.intent = intent; + } + + public String getObjectClass() { + return objectClass; + } + + public void setObjectClass(String objectClass) { + this.objectClass = objectClass; + } + + public ShadowKindType getKind() { + return kind; + } + + public void setKind(ShadowKindType kind) { + this.kind = kind; + } + @Override public List getMenuItems() { return menu; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/PageRoles.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/PageRoles.java index a016d795856..8d9dcd031b4 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/PageRoles.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/PageRoles.java @@ -323,6 +323,7 @@ private ObjectQuery createQuery(){ String text = dto.getText(); Boolean requestable = dto.getRequestableValue(); ObjectQuery query = new ObjectQuery(); + List filters = new ArrayList<>(); if(StringUtils.isNotEmpty(text)){ PolyStringNormalizer normalizer = getPrismContext().getDefaultPolyStringNormalizer(); @@ -330,49 +331,30 @@ private ObjectQuery createQuery(){ ObjectFilter substring = SubstringFilter.createSubstring(RoleType.F_NAME, RoleType.class, getPrismContext(), PolyStringNormMatchingRule.NAME, normalizedText); + filters.add(substring); + } - if(requestable == null){ - query.setFilter(substring); - } else { - EqualFilter boolFilter = EqualFilter.createEqual(RoleType.F_REQUESTABLE, RoleType.class, getPrismContext(), + if(requestable != null){ + EqualFilter requestableFilter = EqualFilter.createEqual(RoleType.F_REQUESTABLE, RoleType.class, getPrismContext(), null, requestable); - if (requestable == true){ - query.setFilter(AndFilter.createAnd(substring, boolFilter)); - - } else { - boolFilter = EqualFilter.createEqual(RoleType.F_REQUESTABLE, RoleType.class, getPrismContext(), - null, false); - EqualFilter nullFilter = EqualFilter.createEqual(RoleType.F_REQUESTABLE, RoleType.class, getPrismContext(), - null, null); - OrFilter or = OrFilter.createOr(boolFilter, nullFilter); - query.setFilter(AndFilter.createAnd(substring, or)); - } - } - - return query; - }else{ - if(requestable == null){ - query.setFilter(null); + if (requestable){ + filters.add(requestableFilter); } else { - EqualFilter boolFilter = EqualFilter.createEqual(RoleType.F_REQUESTABLE, RoleType.class, getPrismContext(), - null, requestable); - - if (requestable == true){ - query.setFilter(boolFilter); - } - else { - boolFilter = EqualFilter.createEqual(RoleType.F_REQUESTABLE, RoleType.class, getPrismContext(), - null, false); - EqualFilter nullFilter = EqualFilter.createEqual(RoleType.F_REQUESTABLE, RoleType.class, getPrismContext(), - null, null); - - OrFilter or = OrFilter.createOr(boolFilter, nullFilter); - query.setFilter(or); - } + requestableFilter = EqualFilter.createEqual(RoleType.F_REQUESTABLE, RoleType.class, getPrismContext(), + null, false); + EqualFilter nullFilter = EqualFilter.createEqual(RoleType.F_REQUESTABLE, RoleType.class, getPrismContext(), + null, null); + OrFilter or = OrFilter.createOr(requestableFilter, nullFilter); + filters.add(or); } - return query; } + + if(!filters.isEmpty()){ + query.setFilter(AndFilter.createAnd(filters)); + } + + return query; } private void clearSearchPerformed(AjaxRequestTarget target){ diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/session/ConfigurationStorage.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/session/ConfigurationStorage.java index abe32644a68..6de66beaa0e 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/session/ConfigurationStorage.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/session/ConfigurationStorage.java @@ -16,7 +16,9 @@ package com.evolveum.midpoint.web.session; +import com.evolveum.midpoint.prism.query.ObjectPaging; import com.evolveum.midpoint.schema.constants.ObjectTypes; +import com.evolveum.midpoint.web.page.admin.configuration.dto.AccountDetailsSearchDto; import com.evolveum.midpoint.web.page.admin.configuration.dto.DebugSearchDto; import java.io.Serializable; @@ -27,6 +29,10 @@ public class ConfigurationStorage implements Serializable { private DebugSearchDto debugSearchDto; + private AccountDetailsSearchDto accountSearchDto; + + private ObjectPaging debugSearchPaging; + private ObjectPaging accountDetailsPaging; public DebugSearchDto getDebugSearchDto() { if (debugSearchDto == null) { @@ -39,4 +45,32 @@ public DebugSearchDto getDebugSearchDto() { public void setDebugSearchDto(DebugSearchDto debugSearchDto) { this.debugSearchDto = debugSearchDto; } + + public AccountDetailsSearchDto getAccountSearchDto() { + if(accountSearchDto == null){ + accountSearchDto = new AccountDetailsSearchDto(); + } + + return accountSearchDto; + } + + public void setAccountSearchDto(AccountDetailsSearchDto accountSearchDto) { + this.accountSearchDto = accountSearchDto; + } + + public ObjectPaging getDebugSearchPaging() { + return debugSearchPaging; + } + + public void setDebugSearchPaging(ObjectPaging debugSearchPaging) { + this.debugSearchPaging = debugSearchPaging; + } + + public ObjectPaging getAccountDetailsPaging() { + return accountDetailsPaging; + } + + public void setAccountDetailsPaging(ObjectPaging accountDetailsPaging) { + this.accountDetailsPaging = accountDetailsPaging; + } }