diff --git a/build-system/pom.xml b/build-system/pom.xml
index 3ea5ce2a29a..87c3a8036ff 100644
--- a/build-system/pom.xml
+++ b/build-system/pom.xml
@@ -691,7 +691,7 @@
com.evolveum.polygon
connector-csv
- 2.1
+ 2.2
com.evolveum.polygon
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/ObjectListPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/ObjectListPanel.java
index 65c8ba96c19..17b7e231f9a 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/ObjectListPanel.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/ObjectListPanel.java
@@ -57,6 +57,7 @@
import com.evolveum.midpoint.web.component.util.SelectableBean;
import com.evolveum.midpoint.web.session.PageStorage;
import com.evolveum.midpoint.web.session.UserProfileStorage.TableId;
+import org.jetbrains.annotations.NotNull;
/**
* @author katkav
@@ -361,6 +362,7 @@ public SelectableBean createDataObjectWrapper(O obj) {
return bean;
}
+ @NotNull
@Override
protected List createObjectOrderings(SortParam sortParam) {
List customOrdering = createCustomOrdering(sortParam);
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebComponentUtil.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebComponentUtil.java
index d24a437dbfc..2387cd0e8b7 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebComponentUtil.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebComponentUtil.java
@@ -416,6 +416,18 @@ public static void safeResultCleanup(OperationResult result, Trace logger) {
}
}
+ public static GuiObjectListType getDefaultGuiObjectListType(PageBase pageBase) {
+ AdminGuiConfigurationType config = pageBase.getPrincipal().getAdminGuiConfiguration();
+ if (config == null) {
+ return null;
+ }
+ GuiObjectListsType lists = config.getObjectLists();
+ if (lists == null) {
+ return null;
+ }
+ return lists.getDefault();
+ }
+
public enum Channel {
// TODO: move this to schema component
LIVE_SYNC(SchemaConstants.CHANGE_CHANNEL_LIVE_SYNC_URI),
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/BaseSortableDataProvider.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/BaseSortableDataProvider.java
index d9456524019..c9c02d2640e 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/BaseSortableDataProvider.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/BaseSortableDataProvider.java
@@ -17,6 +17,7 @@
package com.evolveum.midpoint.web.component.data;
import com.evolveum.midpoint.gui.api.page.PageBase;
+import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.model.api.*;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.path.ItemPath;
@@ -25,7 +26,9 @@
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.prism.query.OrderDirection;
import com.evolveum.midpoint.repo.api.RepositoryService;
+import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.SchemaConstantsGenerated;
+import com.evolveum.midpoint.schema.SelectorOptions;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.task.api.TaskManager;
import com.evolveum.midpoint.util.logging.Trace;
@@ -34,8 +37,8 @@
import com.evolveum.midpoint.web.security.MidPointApplication;
import com.evolveum.midpoint.wf.api.WorkflowManager;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AdminGuiConfigurationType;
+import com.evolveum.midpoint.xml.ns._public.common.common_3.DistinctSearchOptionType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.GuiObjectListType;
-import com.evolveum.midpoint.xml.ns._public.common.common_3.GuiObjectListsType;
import org.apache.commons.lang.Validate;
import org.apache.wicket.Component;
import org.apache.wicket.extensions.markup.html.repeater.data.sort.SortOrder;
@@ -45,6 +48,7 @@
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
import javax.xml.namespace.QName;
import java.io.Serializable;
@@ -93,47 +97,47 @@ public BaseSortableDataProvider(Component component, boolean useCache, boolean u
}
protected ModelService getModel() {
- MidPointApplication application = (MidPointApplication) MidPointApplication.get();
+ MidPointApplication application = MidPointApplication.get();
return application.getModel();
}
protected RepositoryService getRepositoryService() {
- MidPointApplication application = (MidPointApplication) MidPointApplication.get();
+ MidPointApplication application = MidPointApplication.get();
return application.getRepositoryService();
}
protected TaskManager getTaskManager() {
- MidPointApplication application = (MidPointApplication) MidPointApplication.get();
+ MidPointApplication application = MidPointApplication.get();
return application.getTaskManager();
}
protected PrismContext getPrismContext() {
- MidPointApplication application = (MidPointApplication) MidPointApplication.get();
+ MidPointApplication application = MidPointApplication.get();
return application.getPrismContext();
}
protected TaskService getTaskService() {
- MidPointApplication application = (MidPointApplication) MidPointApplication.get();
+ MidPointApplication application = MidPointApplication.get();
return application.getTaskService();
}
protected ModelInteractionService getModelInteractionService() {
- MidPointApplication application = (MidPointApplication) MidPointApplication.get();
+ MidPointApplication application = MidPointApplication.get();
return application.getModelInteractionService();
}
protected WorkflowService getWorkflowService() {
- MidPointApplication application = (MidPointApplication) MidPointApplication.get();
+ MidPointApplication application = MidPointApplication.get();
return application.getWorkflowService();
}
protected ModelAuditService getAuditService() {
- MidPointApplication application = (MidPointApplication) MidPointApplication.get();
+ MidPointApplication application = MidPointApplication.get();
return application.getAuditService();
}
protected WorkflowManager getWorkflowManager() {
- MidPointApplication application = (MidPointApplication) MidPointApplication.get();
+ MidPointApplication application = MidPointApplication.get();
return application.getWorkflowManager();
}
@@ -193,27 +197,30 @@ protected boolean checkOrderingSettings() {
return false;
}
- public boolean isOrderingDisabled() {
- if (!checkOrderingSettings()) {
- return false;
- }
+ public boolean isDistinct() {
+ GuiObjectListType def = WebComponentUtil.getDefaultGuiObjectListType((PageBase) component.getPage());
+ return def == null || def.getDistinct() != DistinctSearchOptionType.NEVER; // change after other options are added
+ }
- PageBase page = (PageBase) component.getPage();
- AdminGuiConfigurationType config = page.getPrincipal().getAdminGuiConfiguration();
- if (config == null) {
- return false;
- }
- GuiObjectListsType lists = config.getObjectLists();
- if (lists == null) {
- return false;
+ protected Collection> createDefaultOptions() {
+ return getDistinctRelatedOptions(); // probably others in the future
+ }
+
+ @Nullable
+ protected Collection> getDistinctRelatedOptions() {
+ if (isDistinct()) {
+ return SelectorOptions.createCollection(GetOperationOptions.createDistinct());
+ } else {
+ return null;
}
+ }
- GuiObjectListType def = lists.getDefault();
- if (def == null) {
+ public boolean isOrderingDisabled() {
+ if (!checkOrderingSettings()) {
return false;
}
-
- return def.isDisableSorting();
+ GuiObjectListType def = WebComponentUtil.getDefaultGuiObjectListType((PageBase) component.getPage());
+ return def != null && def.isDisableSorting();
}
protected ObjectPaging createPaging(long offset, long pageSize) {
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/ObjectDataProvider.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/ObjectDataProvider.java
index efb5f0000e5..a54f51eaf62 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/ObjectDataProvider.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/ObjectDataProvider.java
@@ -78,6 +78,12 @@ public List getSelectedData() {
return allSelected;
}
+ // Here we apply the distinct option. It is easier and more reliable to apply it here than to do at all the places
+ // where options for this provider are defined.
+ private Collection> getOptionsToUse() {
+ return GetOperationOptions.merge(options, getDistinctRelatedOptions());
+ }
+
@Override
public Iterator internalIterator(long first, long count) {
@@ -120,7 +126,7 @@ public Iterator internalIterator(long first, long count) {
LOGGER.trace("Query {} with {}", type.getSimpleName(), query.debugDump());
}
- List> list = getModel().searchObjects(type, query, options, task, result);
+ List> list = getModel().searchObjects(type, query, getOptionsToUse(), task, result);
if (LOGGER.isTraceEnabled()) {
LOGGER.trace("Query {} resulted in {} objects", type.getSimpleName(), list.size());
@@ -169,7 +175,7 @@ protected int internalSize() {
OperationResult result = new OperationResult(OPERATION_COUNT_OBJECTS);
try {
Task task = getPage().createSimpleTask(OPERATION_COUNT_OBJECTS);
- count = getModel().countObjects(type, getQuery(), options, task, result);
+ count = getModel().countObjects(type, getQuery(), getOptionsToUse(), task, result);
} catch (Exception ex) {
result.recordFatalError("Couldn't count objects.", ex);
LoggingUtils.logUnexpectedException(LOGGER, "Couldn't count objects", ex);
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/RepositoryObjectDataProvider.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/RepositoryObjectDataProvider.java
index 42ea9665416..3411a4fb5b7 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/RepositoryObjectDataProvider.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/RepositoryObjectDataProvider.java
@@ -38,6 +38,7 @@
import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType;
import org.apache.commons.lang.Validate;
import org.apache.wicket.Component;
+import org.jetbrains.annotations.NotNull;
import java.io.Serializable;
import java.util.*;
@@ -78,12 +79,7 @@ public Iterator internalIterator(long first, long count) {
}
query.setPaging(paging);
- //RAW and DEFAULT retrieve option selected
- Collection> options = new ArrayList<>();
- GetOperationOptions opt = GetOperationOptions.createRaw();
- opt.setRetrieve(RetrieveOption.DEFAULT);
- options.add(SelectorOptions.create(ItemPath.EMPTY_PATH, opt));
-
+ Collection> options = getOptions();
List> list = getModel().searchObjects((Class) type, query, options,
getPage().createSimpleTask(OPERATION_SEARCH_OBJECTS), result);
for (PrismObject extends ObjectType> object : list) {
@@ -101,6 +97,15 @@ public Iterator internalIterator(long first, long count) {
return getAvailableData().iterator();
}
+ @NotNull
+ private Collection> getOptions() {
+ Collection> options = new ArrayList<>();
+ GetOperationOptions opt = GetOperationOptions.createRaw();
+ opt.setRetrieve(RetrieveOption.DEFAULT);
+ options.add(SelectorOptions.create(ItemPath.EMPTY_PATH, opt));
+ return GetOperationOptions.merge(createDefaultOptions(), options);
+ }
+
@Override
protected boolean checkOrderingSettings() {
return true;
@@ -171,16 +176,14 @@ protected int internalSize() {
int count = 0;
OperationResult result = new OperationResult(OPERATION_COUNT_OBJECTS);
try {
- count = getModel().countObjects(type, getQuery(),
- SelectorOptions.createCollection(ItemPath.EMPTY_PATH, GetOperationOptions.createRaw()),
+ count = getModel().countObjects(type, getQuery(), getOptions(),
getPage().createSimpleTask(OPERATION_COUNT_OBJECTS), result);
} catch (Exception ex) {
result.recordFatalError("Couldn't count objects.", ex);
} finally {
result.computeStatusIfUnknown();
}
-
- getPage().showResult(result, false);
+ getPage().showResult(result, false);
LOGGER.trace("end::internalSize()");
return count;
}
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/SelectableBeanObjectDataProvider.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/SelectableBeanObjectDataProvider.java
index 797ea099e7c..9bd2d0918a7 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/SelectableBeanObjectDataProvider.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/SelectableBeanObjectDataProvider.java
@@ -161,7 +161,7 @@ public Iterator> internalIterator(long offset, long pageSize)
LOGGER.trace("Query {} with {}", type.getSimpleName(), query.debugDump());
}
- if (ResourceType.class.equals(type) && (options == null || options.isEmpty())){
+ if (ResourceType.class.equals(type) && (options == null || options.isEmpty())) {
options = SelectorOptions.createCollection(GetOperationOptions.createNoFetch());
}
Collection> currentOptions = options;
@@ -178,6 +178,7 @@ public Iterator> internalIterator(long offset, long pageSize)
(o) -> o.setDefinitionProcessing(FULL));
}
}
+ currentOptions = GetOperationOptions.merge(currentOptions, getDistinctRelatedOptions());
List> list = (List)getModel().searchObjects(type, query, currentOptions, task, result);
if (LOGGER.isTraceEnabled()) {
@@ -240,7 +241,8 @@ protected int internalSize() {
Task task = getPage().createSimpleTask(OPERATION_COUNT_OBJECTS);
OperationResult result = task.getResult();
try {
- Integer counted = getModel().countObjects(type, getQuery(), options, task, result);
+ Collection> currentOptions = GetOperationOptions.merge(options, getDistinctRelatedOptions());
+ Integer counted = getModel().countObjects(type, getQuery(), currentOptions, task, result);
count = defaultIfNull(counted, 0);
} catch (Exception ex) {
result.recordFatalError("Couldn't count objects.", ex);
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchFactory.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchFactory.java
index 97cf4359404..2503ff10179 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchFactory.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchFactory.java
@@ -217,11 +217,11 @@ private static boolean isFullTextSearchEnabled(ModelServi
return FullTextSearchConfigurationUtil.isEnabledFor(modelServiceLocator.getModelInteractionService().getSystemConfiguration(result)
.getFullTextSearch(), type);
} catch (SchemaException | ObjectNotFoundException ex) {
- throw new SystemException(ex);
+ throw new SystemException(ex);
}
}
- private static SearchBoxModeType getDefaultSearchType (ModelServiceLocator modelServiceLocator, Class type) {
+ private static SearchBoxModeType getDefaultSearchType(ModelServiceLocator modelServiceLocator, Class type) {
OperationResult result = new OperationResult(LOAD_ADMIN_GUI_CONFIGURATION);
try {
AdminGuiConfigurationType guiConfig = modelServiceLocator.getModelInteractionService().getAdminGuiConfiguration(null, result);
@@ -238,7 +238,7 @@ private static SearchBoxModeType getDefaultSearchType (Mo
}
return null;
} catch (SchemaException | ObjectNotFoundException ex) {
- throw new SystemException(ex);
+ throw new SystemException(ex);
}
}
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/dto/NodeDtoProvider.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/dto/NodeDtoProvider.java
index d85d198b688..9a19b1af0fc 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/dto/NodeDtoProvider.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/dto/NodeDtoProvider.java
@@ -60,7 +60,7 @@ public Iterator extends NodeDto> internalIterator(long first, long count) {
}
query.setPaging(paging);
- List> nodes = getModel().searchObjects(NodeType.class, query, null, task, result);
+ List> nodes = getModel().searchObjects(NodeType.class, query, createDefaultOptions(), task, result);
for (PrismObject node : nodes) {
getAvailableData().add(createNodeDto(node));
@@ -104,7 +104,7 @@ protected int internalSize() {
OperationResult result = new OperationResult(OPERATION_COUNT_NODES);
Task task = getTaskManager().createTaskInstance(OPERATION_COUNT_NODES);
try {
- count = getModel().countObjects(NodeType.class, getQuery(), null, task, result);
+ count = getModel().countObjects(NodeType.class, getQuery(), createDefaultOptions(), task, result);
result.recomputeStatus();
} catch (Exception ex) {
LoggingUtils.logUnexpectedException(LOGGER, "Unhandled exception when counting nodes", ex);
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/dto/TaskDtoProvider.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/dto/TaskDtoProvider.java
index b0101296cfd..b0b87313ff6 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/dto/TaskDtoProvider.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/dto/TaskDtoProvider.java
@@ -84,8 +84,9 @@ public Iterator extends TaskDto> internalIterator(long first, long count) {
propertiesToGet.add(TaskType.F_NEXT_RUN_START_TIMESTAMP);
propertiesToGet.add(TaskType.F_NEXT_RETRY_TIMESTAMP);
}
- Collection> searchOptions =
- GetOperationOptions.createRetrieveAttributesOptions(propertiesToGet.toArray(new QName[0]));
+ Collection> searchOptions = GetOperationOptions.merge(
+ createDefaultOptions(),
+ GetOperationOptions.createRetrieveAttributesOptions(propertiesToGet.toArray(new QName[0])));
List> tasks = getModel().searchObjects(TaskType.class, query, searchOptions, operationTask, result);
for (PrismObject task : tasks) {
try {
@@ -140,7 +141,7 @@ protected int internalSize() {
OperationResult result = new OperationResult(OPERATION_COUNT_TASKS);
Task task = getTaskManager().createTaskInstance(OPERATION_COUNT_TASKS);
try {
- count = getModel().countObjects(TaskType.class, getQuery(), null, task, result);
+ count = getModel().countObjects(TaskType.class, getQuery(), createDefaultOptions(), task, result);
result.recomputeStatus();
} catch (Exception ex) {
LoggingUtils.logUnexpectedException(LOGGER, "Unhandled exception when counting tasks", ex);
diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/GetOperationOptions.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/GetOperationOptions.java
index 30ab61bb610..4c7be7228d4 100644
--- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/GetOperationOptions.java
+++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/GetOperationOptions.java
@@ -20,7 +20,8 @@
import com.evolveum.midpoint.xml.ns._public.common.common_3.GetOperationOptionsType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.IterationMethodType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
-import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections4.CollectionUtils;
+import org.jetbrains.annotations.NotNull;
import javax.xml.namespace.QName;
@@ -175,6 +176,10 @@ public class GetOperationOptions extends AbstractOptions implements Serializable
*/
private Boolean executionPhase;
+ /*
+ * !!! After adding option here don't forget to update equals, clone, merge, etc. !!!
+ */
+
public RetrieveOption getRetrieve() {
return retrieve;
}
@@ -916,4 +921,82 @@ public static GetOperationOptions fromRestOptions(List options, Definiti
}
+ @NotNull
+ @SafeVarargs
+ public static Collection> merge(Collection>... parts) {
+ Collection> merged = new ArrayList<>();
+ for (Collection> part : parts) {
+ for (SelectorOptions increment : CollectionUtils.emptyIfNull(part)) {
+ if (increment != null) { // should always be so
+ Collection existing = SelectorOptions.findOptionsForPath(merged, increment.getItemPath());
+ if (existing.isEmpty()) {
+ merged.add(increment);
+ } else if (existing.size() == 1) {
+ existing.iterator().next().merge(increment.getOptions());
+ } else {
+ throw new AssertionError("More than one options for path: " + increment.getItemPath());
+ }
+ }
+ }
+ }
+ return merged;
+ }
+
+ @SuppressWarnings("ConstantConditions")
+ private void merge(GetOperationOptions increment) {
+ if (increment == null) {
+ return;
+ }
+ if (increment.retrieve != null) {
+ this.retrieve = increment.retrieve;
+ }
+ if (increment.resolve != null) {
+ this.resolve = increment.resolve;
+ }
+ if (increment.resolveNames != null) {
+ this.resolveNames = increment.resolveNames;
+ }
+ if (increment.noFetch != null) {
+ this.noFetch = increment.noFetch;
+ }
+ if (increment.raw != null) {
+ this.raw = increment.raw;
+ }
+ if (increment.tolerateRawData != null) {
+ this.tolerateRawData = increment.tolerateRawData;
+ }
+ if (increment.doNotDiscovery != null) {
+ this.doNotDiscovery = increment.doNotDiscovery;
+ }
+ if (increment.relationalValueSearchQuery != null) {
+ this.relationalValueSearchQuery = increment.relationalValueSearchQuery;
+ }
+ if (increment.allowNotFound != null) {
+ this.allowNotFound = increment.allowNotFound;
+ }
+ if (increment.readOnly != null) {
+ this.readOnly = increment.readOnly;
+ }
+ if (increment.pointInTimeType != null) {
+ this.pointInTimeType = increment.pointInTimeType;
+ }
+ if (increment.staleness != null) {
+ this.staleness = increment.staleness;
+ }
+ if (increment.distinct != null) {
+ this.distinct = increment.distinct;
+ }
+ if (increment.attachDiagData != null) {
+ this.attachDiagData = increment.attachDiagData;
+ }
+ if (increment.definitionProcessing != null) {
+ this.definitionProcessing = increment.definitionProcessing;
+ }
+ if (increment.iterationMethod != null) {
+ this.iterationMethod = increment.iterationMethod;
+ }
+ if (increment.executionPhase != null) {
+ this.executionPhase = increment.executionPhase;
+ }
+ }
}
diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/SelectorOptions.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/SelectorOptions.java
index 41eb0b67adc..568aa5ac2b8 100644
--- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/SelectorOptions.java
+++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/SelectorOptions.java
@@ -403,6 +403,5 @@ public void shortDump(StringBuilder sb) {
sb.append(options);
}
}
-
//endregion
}
diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/AdminGuiConfigTypeUtil.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/AdminGuiConfigTypeUtil.java
index 8ba00e10b8b..fc3571c0142 100644
--- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/AdminGuiConfigTypeUtil.java
+++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/AdminGuiConfigTypeUtil.java
@@ -188,13 +188,7 @@ private static boolean isTheSameObjectForm(ObjectFormType oldForm, ObjectFormTyp
private static void mergeList(GuiObjectListsType objectLists, GuiObjectListType newList) {
// We support only the default object lists now, so simply replace the existing definition with the
// latest definition. We will need a more sophisticated merging later.
- Iterator iterator = objectLists.getObjectList().iterator();
- while (iterator.hasNext()) {
- GuiObjectListType currentList = iterator.next();
- if (currentList.getType().equals(newList.getType())) {
- iterator.remove();
- }
- }
+ objectLists.getObjectList().removeIf(currentList -> currentList.getType().equals(newList.getType()));
objectLists.getObjectList().add(newList.clone());
}
diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestNotifications.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestNotifications.java
index 63dff112be8..705a73d1a3d 100644
--- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestNotifications.java
+++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestNotifications.java
@@ -364,6 +364,60 @@ public void test131ModifyUserJackAssignAccount() throws Exception {
}
+ @Test
+ public void test135ModifyUserJackAssignRole() throws Exception {
+ final String TEST_NAME = "test135ModifyUserJackAssignRole";
+ TestUtil.displayTestTitle(this, TEST_NAME);
+
+ // GIVEN
+ Task task = taskManager.createTaskInstance(TestNotifications.class.getName() + "." + TEST_NAME);
+ OperationResult result = task.getResult();
+ preTestCleanup(AssignmentPolicyEnforcementType.FULL);
+
+ // WHEN
+ TestUtil.displayWhen(TEST_NAME);
+ assignRole(USER_JACK_OID, ROLE_SUPERUSER_OID, task, result);
+
+ // THEN
+ TestUtil.displayThen(TEST_NAME);
+ result.computeStatus();
+ TestUtil.assertSuccess("executeChanges result", result);
+
+ PrismObject userJack = getUser(USER_JACK_OID);
+ display("User after change execution", userJack);
+ assertUserJack(userJack);
+ assertAssignedRole(userJack, ROLE_SUPERUSER_OID);
+ assertAssignments(userJack, 2);
+
+ // Check notifications
+ display("Notifications", dummyTransport);
+
+ notificationManager.setDisabled(true);
+ checkDummyTransportMessages("accountPasswordNotifier", 0);
+ checkDummyTransportMessages("userPasswordNotifier", 0);
+ checkDummyTransportMessages("simpleAccountNotifier-SUCCESS", 0);
+ checkDummyTransportMessages("simpleAccountNotifier-FAILURE", 0);
+ checkDummyTransportMessages("simpleAccountNotifier-ADD-SUCCESS", 0);
+ checkDummyTransportMessages("simpleAccountNotifier-DELETE-SUCCESS", 0);
+ checkDummyTransportMessages("simpleUserNotifier", 1);
+ checkDummyTransportMessages("simpleUserNotifier-ADD", 0);
+
+ assertSteadyResources();
+
+ String expected = "Notification about user-related operation (status: SUCCESS)\n"
+ + "\n"
+ + "User: Jack Sparrow (jack, oid c0c010c0-d34d-b33f-f00d-111111111111)\n"
+ + "\n"
+ + "The user record was modified. Modified attributes are:\n"
+ + " - Assignment:\n"
+ + " - ADD: \n"
+ + " - Target: Superuser (role)\n"
+ + "\n"
+ + "Channel: ";
+ assertEquals("Wrong message body", expected, dummyTransport.getMessages("dummy:simpleUserNotifier").get(0).getBody());
+
+ }
+
@Test
public void test200SendSmsUsingGet() {
final String TEST_NAME = "test200SendSmsUsingGet";
diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceObjectConverter.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceObjectConverter.java
index ec5ee1dd04e..d80f0ee638c 100644
--- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceObjectConverter.java
+++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceObjectConverter.java
@@ -106,20 +106,11 @@ public class ResourceObjectConverter {
private static final String OPERATION_REFRESH_OPERATION_STATUS = DOT_CLASS + "refreshOperationStatus";
- @Autowired
- private EntitlementConverter entitlementConverter;
-
- @Autowired
- private MatchingRuleRegistry matchingRuleRegistry;
-
- @Autowired
- private ResourceObjectReferenceResolver resourceObjectReferenceResolver;
-
- @Autowired
- private Clock clock;
-
- @Autowired
- private PrismContext prismContext;
+ @Autowired private EntitlementConverter entitlementConverter;
+ @Autowired private MatchingRuleRegistry matchingRuleRegistry;
+ @Autowired private ResourceObjectReferenceResolver resourceObjectReferenceResolver;
+ @Autowired private Clock clock;
+ @Autowired private PrismContext prismContext;
private static final Trace LOGGER = TraceManager.getTrace(ResourceObjectConverter.class);
diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceObjectReferenceResolver.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceObjectReferenceResolver.java
index 09be671c2b1..683d2852e58 100644
--- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceObjectReferenceResolver.java
+++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceObjectReferenceResolver.java
@@ -102,6 +102,7 @@ PrismObject resolve(ProvisioningContext ctx, ResourceObjectReference
if (resourceObjectReference.getResolutionFrequency() == null
|| resourceObjectReference.getResolutionFrequency() == ResourceObjectReferenceResolutionFrequencyType.ONCE) {
PrismObject shadow = repositoryService.getObject(ShadowType.class, shadowRef.getOid(), null, result);
+ shadowCache.applyDefinition(shadow, result);
return shadow;
}
} else if (resourceObjectReference.getResolutionFrequency() == ResourceObjectReferenceResolutionFrequencyType.NEVER) {
@@ -126,7 +127,7 @@ PrismObject resolve(ProvisioningContext ctx, ResourceObjectReference
ObjectFilter filter = AndFilter.createAnd(baseFilter, evaluatedRefQuery.getFilter());
ObjectQuery query = ObjectQuery.createObjectQuery(filter);
- // TODO: implement "repo" search strategies
+ // TODO: implement "repo" search strategies, don't forget to apply definitions
Collection> options = null;
@@ -165,6 +166,7 @@ Collection extends ResourceAttribute>> resolvePrimaryIdentifier(Provisioning
if (repoShadow == null) {
return null;
}
+ shadowCache.applyDefinition(repoShadow, result);
PrismContainer attributesContainer = repoShadow.findContainer(ShadowType.F_ATTRIBUTES);
if (attributesContainer == null) {
return null;
diff --git a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/csv/AbstractCsvTest.java b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/csv/AbstractCsvTest.java
index b615222441d..043280b275e 100644
--- a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/csv/AbstractCsvTest.java
+++ b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/csv/AbstractCsvTest.java
@@ -298,8 +298,9 @@ public void test006Capabilities() throws Exception {
ScriptCapabilityType capScript = CapabilityUtil.getCapability(nativeCapabilitiesList, ScriptCapabilityType.class);
assertNotNull("No script capability", capScript);
List scriptHosts = capScript.getHost();
- assertEquals("Wrong number of script hosts", 1, scriptHosts.size());
+ assertEquals("Wrong number of script hosts", 2, scriptHosts.size());
assertScriptHost(capScript, ProvisioningScriptHostType.CONNECTOR);
+ assertScriptHost(capScript, ProvisioningScriptHostType.RESOURCE);
List