diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/progress/ProvisioningStatisticsLineDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/progress/ProvisioningStatisticsLineDto.java index a5d633f5dc2..f8306359b52 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/progress/ProvisioningStatisticsLineDto.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/progress/ProvisioningStatisticsLineDto.java @@ -38,8 +38,8 @@ public class ProvisioningStatisticsLineDto { public static final String F_RESOURCE = "resource"; public static final String F_OBJECT_CLASS = "objectClass"; - public static final String F_GET_SUCCESS = "searchSuccess"; - public static final String F_GET_FAILURE = "searchFailure"; + public static final String F_GET_SUCCESS = "getSuccess"; + public static final String F_GET_FAILURE = "getFailure"; public static final String F_SEARCH_SUCCESS = "searchSuccess"; public static final String F_SEARCH_FAILURE = "searchFailure"; public static final String F_CREATE_SUCCESS = "createSuccess"; @@ -54,6 +54,7 @@ public class ProvisioningStatisticsLineDto { public static final String F_SCRIPT_FAILURE = "scriptFailure"; public static final String F_OTHER_SUCCESS = "otherSuccess"; public static final String F_OTHER_FAILURE = "otherFailure"; + public static final String F_TOTAL_OPERATIONS_COUNT = "totalOperationsCount"; public static final String F_AVERAGE_TIME = "averageTime"; public static final String F_MIN_TIME = "minTime"; public static final String F_MAX_TIME = "maxTime"; @@ -184,10 +185,14 @@ public int getOtherFailure() { return otherFailure; } - public Long getAverageTime() { - int totalCount = getSuccess + getFailure + searchSuccess + searchFailure + + public int getTotalOperationsCount() { + return getSuccess + getFailure + searchSuccess + searchFailure + createSuccess + createFailure + updateSuccess + updateFailure + deleteSuccess + deleteFailure + syncSuccess + syncFailure + scriptSuccess + scriptFailure + otherSuccess + otherFailure; + } + + public Long getAverageTime() { + int totalCount = getTotalOperationsCount(); if (totalCount > 0) { return totalTime / totalCount; } else { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/progress/StatisticsDtoModel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/progress/StatisticsDtoModel.java index 060ca70289e..f83f1c2fcb5 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/progress/StatisticsDtoModel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/progress/StatisticsDtoModel.java @@ -115,14 +115,13 @@ public StatisticsDto getObjectInternal() { } protected StatisticsDto getStatisticsFromTask(Task task) { - OperationalInformation operationalInformation = task.getOperationalInformation(); + OperationalInformationType operationalInformation = task.collectOperationalInformation(); if (operationalInformation == null) { LOGGER.warn("No operational information in task"); return null; } - OperationalInformationType infoType = operationalInformation.getAggregatedValue(); - infoType.setFromMemory(true); - StatisticsDto dto = new StatisticsDto(infoType); + operationalInformation.setFromMemory(true); + StatisticsDto dto = new StatisticsDto(operationalInformation); return dto; } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/progress/StatisticsPanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/progress/StatisticsPanel.html index c4bb9f81d7f..03e8294c34e 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/progress/StatisticsPanel.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/progress/StatisticsPanel.html @@ -40,6 +40,7 @@

+ @@ -64,6 +65,7 @@

+ diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/progress/StatisticsPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/progress/StatisticsPanel.java index a83e137f916..38a5467af81 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/progress/StatisticsPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/progress/StatisticsPanel.java @@ -60,6 +60,7 @@ public class StatisticsPanel extends SimplePanel { private static final String ID_PROVISIONING_SCRIPT_FAILURE = "Provisioning.ScriptFailure"; private static final String ID_PROVISIONING_OTHER_SUCCESS = "Provisioning.OtherSuccess"; private static final String ID_PROVISIONING_OTHER_FAILURE = "Provisioning.OtherFailure"; + private static final String ID_PROVISIONING_TOTAL_OPERATIONS_COUNT = "Provisioning.TotalOperationsCount"; private static final String ID_PROVISIONING_AVERAGE_TIME = "Provisioning.AverageTime"; private static final String ID_PROVISIONING_MIN_TIME = "Provisioning.MinTime"; private static final String ID_PROVISIONING_MAX_TIME = "Provisioning.MaxTime"; @@ -121,6 +122,7 @@ protected void populateItem(final ListItem item) item.add(new Label(ID_PROVISIONING_SCRIPT_FAILURE, new PropertyModel(item.getModel(), ProvisioningStatisticsLineDto.F_SCRIPT_FAILURE))); item.add(new Label(ID_PROVISIONING_OTHER_SUCCESS, new PropertyModel(item.getModel(), ProvisioningStatisticsLineDto.F_OTHER_SUCCESS))); item.add(new Label(ID_PROVISIONING_OTHER_FAILURE, new PropertyModel(item.getModel(), ProvisioningStatisticsLineDto.F_OTHER_FAILURE))); + item.add(new Label(ID_PROVISIONING_TOTAL_OPERATIONS_COUNT, new PropertyModel(item.getModel(), ProvisioningStatisticsLineDto.F_TOTAL_OPERATIONS_COUNT))); item.add(new Label(ID_PROVISIONING_AVERAGE_TIME, new PropertyModel(item.getModel(), ProvisioningStatisticsLineDto.F_AVERAGE_TIME))); item.add(new Label(ID_PROVISIONING_MIN_TIME, new PropertyModel(item.getModel(), ProvisioningStatisticsLineDto.F_MIN_TIME))); item.add(new Label(ID_PROVISIONING_MAX_TIME, new PropertyModel(item.getModel(), ProvisioningStatisticsLineDto.F_MAX_TIME))); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/progress/StatisticsPanel.properties b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/progress/StatisticsPanel.properties index 46c3c97f743..47bde790536 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/progress/StatisticsPanel.properties +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/progress/StatisticsPanel.properties @@ -19,8 +19,8 @@ Title.MappingsStatistics=Mappings evaluation information Title.NotificationsStatistics=Notifications information Title.CurrentStatus=Last status message Title.Source=Source: -Message.SourceRepository=repository (updated on {0}) -Message.SourceMemory=task in memory (updated on {0}) +Message.SourceRepository=repository (statistics updated on {0}) +Message.SourceMemory=task in memory (fetched {0}) ProvisioningStatistics.Resource=Resource ProvisioningStatistics.ObjectClass=Object class @@ -40,6 +40,7 @@ ProvisioningStatistics.ScriptSuccess=Script OK ProvisioningStatistics.ScriptFailure=Fail ProvisioningStatistics.OtherSuccess=Script OK ProvisioningStatistics.OtherFailure=Fail +ProvisioningStatistics.TotalOperationsCount=All operations ProvisioningStatistics.AverageTime=Avg time ProvisioningStatistics.MinTime=Min ProvisioningStatistics.MaxTime=Max diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/home/PageMyPasswordQuestions.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/home/PageMyPasswordQuestions.java index 461831b9b0b..61321230060 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/home/PageMyPasswordQuestions.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/home/PageMyPasswordQuestions.java @@ -1,55 +1,34 @@ package com.evolveum.midpoint.web.page.admin.home; -import java.net.URLDecoder; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import java.util.Iterator; import java.util.List; import org.apache.commons.lang.StringEscapeUtils; -import org.apache.commons.lang.NullArgumentException; -import org.apache.velocity.app.event.implement.EscapeJavaScriptReference; import org.apache.wicket.RestartResponseException; import org.apache.wicket.ajax.AjaxRequestTarget; -import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.TextField; -import org.apache.wicket.markup.html.form.validation.IFormValidator; import org.apache.wicket.markup.html.list.ListItem; import org.apache.wicket.markup.html.list.ListView; -import org.apache.wicket.markup.html.panel.FeedbackPanel; -import org.apache.wicket.markup.repeater.RepeatingView; import org.apache.wicket.model.IModel; -import org.apache.wicket.model.PropertyModel; -import org.apache.wicket.util.encoding.UrlDecoder; -import org.apache.wicket.util.string.StringValue; -import org.aspectj.util.LangUtil.ProcessController.Thrown; -import org.eclipse.core.internal.runtime.PrintStackUtil; -import ch.qos.logback.classic.Logger; - -import com.evolveum.midpoint.model.api.ModelService; import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.PrismObjectDefinition; import com.evolveum.midpoint.prism.crypto.EncryptionException; import com.evolveum.midpoint.prism.crypto.Protector; import com.evolveum.midpoint.prism.delta.ObjectDelta; -import com.evolveum.midpoint.prism.delta.PropertyDelta; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.schema.SchemaRegistry; import com.evolveum.midpoint.schema.GetOperationOptions; import com.evolveum.midpoint.schema.RetrieveOption; -import com.evolveum.midpoint.schema.SchemaConstantsGenerated; import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.MiscSchemaUtil; -import com.evolveum.midpoint.security.api.AuthorizationConstants; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.logging.LoggingUtils; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; -import com.evolveum.midpoint.web.application.AuthorizationAction; import com.evolveum.midpoint.web.application.PageDescriptor; import com.evolveum.midpoint.web.component.AjaxButton; import com.evolveum.midpoint.web.component.AjaxSubmitButton; @@ -59,28 +38,16 @@ import com.evolveum.midpoint.web.component.util.ObjectWrapperUtil; import com.evolveum.midpoint.web.page.PageBase; import com.evolveum.midpoint.web.page.admin.home.component.MyPasswordQuestionsPanel; -import com.evolveum.midpoint.web.page.admin.home.dto.MyPasswordsDto; -import com.evolveum.midpoint.web.page.admin.home.dto.PasswordAccountDto; import com.evolveum.midpoint.web.page.admin.home.dto.PasswordQuestionsDto; import com.evolveum.midpoint.web.page.admin.home.dto.SecurityQuestionAnswerDTO; -import com.evolveum.midpoint.web.page.admin.users.PageUsers; -import com.evolveum.midpoint.web.security.MidPointApplication; import com.evolveum.midpoint.web.security.SecurityUtils; -import com.evolveum.midpoint.web.security.WebApplicationConfiguration; -import com.evolveum.midpoint.web.util.OnePageParameterEncoder; import com.evolveum.midpoint.web.util.WebMiscUtil; import com.evolveum.midpoint.xml.ns._public.common.common_3.CredentialsPolicyType; import com.evolveum.midpoint.xml.ns._public.common.common_3.CredentialsType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.PasswordType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.SecurityPolicyType; import com.evolveum.midpoint.xml.ns._public.common.common_3.SecurityQuestionAnswerType; import com.evolveum.midpoint.xml.ns._public.common.common_3.SecurityQuestionDefinitionType; import com.evolveum.midpoint.xml.ns._public.common.common_3.SecurityQuestionsCredentialsType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.SystemConfigurationType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.SystemObjectsType; import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; import com.evolveum.prism.xml.ns._public.types_3.ProtectedStringType; @@ -223,7 +190,7 @@ public void initLayout(){ // SystemConfigurationType.class, SystemObjectsType.SYSTEM_CONFIGURATION.value(), null, //task, result); - CredentialsPolicyType credPolicy=getModelInteractionService().getCredentialsPolicy(null, result); + CredentialsPolicyType credPolicy=getModelInteractionService().getCredentialsPolicy(null, null, result); // PrismObject securityPolicy = getModelService().getObject(SecurityPolicyType.class,config.asObjectable().getGlobalSecurityPolicyRef().getOid(), null, task, subResult); //Global Policy set question numbers diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/PageTaskEdit.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/PageTaskEdit.java index 5cc6c443bdf..8b61a1d8571 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/PageTaskEdit.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/PageTaskEdit.java @@ -257,9 +257,6 @@ private TaskDto loadTask() { private TaskDto prepareTaskDto(TaskType task, OperationResult result) throws SchemaException, ObjectNotFoundException { TaskDto taskDto = new TaskDto(task, getModelService(), getTaskService(), getModelInteractionService(), getTaskManager(), TaskDtoProviderOptions.fullOptions(), result, this); - for (TaskType child : task.getSubtask()) { - taskDto.addChildTaskDto(prepareTaskDto(child, result)); - } return taskDto; } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/currentState/TaskCurrentStateDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/currentState/TaskCurrentStateDto.java index cf2d69239c5..d9bfe8194f3 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/currentState/TaskCurrentStateDto.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/currentState/TaskCurrentStateDto.java @@ -32,15 +32,23 @@ public class TaskCurrentStateDto { private TaskDto taskDto; private SynchronizationInformationType synchronizationInformationType; private IterativeTaskInformationType iterativeTaskInformationType; + private Long currentProgress; public TaskCurrentStateDto(TaskDto taskDto) { this.taskDto = taskDto; } - public TaskCurrentStateDto(TaskDto taskDto, SynchronizationInformationType sit, IterativeTaskInformationType itit) { + public TaskCurrentStateDto(TaskDto taskDto, SynchronizationInformationType sit, IterativeTaskInformationType itit, Long currentProgress) { this.taskDto = taskDto; this.synchronizationInformationType = sit; this.iterativeTaskInformationType = itit; + if (currentProgress != null) { + this.currentProgress = currentProgress; + } else { + if (taskDto != null) { + this.currentProgress = taskDto.getProgress(); + } + } } public TaskDto getTaskDto() { @@ -54,4 +62,8 @@ public SynchronizationInformationType getSynchronizationInformationType() { public IterativeTaskInformationType getIterativeTaskInformationType() { return iterativeTaskInformationType; } + + public Long getCurrentProgress() { + return currentProgress; + } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/currentState/TaskCurrentStateDtoModel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/currentState/TaskCurrentStateDtoModel.java index 41d78c2a1e8..547228ca4c4 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/currentState/TaskCurrentStateDtoModel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/currentState/TaskCurrentStateDtoModel.java @@ -18,6 +18,8 @@ import com.evolveum.midpoint.prism.PrismContainer; import com.evolveum.midpoint.prism.PrismObject; +import com.evolveum.midpoint.schema.GetOperationOptions; +import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.statistics.IterativeTaskInformation; @@ -48,6 +50,7 @@ import org.apache.wicket.model.IModel; import java.io.IOException; +import java.util.Collection; /** * @author Pavol Mederly @@ -117,27 +120,21 @@ protected TaskCurrentStateDto getObjectInternal() { } else { LOGGER.info("No IterativeTaskInformationType in task extension."); } - return new TaskCurrentStateDto(taskModel.getObject(), infoPropertyValue, ititPropertyValue); + return new TaskCurrentStateDto(taskModel.getObject(), infoPropertyValue, ititPropertyValue, null); } - SynchronizationInformation info = task.getSynchronizationInformation(); - SynchronizationInformationType sit; - if (info != null) { - sit = info.getAggregatedValue(); + SynchronizationInformationType sit = task.collectSynchronizationInformation(); + if (sit != null) { sit.setFromMemory(true); } else { - sit = null; LOGGER.warn("No synchronization information in task"); } - IterativeTaskInformation iter = task.getIterativeTaskInformation(); - IterativeTaskInformationType itit; - if (iter != null) { - itit = iter.getAggregatedValue(); + IterativeTaskInformationType itit = task.collectIterativeTaskInformation();; + if (itit != null) { itit.setFromMemory(true); } else { - itit = null; LOGGER.warn("No synchronization information in task"); } - return new TaskCurrentStateDto(taskModel.getObject(), sit, itit); + return new TaskCurrentStateDto(taskModel.getObject(), sit, itit, task.getProgress()); } public void refresh(PageBase page) { @@ -145,6 +142,7 @@ public void refresh(PageBase page) { if (taskModel == null || taskModel.getObject() == null) { LOGGER.warn("Null or empty taskModel"); + return; } TaskManager taskManager = page.getTaskManager(); OperationResult result = new OperationResult("refresh"); @@ -153,7 +151,8 @@ public void refresh(PageBase page) { String oid = taskModel.getObject().getOid(); try { LOGGER.info("Refreshing task {}", taskModel.getObject()); - PrismObject task = page.getModelService().getObject(TaskType.class, oid, null, operationTask, result); + Collection> options = GetOperationOptions.createRetrieveAttributesOptions(TaskType.F_SUBTASK, TaskType.F_NODE_AS_OBSERVED); + PrismObject task = page.getModelService().getObject(TaskType.class, oid, options, operationTask, result); TaskDto taskDto = new TaskDto(task.asObjectable(), page.getModelService(), page.getTaskService(), page.getModelInteractionService(), taskManager, TaskDtoProviderOptions.minimalOptions(), result, page); taskModel.setObject(taskDto); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/currentState/TaskStatePanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/currentState/TaskStatePanel.html index 2dfeda05894..e0352a26b4e 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/currentState/TaskStatePanel.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/currentState/TaskStatePanel.html @@ -71,6 +71,9 @@

+

+
+

diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/currentState/TaskStatePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/currentState/TaskStatePanel.java index 9725096561f..68443725ff2 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/currentState/TaskStatePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/currentState/TaskStatePanel.java @@ -22,12 +22,16 @@ import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.web.component.data.TablePanel; +import com.evolveum.midpoint.web.component.data.column.EnumPropertyColumn; +import com.evolveum.midpoint.web.component.data.column.LinkColumn; import com.evolveum.midpoint.web.component.progress.StatisticsDtoModel; import com.evolveum.midpoint.web.component.progress.StatisticsPanel; import com.evolveum.midpoint.web.component.util.ListDataProvider; import com.evolveum.midpoint.web.component.util.SimplePanel; +import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; import com.evolveum.midpoint.web.page.PageBase; import com.evolveum.midpoint.web.page.admin.server.PageTaskEdit; +import com.evolveum.midpoint.web.page.admin.server.PageTasks; import com.evolveum.midpoint.web.page.admin.server.dto.TaskDto; import com.evolveum.midpoint.web.page.admin.server.dto.TaskDtoExecutionStatus; import com.evolveum.midpoint.web.util.WebMiscUtil; @@ -35,19 +39,24 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.SynchronizationInformationType; import org.apache.commons.lang.time.DurationFormatUtils; import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn; +import org.apache.wicket.extensions.markup.html.repeater.data.table.ISortableDataProvider; import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn; import org.apache.wicket.extensions.markup.html.repeater.util.SortableDataProvider; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.model.AbstractReadOnlyModel; import org.apache.wicket.model.IModel; import org.apache.wicket.model.PropertyModel; +import org.apache.wicket.model.ResourceModel; +import javax.xml.datatype.XMLGregorianCalendar; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Date; import java.util.List; +import static com.evolveum.midpoint.web.page.PageTemplate.createStringResourceStatic; + /** * @author mederly */ @@ -80,7 +89,12 @@ public class TaskStatePanel extends SimplePanel { private static final String ID_SYNCHRONIZATION_INFORMATION_PANEL = "synchronizationInformationPanel"; private static final String ID_STATISTICS_PANEL = "statisticsPanel"; + private static final String ID_WORKER_THREADS_TABLE = "workerThreadsTable"; + private static final String ID_WORKER_THREADS_TABLE_LABEL = "workerThreadsTableLabel"; + private static final String ID_OPERATION_RESULT = "operationResult"; + + // ugly hack - TODO replace with something serious private static final Collection WALL_CLOCK_AVG_CATEGORIES = Arrays.asList( TaskCategory.BULK_ACTIONS, TaskCategory.IMPORTING_ACCOUNTS, TaskCategory.RECOMPUTATION, TaskCategory.RECONCILIATION ); @@ -97,7 +111,7 @@ protected void initLayout() { Label updated = new Label(ID_UPDATED, new AbstractReadOnlyModel() { @Override public String getObject() { - return WebMiscUtil.formatDate(new Date()); + return formatDate(new Date()); } }); add(updated); @@ -136,11 +150,11 @@ public String getObject() { return null; } if (TaskDtoExecutionStatus.RUNNING.equals(dto.getExecution()) || finished == null || finished < started) { - return getString("TaskStatePanel.message.executionTime.notFinished", WebMiscUtil.formatDate(new Date(started)), + return getString("TaskStatePanel.message.executionTime.notFinished", formatDate(new Date(started)), DurationFormatUtils.formatDurationHMS(System.currentTimeMillis() - started)); } else { return getString("TaskStatePanel.message.executionTime.finished", - WebMiscUtil.formatDate(new Date(started)), WebMiscUtil.formatDate(new Date(finished)), + formatDate(new Date(started)), formatDate(new Date(finished)), DurationFormatUtils.formatDurationHMS(finished - started)); } } @@ -150,8 +164,13 @@ public String getObject() { Label progress = new Label(ID_PROGRESS, new AbstractReadOnlyModel() { @Override public String getObject() { - TaskDto dto = getModel().getObject().getTaskDto(); - return dto.getProgressDescription(); // TODO implement using live task + implement stalled since + TaskCurrentStateDto dto = getModelObject(); + TaskDto taskDto = dto.getTaskDto(); + if (taskDto == null) { + return null; + } else { + return taskDto.getProgressDescription(dto.getCurrentProgress()); // TODO implement stalled since + } } }); add(progress); @@ -233,11 +252,17 @@ public String getObject() { if (info.getLastSuccessEndTimestamp() == null) { return null; } else { - return getString("TaskStatePanel.message.timeInfoWithDuration", - WebMiscUtil.formatDate(info.getLastSuccessEndTimestamp()), - DurationFormatUtils.formatDurationWords(System.currentTimeMillis() - - XmlTypeConverter.toMillis(info.getLastSuccessEndTimestamp()), true, true), - info.getLastSuccessDuration()); + if (showAgo(dto)) { + return getString("TaskStatePanel.message.timeInfoWithDurationAndAgo", + formatDate(info.getLastSuccessEndTimestamp()), + DurationFormatUtils.formatDurationWords(System.currentTimeMillis() - + XmlTypeConverter.toMillis(info.getLastSuccessEndTimestamp()), true, true), + info.getLastSuccessDuration()); + } else { + return getString("TaskStatePanel.message.timeInfoWithDuration", + formatDate(info.getLastSuccessEndTimestamp()), + info.getLastSuccessDuration()); + } } } }); @@ -321,11 +346,17 @@ public String getObject() { if (info.getLastFailureEndTimestamp() == null) { return null; } else { - return getString("TaskStatePanel.message.timeInfoWithDuration", - WebMiscUtil.formatDate(info.getLastFailureEndTimestamp()), - DurationFormatUtils.formatDurationWords(System.currentTimeMillis() - - XmlTypeConverter.toMillis(info.getLastFailureEndTimestamp()), true, true), - info.getLastFailureDuration()); + if (showAgo(dto)) { + return getString("TaskStatePanel.message.timeInfoWithDurationAndAgo", + formatDate(info.getLastFailureEndTimestamp()), + DurationFormatUtils.formatDurationWords(System.currentTimeMillis() - + XmlTypeConverter.toMillis(info.getLastFailureEndTimestamp()), true, true), + info.getLastFailureDuration()); + } else { + return getString("TaskStatePanel.message.timeInfoWithDuration", + formatDate(info.getLastFailureEndTimestamp()), + info.getLastFailureDuration()); + } } } }); @@ -377,8 +408,8 @@ public String getObject() { if (info.getCurrentObjectStartTimestamp() == null) { return null; } else { - return getString("TaskStatePanel.message.timeInfo", - WebMiscUtil.formatDate(info.getCurrentObjectStartTimestamp()), + return getString("TaskStatePanel.message.timeInfoWithAgo", + formatDate(info.getCurrentObjectStartTimestamp()), DurationFormatUtils.formatDurationWords(System.currentTimeMillis() - XmlTypeConverter.toMillis(info.getCurrentObjectStartTimestamp()), true, true)); } @@ -425,6 +456,13 @@ public SynchronizationInformationDto getObject() { return new SynchronizationInformationDto(dto.getSynchronizationInformationType()); } }); + synchronizationInformationPanel.add(new VisibleEnableBehaviour() { + @Override + public boolean isVisible() { + TaskCurrentStateDto dto = getModelObject(); + return dto != null && dto.getSynchronizationInformationType() != null; + } + }); add(synchronizationInformationPanel); Label countersSource = new Label(ID_COUNTERS_SOURCE, new AbstractReadOnlyModel() { @@ -434,16 +472,16 @@ public String getObject() { if (dto == null) { return null; } - SynchronizationInformationType info = dto.getSynchronizationInformationType(); + IterativeTaskInformationType info = dto.getIterativeTaskInformationType(); if (info == null) { return null; } if (Boolean.TRUE.equals(info.isFromMemory())) { return getString("TaskStatePanel.message.countersSourceMemory", - WebMiscUtil.formatDate(info.getTimestamp())); + formatDate(info.getTimestamp())); } else { return getString("TaskStatePanel.message.countersSourceRepository", - WebMiscUtil.formatDate(info.getTimestamp())); + formatDate(info.getTimestamp())); } } }); @@ -458,6 +496,39 @@ public TaskDto getObject() { StatisticsPanel statisticsPanel = new StatisticsPanel(ID_STATISTICS_PANEL, statisticsDtoModel); add(statisticsPanel); + VisibleEnableBehaviour hiddenWhenNoSubtasks = new VisibleEnableBehaviour() { + @Override + public boolean isVisible() { + TaskDto taskDto = getModelObject().getTaskDto(); + return taskDto != null && !taskDto.getTransientSubtasks().isEmpty(); + } + }; + + Label workerThreadsTableLabel = new Label(ID_WORKER_THREADS_TABLE_LABEL, new ResourceModel("TaskStatePanel.workerThreads")); + workerThreadsTableLabel.add(hiddenWhenNoSubtasks); + add(workerThreadsTableLabel); + List> columns = new ArrayList<>(); + columns.add(new PropertyColumn(createStringResourceStatic(this, "TaskStatePanel.subtaskName"), WorkerThreadDto.F_NAME)); + columns.add(new EnumPropertyColumn(createStringResourceStatic(this, "TaskStatePanel.subtaskState"), WorkerThreadDto.F_EXECUTION_STATUS)); + columns.add(new PropertyColumn(createStringResourceStatic(this, "TaskStatePanel.subtaskObjectsProcessed"), WorkerThreadDto.F_PROGRESS)); + ISortableDataProvider threadsProvider = new ListDataProvider<>(this, + new AbstractReadOnlyModel>() { + @Override + public List getObject() { + List rv = new ArrayList<>(); + TaskDto taskDto = getModelObject().getTaskDto(); + if (taskDto != null) { + for (TaskDto subtaskDto : taskDto.getTransientSubtasks()) { + rv.add(new WorkerThreadDto(subtaskDto)); + } + } + return rv; + } + }); + TablePanel workerThreadsTablePanel = new TablePanel<>(ID_WORKER_THREADS_TABLE, threadsProvider , columns); + workerThreadsTablePanel.add(hiddenWhenNoSubtasks); + add(workerThreadsTablePanel); + SortableDataProvider provider = new ListDataProvider<>(this, new PropertyModel>(getModel(), "taskDto.opResult")); TablePanel result = new TablePanel<>(ID_OPERATION_RESULT, provider, initResultColumns()); @@ -467,6 +538,32 @@ public TaskDto getObject() { add(result); } + private String formatDate(XMLGregorianCalendar date) { + return formatDate(XmlTypeConverter.toDate(date)); + } + + private String formatDate(Date date) { + if (date == null) { + return null; + } + return date.toLocaleString(); + } + + protected boolean showAgo(TaskCurrentStateDto dto) { + boolean showAgo = false; + TaskDto taskDto = dto.getTaskDto(); + if (taskDto != null) { + Long started = taskDto.getLastRunStartTimestampLong(); + Long finished = taskDto.getLastRunFinishTimestampLong(); + if (started != null && (finished == null || finished < started)) { + showAgo = true; // for all running tasks + } else if (finished != null && (System.currentTimeMillis()-finished < 60000L)) { + showAgo = true; // for tasks finished just a while ago + } + } + return showAgo; + } + private Long getWallClockAverage(TaskCurrentStateDto dto, int objectsTotal) { if (objectsTotal == 0) { return null; @@ -500,6 +597,7 @@ public void refreshModel(PageTaskEdit page) { IModel model = getModel(); if (!(model instanceof TaskCurrentStateDtoModel)) { LOGGER.warn("Unexpected or null model for TaskCurrentStateDto object: {}", model); + return; } ((TaskCurrentStateDtoModel) model).refresh(page); if (statisticsDtoModel != null) { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/currentState/TaskStatePanel.properties b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/currentState/TaskStatePanel.properties index 442bf1aaa37..8cf2ecdae69 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/currentState/TaskStatePanel.properties +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/currentState/TaskStatePanel.properties @@ -16,8 +16,8 @@ TaskStatePanel.updated=Updated: TaskStatePanel.countersSource=Source: -TaskStatePanel.message.countersSourceRepository=repository (updated on {0}) -TaskStatePanel.message.countersSourceMemory=task in memory (updated on {0}) +TaskStatePanel.message.countersSourceRepository=repository (statistics updated on {0}) +TaskStatePanel.message.countersSourceMemory=task in memory (fetched {0}) TaskStatePanel.executionStatus=Execution status TaskStatePanel.executionTime=Execution time @@ -32,14 +32,20 @@ TaskStatePanel.message.objectsProcessed={0} TaskStatePanel.message.objectsProcessedTime=(average time {1} ms, total processing time {0} seconds) TaskStatePanel.lastObjectProcessedSuccess=Last object successfully processed TaskStatePanel.message.lastObjectProcessed={0} -TaskStatePanel.message.timeInfoWithDuration={0} ({1} ago - in {2} ms) -TaskStatePanel.message.timeInfo={0} ({1} ago) +TaskStatePanel.message.timeInfoWithDurationAndAgo={0} ({1} ago - in {2} ms) +TaskStatePanel.message.timeInfoWithDuration={0} (in {1} ms) +TaskStatePanel.message.timeInfoWithAgo={0} ({1} ago) TaskStatePanel.objectsProcessedFailure=Objects failed to be processed TaskStatePanel.lastObjectProcessedFailure=Last object failed to be processed TaskStatePanel.lastError=Last error when processing object TaskStatePanel.currentObjectProcessed=Current object being processed TaskStatePanel.objectsTotal=Total objects processed +TaskStatePanel.workerThreads=Lightweight subtasks (worker threads) +TaskStatePanel.subtaskName=Name +TaskStatePanel.subtaskState=State +TaskStatePanel.subtaskObjectsProcessed=Objects processed + TaskStatePanel.statistics=Operational statistics TaskStatePanel.opResult=Operation result \ No newline at end of file diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/currentState/WorkerThreadDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/currentState/WorkerThreadDto.java new file mode 100644 index 00000000000..4e0c164bd6c --- /dev/null +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/currentState/WorkerThreadDto.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2010-2015 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.server.currentState; + +import com.evolveum.midpoint.web.page.admin.server.dto.TaskDto; +import com.evolveum.midpoint.web.page.admin.server.dto.TaskDtoExecutionStatus; + +import java.io.Serializable; + +/** + * @author Pavol Mederly + */ +public class WorkerThreadDto implements Serializable { + + public static final String F_NAME = "name"; + public static final String F_EXECUTION_STATUS = "executionStatus"; + public static final String F_PROGRESS = "progress"; + + private final TaskDto subtaskDto; + + public WorkerThreadDto(TaskDto subtaskDto) { + this.subtaskDto = subtaskDto; + } + + public String getName() { + return subtaskDto != null ? subtaskDto.getName() : null; + } + + public Long getProgress() { + return subtaskDto != null ? subtaskDto.getProgress() : null; + } + + public TaskDtoExecutionStatus getExecutionStatus() { + return subtaskDto != null ? subtaskDto.getExecution() : null; + } +} diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/dto/TaskDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/dto/TaskDto.java index 914f7db9240..3d8c22a6a0c 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/dto/TaskDto.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/dto/TaskDto.java @@ -116,7 +116,8 @@ public class TaskDto extends Selectable { private ObjectTypes objectRefType; private String objectRefName; - private List subtasks = new ArrayList(); + private List subtasks = new ArrayList<>(); // only persistent subtasks are here + private List transientSubtasks = new ArrayList<>(); // transient ones are here private Long lastRunStartTimestampLong; private Long lastRunFinishTimestampLong; @@ -171,6 +172,11 @@ public TaskDto(TaskType taskType, ModelService modelService, TaskService taskSer //dryRun, intent, kind, objectCLass, workerThreads fillFromExtension(taskType); + + for (TaskType child : taskType.getSubtask()) { + addChildTaskDto(new TaskDto(child, modelService, taskService, modelInteractionService, taskManager, + options, parentResult, pageBase)); + } } private void fillInResourceReference(TaskType task, TaskManager manager, OperationResult result, ModelService service, PageBase pageBase){ @@ -527,17 +533,21 @@ public Long getExpectedTotal() { } public String getProgressDescription() { - if (taskType.getProgress() == null && taskType.getExpectedTotal() == null) { + return getProgressDescription(taskType.getProgress()); + } + + public String getProgressDescription(Long currentProgress) { + if (currentProgress == null && taskType.getExpectedTotal() == null) { return ""; // the task handler probably does not report progress at all } else { StringBuilder sb = new StringBuilder(); - if (taskType.getProgress() != null){ - sb.append(taskType.getProgress()); + if (currentProgress != null){ + sb.append(currentProgress); } else { sb.append("0"); } if (taskType.getExpectedTotal() != null) { - sb.append("/" + taskType.getExpectedTotal()); + sb.append("/").append(taskType.getExpectedTotal()); } return sb.toString(); } @@ -689,13 +699,21 @@ public ModelOperationStatusDto getModelOperationStatus() { } public void addChildTaskDto(TaskDto taskDto) { - subtasks.add(taskDto); + if (taskDto.getOid() != null) { + subtasks.add(taskDto); + } else { + transientSubtasks.add(taskDto); + } } public List getSubtasks() { return subtasks; } + public List getTransientSubtasks() { + return transientSubtasks; + } + public boolean isWorkflowShadowTask() { return workflowShadowTask; } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUser.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUser.java index f3bd3dd1eca..f89c05ba70c 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUser.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUser.java @@ -1485,7 +1485,7 @@ private void recomputeAssignmentsPerformed(AjaxRequestTarget target){ } // all resources - DeltaSetTriple evaluatedConstructionsTriple = evaluatedAssignment.getEvaluatedConstructions(result); + DeltaSetTriple evaluatedConstructionsTriple = evaluatedAssignment.getEvaluatedConstructions(task, result); Collection evaluatedConstructions = evaluatedConstructionsTriple.getNonNegativeValues(); for (EvaluatedConstruction construction : evaluatedConstructions) { assignmentDtoSet.add(createAssignmentsPreviewDto(construction)); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/forgetpassword/PageSecurityQuestions.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/forgetpassword/PageSecurityQuestions.java index e73a97570c5..91fcd46ced3 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/forgetpassword/PageSecurityQuestions.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/forgetpassword/PageSecurityQuestions.java @@ -17,7 +17,6 @@ import org.apache.commons.lang.StringEscapeUtils; import org.apache.wicket.RestartResponseException; import org.apache.wicket.ajax.AjaxRequestTarget; -import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.markup.html.list.ListItem; @@ -85,7 +84,6 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.SecurityPolicyType; import com.evolveum.midpoint.xml.ns._public.common.common_3.SecurityQuestionAnswerType; import com.evolveum.midpoint.xml.ns._public.common.common_3.SecurityQuestionDefinitionType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.SecurityQuestionsCredentialsPolicyType; import com.evolveum.midpoint.xml.ns._public.common.common_3.SecurityQuestionsCredentialsType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; import com.evolveum.midpoint.xml.ns._public.common.common_3.SystemConfigurationType; @@ -561,13 +559,13 @@ private void resetPassword(UserType user, AjaxRequestTarget target) { try { // System.out.println("try"); - if (getModelInteractionService().getCredentialsPolicy(null, parentResult) + if (getModelInteractionService().getCredentialsPolicy(null, null, parentResult) .getSecurityQuestions().getResetMethod().getResetType() .equals(CredentialsResetTypeType.SECURITY_QUESTIONS)) { // System.out.println("ifff"); getSession().setAttribute("pwdReset", newPassword); setResponsePage(PageShowPassword.class); - } else if (getModelInteractionService().getCredentialsPolicy(null, parentResult) + } else if (getModelInteractionService().getCredentialsPolicy(null, null, parentResult) .getSecurityQuestions().getResetMethod().getResetType() .equals(CredentialsResetTypeType.SECURITY_QUESTIONS_EMAIL)) { // System.out.println("ifff2"); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/PageLogin.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/PageLogin.java index e8f9b4367fd..c6c02caff71 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/PageLogin.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/PageLogin.java @@ -80,7 +80,7 @@ protected void onSubmit() { OperationResult parentResult = new OperationResult(OPERATION_LOAD_RESET_PASSWORD_POLICY); try { - CredentialsPolicyType creds= getModelInteractionService().getCredentialsPolicy(null, parentResult); + CredentialsPolicyType creds= getModelInteractionService().getCredentialsPolicy(null, (Task) null, parentResult); BookmarkablePageLink link = new BookmarkablePageLink("forgetpassword", PageForgetPassword.class); boolean linkIsVisible=false; if(creds!=null ){ diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/statistics/IterativeTaskInformation.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/statistics/IterativeTaskInformation.java index 4c677d11803..56d27edb49e 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/statistics/IterativeTaskInformation.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/statistics/IterativeTaskInformation.java @@ -20,6 +20,7 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.IterativeTaskInformationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.SynchronizationInformationType; +import javax.xml.datatype.DatatypeConstants; import javax.xml.namespace.QName; import java.util.Date; @@ -86,8 +87,8 @@ private IterativeTaskInformationType aggregate(IterativeTaskInformationType star return delta; } IterativeTaskInformationType rv = new IterativeTaskInformationType(); - addTo(rv, startValue); - addTo(rv, delta); + addTo(rv, startValue, true); + addTo(rv, delta, true); return rv; } @@ -162,8 +163,11 @@ public void toJaxb(IterativeTaskInformationType rv) { } // sum != null, delta != null - public static void addTo(IterativeTaskInformationType sum, IterativeTaskInformationType delta) { - if (delta.getLastSuccessObjectName() != null) { + // overrideCurrent should be TRUE if the delta is chronologically later (i.e. if delta is meant as an update to sum) + // if it is simply an aggregation of various (parallel) sources, overrideCurrent should be FALSE + public static void addTo(IterativeTaskInformationType sum, IterativeTaskInformationType delta, boolean overrideCurrent) { + if (sum.getLastSuccessEndTimestamp() == null || (delta.getLastSuccessEndTimestamp() != null && + delta.getLastSuccessEndTimestamp().compare(sum.getLastSuccessEndTimestamp()) == DatatypeConstants.GREATER)) { sum.setLastSuccessObjectName(delta.getLastSuccessObjectName()); sum.setLastSuccessObjectDisplayName(delta.getLastSuccessObjectDisplayName()); sum.setLastSuccessObjectType(delta.getLastSuccessObjectType()); @@ -174,7 +178,8 @@ public static void addTo(IterativeTaskInformationType sum, IterativeTaskInformat sum.setTotalSuccessDuration(sum.getTotalSuccessDuration() + delta.getTotalSuccessDuration()); sum.setTotalSuccessCount(sum.getTotalSuccessCount() + delta.getTotalSuccessCount()); - if (delta.getLastFailureObjectName() != null) { + if (sum.getLastFailureEndTimestamp() == null || (delta.getLastFailureEndTimestamp() != null && + delta.getLastFailureEndTimestamp().compare(sum.getLastFailureEndTimestamp()) == DatatypeConstants.GREATER)) { sum.setLastFailureObjectName(delta.getLastFailureObjectName()); sum.setLastFailureObjectDisplayName(delta.getLastFailureObjectDisplayName()); sum.setLastFailureObjectType(delta.getLastFailureObjectType()); @@ -186,10 +191,13 @@ public static void addTo(IterativeTaskInformationType sum, IterativeTaskInformat sum.setTotalFailureDuration(sum.getTotalFailureDuration() + delta.getTotalFailureDuration()); sum.setTotalFailureCount(sum.getTotalFailureCount() + delta.getTotalFailureCount()); - sum.setCurrentObjectName(delta.getCurrentObjectName()); - sum.setCurrentObjectDisplayName(delta.getCurrentObjectDisplayName()); - sum.setCurrentObjectType(delta.getCurrentObjectType()); - sum.setCurrentObjectOid(delta.getCurrentObjectOid()); - sum.setCurrentObjectStartTimestamp(delta.getCurrentObjectStartTimestamp()); + if (overrideCurrent || sum.getCurrentObjectStartTimestamp() == null || (delta.getCurrentObjectStartTimestamp() != null && + delta.getCurrentObjectStartTimestamp().compare(sum.getCurrentObjectStartTimestamp()) == DatatypeConstants.GREATER)) { + sum.setCurrentObjectName(delta.getCurrentObjectName()); + sum.setCurrentObjectDisplayName(delta.getCurrentObjectDisplayName()); + sum.setCurrentObjectType(delta.getCurrentObjectType()); + sum.setCurrentObjectOid(delta.getCurrentObjectOid()); + sum.setCurrentObjectStartTimestamp(delta.getCurrentObjectStartTimestamp()); + } } } diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/statistics/OperationalInformation.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/statistics/OperationalInformation.java index 107a5197ea4..5a627942ce0 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/statistics/OperationalInformation.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/statistics/OperationalInformation.java @@ -27,6 +27,7 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.ProvisioningStatisticsType; import org.apache.commons.lang.StringUtils; +import javax.xml.datatype.DatatypeConstants; import javax.xml.namespace.QName; import java.util.ArrayList; import java.util.Date; @@ -278,17 +279,19 @@ private OperationalInformationType aggregate(OperationalInformationType startVal return rv; } - private void addTo(OperationalInformationType rv, OperationalInformationType delta) { + public static void addTo(OperationalInformationType rv, OperationalInformationType delta) { addProvisioningTo(rv, delta.getProvisioningStatistics()); addMappingsTo(rv, delta.getMappingsStatistics()); addNotificationsTo(rv, delta.getNotificationsStatistics()); if (delta.getLastMessageTimestamp() != null) { - rv.setLastMessageTimestamp(delta.getLastMessageTimestamp()); - rv.setLastMessage(delta.getLastMessage()); + if (rv.getLastMessageTimestamp() == null || rv.getLastMessageTimestamp().compare(delta.getLastMessageTimestamp()) == DatatypeConstants.LESSER) { + rv.setLastMessageTimestamp(delta.getLastMessageTimestamp()); + rv.setLastMessage(delta.getLastMessage()); + } } } - private void addNotificationsTo(OperationalInformationType rv, NotificationsStatisticsType delta) { + private static void addNotificationsTo(OperationalInformationType rv, NotificationsStatisticsType delta) { if (delta == null) { return; } @@ -330,7 +333,7 @@ private static NotificationsStatisticsEntryType findNotificationsEntryType(List< } - private void addMappingsTo(OperationalInformationType rv, MappingsStatisticsType delta) { + private static void addMappingsTo(OperationalInformationType rv, MappingsStatisticsType delta) { if (delta == null) { return; } @@ -369,7 +372,7 @@ private static MappingsStatisticsEntryType findMappingsEntryType(List String getDisplayName(PrismObject object) { + if (object == null) { + return null; + } + O objectable = object.asObjectable(); + if (objectable instanceof UserType) { + return "User " + ((UserType) objectable).getFullName() + " (" + object.getName() + ")"; + } else if (objectable instanceof RoleType) { + return "Role " + ((RoleType) objectable).getDisplayName() + " (" + object.getName() + ")"; + } else if (objectable instanceof OrgType) { + return "Org " + ((OrgType) objectable).getDisplayName() + " (" + object.getName() + ")"; + } else if (objectable instanceof ShadowType) { + return "Shadow " + getDisplayName((ShadowType) objectable); + } else { + return objectable.getClass().getSimpleName() + " " + objectable.getName(); + } + } +} diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/statistics/SynchronizationInformation.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/statistics/SynchronizationInformation.java index 90faf1f042a..7973b247d80 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/statistics/SynchronizationInformation.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/statistics/SynchronizationInformation.java @@ -75,7 +75,7 @@ private SynchronizationInformationType aggregate(SynchronizationInformationType return rv; } - private static void addTo(SynchronizationInformationType sum, SynchronizationInformationType delta) { + public static void addTo(SynchronizationInformationType sum, SynchronizationInformationType delta) { sum.setCountProtected(sum.getCountProtected() + delta.getCountProtected()); sum.setCountNoSynchronizationPolicy(sum.getCountNoSynchronizationPolicy() + delta.getCountNoSynchronizationPolicy()); sum.setCountSynchronizationDisabled(sum.getCountSynchronizationDisabled() + delta.getCountSynchronizationDisabled()); diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ObjectResolver.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ObjectResolver.java index 82980d305ad..b6f94dbe18f 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ObjectResolver.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ObjectResolver.java @@ -50,6 +50,7 @@ public interface ObjectResolver { * * @param ref object reference to resolve * @param contextDescription short description of the context of resolution, e.g. "executing expression FOO". Used in error messages. + * @param task * @return resolved object * @throws ObjectNotFoundException * requested object does not exist @@ -57,12 +58,14 @@ public interface ObjectResolver { * error dealing with storage schema * @throws IllegalArgumentException * wrong OID format, etc. + * + * TODO resolve module dependencies to allow task to be of type Task */ - T resolve(ObjectReferenceType ref, Class expectedType, Collection> options, - String contextDescription, OperationResult result) + T resolve(ObjectReferenceType ref, Class expectedType, Collection> options, + String contextDescription, Object task, OperationResult result) throws ObjectNotFoundException, SchemaException; - void searchIterative(Class type, ObjectQuery query, Collection> options, ResultHandler handler, OperationResult parentResult) + void searchIterative(Class type, ObjectQuery query, Collection> options, ResultHandler handler, Object task, OperationResult parentResult) throws SchemaException, ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException; } diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ResourceTypeUtil.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ResourceTypeUtil.java index e10c6201e45..ec41ad8a8c0 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ResourceTypeUtil.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ResourceTypeUtil.java @@ -15,7 +15,6 @@ */ package com.evolveum.midpoint.schema.util; -import com.evolveum.midpoint.prism.Containerable; import com.evolveum.midpoint.prism.PrismContainer; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismProperty; @@ -91,7 +90,7 @@ public static ConnectorType getConnectorType(ResourceType resource, ObjectResolv return resource.getConnector(); } else if (resource.getConnectorRef() != null) { return resolver.resolve(resource.getConnectorRef(), ConnectorType.class, - null, "resolving connector in " + resource, parentResult); + null, "resolving connector in " + resource, null, parentResult); // TODO task } else { return null; } diff --git a/infra/test-util/src/main/java/com/evolveum/midpoint/test/util/DirectoryFileObjectResolver.java b/infra/test-util/src/main/java/com/evolveum/midpoint/test/util/DirectoryFileObjectResolver.java index 1c2ad2286de..e4bc001f820 100644 --- a/infra/test-util/src/main/java/com/evolveum/midpoint/test/util/DirectoryFileObjectResolver.java +++ b/infra/test-util/src/main/java/com/evolveum/midpoint/test/util/DirectoryFileObjectResolver.java @@ -16,15 +16,9 @@ package com.evolveum.midpoint.test.util; import java.io.File; -import java.io.FileNotFoundException; import java.io.IOException; import java.util.Collection; -import javax.xml.bind.JAXBElement; -import javax.xml.bind.JAXBException; - -import org.opends.server.types.ObjectClass; - import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.util.PrismTestUtil; import com.evolveum.midpoint.schema.GetOperationOptions; @@ -32,7 +26,6 @@ import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.ObjectResolver; -import com.evolveum.midpoint.util.JAXBUtil; import com.evolveum.midpoint.util.exception.CommunicationException; import com.evolveum.midpoint.util.exception.ConfigurationException; import com.evolveum.midpoint.util.exception.ObjectNotFoundException; @@ -57,8 +50,8 @@ public DirectoryFileObjectResolver(File directory) { @Override public T resolve(ObjectReferenceType ref, Class expectedType, - Collection> options, String contextDescription, - OperationResult result) throws ObjectNotFoundException, SchemaException { + Collection> options, String contextDescription, + Object task, OperationResult result) throws ObjectNotFoundException, SchemaException { File file = new File( directory, oidToFilename(ref.getOid())); if (file.exists()) { try { @@ -77,8 +70,8 @@ private String oidToFilename(String oid) { @Override public void searchIterative(Class type, ObjectQuery query, - Collection> options, ResultHandler handler, - OperationResult parentResult) throws SchemaException, ObjectNotFoundException, + Collection> options, ResultHandler handler, + Object task, OperationResult parentResult) throws SchemaException, ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException { throw new UnsupportedOperationException(); } diff --git a/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertExpressionHelper.java b/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertExpressionHelper.java index 65554deaee0..8f89fb9fb8b 100644 --- a/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertExpressionHelper.java +++ b/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertExpressionHelper.java @@ -29,7 +29,6 @@ import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.task.api.Task; -import com.evolveum.midpoint.util.DOMUtil; import com.evolveum.midpoint.util.exception.ExpressionEvaluationException; import com.evolveum.midpoint.util.exception.ObjectNotFoundException; import com.evolveum.midpoint.util.exception.SchemaException; @@ -43,7 +42,6 @@ import javax.xml.namespace.QName; import java.util.ArrayList; -import java.util.Collection; import java.util.List; /** @@ -80,7 +78,7 @@ private List evaluateExpression(Class resultClass, ExpressionType expr QName resultName = new QName(SchemaConstants.NS_C, "result"); PrismPropertyDefinition resultDef = new PrismPropertyDefinition(resultName, xsdType, prismContext); - Expression,PrismPropertyDefinition> expression = expressionFactory.makeExpression(expressionType, resultDef, shortDesc, result); + Expression,PrismPropertyDefinition> expression = expressionFactory.makeExpression(expressionType, resultDef, shortDesc, task, result); ExpressionEvaluationContext params = new ExpressionEvaluationContext(null, expressionVariables, shortDesc, task, result); ModelExpressionThreadLocalHolder.pushCurrentResult(result); ModelExpressionThreadLocalHolder.pushCurrentTask(task); diff --git a/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertReviewersHelper.java b/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertReviewersHelper.java index d3b80660e5b..ce14b84ed45 100644 --- a/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertReviewersHelper.java +++ b/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertReviewersHelper.java @@ -171,7 +171,7 @@ protected List getTargetObjectOwners(AccessCertificationCas if (_case.getTargetRef() == null) { return null; } - ObjectType target = objectResolver.resolve(_case.getTargetRef(), ObjectType.class, null, "resolving cert case target", result); + ObjectType target = objectResolver.resolve(_case.getTargetRef(), ObjectType.class, null, "resolving cert case target", task, result); if (target instanceof AbstractRoleType) { ObjectReferenceType ownerRef = ((AbstractRoleType) target).getOwnerRef(); if (ownerRef != null) { @@ -190,7 +190,7 @@ protected List getObjectOwners(AccessCertificationCaseType if (_case.getObjectRef() == null) { return null; } - ObjectType object = objectResolver.resolve(_case.getObjectRef(), ObjectType.class, null, "resolving cert case object", result); + ObjectType object = objectResolver.resolve(_case.getObjectRef(), ObjectType.class, null, "resolving cert case object", task, result); if (object instanceof AbstractRoleType) { ObjectReferenceType ownerRef = ((AbstractRoleType) object).getOwnerRef(); if (ownerRef != null) { @@ -207,7 +207,7 @@ private Collection getTargetObjectApprovers(AccessCertifica if (_case.getTargetRef() == null) { return null; } - ObjectType target = objectResolver.resolve(_case.getTargetRef(), ObjectType.class, null, "resolving cert case target", result); + ObjectType target = objectResolver.resolve(_case.getTargetRef(), ObjectType.class, null, "resolving cert case target", task, result); if (target instanceof AbstractRoleType) { return ((AbstractRoleType) target).getApproverRef(); } else if (target instanceof ResourceType) { @@ -221,7 +221,7 @@ private Collection getObjectApprovers(AccessCertificationCa if (_case.getObjectRef() == null) { return null; } - ObjectType object = objectResolver.resolve(_case.getObjectRef(), ObjectType.class, null, "resolving cert case object", result); + ObjectType object = objectResolver.resolve(_case.getObjectRef(), ObjectType.class, null, "resolving cert case object", task, result); if (object instanceof AbstractRoleType) { return ((AbstractRoleType) object).getApproverRef(); } else { diff --git a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/ModelInteractionService.java b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/ModelInteractionService.java index 7206ad1ce07..77e1c5f96a6 100644 --- a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/ModelInteractionService.java +++ b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/ModelInteractionService.java @@ -136,10 +136,10 @@ ModelContext previewChanges( * security questions, etc). * * @param user user for who the policy should apply - * @param parentResult - * @return applicable credentials policy or null + * @param task + *@param parentResult @return applicable credentials policy or null * @throws ObjectNotFoundException No system configuration or other major system inconsistency * @throws SchemaException Wrong schema or content of security policy */ - CredentialsPolicyType getCredentialsPolicy(PrismObject user, OperationResult parentResult) throws ObjectNotFoundException, SchemaException; + CredentialsPolicyType getCredentialsPolicy(PrismObject user, Task task, OperationResult parentResult) throws ObjectNotFoundException, SchemaException; } diff --git a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedAssignment.java b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedAssignment.java index ebbb730ec62..943e7d8d070 100644 --- a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedAssignment.java +++ b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedAssignment.java @@ -6,6 +6,7 @@ import com.evolveum.midpoint.prism.delta.DeltaSetTriple; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.security.api.Authorization; +import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.DebugDumpable; import com.evolveum.midpoint.util.exception.ObjectNotFoundException; import com.evolveum.midpoint.util.exception.SchemaException; @@ -20,7 +21,7 @@ public interface EvaluatedAssignment extends DebugDumpable DeltaSetTriple getRoles(); - DeltaSetTriple getEvaluatedConstructions(OperationResult result) throws SchemaException, ObjectNotFoundException; + DeltaSetTriple getEvaluatedConstructions(Task task, OperationResult result) throws SchemaException, ObjectNotFoundException; PrismObject getTarget(); diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/Expression.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/Expression.java index b2efbb8369f..27da3ad283f 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/Expression.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/Expression.java @@ -17,32 +17,24 @@ import java.util.ArrayList; import java.util.Collection; -import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.Map.Entry; -import java.util.Set; import javax.xml.bind.JAXBElement; import javax.xml.namespace.QName; -import com.evolveum.midpoint.util.QNameUtil; +import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; import org.apache.commons.lang.Validate; import org.w3c.dom.Element; -import com.evolveum.midpoint.model.common.expression.script.ScriptExpression; import com.evolveum.midpoint.prism.ItemDefinition; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismValue; import com.evolveum.midpoint.prism.delta.PrismValueDeltaSetTriple; -import com.evolveum.midpoint.prism.parser.XPathHolder; import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.prism.xml.XmlTypeConverter; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.ObjectResolver; -import com.evolveum.midpoint.util.DebugUtil; -import com.evolveum.midpoint.util.JAXBUtil; import com.evolveum.midpoint.util.MiscUtil; import com.evolveum.midpoint.util.exception.ExpressionEvaluationException; import com.evolveum.midpoint.util.exception.ObjectNotFoundException; @@ -79,10 +71,10 @@ public Expression(ExpressionType expressionType, D outputDefinition, ObjectResol this.prismContext = prismContext; } - public void parse(ExpressionFactory factory, String contextDescription, OperationResult result) + public void parse(ExpressionFactory factory, String contextDescription, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException { if (expressionType == null) { - evaluators.add(createDefaultEvaluator(factory, contextDescription, result)); + evaluators.add(createDefaultEvaluator(factory, contextDescription, task, result)); return; } if (expressionType.getExpressionEvaluator() == null /* && expressionType.getSequence() == null */) { @@ -90,16 +82,16 @@ public void parse(ExpressionFactory factory, String contextDescription, Operatio } if (expressionType.getExpressionEvaluator() != null) { ExpressionEvaluator evaluator = createEvaluator(expressionType.getExpressionEvaluator(), factory, - contextDescription, result); + contextDescription, task, result); evaluators.add(evaluator); } if (evaluators.isEmpty()) { - evaluators.add(createDefaultEvaluator(factory, contextDescription, result)); + evaluators.add(createDefaultEvaluator(factory, contextDescription, task, result)); } } private ExpressionEvaluator createEvaluator(Collection> evaluatorElements, ExpressionFactory factory, - String contextDescription, OperationResult result) + String contextDescription, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException { if (evaluatorElements.isEmpty()) { throw new SchemaException("Empty evaluator list in "+contextDescription); @@ -109,16 +101,16 @@ private ExpressionEvaluator createEvaluator(Collection> eval if (evaluatorFactory == null) { throw new SchemaException("Unknown expression evaluator element "+fistEvaluatorElement.getName()+" in "+contextDescription); } - return evaluatorFactory.createEvaluator(evaluatorElements, outputDefinition, contextDescription, result); + return evaluatorFactory.createEvaluator(evaluatorElements, outputDefinition, contextDescription, task, result); } - private ExpressionEvaluator createDefaultEvaluator(ExpressionFactory factory, String contextDescription, - OperationResult result) throws SchemaException, ObjectNotFoundException { + private ExpressionEvaluator createDefaultEvaluator(ExpressionFactory factory, String contextDescription, + Task task, OperationResult result) throws SchemaException, ObjectNotFoundException { ExpressionEvaluatorFactory evaluatorFactory = factory.getDefaultEvaluatorFactory(); if (evaluatorFactory == null) { throw new SystemException("Internal error: No default expression evaluator factory"); } - return evaluatorFactory.createEvaluator(null, outputDefinition, contextDescription, result); + return evaluatorFactory.createEvaluator(null, outputDefinition, contextDescription, task, result); } public PrismValueDeltaSetTriple evaluate(ExpressionEvaluationContext context) throws SchemaException, @@ -129,7 +121,7 @@ public PrismValueDeltaSetTriple evaluate(ExpressionEvaluationContext context) try { processedVariables = processInnerVariables(context.getVariables(), context.getContextDescription(), - context.getResult()); + context.getTask(), context.getResult()); ExpressionEvaluationContext processedParameters = context.shallowClone(); processedParameters.setVariables(processedVariables); @@ -219,7 +211,7 @@ private void appendTraceFooter(StringBuilder sb) { } private ExpressionVariables processInnerVariables(ExpressionVariables variables, String contextDescription, - OperationResult result) throws SchemaException, ObjectNotFoundException { + Task task, OperationResult result) throws SchemaException, ObjectNotFoundException { if (expressionType == null || expressionType.getVariable() == null || expressionType.getVariable().isEmpty()) { // shortcut return variables; @@ -236,7 +228,7 @@ private ExpressionVariables processInnerVariables(ExpressionVariables variables, if (variableDefType.getObjectRef() != null) { ObjectReferenceType ref = variableDefType.getObjectRef(); ref.setType(prismContext.getSchemaRegistry().qualifyTypeName(ref.getType())); - ObjectType varObject = objectResolver.resolve(ref, ObjectType.class, null, "variable "+varName+" in "+contextDescription, result); + ObjectType varObject = objectResolver.resolve(ref, ObjectType.class, null, "variable "+varName+" in "+contextDescription, task, result); newVariables.addVariableDefinition(varName, varObject); } else if (variableDefType.getValue() != null) { // Only string is supported now @@ -252,7 +244,7 @@ private ExpressionVariables processInnerVariables(ExpressionVariables variables, } } else if (variableDefType.getPath() != null) { ItemPath itemPath = variableDefType.getPath().getItemPath(); - Object resolvedValue = ExpressionUtil.resolvePath(itemPath, variables, null, objectResolver, contextDescription, result); + Object resolvedValue = ExpressionUtil.resolvePath(itemPath, variables, null, objectResolver, contextDescription, task, result); newVariables.addVariableDefinition(varName, resolvedValue); } else { throw new SchemaException("No value for variable "+varName+" in "+contextDescription); diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/ExpressionEvaluatorFactory.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/ExpressionEvaluatorFactory.java index 51856298fcd..d6a7e4aebe0 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/ExpressionEvaluatorFactory.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/ExpressionEvaluatorFactory.java @@ -24,6 +24,7 @@ import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismValue; import com.evolveum.midpoint.schema.result.OperationResult; +import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.exception.ObjectNotFoundException; import com.evolveum.midpoint.util.exception.SchemaException; @@ -36,8 +37,8 @@ public interface ExpressionEvaluatorFactory { QName getElementName(); - ExpressionEvaluator createEvaluator(Collection> evaluatorElements, - D outputDefinition, String contextDescription, OperationResult result) + ExpressionEvaluator createEvaluator(Collection> evaluatorElements, + D outputDefinition, String contextDescription, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException; } diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/ExpressionFactory.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/ExpressionFactory.java index 9847877f825..a21add9ab34 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/ExpressionFactory.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/ExpressionFactory.java @@ -26,6 +26,7 @@ import com.evolveum.midpoint.prism.PrismValue; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.ObjectResolver; +import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.exception.ObjectNotFoundException; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.xml.ns._public.common.common_3.ExpressionType; @@ -58,23 +59,23 @@ public void setEvaluatorFactories(Collection evaluat } } - public Expression makeExpression(ExpressionType expressionType, - D outputDefinition, String shortDesc, OperationResult result) + public Expression makeExpression(ExpressionType expressionType, + D outputDefinition, String shortDesc, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException { ExpressionIdentifier eid = new ExpressionIdentifier(expressionType, outputDefinition); Expression expression = (Expression) cache.get(eid); if (expression == null) { - expression = createExpression(expressionType, outputDefinition, shortDesc, result); + expression = createExpression(expressionType, outputDefinition, shortDesc, task, result); cache.put(eid, expression); } return expression; } - private Expression createExpression(ExpressionType expressionType, - D outputDefinition, String shortDesc, OperationResult result) + private Expression createExpression(ExpressionType expressionType, + D outputDefinition, String shortDesc, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException { Expression expression = new Expression(expressionType, outputDefinition, objectResolver, prismContext); - expression.parse(this, shortDesc, result); + expression.parse(this, shortDesc, task, result); return expression; } diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/ExpressionUtil.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/ExpressionUtil.java index 26f30ee860c..41093798987 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/ExpressionUtil.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/ExpressionUtil.java @@ -21,7 +21,6 @@ import java.util.Map; import java.util.Map.Entry; -import javax.xml.bind.JAXBException; import javax.xml.namespace.QName; import com.evolveum.midpoint.prism.query.ExpressionWrapper; @@ -31,19 +30,13 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; import com.evolveum.prism.xml.ns._public.types_3.ProtectedStringType; -import org.springframework.expression.ExpressionException; -import org.w3c.dom.Element; - -import com.evolveum.midpoint.model.api.expr.MidpointFunctions; import com.evolveum.midpoint.model.common.expression.functions.BasicExpressionFunctions; import com.evolveum.midpoint.model.common.expression.functions.BasicExpressionFunctionsXPath; import com.evolveum.midpoint.model.common.expression.functions.FunctionLibrary; import com.evolveum.midpoint.model.common.expression.functions.LogExpressionFunctions; -import com.evolveum.midpoint.prism.Containerable; import com.evolveum.midpoint.prism.Item; import com.evolveum.midpoint.prism.ItemDefinition; import com.evolveum.midpoint.prism.Objectable; -import com.evolveum.midpoint.prism.PrismConstants; import com.evolveum.midpoint.prism.PrismContainer; import com.evolveum.midpoint.prism.PrismContainerDefinition; import com.evolveum.midpoint.prism.PrismContainerValue; @@ -53,7 +46,6 @@ import com.evolveum.midpoint.prism.PrismPropertyDefinition; import com.evolveum.midpoint.prism.PrismPropertyValue; import com.evolveum.midpoint.prism.PrismValue; -import com.evolveum.midpoint.prism.Recomputable; import com.evolveum.midpoint.prism.Structured; import com.evolveum.midpoint.prism.Visitable; import com.evolveum.midpoint.prism.Visitor; @@ -65,15 +57,12 @@ import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.path.ItemPathSegment; import com.evolveum.midpoint.prism.path.NameItemPathSegment; -import com.evolveum.midpoint.prism.polystring.PolyString; -import com.evolveum.midpoint.prism.query.EqualFilter; import com.evolveum.midpoint.prism.query.InOidFilter; import com.evolveum.midpoint.prism.query.LogicalFilter; import com.evolveum.midpoint.prism.query.NoneFilter; import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.query.PropertyValueFilter; -import com.evolveum.midpoint.prism.query.RefFilter; import com.evolveum.midpoint.prism.query.ValueFilter; import com.evolveum.midpoint.prism.util.JavaTypeConverter; import com.evolveum.midpoint.prism.util.PrismUtil; @@ -96,8 +85,6 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.MappingType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; /** * @author semancik @@ -193,8 +180,8 @@ public static O convertValue(Class finalExpectedJavaType, I inputVal, return convertedVal; } - public static Object resolvePath(ItemPath path, ExpressionVariables variables, Object defaultContext, - ObjectResolver objectResolver, String shortDesc, OperationResult result) throws SchemaException, ObjectNotFoundException { + public static Object resolvePath(ItemPath path, ExpressionVariables variables, Object defaultContext, + ObjectResolver objectResolver, String shortDesc, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException { Object root = defaultContext; ItemPath relativePath = path; @@ -218,7 +205,7 @@ public static Object resolvePath(ItemPath path, ExpressionVariables variables, O } if (root instanceof ObjectReferenceType) { - root = resolveReference((ObjectReferenceType)root, objectResolver, varDesc, shortDesc, result); + root = resolveReference((ObjectReferenceType)root, objectResolver, varDesc, shortDesc, task, result); } if (root instanceof Objectable) { @@ -241,14 +228,14 @@ public static Object resolvePath(ItemPath path, ExpressionVariables variables, O } } - private static PrismObject resolveReference(ObjectReferenceType ref, ObjectResolver objectResolver, String varDesc, String contextDescription, - OperationResult result) throws SchemaException, ObjectNotFoundException { + private static PrismObject resolveReference(ObjectReferenceType ref, ObjectResolver objectResolver, String varDesc, String contextDescription, + Task task, OperationResult result) throws SchemaException, ObjectNotFoundException { if (ref.getOid() == null) { throw new SchemaException("Null OID in reference in variable "+varDesc+" in "+contextDescription); } else { try { - ObjectType objectType = objectResolver.resolve(ref, ObjectType.class, null, contextDescription, result); + ObjectType objectType = objectResolver.resolve(ref, ObjectType.class, null, contextDescription, task, result); if (objectType == null) { throw new IllegalArgumentException("Resolve returned null for "+ref+" in "+contextDescription); } @@ -531,7 +518,7 @@ public static V evaluateExpressi String shortDesc, Task task, OperationResult parentResult) throws SchemaException, ExpressionEvaluationException, ObjectNotFoundException { Expression expression = expressionFactory.makeExpression(expressionType, - outputDefinition, shortDesc, parentResult); + outputDefinition, shortDesc, task, parentResult); ExpressionEvaluationContext params = new ExpressionEvaluationContext(null, variables, shortDesc, task, parentResult); PrismValueDeltaSetTriple outputTriple = expression.evaluate(params); @@ -561,7 +548,7 @@ private static Collection evaluateStringExpression(ExpressionVariables v DOMUtil.XSD_STRING, prismContext); outputDefinition.setMaxOccurs(-1); Expression,PrismPropertyDefinition> expression = expressionFactory.makeExpression(expressionType, - outputDefinition, shortDesc, parentResult); + outputDefinition, shortDesc, task, parentResult); ExpressionEvaluationContext params = new ExpressionEvaluationContext(null, variables, shortDesc, task, parentResult); PrismValueDeltaSetTriple> outputTriple = expression.evaluate(params); diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/AbstractSearchExpressionEvaluator.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/AbstractSearchExpressionEvaluator.java index 7cc1c02a232..d88f698c7ee 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/AbstractSearchExpressionEvaluator.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/AbstractSearchExpressionEvaluator.java @@ -24,11 +24,8 @@ import com.evolveum.midpoint.model.common.expression.evaluator.caching.AbstractSearchExpressionEvaluatorCache; import com.evolveum.midpoint.prism.util.CloneUtil; import com.evolveum.midpoint.security.api.SecurityEnforcer; -import com.evolveum.midpoint.util.Holder; import com.evolveum.midpoint.util.QNameUtil; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectSearchStrategyType; -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.prism.xml.ns._public.types_3.ItemPathType; import org.apache.commons.lang.BooleanUtils; @@ -175,7 +172,7 @@ protected List transformSingleValue(ExpressionVariables variables, PlusMinusZ LOGGER.trace("Query after extension: {}", query.debugDump()); } - resultValues = executeSearchUsingCache(targetTypeClass, targetTypeQName, query, params, contextDescription, params.getResult()); + resultValues = executeSearchUsingCache(targetTypeClass, targetTypeQName, query, params, contextDescription, task, params.getResult()); } if (resultValues.isEmpty() && getExpressionEvaluatorType().isCreateOnDemand() == Boolean.TRUE && @@ -202,14 +199,14 @@ protected AbstractSearchExpressionEvaluatorCache getCache() { return null; } - private List executeSearchUsingCache(Class targetTypeClass, - final QName targetTypeQName, ObjectQuery query, final ExpressionEvaluationContext params, String contextDescription, OperationResult result) throws ExpressionEvaluationException, ObjectNotFoundException, SchemaException { + private List executeSearchUsingCache(Class targetTypeClass, final QName targetTypeQName, ObjectQuery query, + final ExpressionEvaluationContext params, String contextDescription, Task task, OperationResult result) throws ExpressionEvaluationException, ObjectNotFoundException, SchemaException { ObjectSearchStrategyType searchStrategy = getSearchStrategy(); AbstractSearchExpressionEvaluatorCache cache = getCache(); if (cache == null) { - return executeSearch(null, targetTypeClass, targetTypeQName, query, searchStrategy, params, contextDescription, result); + return executeSearch(null, targetTypeClass, targetTypeQName, query, searchStrategy, params, contextDescription, task, result); } List list = cache.getQueryResult(targetTypeClass, query, searchStrategy, params, prismContext); @@ -219,7 +216,7 @@ private List executeSearchUsingCache(Class targetTy } LOGGER.trace("Cache: MISS {} ({})", query, targetTypeClass.getSimpleName()); List rawResult = new ArrayList<>(); - list = executeSearch(rawResult, targetTypeClass, targetTypeQName, query, searchStrategy, params, contextDescription, result); + list = executeSearch(rawResult, targetTypeClass, targetTypeQName, query, searchStrategy, params, contextDescription, task, result); if (list != null && !list.isEmpty()) { // we don't want to cache negative results (e.g. if used with focal objects it might mean that they would be attempted to create multiple times) cache.putQueryResult(targetTypeClass, query, searchStrategy, params, list, rawResult, prismContext); @@ -242,7 +239,7 @@ private List executeSearch(List rawResult Class targetTypeClass, final QName targetTypeQName, ObjectQuery query, ObjectSearchStrategyType searchStrategy, ExpressionEvaluationContext params, String contextDescription, - OperationResult result) + Task task, OperationResult result) throws ExpressionEvaluationException, ObjectNotFoundException, SchemaException { @@ -256,18 +253,18 @@ private List executeSearch(List rawResult switch (searchStrategy) { case IN_REPOSITORY: - return executeSearchAttempt(rawResult, targetTypeClass, targetTypeQName, query, false, false, params, contextDescription, result); + return executeSearchAttempt(rawResult, targetTypeClass, targetTypeQName, query, false, false, params, contextDescription, task, result); case ON_RESOURCE: - return executeSearchAttempt(rawResult, targetTypeClass, targetTypeQName, query, true, true, params, contextDescription, result); + return executeSearchAttempt(rawResult, targetTypeClass, targetTypeQName, query, true, true, params, contextDescription, task, result); case ON_RESOURCE_IF_NEEDED: - List inRepo = executeSearchAttempt(rawResult, targetTypeClass, targetTypeQName, query, false, false, params, contextDescription, result); + List inRepo = executeSearchAttempt(rawResult, targetTypeClass, targetTypeQName, query, false, false, params, contextDescription, task, result); if (!inRepo.isEmpty()) { return inRepo; } if (rawResult != null) { rawResult.clear(); } - return executeSearchAttempt(rawResult, targetTypeClass, targetTypeQName, query, true, false, params, contextDescription, result); + return executeSearchAttempt(rawResult, targetTypeClass, targetTypeQName, query, true, false, params, contextDescription, task, result); default: throw new IllegalArgumentException("Unknown search strategy: " + searchStrategy); } @@ -277,7 +274,7 @@ private List executeSearchAttempt(final List targetTypeClass, final QName targetTypeQName, ObjectQuery query, boolean searchOnResource, boolean tryAlsoRepository, final ExpressionEvaluationContext params, String contextDescription, - OperationResult result) + Task task, OperationResult result) throws ExpressionEvaluationException, ObjectNotFoundException, SchemaException { final List list = new ArrayList(); @@ -302,7 +299,7 @@ public boolean handle(PrismObject object, OperationResult parentResult) { }; try { - objectResolver.searchIterative(targetTypeClass, query, options, handler, result); + objectResolver.searchIterative(targetTypeClass, query, options, handler, task, result); } catch (SchemaException e) { throw new SchemaException(e.getMessage()+" in "+contextDescription, e); } catch (CommunicationException | ConfigurationException @@ -310,7 +307,7 @@ public boolean handle(PrismObject object, OperationResult parentResult) { if (searchOnResource && tryAlsoRepository) { options = SelectorOptions.createCollection(GetOperationOptions.createNoFetch()); try { - objectResolver.searchIterative(targetTypeClass, query, options, handler, result); + objectResolver.searchIterative(targetTypeClass, query, options, handler, task, result); } catch (SchemaException e1) { throw new SchemaException(e1.getMessage()+" in "+contextDescription, e1); } catch (CommunicationException | ConfigurationException @@ -409,7 +406,7 @@ private String expressionDesc = "expression in assignment expression in "+contextDescription; ExpressionFactory expressionFactory = params.getExpressionFactory(); Expression expression = expressionFactory.makeExpression(expressionType, propOutputDefinition, - expressionDesc, result); + expressionDesc, task, result); ExpressionEvaluationContext expressionParams = new ExpressionEvaluationContext(null, variables, expressionDesc, task, result); expressionParams.setExpressionFactory(expressionFactory); diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/AsIsExpressionEvaluatorFactory.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/AsIsExpressionEvaluatorFactory.java index 2f8edf6cec6..0fea932daa1 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/AsIsExpressionEvaluatorFactory.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/AsIsExpressionEvaluatorFactory.java @@ -26,6 +26,7 @@ import com.evolveum.midpoint.prism.PrismValue; import com.evolveum.midpoint.prism.crypto.Protector; import com.evolveum.midpoint.schema.result.OperationResult; +import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.xml.ns._public.common.common_3.AsIsExpressionEvaluatorType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectFactory; @@ -58,8 +59,8 @@ public QName getElementName() { * @see com.evolveum.midpoint.common.expression.ExpressionEvaluatorFactory#createEvaluator(javax.xml.bind.JAXBElement) */ @Override - public AsIsExpressionEvaluator createEvaluator(Collection> evaluatorElements, - D outputDefinition, String contextDescription, OperationResult result) throws SchemaException { + public AsIsExpressionEvaluator createEvaluator(Collection> evaluatorElements, + D outputDefinition, String contextDescription, Task task, OperationResult result) throws SchemaException { Validate.notNull(outputDefinition, "output definition must be specified for asIs expression evaluator"); diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/AssignmentTargetSearchExpressionEvaluatorFactory.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/AssignmentTargetSearchExpressionEvaluatorFactory.java index e617267a242..37e8ed33ebb 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/AssignmentTargetSearchExpressionEvaluatorFactory.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/AssignmentTargetSearchExpressionEvaluatorFactory.java @@ -23,7 +23,6 @@ import com.evolveum.midpoint.model.api.ModelService; import com.evolveum.midpoint.model.common.expression.ExpressionEvaluator; import com.evolveum.midpoint.model.common.expression.ExpressionEvaluatorFactory; -import com.evolveum.midpoint.model.common.expression.ExpressionFactory; import com.evolveum.midpoint.prism.ItemDefinition; import com.evolveum.midpoint.prism.PrismContainerDefinition; import com.evolveum.midpoint.prism.PrismContext; @@ -32,6 +31,7 @@ import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.ObjectResolver; import com.evolveum.midpoint.security.api.SecurityEnforcer; +import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectFactory; @@ -72,8 +72,8 @@ public QName getElementName() { * @see com.evolveum.midpoint.common.expression.ExpressionEvaluatorFactory#createEvaluator(javax.xml.bind.JAXBElement) */ @Override - public ExpressionEvaluator createEvaluator(Collection> evaluatorElements, - D outputDefinition, String contextDescription, OperationResult result) throws SchemaException { + public ExpressionEvaluator createEvaluator(Collection> evaluatorElements, + D outputDefinition, String contextDescription, Task task, OperationResult result) throws SchemaException { Validate.notNull(outputDefinition, "output definition must be specified for assignmentTargetSearch expression evaluator"); diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/AssociationFromLinkExpressionEvaluator.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/AssociationFromLinkExpressionEvaluator.java index f4343c84f6a..c331e945db1 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/AssociationFromLinkExpressionEvaluator.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/AssociationFromLinkExpressionEvaluator.java @@ -16,66 +16,35 @@ package com.evolveum.midpoint.model.common.expression.evaluator; import java.util.Collection; -import java.util.List; -import java.util.Map; -import javax.xml.bind.JAXBElement; import javax.xml.namespace.QName; -import org.apache.commons.lang.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.w3c.dom.Element; - -import com.evolveum.midpoint.common.policy.ValuePolicyGenerator; import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition; import com.evolveum.midpoint.model.common.expression.ExpressionEvaluationContext; import com.evolveum.midpoint.model.common.expression.ExpressionEvaluator; -import com.evolveum.midpoint.model.common.expression.Source; -import com.evolveum.midpoint.model.common.expression.StringPolicyResolver; -import com.evolveum.midpoint.prism.Item; -import com.evolveum.midpoint.prism.ItemDefinition; import com.evolveum.midpoint.prism.PrismContainer; import com.evolveum.midpoint.prism.PrismContainerDefinition; import com.evolveum.midpoint.prism.PrismContainerValue; import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.PrismProperty; -import com.evolveum.midpoint.prism.PrismPropertyDefinition; -import com.evolveum.midpoint.prism.PrismReferenceValue; -import com.evolveum.midpoint.prism.PrismValue; -import com.evolveum.midpoint.prism.PrismPropertyValue; -import com.evolveum.midpoint.prism.crypto.EncryptionException; -import com.evolveum.midpoint.prism.crypto.Protector; import com.evolveum.midpoint.prism.delta.PrismValueDeltaSetTriple; import com.evolveum.midpoint.prism.delta.ItemDelta; -import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.prism.xml.XmlTypeConverter; -import com.evolveum.midpoint.prism.xml.XsdTypeMapper; import com.evolveum.midpoint.schema.GetOperationOptions; import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.constants.ExpressionConstants; -import com.evolveum.midpoint.schema.constants.SchemaConstants; -import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.ObjectResolver; import com.evolveum.midpoint.schema.util.ShadowUtil; -import com.evolveum.midpoint.util.DOMUtil; -import com.evolveum.midpoint.util.RandomString; import com.evolveum.midpoint.util.exception.ExpressionEvaluationException; import com.evolveum.midpoint.util.exception.ObjectNotFoundException; import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.util.exception.SystemException; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.xml.ns._public.common.common_3.AbstractRoleType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ExpressionType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.GenerateExpressionEvaluatorType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowAssociationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowDiscriminatorExpressionEvaluatorType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowDiscriminatorType; 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.StringPolicyType; /** * @author Radovan Semancik @@ -141,7 +110,7 @@ public PrismValueDeltaSetTriple> eval for (ObjectReferenceType linkRef: thisRole.getLinkRef()) { ShadowType shadowType; try { - shadowType = objectResolver.resolve(linkRef, ShadowType.class, options, desc, params.getResult()); + shadowType = objectResolver.resolve(linkRef, ShadowType.class, options, desc, params.getTask(), params.getResult()); } catch (ObjectNotFoundException e) { // Linked shadow not found. This may happen e.g. if the account is deleted and model haven't got // the chance to react yet. Just ignore such shadow. diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/AssociationFromLinkExpressionEvaluatorFactory.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/AssociationFromLinkExpressionEvaluatorFactory.java index 8452e5de1d4..338dfb08093 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/AssociationFromLinkExpressionEvaluatorFactory.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/AssociationFromLinkExpressionEvaluatorFactory.java @@ -30,9 +30,9 @@ import com.evolveum.midpoint.prism.crypto.Protector; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.ObjectResolver; +import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectFactory; -import com.evolveum.midpoint.xml.ns._public.common.common_3.SearchObjectExpressionEvaluatorType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowAssociationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowDiscriminatorExpressionEvaluatorType; import org.apache.commons.lang.Validate; @@ -68,8 +68,8 @@ public QName getElementName() { * @see com.evolveum.midpoint.common.expression.ExpressionEvaluatorFactory#createEvaluator(javax.xml.bind.JAXBElement) */ @Override - public ExpressionEvaluator createEvaluator(Collection> evaluatorElements, - D outputDefinition, String contextDescription, OperationResult result) throws SchemaException { + public ExpressionEvaluator createEvaluator(Collection> evaluatorElements, + D outputDefinition, String contextDescription, Task task, OperationResult result) throws SchemaException { Validate.notNull(outputDefinition, "output definition must be specified for associationFromLink expression evaluator"); diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/AssociationTargetSearchExpressionEvaluatorFactory.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/AssociationTargetSearchExpressionEvaluatorFactory.java index 3353c337697..79743229bd0 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/AssociationTargetSearchExpressionEvaluatorFactory.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/AssociationTargetSearchExpressionEvaluatorFactory.java @@ -31,6 +31,7 @@ import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.ObjectResolver; import com.evolveum.midpoint.security.api.SecurityEnforcer; +import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectFactory; import com.evolveum.midpoint.xml.ns._public.common.common_3.SearchObjectExpressionEvaluatorType; @@ -71,8 +72,8 @@ public QName getElementName() { * @see com.evolveum.midpoint.common.expression.ExpressionEvaluatorFactory#createEvaluator(javax.xml.bind.JAXBElement) */ @Override - public ExpressionEvaluator createEvaluator(Collection> evaluatorElements, - D outputDefinition, String contextDescription, OperationResult result) throws SchemaException { + public ExpressionEvaluator createEvaluator(Collection> evaluatorElements, + D outputDefinition, String contextDescription, Task task, OperationResult result) throws SchemaException { Validate.notNull(outputDefinition, "output definition must be specified for associationTargetSearch expression evaluator"); diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/GenerateExpressionEvaluatorFactory.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/GenerateExpressionEvaluatorFactory.java index 8038100ce49..864bb77426e 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/GenerateExpressionEvaluatorFactory.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/GenerateExpressionEvaluatorFactory.java @@ -16,33 +16,23 @@ package com.evolveum.midpoint.model.common.expression.evaluator; import java.util.Collection; -import java.util.List; import javax.xml.bind.JAXBElement; import javax.xml.namespace.QName; -import org.apache.commons.lang.StringUtils; +import com.evolveum.midpoint.task.api.Task; import org.apache.commons.lang.Validate; -import org.w3c.dom.Element; import com.evolveum.midpoint.model.common.expression.ExpressionEvaluator; import com.evolveum.midpoint.model.common.expression.ExpressionEvaluatorFactory; -import com.evolveum.midpoint.prism.Item; import com.evolveum.midpoint.prism.ItemDefinition; import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismPropertyDefinition; import com.evolveum.midpoint.prism.PrismValue; import com.evolveum.midpoint.prism.crypto.Protector; -import com.evolveum.midpoint.prism.delta.ItemDelta; -import com.evolveum.midpoint.prism.delta.PrismValueDeltaSetTriple; -import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.ObjectResolver; -import com.evolveum.midpoint.util.DOMUtil; -import com.evolveum.midpoint.util.exception.ExpressionEvaluationException; import com.evolveum.midpoint.util.exception.ObjectNotFoundException; import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.xml.ns._public.common.common_3.AsIsExpressionEvaluatorType; import com.evolveum.midpoint.xml.ns._public.common.common_3.GenerateExpressionEvaluatorType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectFactory; import com.evolveum.midpoint.xml.ns._public.common.common_3.StringPolicyType; @@ -74,8 +64,8 @@ public QName getElementName() { * @see com.evolveum.midpoint.common.expression.ExpressionEvaluatorFactory#createEvaluator(javax.xml.bind.JAXBElement, com.evolveum.midpoint.prism.PrismContext) */ @Override - public ExpressionEvaluator createEvaluator(Collection> evaluatorElements, - D outputDefinition, String contextDescription, OperationResult result) + public ExpressionEvaluator createEvaluator(Collection> evaluatorElements, + D outputDefinition, String contextDescription, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException { Validate.notNull(outputDefinition, "output definition must be specified for 'generate' expression evaluator"); @@ -98,7 +88,7 @@ public ExpressionEvaluator StringPolicyType elementStringPolicy = null; if (generateEvaluatorType.getValuePolicyRef() != null) { ValuePolicyType valuePolicyType = objectResolver.resolve(generateEvaluatorType.getValuePolicyRef(), ValuePolicyType.class, - null, "resolving value policy reference in "+contextDescription, result); + null, "resolving value policy reference in "+contextDescription, task, result); elementStringPolicy = valuePolicyType.getStringPolicy(); } diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/LiteralExpressionEvaluatorFactory.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/LiteralExpressionEvaluatorFactory.java index 22b58edfc4b..cdf2d69b4e6 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/LiteralExpressionEvaluatorFactory.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/LiteralExpressionEvaluatorFactory.java @@ -15,16 +15,13 @@ */ package com.evolveum.midpoint.model.common.expression.evaluator; -import java.util.ArrayList; import java.util.Collection; -import java.util.List; import javax.xml.bind.JAXBElement; import javax.xml.namespace.QName; -import org.apache.commons.lang.StringUtils; +import com.evolveum.midpoint.task.api.Task; import org.apache.commons.lang.Validate; -import org.w3c.dom.Element; import com.evolveum.midpoint.common.StaticExpressionUtil; import com.evolveum.midpoint.model.common.expression.ExpressionEvaluator; @@ -32,15 +29,10 @@ import com.evolveum.midpoint.prism.Item; import com.evolveum.midpoint.prism.ItemDefinition; import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismPropertyDefinition; import com.evolveum.midpoint.prism.PrismValue; import com.evolveum.midpoint.prism.delta.ItemDelta; import com.evolveum.midpoint.prism.delta.PrismValueDeltaSetTriple; -import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; -import com.evolveum.midpoint.util.DOMUtil; -import com.evolveum.midpoint.util.JAXBUtil; -import com.evolveum.midpoint.util.exception.ExpressionEvaluationException; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectFactory; @@ -66,8 +58,8 @@ public QName getElementName() { * @see com.evolveum.midpoint.common.expression.ExpressionEvaluatorFactory#createEvaluator(javax.xml.bind.JAXBElement, com.evolveum.midpoint.prism.PrismContext) */ @Override - public ExpressionEvaluator createEvaluator(Collection> evaluatorElements, D outputDefinition, - String contextDescription, OperationResult result) throws SchemaException { + public ExpressionEvaluator createEvaluator(Collection> evaluatorElements, D outputDefinition, + String contextDescription, Task task, OperationResult result) throws SchemaException { Validate.notNull(outputDefinition, "output definition must be specified for literal expression evaluator"); diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/PathExpressionEvaluatorFactory.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/PathExpressionEvaluatorFactory.java index 1ee70bcdfd6..09400686917 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/PathExpressionEvaluatorFactory.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/PathExpressionEvaluatorFactory.java @@ -20,8 +20,8 @@ import javax.xml.bind.JAXBElement; import javax.xml.namespace.QName; +import com.evolveum.midpoint.task.api.Task; import org.apache.commons.lang.Validate; -import org.w3c.dom.Element; import com.evolveum.midpoint.model.common.expression.ExpressionEvaluator; import com.evolveum.midpoint.model.common.expression.ExpressionEvaluatorFactory; @@ -29,9 +29,6 @@ import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismValue; import com.evolveum.midpoint.prism.crypto.Protector; -import com.evolveum.midpoint.prism.delta.ItemDelta; -import com.evolveum.midpoint.prism.delta.PrismValueDeltaSetTriple; -import com.evolveum.midpoint.prism.parser.XPathHolder; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.ObjectResolver; @@ -67,7 +64,7 @@ public QName getElementName() { */ @Override public ExpressionEvaluator createEvaluator(Collection> evaluatorElements, - D outputDefinition, String contextDescription, OperationResult result) throws SchemaException { + D outputDefinition, String contextDescription, Task task, OperationResult result) throws SchemaException { Validate.notNull(outputDefinition, "output definition must be specified for path expression evaluator"); diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/ReferenceSearchExpressionEvaluatorFactory.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/ReferenceSearchExpressionEvaluatorFactory.java index 0b1839730d7..cffcfe51d61 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/ReferenceSearchExpressionEvaluatorFactory.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/evaluator/ReferenceSearchExpressionEvaluatorFactory.java @@ -23,9 +23,7 @@ import com.evolveum.midpoint.model.api.ModelService; import com.evolveum.midpoint.model.common.expression.ExpressionEvaluator; import com.evolveum.midpoint.model.common.expression.ExpressionEvaluatorFactory; -import com.evolveum.midpoint.model.common.expression.ExpressionFactory; import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.PrismContainerDefinition; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismReferenceDefinition; import com.evolveum.midpoint.prism.PrismValue; @@ -33,8 +31,8 @@ import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.ObjectResolver; import com.evolveum.midpoint.security.api.SecurityEnforcer; +import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectFactory; import com.evolveum.midpoint.xml.ns._public.common.common_3.SearchObjectRefExpressionEvaluatorType; @@ -73,8 +71,8 @@ public QName getElementName() { * @see com.evolveum.midpoint.common.expression.ExpressionEvaluatorFactory#createEvaluator(javax.xml.bind.JAXBElement) */ @Override - public ExpressionEvaluator createEvaluator(Collection> evaluatorElements, - D outputDefinition, String contextDescription, OperationResult result) throws SchemaException { + public ExpressionEvaluator createEvaluator(Collection> evaluatorElements, + D outputDefinition, String contextDescription, Task task, OperationResult result) throws SchemaException { Validate.notNull(outputDefinition, "output definition must be specified for referenceSearch expression evaluator"); diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/ScriptEvaluator.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/ScriptEvaluator.java index 1fd81ec8045..3f876871616 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/ScriptEvaluator.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/ScriptEvaluator.java @@ -24,6 +24,7 @@ import com.evolveum.midpoint.prism.PrismValue; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.ObjectResolver; +import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.exception.ExpressionEvaluationException; import com.evolveum.midpoint.util.exception.ObjectNotFoundException; import com.evolveum.midpoint.util.exception.SchemaException; @@ -43,9 +44,9 @@ */ public interface ScriptEvaluator { - public List evaluate(ScriptExpressionEvaluatorType expressionType, ExpressionVariables variables, - ItemDefinition outputDefinition, ScriptExpressionReturnTypeType suggestedReturnType, ObjectResolver objectResolver, - Collection functions, String contextDescription, OperationResult result) + public List evaluate(ScriptExpressionEvaluatorType expressionType, ExpressionVariables variables, + ItemDefinition outputDefinition, ScriptExpressionReturnTypeType suggestedReturnType, ObjectResolver objectResolver, + Collection functions, String contextDescription, Task task, OperationResult result) throws ExpressionEvaluationException, ObjectNotFoundException, ExpressionSyntaxException; /** diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/ScriptExpression.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/ScriptExpression.java index f7e76e374b7..f88c8c980de 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/ScriptExpression.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/ScriptExpression.java @@ -30,6 +30,7 @@ import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.SchemaDebugUtil; import com.evolveum.midpoint.schema.util.ObjectResolver; +import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.DOMUtil; import com.evolveum.midpoint.util.DebugDumpable; import com.evolveum.midpoint.util.DebugUtil; @@ -97,8 +98,8 @@ public void setFunctions(Collection functions) { this.functions = functions; } - public List evaluate(ExpressionVariables variables, ScriptExpressionReturnTypeType suggestedReturnType, - boolean useNew, String contextDescription, OperationResult result) + public List evaluate(ExpressionVariables variables, ScriptExpressionReturnTypeType suggestedReturnType, + boolean useNew, String contextDescription, Task task, OperationResult result) throws ExpressionEvaluationException, ObjectNotFoundException, SchemaException { ScriptExpressionEvaluationContext context = new ScriptExpressionEvaluationContext(variables, contextDescription, result, this); @@ -107,7 +108,7 @@ public List evaluate(ExpressionVariables variables, Sc try { context.setupThreadLocal(); - List expressionResult = evaluator.evaluate(scriptType, variables, outputDefinition, suggestedReturnType, objectResolver, functions, contextDescription, result); + List expressionResult = evaluator.evaluate(scriptType, variables, outputDefinition, suggestedReturnType, objectResolver, functions, contextDescription, task, result); traceExpressionSuccess(variables, contextDescription, expressionResult); return expressionResult; diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/ScriptExpressionEvaluator.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/ScriptExpressionEvaluator.java index 1076b3e3581..216bf7dddf0 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/ScriptExpressionEvaluator.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/ScriptExpressionEvaluator.java @@ -57,7 +57,7 @@ protected List transformSingleValue(ExpressionVariables variables, PlusMinusZ if (returnType == null && isRelative()) { returnType = ScriptExpressionReturnTypeType.SCALAR; } - return (List) scriptExpression.evaluate(variables, returnType, useNew, contextDescription, result); + return (List) scriptExpression.evaluate(variables, returnType, useNew, contextDescription, task, result); } /* (non-Javadoc) diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/ScriptExpressionEvaluatorFactory.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/ScriptExpressionEvaluatorFactory.java index bf1df2ec547..c1f8533fb79 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/ScriptExpressionEvaluatorFactory.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/ScriptExpressionEvaluatorFactory.java @@ -26,6 +26,7 @@ import com.evolveum.midpoint.prism.PrismValue; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.security.api.SecurityEnforcer; +import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectFactory; import com.evolveum.midpoint.xml.ns._public.common.common_3.ScriptExpressionEvaluatorType; @@ -54,7 +55,7 @@ public QName getElementName() { */ @Override public ExpressionEvaluator createEvaluator(Collection> evaluatorElements, - D outputDefinition, String contextDescription, OperationResult result) throws SchemaException { + D outputDefinition, String contextDescription, Task task, OperationResult result) throws SchemaException { if (evaluatorElements.size() > 1) { throw new SchemaException("More than one evaluator specified in "+contextDescription); diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/jsr223/Jsr223ScriptEvaluator.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/jsr223/Jsr223ScriptEvaluator.java index 62373edc68b..69595ce1219 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/jsr223/Jsr223ScriptEvaluator.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/jsr223/Jsr223ScriptEvaluator.java @@ -17,11 +17,9 @@ import java.util.ArrayList; import java.util.Collection; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; -import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import javax.script.Bindings; @@ -32,18 +30,14 @@ import javax.script.ScriptException; import javax.xml.namespace.QName; -import org.w3c.dom.Element; - import com.evolveum.midpoint.common.monitor.InternalMonitor; import com.evolveum.midpoint.model.common.expression.ExpressionSyntaxException; import com.evolveum.midpoint.model.common.expression.ExpressionUtil; import com.evolveum.midpoint.model.common.expression.ExpressionVariables; -import com.evolveum.midpoint.model.common.expression.functions.BasicExpressionFunctions; import com.evolveum.midpoint.model.common.expression.functions.FunctionLibrary; import com.evolveum.midpoint.model.common.expression.script.ScriptEvaluator; import com.evolveum.midpoint.prism.Containerable; import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.PrismContainer; import com.evolveum.midpoint.prism.PrismContainerDefinition; import com.evolveum.midpoint.prism.PrismContainerValue; import com.evolveum.midpoint.prism.PrismContext; @@ -52,25 +46,22 @@ import com.evolveum.midpoint.prism.PrismPropertyDefinition; import com.evolveum.midpoint.prism.PrismPropertyValue; import com.evolveum.midpoint.prism.PrismReferenceDefinition; -import com.evolveum.midpoint.prism.PrismReferenceValue; import com.evolveum.midpoint.prism.PrismValue; import com.evolveum.midpoint.prism.crypto.Protector; import com.evolveum.midpoint.prism.polystring.PolyString; -import com.evolveum.midpoint.prism.util.JavaTypeConverter; import com.evolveum.midpoint.prism.xml.XsdTypeMapper; import com.evolveum.midpoint.schema.constants.MidPointConstants; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.ObjectResolver; +import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.exception.ExpressionEvaluationException; import com.evolveum.midpoint.util.exception.ObjectNotFoundException; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.exception.SystemException; -import com.evolveum.midpoint.util.exception.TunnelException; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ScriptExpressionEvaluatorType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ScriptExpressionReturnTypeType; -import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; /** * Expression evaluator that is using javax.script (JSR-223) engine. @@ -101,12 +92,12 @@ public Jsr223ScriptEvaluator(String engineName, PrismContext prismContext, Prote @Override public List evaluate(ScriptExpressionEvaluatorType expressionType, - ExpressionVariables variables, ItemDefinition outputDefinition, ScriptExpressionReturnTypeType suggestedReturnType, - ObjectResolver objectResolver, Collection functions, - String contextDescription, OperationResult result) throws ExpressionEvaluationException, + ExpressionVariables variables, ItemDefinition outputDefinition, ScriptExpressionReturnTypeType suggestedReturnType, + ObjectResolver objectResolver, Collection functions, + String contextDescription, Task task, OperationResult result) throws ExpressionEvaluationException, ObjectNotFoundException, ExpressionSyntaxException { - Bindings bindings = convertToBindings(variables, objectResolver, functions, contextDescription, result); + Bindings bindings = convertToBindings(variables, objectResolver, functions, contextDescription, task, result); String codeString = expressionType.getCode(); if (codeString == null) { @@ -205,7 +196,7 @@ public Object evaluateReportScript(String codeString, ExpressionVariables va String contextDescription, OperationResult result) throws ExpressionEvaluationException, ObjectNotFoundException, ExpressionSyntaxException { - Bindings bindings = convertToBindings(variables, objectResolver, functions, contextDescription, result); + Bindings bindings = convertToBindings(variables, objectResolver, functions, contextDescription, (Task) null, result); // String codeString = code; if (codeString == null) { @@ -269,9 +260,9 @@ private boolean isEmpty(T val) { return false; } - private Bindings convertToBindings(ExpressionVariables variables, ObjectResolver objectResolver, - Collection functions, - String contextDescription, OperationResult result) throws ExpressionSyntaxException, ObjectNotFoundException { + private Bindings convertToBindings(ExpressionVariables variables, ObjectResolver objectResolver, + Collection functions, + String contextDescription, Task task, OperationResult result) throws ExpressionSyntaxException, ObjectNotFoundException { Bindings bindings = scriptEngine.createBindings(); // Functions if (functions != null) { @@ -287,7 +278,7 @@ private Bindings convertToBindings(ExpressionVariables variables, ObjectResolver continue; } String variableName = variableEntry.getKey().getLocalPart(); - Object variableValue = convertVariableValue(variableEntry.getValue(), variableName, objectResolver, contextDescription, result); + Object variableValue = convertVariableValue(variableEntry.getValue(), variableName, objectResolver, contextDescription, task, result); bindings.put(variableName, variableValue); } } @@ -295,10 +286,10 @@ private Bindings convertToBindings(ExpressionVariables variables, ObjectResolver } private Object convertVariableValue(Object originalValue, String variableName, ObjectResolver objectResolver, - String contextDescription, OperationResult result) throws ExpressionSyntaxException, ObjectNotFoundException { + String contextDescription, Task task, OperationResult result) throws ExpressionSyntaxException, ObjectNotFoundException { if (originalValue instanceof ObjectReferenceType) { originalValue = resolveReference((ObjectReferenceType)originalValue, objectResolver, variableName, - contextDescription, result); + contextDescription, task, result); } if (originalValue instanceof PrismObject) { return ((PrismObject)originalValue).asObjectable(); @@ -325,14 +316,14 @@ private Object convertVariableValue(Object originalValue, String variableName, O return originalValue; } - private Object resolveReference(ObjectReferenceType ref, ObjectResolver objectResolver, String name, String contextDescription, - OperationResult result) throws ExpressionSyntaxException, ObjectNotFoundException { + private Object resolveReference(ObjectReferenceType ref, ObjectResolver objectResolver, String name, String contextDescription, + Task task, OperationResult result) throws ExpressionSyntaxException, ObjectNotFoundException { if (ref.getOid() == null) { throw new ExpressionSyntaxException("Null OID in reference in variable "+name+" in "+contextDescription); } else { try { - return objectResolver.resolve(ref, ObjectType.class, null, contextDescription, result); + return objectResolver.resolve(ref, ObjectType.class, null, contextDescription, task, result); } catch (ObjectNotFoundException e) { throw new ObjectNotFoundException("Object not found during variable "+name+" resolution in "+contextDescription+": "+e.getMessage(),e, ref.getOid()); diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/xpath/LazyXPathVariableResolver.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/xpath/LazyXPathVariableResolver.java index 166e96a55df..1376d22e79d 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/xpath/LazyXPathVariableResolver.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/xpath/LazyXPathVariableResolver.java @@ -109,7 +109,7 @@ public Object resolveVariable(QName name) { type = ref.getType(); try { - variableValue = objectResolver.resolve(ref, ObjectType.class, null, contextDescription, result); + variableValue = objectResolver.resolve(ref, ObjectType.class, null, contextDescription, null, result); // TODO task } catch (ObjectNotFoundException e) { ObjectNotFoundException newEx = new ObjectNotFoundException("Object not found during variable "+name+" resolution in "+contextDescription+": "+e.getMessage(),e, ref.getOid()); diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/xpath/XPathScriptEvaluator.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/xpath/XPathScriptEvaluator.java index 8386348de1b..5f9d4aa85f5 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/xpath/XPathScriptEvaluator.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/script/xpath/XPathScriptEvaluator.java @@ -17,7 +17,6 @@ import com.evolveum.midpoint.model.common.expression.ExpressionSyntaxException; import com.evolveum.midpoint.model.common.expression.ExpressionVariables; -import com.evolveum.midpoint.model.common.expression.functions.BasicExpressionFunctions; import com.evolveum.midpoint.model.common.expression.functions.FunctionLibrary; import com.evolveum.midpoint.model.common.expression.script.ScriptEvaluator; import com.evolveum.midpoint.prism.ItemDefinition; @@ -32,6 +31,7 @@ import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.ExceptionUtil; import com.evolveum.midpoint.schema.util.ObjectResolver; +import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.DOMUtil; import com.evolveum.midpoint.util.exception.ExpressionEvaluationException; import com.evolveum.midpoint.util.exception.ObjectNotFoundException; @@ -43,7 +43,6 @@ import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; import org.w3c.dom.Element; -import org.w3c.dom.Node; import org.w3c.dom.NodeList; import javax.xml.namespace.QName; @@ -52,7 +51,6 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; -import java.util.Map; /** * @author Radovan Semancik @@ -71,9 +69,9 @@ public XPathScriptEvaluator(PrismContext prismContext) { @Override public List evaluate(ScriptExpressionEvaluatorType expressionType, - ExpressionVariables variables, ItemDefinition outputDefinition, ScriptExpressionReturnTypeType suggestedReturnType, - ObjectResolver objectResolver, Collection functions, - String contextDescription, OperationResult result) throws ExpressionEvaluationException, + ExpressionVariables variables, ItemDefinition outputDefinition, ScriptExpressionReturnTypeType suggestedReturnType, + ObjectResolver objectResolver, Collection functions, + String contextDescription, Task task, OperationResult result) throws ExpressionEvaluationException, ObjectNotFoundException, ExpressionSyntaxException { String codeString = expressionType.getCode(); diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/mapping/Mapping.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/mapping/Mapping.java index 5319f506d87..5772f6dddf8 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/mapping/Mapping.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/mapping/Mapping.java @@ -17,14 +17,10 @@ import java.util.ArrayList; import java.util.Collection; -import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.Map.Entry; -import javax.xml.bind.JAXBElement; -import javax.xml.bind.JAXBException; import javax.xml.datatype.DatatypeConstants; import javax.xml.datatype.Duration; import javax.xml.datatype.XMLGregorianCalendar; @@ -49,9 +45,6 @@ import com.evolveum.midpoint.model.common.expression.ObjectDeltaObject; import com.evolveum.midpoint.model.common.expression.Source; import com.evolveum.midpoint.model.common.expression.StringPolicyResolver; -import com.evolveum.midpoint.model.common.expression.evaluator.LiteralExpressionEvaluatorFactory; -import com.evolveum.midpoint.model.common.expression.script.ScriptExpression; -import com.evolveum.midpoint.model.common.expression.script.ScriptExpressionFactory; import com.evolveum.midpoint.prism.Item; import com.evolveum.midpoint.prism.ItemDefinition; import com.evolveum.midpoint.prism.PrismContext; @@ -66,11 +59,8 @@ import com.evolveum.midpoint.prism.Visitor; import com.evolveum.midpoint.prism.delta.PrismValueDeltaSetTriple; import com.evolveum.midpoint.prism.delta.ItemDelta; -import com.evolveum.midpoint.prism.parser.XPathHolder; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.path.NameItemPathSegment; -import com.evolveum.midpoint.prism.xml.XmlTypeConverter; -import com.evolveum.midpoint.schema.constants.ExpressionConstants; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.SchemaDebugUtil; @@ -84,7 +74,6 @@ import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ExpressionReturnMultiplicityType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ExpressionType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ExpressionVariableDefinitionType; import com.evolveum.midpoint.xml.ns._public.common.common_3.MappingSourceDeclarationType; @@ -94,7 +83,6 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.MappingType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ValueFilterType; /** @@ -487,7 +475,7 @@ public void evaluate(Task task, OperationResult parentResult) throws ExpressionE traceEvaluationStart(); try { - evaluateTimeConstraintValid(result); + evaluateTimeConstraintValid(task, result); if (!timeConstraintValid) { outputTriple = null; @@ -496,7 +484,7 @@ public void evaluate(Task task, OperationResult parentResult) throws ExpressionE return; } - parseSources(result); + parseSources(task, result); parseTarget(); if (outputPath != null && outputDefinition == null) { @@ -669,14 +657,14 @@ private boolean computeConditionResult(Collection> b return ExpressionUtil.computeConditionResult(booleanPropertyValues); } - public Boolean evaluateTimeConstraintValid(OperationResult result) throws SchemaException, ObjectNotFoundException { + public Boolean evaluateTimeConstraintValid(Task task, OperationResult result) throws SchemaException, ObjectNotFoundException { if (timeConstraintValid == null) { - parseTimeConstraints(result); + parseTimeConstraints(task, result); } return timeConstraintValid; } - private void parseTimeConstraints(OperationResult result) throws SchemaException, ObjectNotFoundException { + private void parseTimeConstraints(Task task, OperationResult result) throws SchemaException, ObjectNotFoundException { MappingTimeDeclarationType timeFromType = mappingType.getTimeFrom(); MappingTimeDeclarationType timeToType = mappingType.getTimeTo(); if (timeFromType == null && timeToType == null) { @@ -684,7 +672,7 @@ private void parseTimeConstraints(OperationResult result) throws SchemaException return; } - XMLGregorianCalendar timeFrom = parseTime(timeFromType, result); + XMLGregorianCalendar timeFrom = parseTime(timeFromType, task, result); if (timeFrom == null && timeFromType != null) { // Time is specified but there is no value for it. // This means that event that should start validity haven't happened yet @@ -692,7 +680,7 @@ private void parseTimeConstraints(OperationResult result) throws SchemaException timeConstraintValid = false; return; } - XMLGregorianCalendar timeTo = parseTime(timeToType, result); + XMLGregorianCalendar timeTo = parseTime(timeToType, task, result); if (timeFrom != null && timeFrom.compare(now) == DatatypeConstants.GREATER) { // before timeFrom @@ -731,7 +719,7 @@ private void parseTimeConstraints(OperationResult result) throws SchemaException } - private XMLGregorianCalendar parseTime(MappingTimeDeclarationType timeType, OperationResult result) throws SchemaException, ObjectNotFoundException { + private XMLGregorianCalendar parseTime(MappingTimeDeclarationType timeType, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException { if (timeType == null) { return null; } @@ -744,7 +732,7 @@ private XMLGregorianCalendar parseTime(MappingTimeDeclarationType timeType, Oper time = (XMLGregorianCalendar) defaultReferenceTime.clone(); } } else { - time = parseTimeSource(referenceTimeType, result); + time = parseTimeSource(referenceTimeType, task, result); if (time == null) { // Reference time is specified but the value is not present. return null; @@ -758,7 +746,7 @@ private XMLGregorianCalendar parseTime(MappingTimeDeclarationType timeType, Oper return time; } - private XMLGregorianCalendar parseTimeSource(MappingSourceDeclarationType sourceType, OperationResult result) throws SchemaException, ObjectNotFoundException { + private XMLGregorianCalendar parseTimeSource(MappingSourceDeclarationType sourceType, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException { ItemPathType itemPathType = sourceType.getPath(); if (itemPathType == null) { throw new SchemaException("No path in source definition in "+getMappingContextDescription()); @@ -768,7 +756,7 @@ private XMLGregorianCalendar parseTimeSource(MappingSourceDeclarationType source throw new SchemaException("Empty source path in "+getMappingContextDescription()); } - Object sourceObject = ExpressionUtil.resolvePath(path, variables, sourceContext, objectResolver, "reference time definition in "+getMappingContextDescription(), result); + Object sourceObject = ExpressionUtil.resolvePath(path, variables, sourceContext, objectResolver, "reference time definition in "+getMappingContextDescription(), task, result); if (sourceObject == null) { return null; } @@ -786,7 +774,7 @@ private XMLGregorianCalendar parseTimeSource(MappingSourceDeclarationType source return timeProperty.getRealValue(); } - private Collection> parseSources(OperationResult result) throws SchemaException, ObjectNotFoundException { + private Collection> parseSources(Task task, OperationResult result) throws SchemaException, ObjectNotFoundException { List sourceTypes = mappingType.getSource(); if (defaultSource != null) { defaultSource.recompute(); @@ -795,7 +783,7 @@ private Collection> parseSources(OperationResult result) throws Sche } if (sourceTypes != null) { for (MappingSourceDeclarationType sourceType: sourceTypes) { - Source source = parseSource(sourceType, result); + Source source = parseSource(sourceType, task, result); source.recompute(); // Override existing sources (e.g. default source) @@ -813,7 +801,7 @@ private Collection> parseSources(OperationResult result) throws Sche return sources; } - private Source parseSource(MappingSourceDeclarationType sourceType, OperationResult result) throws SchemaException, ObjectNotFoundException { + private Source parseSource(MappingSourceDeclarationType sourceType, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException { ItemPathType itemPathType = sourceType.getPath(); if (itemPathType == null) { throw new SchemaException("No path in source definition in "+getMappingContextDescription()); @@ -827,7 +815,7 @@ private Source parseSo name = ItemPath.getName(path.last()); } ItemPath resolvePath = path; - Object sourceObject = ExpressionUtil.resolvePath(path, variables, sourceContext, objectResolver, "source definition in "+getMappingContextDescription(), result); + Object sourceObject = ExpressionUtil.resolvePath(path, variables, sourceContext, objectResolver, "source definition in "+getMappingContextDescription(), task, result); Item itemOld = null; ItemDelta delta = null; Item itemNew = null; @@ -948,7 +936,7 @@ private void evaluateCondition(Task task, OperationResult result) throws SchemaE } PrismPropertyDefinition conditionOutput = new PrismPropertyDefinition<>(CONDITION_OUTPUT_NAME, DOMUtil.XSD_BOOLEAN, expressionFactory.getPrismContext()); Expression,PrismPropertyDefinition> expression = expressionFactory.makeExpression(conditionExpressionType, - conditionOutput, "condition in "+getMappingContextDescription(), result); + conditionOutput, "condition in "+getMappingContextDescription(), task, result); ExpressionEvaluationContext params = new ExpressionEvaluationContext(sources, variables, "condition in "+getMappingContextDescription(), task, result); params.setStringPolicyResolver(stringPolicyResolver); @@ -967,7 +955,7 @@ private void evaluateExpression(Task task, OperationResult result, boolean condi expressionType = mappingType.getExpression(); } expression = expressionFactory.makeExpression(expressionType, outputDefinition, - "expression in "+getMappingContextDescription(), result); + "expression in "+getMappingContextDescription(), task, result); ExpressionEvaluationContext params = new ExpressionEvaluationContext(sources, variables, "expression in "+getMappingContextDescription(), task, result); params.setDefaultSource(defaultSource); diff --git a/model/model-common/src/test/java/com/evolveum/midpoint/model/common/expression/TestExpression.java b/model/model-common/src/test/java/com/evolveum/midpoint/model/common/expression/TestExpression.java index 871330f7f8f..54113f2ce3f 100644 --- a/model/model-common/src/test/java/com/evolveum/midpoint/model/common/expression/TestExpression.java +++ b/model/model-common/src/test/java/com/evolveum/midpoint/model/common/expression/TestExpression.java @@ -19,11 +19,6 @@ import java.io.File; import java.io.IOException; -import java.util.HashMap; -import java.util.Map; - -import javax.xml.bind.JAXBElement; -import javax.xml.namespace.QName; import org.testng.annotations.BeforeSuite; import org.testng.annotations.Test; @@ -91,7 +86,7 @@ public void testIterationCondition() throws Exception { PrismPropertyDefinition outputDefinition = new PrismPropertyDefinition(ExpressionConstants.OUTPUT_ELMENT_NAME, DOMUtil.XSD_BOOLEAN, prismContext); - Expression,PrismPropertyDefinition> expression = expressionFactory.makeExpression(expressionType, outputDefinition , TEST_NAME, result); + Expression,PrismPropertyDefinition> expression = expressionFactory.makeExpression(expressionType, outputDefinition , TEST_NAME, null, result); ExpressionVariables variables = new ExpressionVariables(); PrismObject user = PrismTestUtil.parseObject(new File(TEST_DIR, "user-jack.xml")); diff --git a/model/model-common/src/test/java/com/evolveum/midpoint/model/common/expression/TestExpressionUtil.java b/model/model-common/src/test/java/com/evolveum/midpoint/model/common/expression/TestExpressionUtil.java index 72b9dcc3270..3295f33984d 100644 --- a/model/model-common/src/test/java/com/evolveum/midpoint/model/common/expression/TestExpressionUtil.java +++ b/model/model-common/src/test/java/com/evolveum/midpoint/model/common/expression/TestExpressionUtil.java @@ -18,29 +18,18 @@ import static org.testng.AssertJUnit.assertTrue; import static org.testng.AssertJUnit.assertEquals; -import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.util.PrismAsserts; import org.testng.annotations.Test; -import org.testng.AssertJUnit; import java.io.File; import java.io.IOException; -import java.util.HashMap; -import java.util.Map; - -import javax.xml.bind.JAXBException; -import javax.xml.namespace.QName; import org.testng.annotations.BeforeSuite; -import org.testng.annotations.Test; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.xml.sax.SAXException; -import com.evolveum.midpoint.model.common.expression.ExpressionUtil; -import com.evolveum.midpoint.model.common.expression.ItemDeltaItem; -import com.evolveum.midpoint.model.common.expression.ObjectDeltaObject; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismProperty; import com.evolveum.midpoint.prism.PrismPropertyDefinition; @@ -209,7 +198,7 @@ private T resolvePath(String path, ExpressionVariables variables, final Stri ItemPath itemPath = toItemPath(path); // WHEN - Object resolved = ExpressionUtil.resolvePath(itemPath, variables, null, null, TEST_NAME, result); + Object resolved = ExpressionUtil.resolvePath(itemPath, variables, null, null, TEST_NAME, null, result); // THEN System.out.println("Resolved:"); diff --git a/model/model-common/src/test/java/com/evolveum/midpoint/model/common/expression/script/AbstractScriptTest.java b/model/model-common/src/test/java/com/evolveum/midpoint/model/common/expression/script/AbstractScriptTest.java index b9f2089f381..00d1b08d3ea 100644 --- a/model/model-common/src/test/java/com/evolveum/midpoint/model/common/expression/script/AbstractScriptTest.java +++ b/model/model-common/src/test/java/com/evolveum/midpoint/model/common/expression/script/AbstractScriptTest.java @@ -20,10 +20,6 @@ import com.evolveum.midpoint.model.common.expression.ExpressionUtil; import com.evolveum.midpoint.model.common.expression.ExpressionVariables; import com.evolveum.midpoint.model.common.expression.functions.FunctionLibrary; -import com.evolveum.midpoint.model.common.expression.script.ScriptEvaluator; -import com.evolveum.midpoint.model.common.expression.script.ScriptExpression; -import com.evolveum.midpoint.model.common.expression.script.ScriptExpressionEvaluationContext; -import com.evolveum.midpoint.model.common.expression.script.ScriptExpressionFactory; import com.evolveum.midpoint.prism.ItemDefinition; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismPropertyDefinition; @@ -55,12 +51,10 @@ import org.testng.annotations.Test; import org.xml.sax.SAXException; -import javax.xml.bind.JAXBElement; import javax.xml.bind.JAXBException; import javax.xml.namespace.QName; import java.io.File; -import java.io.FileNotFoundException; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; @@ -258,7 +252,7 @@ private ScriptExpressionEvaluatorType parseScriptType(String fileName) throws Sc private List> evaluateExpression(ScriptExpressionEvaluatorType scriptType, ItemDefinition outputDefinition, ExpressionVariables variables, String shortDesc, OperationResult result) throws ExpressionEvaluationException, ObjectNotFoundException, SchemaException { ScriptExpression scriptExpression = scriptExpressionfactory.createScriptExpression(scriptType, outputDefinition, shortDesc); - return scriptExpression.evaluate(variables, null, false, shortDesc, result); + return scriptExpression.evaluate(variables, null, false, shortDesc, null, result); } private List> evaluateExpression(ScriptExpressionEvaluatorType scriptType, QName typeName, boolean scalar, diff --git a/model/model-common/src/test/java/com/evolveum/midpoint/model/common/expression/script/TestScriptCaching.java b/model/model-common/src/test/java/com/evolveum/midpoint/model/common/expression/script/TestScriptCaching.java index 051144e7ffa..bcf03385d37 100644 --- a/model/model-common/src/test/java/com/evolveum/midpoint/model/common/expression/script/TestScriptCaching.java +++ b/model/model-common/src/test/java/com/evolveum/midpoint/model/common/expression/script/TestScriptCaching.java @@ -18,42 +18,27 @@ import com.evolveum.midpoint.common.monitor.InternalMonitor; import com.evolveum.midpoint.model.common.expression.ExpressionUtil; import com.evolveum.midpoint.model.common.expression.ExpressionVariables; -import com.evolveum.midpoint.model.common.expression.functions.BasicExpressionFunctions; import com.evolveum.midpoint.model.common.expression.functions.FunctionLibrary; -import com.evolveum.midpoint.model.common.expression.script.ScriptEvaluator; -import com.evolveum.midpoint.model.common.expression.script.ScriptExpression; -import com.evolveum.midpoint.model.common.expression.script.ScriptExpressionFactory; import com.evolveum.midpoint.model.common.expression.script.jsr223.Jsr223ScriptEvaluator; import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.Objectable; import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismPropertyDefinition; import com.evolveum.midpoint.prism.PrismPropertyValue; -import com.evolveum.midpoint.prism.PrismValue; import com.evolveum.midpoint.prism.crypto.AESProtector; import com.evolveum.midpoint.prism.crypto.Protector; -import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.util.PrismTestUtil; -import com.evolveum.midpoint.prism.xml.XmlTypeConverter; import com.evolveum.midpoint.schema.MidPointPrismContextFactory; import com.evolveum.midpoint.schema.constants.MidPointConstants; -import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.ObjectResolver; -import com.evolveum.midpoint.schema.util.SchemaTestConstants; import com.evolveum.midpoint.test.util.DirectoryFileObjectResolver; import com.evolveum.midpoint.test.util.TestUtil; import com.evolveum.midpoint.util.DOMUtil; -import com.evolveum.midpoint.util.MiscUtil; import com.evolveum.midpoint.util.PrettyPrinter; import com.evolveum.midpoint.util.exception.ExpressionEvaluationException; import com.evolveum.midpoint.util.exception.ObjectNotFoundException; import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ScriptExpressionEvaluatorType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; import org.testng.AssertJUnit; import org.testng.annotations.BeforeClass; @@ -62,15 +47,12 @@ import org.xml.sax.SAXException; import java.io.File; -import java.io.FileNotFoundException; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.List; -import javax.xml.bind.JAXBElement; import javax.xml.bind.JAXBException; -import javax.xml.datatype.XMLGregorianCalendar; import javax.xml.namespace.QName; import static org.testng.AssertJUnit.*; @@ -167,7 +149,7 @@ private long executeScript(String filname, String expectedResult, String desc) t // WHEN long startTime = System.currentTimeMillis(); - List> scripResults = scriptExpression.evaluate(variables , null, false, desc, result); + List> scripResults = scriptExpression.evaluate(variables , null, false, desc, null, result); long endTime = System.currentTimeMillis(); // THEN diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelObjectResolver.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelObjectResolver.java index 7691b1b1180..8d20c231f1b 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelObjectResolver.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelObjectResolver.java @@ -81,7 +81,7 @@ public class ModelObjectResolver implements ObjectResolver { @Override public O resolve(ObjectReferenceType ref, Class expectedType, Collection> options, - String contextDescription, OperationResult result) throws ObjectNotFoundException, SchemaException { + String contextDescription, Object task, OperationResult result) throws ObjectNotFoundException, SchemaException { String oid = ref.getOid(); Class typeClass = null; QName typeQName = ref.getType(); @@ -92,7 +92,7 @@ public O resolve(ObjectReferenceType ref, Class expect expectedType = (Class) typeClass; } try { - return getObject(expectedType, oid, options, null, result); + return getObject(expectedType, oid, options, (Task) task, result); } catch (SystemException ex) { throw ex; } catch (ObjectNotFoundException ex) { @@ -211,18 +211,18 @@ public T getObject(Class clazz, String oid, Collection return objectType; } - public void searchIterative(Class type, ObjectQuery query, Collection> options, ResultHandler handler, OperationResult parentResult) + public void searchIterative(Class type, ObjectQuery query, Collection> options, ResultHandler handler, Object task, OperationResult parentResult) throws SchemaException, ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException { if (ObjectTypes.isClassManagedByProvisioning(type)) { - provisioning.searchObjectsIterative(type, query, options, handler, parentResult); + provisioning.searchObjectsIterative(type, query, options, handler, (Task) task, parentResult); } else { cacheRepositoryService.searchObjectsIterative(type, query, handler, options, parentResult); } } - public Integer countObjects(Class type, ObjectQuery query, Collection> options, OperationResult parentResult) throws SchemaException, ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException { + public Integer countObjects(Class type, ObjectQuery query, Collection> options, Task task, OperationResult parentResult) throws SchemaException, ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException { if (ObjectTypes.isClassManagedByProvisioning(type)) { - return provisioning.countObjects(type, query, options, parentResult); + return provisioning.countObjects(type, query, options, task, parentResult); } else { return cacheRepositoryService.countObjects(type, query, parentResult); } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ModelController.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ModelController.java index a3d1b2ec97f..03cd00896e5 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ModelController.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ModelController.java @@ -23,7 +23,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; -import java.util.Iterator; import java.util.List; import java.util.Set; @@ -40,8 +39,6 @@ import com.evolveum.midpoint.model.api.hooks.ReadHook; import com.evolveum.midpoint.model.impl.scripting.ExecutionContext; import com.evolveum.midpoint.model.impl.scripting.ScriptingExpressionEvaluator; -import com.evolveum.midpoint.prism.ConsistencyCheckScope; -import com.evolveum.midpoint.prism.parser.XNodeSerializer; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.schema.util.ObjectQueryUtil; import com.evolveum.midpoint.util.QNameUtil; @@ -65,8 +62,6 @@ import com.evolveum.midpoint.audit.api.AuditEventStage; import com.evolveum.midpoint.audit.api.AuditEventType; import com.evolveum.midpoint.audit.api.AuditService; -import com.evolveum.midpoint.common.InternalsConfig; -import com.evolveum.midpoint.common.crypto.CryptoUtil; import com.evolveum.midpoint.common.refinery.LayerRefinedAttributeDefinition; import com.evolveum.midpoint.common.refinery.LayerRefinedObjectClassDefinition; import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition; @@ -89,18 +84,12 @@ import com.evolveum.midpoint.model.impl.lens.projector.Projector; import com.evolveum.midpoint.model.impl.util.Utils; import com.evolveum.midpoint.prism.DisplayableValueImpl; -import com.evolveum.midpoint.prism.Item; -import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.PrismContainer; -import com.evolveum.midpoint.prism.PrismContainerDefinition; -import com.evolveum.midpoint.prism.PrismContainerValue; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismObjectDefinition; import com.evolveum.midpoint.prism.PrismPropertyValue; import com.evolveum.midpoint.prism.PrismReference; import com.evolveum.midpoint.prism.PrismReferenceValue; -import com.evolveum.midpoint.prism.PrismValue; import com.evolveum.midpoint.prism.Visitable; import com.evolveum.midpoint.prism.Visitor; import com.evolveum.midpoint.prism.crypto.Protector; @@ -116,7 +105,6 @@ import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.query.OrFilter; import com.evolveum.midpoint.prism.query.TypeFilter; -import com.evolveum.midpoint.prism.xml.XsdTypeMapper; import com.evolveum.midpoint.provisioning.api.ProvisioningOperationOptions; import com.evolveum.midpoint.provisioning.api.ProvisioningService; import com.evolveum.midpoint.repo.api.RepoAddOptions; @@ -134,7 +122,6 @@ import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.result.OperationResultRunner; import com.evolveum.midpoint.schema.result.OperationResultStatus; -import com.evolveum.midpoint.schema.util.MiscSchemaUtil; import com.evolveum.midpoint.schema.util.ShadowUtil; import com.evolveum.midpoint.security.api.AuthorizationConstants; import com.evolveum.midpoint.security.api.ObjectSecurityConstraints; @@ -144,7 +131,6 @@ import com.evolveum.midpoint.task.api.TaskManager; import com.evolveum.midpoint.util.DebugUtil; import com.evolveum.midpoint.util.DisplayableValue; -import com.evolveum.midpoint.util.exception.AuthorizationException; import com.evolveum.midpoint.util.exception.CommunicationException; import com.evolveum.midpoint.util.exception.ConfigurationException; import com.evolveum.midpoint.util.exception.ExpressionEvaluationException; @@ -166,17 +152,11 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.LayerType; import com.evolveum.midpoint.xml.ns._public.common.common_3.LookupTableRowType; import com.evolveum.midpoint.xml.ns._public.common.common_3.LookupTableType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectPolicyConfigurationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectSynchronizationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectTemplateItemDefinitionType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectTemplateType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationResultStatusType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationResultType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.PropertyAccessType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.PropertyLimitationsType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ReportType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleType; import com.evolveum.midpoint.xml.ns._public.common.common_3.SecurityPolicyType; @@ -1174,7 +1154,7 @@ private DisplayableValue getRoleSelectionSpecEq(EqualFilter eqFi } @Override - public CredentialsPolicyType getCredentialsPolicy(PrismObject user, OperationResult parentResult) throws ObjectNotFoundException, SchemaException { + public CredentialsPolicyType getCredentialsPolicy(PrismObject user, Task task, OperationResult parentResult) throws ObjectNotFoundException, SchemaException { // TODO: check for user membership in an organization (later versions) OperationResult result = parentResult.createMinorSubresult(GET_CREDENTIALS_POLICY); @@ -1190,7 +1170,7 @@ public CredentialsPolicyType getCredentialsPolicy(PrismObject user, Op return null; } SecurityPolicyType securityPolicyType; - securityPolicyType = objectResolver.resolve(secPolicyRef, SecurityPolicyType.class, null, "security policy referred from system configuration", result); + securityPolicyType = objectResolver.resolve(secPolicyRef, SecurityPolicyType.class, null, "security policy referred from system configuration", task, result); if (securityPolicyType == null) { result.recordNotApplicableIfUnknown(); return null; @@ -1267,7 +1247,7 @@ public SearchResultList> searchObjects(Cla } switch (searchProvider) { case REPOSITORY: list = cacheRepositoryService.searchObjects(type, query, options, result); break; - case PROVISIONING: list = provisioning.searchObjects(type, query, options, result); break; + case PROVISIONING: list = provisioning.searchObjects(type, query, options, null, result); break; case TASK_MANAGER: list = taskManager.searchObjects(type, query, options, result); break; case WORKFLOW: throw new UnsupportedOperationException(); default: throw new AssertionError("Unexpected search provider: " + searchProvider); @@ -1389,7 +1369,7 @@ public boolean handle(PrismObject object, OperationResult parentResult) { try { switch (searchProvider) { case REPOSITORY: metadata = cacheRepositoryService.searchObjectsIterative(type, query, internalHandler, options, result); break; - case PROVISIONING: metadata = provisioning.searchObjectsIterative(type, query, options, internalHandler, result); break; + case PROVISIONING: metadata = provisioning.searchObjectsIterative(type, query, options, internalHandler, task, result); break; case TASK_MANAGER: throw new UnsupportedOperationException("searchIterative in task manager is currently not supported"); case WORKFLOW: throw new UnsupportedOperationException("searchIterative in task manager is currently not supported"); default: throw new AssertionError("Unexpected search provider: " + searchProvider); @@ -1469,7 +1449,7 @@ public Integer countObjects(Class type, ObjectQuery qu objectManager = ObjectTypes.ObjectManager.REPOSITORY; } switch (objectManager) { - case PROVISIONING: count = provisioning.countObjects(type, query, null, parentResult); break; + case PROVISIONING: count = provisioning.countObjects(type, query, null, task, parentResult); break; case REPOSITORY: count = cacheRepositoryService.countObjects(type, query, parentResult); break; case TASK_MANAGER: count = taskManager.countObjects(type, query, parentResult); break; default: throw new AssertionError("Unexpected objectManager: " + objectManager); @@ -1587,7 +1567,7 @@ public List> listResourceObjects(String resour try { - list = provisioning.listResourceObjects(resourceOid, objectClass, paging, result); + list = provisioning.listResourceObjects(resourceOid, objectClass, paging, task, result); } catch (SchemaException ex) { ModelUtils.recordFatalError(result, ex); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/ExpressionHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/ExpressionHandler.java index 6a18b6450b4..a994b6375aa 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/ExpressionHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/ExpressionHandler.java @@ -16,16 +16,10 @@ package com.evolveum.midpoint.model.impl.expr; import java.util.Collection; -import java.util.HashMap; -import java.util.Map; -import javax.xml.namespace.QName; - -import com.evolveum.midpoint.prism.ItemDefinition; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismPropertyDefinition; import com.evolveum.midpoint.prism.PrismPropertyValue; -import com.evolveum.midpoint.prism.PrismValue; import com.evolveum.midpoint.prism.delta.PrismValueDeltaSetTriple; import org.apache.commons.lang.Validate; @@ -36,26 +30,19 @@ import com.evolveum.midpoint.model.common.expression.Expression; import com.evolveum.midpoint.model.common.expression.ExpressionEvaluationContext; import com.evolveum.midpoint.model.common.expression.ExpressionFactory; -import com.evolveum.midpoint.model.common.expression.ExpressionUtil; import com.evolveum.midpoint.model.common.expression.ExpressionVariables; -import com.evolveum.midpoint.model.common.expression.script.ScriptExpression; -import com.evolveum.midpoint.model.common.expression.script.ScriptExpressionFactory; import com.evolveum.midpoint.model.common.expression.script.xpath.XPathScriptEvaluator; -import com.evolveum.midpoint.model.common.mapping.MappingFactory; import com.evolveum.midpoint.model.impl.ModelObjectResolver; import com.evolveum.midpoint.model.impl.controller.ModelController; import com.evolveum.midpoint.repo.api.RepositoryService; import com.evolveum.midpoint.schema.constants.ExpressionConstants; 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.ObjectResolver; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.DOMUtil; import com.evolveum.midpoint.util.exception.ExpressionEvaluationException; import com.evolveum.midpoint.util.exception.ObjectNotFoundException; import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.xml.ns._public.common.api_types_3.PropertyReferenceListType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ExpressionType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; @@ -110,7 +97,7 @@ public String evaluateExpression(ShadowType shadow, ExpressionType expressionTyp PrismPropertyDefinition outputDefinition = new PrismPropertyDefinition<>(ExpressionConstants.OUTPUT_ELMENT_NAME, DOMUtil.XSD_STRING, prismContext); Expression,PrismPropertyDefinition> expression = expressionFactory.makeExpression(expressionType, - outputDefinition, shortDesc, result); + outputDefinition, shortDesc, task, result); ExpressionEvaluationContext params = new ExpressionEvaluationContext(null, variables, shortDesc, task, result); PrismValueDeltaSetTriple> outputTriple = expression.evaluate(params); @@ -142,7 +129,7 @@ public boolean evaluateConfirmationExpression(UserType user, ShadowType shadow, PrismPropertyDefinition outputDefinition = new PrismPropertyDefinition<>(ExpressionConstants.OUTPUT_ELMENT_NAME, DOMUtil.XSD_BOOLEAN, prismContext); Expression,PrismPropertyDefinition> expression = expressionFactory.makeExpression(expressionType, - outputDefinition, shortDesc, result); + outputDefinition, shortDesc, task, result); ExpressionEvaluationContext params = new ExpressionEvaluationContext(null, variables, shortDesc, task, result); PrismValueDeltaSetTriple> outputTriple = expression.evaluate(params); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/MidpointFunctionsImpl.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/MidpointFunctionsImpl.java index af112a7cfc8..806e0080c75 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/MidpointFunctionsImpl.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/MidpointFunctionsImpl.java @@ -707,21 +707,21 @@ public ShadowType getLinkedShadow(FocusType focus, String resourceOid, ShadowKin public Integer countAccounts(String resourceOid, QName attributeName, T attributeValue) throws SchemaException, ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException { OperationResult result = getCurrentResult(MidpointFunctions.class.getName()+".countAccounts"); ResourceType resourceType = modelObjectResolver.getObjectSimple(ResourceType.class, resourceOid, null, null, result); - return countAccounts(resourceType, attributeName, attributeValue, result); + return countAccounts(resourceType, attributeName, attributeValue, getCurrentTask(), result); } public Integer countAccounts(ResourceType resourceType, QName attributeName, T attributeValue) throws SchemaException, ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException { OperationResult result = getCurrentResult(MidpointFunctions.class.getName()+".countAccounts"); - return countAccounts(resourceType, attributeName, attributeValue, result); + return countAccounts(resourceType, attributeName, attributeValue, getCurrentTask(), result); } public Integer countAccounts(ResourceType resourceType, String attributeName, T attributeValue) throws SchemaException, ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException { OperationResult result = getCurrentResult(MidpointFunctions.class.getName()+".countAccounts"); QName attributeQName = new QName(ResourceTypeUtil.getResourceNamespace(resourceType), attributeName); - return countAccounts(resourceType, attributeQName, attributeValue, result); + return countAccounts(resourceType, attributeQName, attributeValue, getCurrentTask(), result); } - private Integer countAccounts(ResourceType resourceType, QName attributeName, T attributeValue, OperationResult result) + private Integer countAccounts(ResourceType resourceType, QName attributeName, T attributeValue, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException { RefinedResourceSchema rSchema = RefinedResourceSchema.getRefinedSchema(resourceType); @@ -733,20 +733,20 @@ private Integer countAccounts(ResourceType resourceType, QName attributeName RefFilter resourceRefFilter = RefFilter.createReferenceEqual(ShadowType.F_RESOURCE_REF, ShadowType.class, resourceType); AndFilter filter = AndFilter.createAnd(idFilter, ocFilter, resourceRefFilter); ObjectQuery query = ObjectQuery.createObjectQuery(filter); - return modelObjectResolver.countObjects(ShadowType.class, query, null, result); + return modelObjectResolver.countObjects(ShadowType.class, query, null, task, result); } public boolean isUniquePropertyValue(ObjectType objectType, String propertyPathString, T propertyValue) throws SchemaException, ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException { Validate.notEmpty(propertyPathString, "Empty property path"); OperationResult result = getCurrentResult(MidpointFunctions.class.getName()+".isUniquePropertyValue"); ItemPath propertyPath = new XPathHolder(propertyPathString).toItemPath(); - return isUniquePropertyValue(objectType, propertyPath, propertyValue, result); + return isUniquePropertyValue(objectType, propertyPath, propertyValue, getCurrentTask(), result); } - private boolean isUniquePropertyValue(final ObjectType objectType, ItemPath propertyPath, T propertyValue, OperationResult result) + private boolean isUniquePropertyValue(final ObjectType objectType, ItemPath propertyPath, T propertyValue, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException { - List conflictingObjects = getObjectsInConflictOnPropertyValue(objectType, propertyPath, propertyValue, DefaultMatchingRule.NAME, false, result); + List conflictingObjects = getObjectsInConflictOnPropertyValue(objectType, propertyPath, propertyValue, DefaultMatchingRule.NAME, false, task, result); return conflictingObjects.isEmpty(); } @@ -759,10 +759,10 @@ public List getObjectsInConflictOnPropertyValue(O o OperationResult result = getCurrentResult(MidpointFunctions.class.getName()+".getObjectsInConflictOnPropertyValue"); ItemPath propertyPath = new XPathHolder(propertyPathString).toItemPath(); QName matchingRuleQName = new QName(matchingRuleName); // no namespace for now - return getObjectsInConflictOnPropertyValue(objectType, propertyPath, propertyValue, matchingRuleQName, getAllConflicting, result); + return getObjectsInConflictOnPropertyValue(objectType, propertyPath, propertyValue, matchingRuleQName, getAllConflicting, getCurrentTask(), result); } - private List getObjectsInConflictOnPropertyValue(final O objectType, ItemPath propertyPath, T propertyValue, QName matchingRule, final boolean getAllConflicting, OperationResult result) + private List getObjectsInConflictOnPropertyValue(final O objectType, ItemPath propertyPath, T propertyValue, QName matchingRule, final boolean getAllConflicting, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException { Validate.notNull(objectType, "Null object"); @@ -796,7 +796,7 @@ public boolean handle(PrismObject object, OperationResult parentResult) { } }; - modelObjectResolver.searchIterative((Class) objectType.getClass(), query, null, handler, result); + modelObjectResolver.searchIterative((Class) objectType.getClass(), query, null, handler, task, result); return conflictingObjects; } @@ -805,11 +805,11 @@ public boolean isUniqueAccountValue(ResourceType resourceType, ShadowType sh Validate.notEmpty(attributeName,"Empty attribute name"); OperationResult result = getCurrentResult(MidpointFunctions.class.getName()+".isUniqueAccountValue"); QName attributeQName = new QName(ResourceTypeUtil.getResourceNamespace(resourceType), attributeName); - return isUniqueAccountValue(resourceType, shadowType, attributeQName, attributeValue, result); + return isUniqueAccountValue(resourceType, shadowType, attributeQName, attributeValue, getCurrentTask(), result); } private boolean isUniqueAccountValue(ResourceType resourceType, final ShadowType shadowType, - QName attributeName, T attributeValue, OperationResult result) + QName attributeName, T attributeValue, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException { Validate.notNull(resourceType, "Null resource"); @@ -848,7 +848,7 @@ public boolean handle(PrismObject object, OperationResult parentResu } }; - modelObjectResolver.searchIterative(ShadowType.class, query, null, handler, result); + modelObjectResolver.searchIterative(ShadowType.class, query, null, handler, task, result); return isUniqueHolder.getValue(); } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/importer/ImportAccountsFromResourceTaskHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/importer/ImportAccountsFromResourceTaskHandler.java index ac15c5ebd45..306aca34e80 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/importer/ImportAccountsFromResourceTaskHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/importer/ImportAccountsFromResourceTaskHandler.java @@ -109,6 +109,8 @@ public ImportAccountsFromResourceTaskHandler() { super("Import from resource", OperationConstants.IMPORT_ACCOUNTS_FROM_RESOURCE); setLogFinishInfo(true); setPreserveStatistics(false); + setEnableIterationStatistics(true); + setEnableSynchronizationStatistics(true); } @PostConstruct diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/integrity/ShadowIntegrityCheckResultHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/integrity/ShadowIntegrityCheckResultHandler.java index 838b55b4c03..62d9a98d415 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/integrity/ShadowIntegrityCheckResultHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/integrity/ShadowIntegrityCheckResultHandler.java @@ -20,6 +20,7 @@ import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; import com.evolveum.midpoint.model.impl.sync.SynchronizationService; import com.evolveum.midpoint.model.impl.util.AbstractSearchIterativeResultHandler; +import com.evolveum.midpoint.model.impl.util.AbstractSearchIterativeTaskHandler; import com.evolveum.midpoint.model.impl.util.Utils; import com.evolveum.midpoint.prism.Item; import com.evolveum.midpoint.prism.PrismContainer; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/AssignmentEvaluator.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/AssignmentEvaluator.java index 26d52db4a83..3affd4906d8 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/AssignmentEvaluator.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/AssignmentEvaluator.java @@ -377,7 +377,7 @@ private void evaluateFocusMappings(EvaluatedAssignmentImpl evaluatedAssignmen for (MappingType mappingType: mappingsType.getMapping()) { Mapping mapping = LensUtil.createFocusMapping(mappingFactory, lensContext, mappingType, source, focusOdo, - assignmentPathVariables, systemConfiguration, now, sourceDescription, result); + assignmentPathVariables, systemConfiguration, now, sourceDescription, task, result); if (mapping == null) { continue; } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/ChangeExecutor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/ChangeExecutor.java index 6a159635b59..d6c8af80ab4 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/ChangeExecutor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/ChangeExecutor.java @@ -49,7 +49,6 @@ import com.evolveum.midpoint.prism.delta.PropertyDelta; import com.evolveum.midpoint.prism.delta.ReferenceDelta; import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.prism.xml.XmlTypeConverter; import com.evolveum.midpoint.prism.xnode.PrimitiveXNode; import com.evolveum.midpoint.provisioning.api.ProvisioningOperationOptions; import com.evolveum.midpoint.provisioning.api.ProvisioningService; @@ -63,7 +62,6 @@ import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.result.OperationResultStatus; -import com.evolveum.midpoint.schema.util.ObjectTypeUtil; import com.evolveum.midpoint.schema.util.ShadowUtil; import com.evolveum.midpoint.schema.util.SynchronizationSituationUtil; import com.evolveum.midpoint.security.api.OwnerResolver; @@ -83,7 +81,6 @@ import com.evolveum.prism.xml.ns._public.types_3.RawType; import org.apache.commons.lang.BooleanUtils; -import org.jfree.util.Log; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; @@ -1307,7 +1304,7 @@ private void evaluateScriptArgument(ProvisioningScriptArgumentType argument, Exp DOMUtil.XSD_STRING, prismContext); String shortDesc = "Provisioning script argument expression"; - Expression,PrismPropertyDefinition> expression = expressionFactory.makeExpression(argument, scriptArgumentDefinition, shortDesc, result); + Expression,PrismPropertyDefinition> expression = expressionFactory.makeExpression(argument, scriptArgumentDefinition, shortDesc, task, result); ExpressionEvaluationContext params = new ExpressionEvaluationContext(null, variables, shortDesc, task, result); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Construction.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Construction.java index 53e3ae8dbf1..c5345e5c954 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Construction.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Construction.java @@ -301,13 +301,13 @@ public void setAssignmentPath(AssignmentPath assignmentPath) { this.assignmentPath = assignmentPath; } - public ResourceType getResource(OperationResult result) throws ObjectNotFoundException, SchemaException { + public ResourceType getResource(Task task, OperationResult result) throws ObjectNotFoundException, SchemaException { if (resource == null) { if (constructionType.getResource() != null) { resource = constructionType.getResource(); } else if (constructionType.getResourceRef() != null) { try { - resource = LensUtil.getResource(lensContext, constructionType.getResourceRef().getOid(), objectResolver, result); + resource = LensUtil.getResource(lensContext, constructionType.getResourceRef().getOid(), objectResolver, task, result); } catch (ObjectNotFoundException e) { throw new ObjectNotFoundException("Resource reference seems to be invalid in account construction in " + source + ": "+e.getMessage(), e); } catch (SecurityViolationException|CommunicationException|ConfigurationException e) { @@ -322,13 +322,13 @@ public ResourceType getResource(OperationResult result) throws ObjectNotFoundExc } public void evaluate(Task task, OperationResult result) throws SchemaException, ExpressionEvaluationException, ObjectNotFoundException { - evaluateKindIntentObjectClass(result); + evaluateKindIntentObjectClass(task, result); assignmentPathVariables = LensUtil.computeAssignmentPathVariables(assignmentPath); evaluateAttributes(task, result); evaluateAssociations(task, result); } - private void evaluateKindIntentObjectClass(OperationResult result) throws SchemaException, ObjectNotFoundException { + private void evaluateKindIntentObjectClass(Task task, OperationResult result) throws SchemaException, ObjectNotFoundException { String resourceOid = null; if (constructionType.getResourceRef() != null) { resourceOid = constructionType.getResourceRef().getOid(); @@ -336,7 +336,7 @@ private void evaluateKindIntentObjectClass(OperationResult result) throws Schema if (constructionType.getResource() != null) { resourceOid = constructionType.getResource().getOid(); } - ResourceType resource = getResource(result); + ResourceType resource = getResource(task, result); if (!resource.getOid().equals(resourceOid)) { throw new IllegalStateException("The specified resource and the resource in construction does not match"); } @@ -355,7 +355,7 @@ private void evaluateKindIntentObjectClass(OperationResult result) throws Schema if (refinedObjectClassDefinition == null) { if (constructionType.getIntent() != null) { - throw new SchemaException("No "+kind+" type '"+constructionType.getIntent()+"' found in "+getResource(result)+" as specified in construction in "+source); + throw new SchemaException("No "+kind+" type '"+constructionType.getIntent()+"' found in "+getResource(task, result)+" as specified in construction in "+source); } else { throw new SchemaException("No default "+kind+" type found in " + resource + " as specified in construction in "+source); } @@ -365,7 +365,7 @@ private void evaluateKindIntentObjectClass(OperationResult result) throws Schema for (QName auxiliaryObjectClassName: constructionType.getAuxiliaryObjectClass()) { RefinedObjectClassDefinition auxOcDef = refinedSchema.getRefinedDefinition(auxiliaryObjectClassName); if (auxOcDef == null) { - throw new SchemaException("No auxiliary object class "+auxiliaryObjectClassName+" found in "+getResource(result)+" as specified in construction in "+source); + throw new SchemaException("No auxiliary object class "+auxiliaryObjectClassName+" found in "+getResource(task, result)+" as specified in construction in "+source); } auxiliaryObjectClassDefinitions.add(auxOcDef); } @@ -410,7 +410,7 @@ private Mapping, ResourceAttributeDefinition> evalu } ResourceAttributeDefinition outputDefinition = findAttributeDefinition(attrName); if (outputDefinition == null) { - throw new SchemaException("Attribute "+attrName+" not found in schema for account type "+getIntent()+", "+ObjectTypeUtil.toShortString(getResource(result))+" as definied in "+ObjectTypeUtil.toShortString(source), attrName); + throw new SchemaException("Attribute "+attrName+" not found in schema for account type "+getIntent()+", "+ObjectTypeUtil.toShortString(getResource(task, result))+" as definied in "+ObjectTypeUtil.toShortString(source), attrName); } Mapping,ResourceAttributeDefinition> mapping = mappingFactory.createMapping(outboundMappingType, "for attribute " + PrettyPrinter.prettyPrint(attrName) + " in "+source); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/EvaluatedAssignmentImpl.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/EvaluatedAssignmentImpl.java index 168278a6678..62b1b10af6c 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/EvaluatedAssignmentImpl.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/EvaluatedAssignmentImpl.java @@ -43,7 +43,6 @@ import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType; import com.evolveum.midpoint.xml.ns._public.common.common_3.FocusType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.PolicyConstraintsType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; import com.evolveum.midpoint.xml.ns._public.common.common_3.SystemConfigurationType; @@ -104,13 +103,13 @@ public DeltaSetTriple> getConstructions() { * * @return */ - public DeltaSetTriple getEvaluatedConstructions(OperationResult result) throws SchemaException, ObjectNotFoundException { + public DeltaSetTriple getEvaluatedConstructions(Task task, OperationResult result) throws SchemaException, ObjectNotFoundException { DeltaSetTriple rv = new DeltaSetTriple<>(); for (PlusMinusZero whichSet : PlusMinusZero.values()) { Collection> constructionSet = constructions.getSet(whichSet); if (constructionSet != null) { for (Construction construction : constructionSet) { - rv.addToSet(whichSet, new EvaluatedConstructionImpl(construction, result)); + rv.addToSet(whichSet, new EvaluatedConstructionImpl(construction, task, result)); } } } @@ -208,10 +207,10 @@ public void setForceRecon(boolean forceRecon) { this.forceRecon = forceRecon; } - public Collection getResources(OperationResult result) throws ObjectNotFoundException, SchemaException { + public Collection getResources(Task task, OperationResult result) throws ObjectNotFoundException, SchemaException { Collection resources = new ArrayList(); for (Construction acctConstr: constructions.getAllValues()) { - resources.add(acctConstr.getResource(result)); + resources.add(acctConstr.getResource(task, result)); } return resources; } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/EvaluatedConstructionImpl.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/EvaluatedConstructionImpl.java index 9a66f94e8f0..ea3ed906229 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/EvaluatedConstructionImpl.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/EvaluatedConstructionImpl.java @@ -19,6 +19,7 @@ import com.evolveum.midpoint.model.api.context.EvaluatedConstruction; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.schema.result.OperationResult; +import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.DebugUtil; import com.evolveum.midpoint.util.exception.ObjectNotFoundException; import com.evolveum.midpoint.util.exception.SchemaException; @@ -60,8 +61,8 @@ public void setDirectlyAssigned(boolean directlyAssigned) { this.directlyAssigned = directlyAssigned; } - public EvaluatedConstructionImpl(Construction construction, OperationResult result) throws SchemaException, ObjectNotFoundException { - resource = construction.getResource(result).asPrismObject(); + public EvaluatedConstructionImpl(Construction construction, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException { + resource = construction.getResource(task, result).asPrismObject(); kind = construction.getKind(); intent = construction.getIntent(); directlyAssigned = construction.getAssignmentPath() == null || construction.getAssignmentPath().size() == 1; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensUtil.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensUtil.java index 093cefbec75..8eb23ebfb13 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensUtil.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensUtil.java @@ -36,7 +36,6 @@ import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition; import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; import com.evolveum.midpoint.model.api.PolicyViolationException; -import com.evolveum.midpoint.model.api.context.SynchronizationPolicyDecision; import com.evolveum.midpoint.model.common.expression.Expression; import com.evolveum.midpoint.model.common.expression.ExpressionEvaluationContext; import com.evolveum.midpoint.model.common.expression.ExpressionFactory; @@ -61,12 +60,9 @@ import com.evolveum.midpoint.prism.delta.ReferenceDelta; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.util.PrismUtil; -import com.evolveum.midpoint.prism.xml.XmlTypeConverter; import com.evolveum.midpoint.provisioning.api.ProvisioningService; import com.evolveum.midpoint.repo.api.RepositoryService; -import com.evolveum.midpoint.schema.GetOperationOptions; import com.evolveum.midpoint.schema.ResourceShadowDiscriminator; -import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.constants.ExpressionConstants; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; @@ -98,11 +94,9 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.MetadataType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectPolicyConfigurationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectTemplateType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; import com.evolveum.midpoint.xml.ns._public.common.common_3.PasswordType; import com.evolveum.midpoint.xml.ns._public.common.common_3.PropertyConstraintType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceObjectTypeDefinitionType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceObjectTypeDependencyType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ScriptExpressionReturnTypeType; @@ -110,7 +104,6 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; import com.evolveum.midpoint.xml.ns._public.common.common_3.StringPolicyType; import com.evolveum.midpoint.xml.ns._public.common.common_3.SystemConfigurationType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.SystemObjectsType; import com.evolveum.midpoint.xml.ns._public.common.common_3.TimeIntervalStatusType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ValuePolicyType; import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; @@ -148,14 +141,14 @@ public static ResourceType getResource(LensContext con } public static ResourceType getResource(LensContext context, String resourceOid, ObjectResolver objectResolver, - OperationResult result) throws ObjectNotFoundException, + Task task, OperationResult result) throws ObjectNotFoundException, CommunicationException, SchemaException, ConfigurationException, SecurityViolationException { ResourceType resourceType = context.getResource(resourceOid); if (resourceType == null) { ObjectReferenceType ref = new ObjectReferenceType(); ref.setType(ResourceType.COMPLEX_TYPE); ref.setOid(resourceOid); - resourceType = objectResolver.resolve(ref, ResourceType.class, null, "resource fetch in lens", result); + resourceType = objectResolver.resolve(ref, ResourceType.class, null, "resource fetch in lens", task, result); context.rememberResource(resourceType); } return resourceType; @@ -613,7 +606,7 @@ public static void evaluateScript( ModelExpressionThreadLocalHolder.pushCurrentResult(parentResult); ModelExpressionThreadLocalHolder.pushCurrentTask(task); try { - scriptExpression.evaluate(variables, ScriptExpressionReturnTypeType.SCALAR, false, shortDesc, parentResult); + scriptExpression.evaluate(variables, ScriptExpressionReturnTypeType.SCALAR, false, shortDesc, task, parentResult); } finally { ModelExpressionThreadLocalHolder.popLensContext(); ModelExpressionThreadLocalHolder.popCurrentResult(); @@ -846,7 +839,7 @@ public static String formatIterationToken(LensContext } PrismPropertyDefinition outputDefinition = new PrismPropertyDefinition(ExpressionConstants.VAR_ITERATION_TOKEN, DOMUtil.XSD_STRING, context.getPrismContext()); - Expression,PrismPropertyDefinition> expression = expressionFactory.makeExpression(tokenExpressionType, outputDefinition , "iteration token expression in "+accountContext.getHumanReadableName(), result); + Expression,PrismPropertyDefinition> expression = expressionFactory.makeExpression(tokenExpressionType, outputDefinition , "iteration token expression in "+accountContext.getHumanReadableName(), task, result); Collection> sources = new ArrayList<>(); PrismPropertyDefinition inputDefinition = new PrismPropertyDefinition(ExpressionConstants.VAR_ITERATION, @@ -904,7 +897,7 @@ public static boolean evaluateIterationCondition(LensCont } PrismPropertyDefinition outputDefinition = new PrismPropertyDefinition(ExpressionConstants.OUTPUT_ELMENT_NAME, DOMUtil.XSD_BOOLEAN, context.getPrismContext()); - Expression,PrismPropertyDefinition> expression = expressionFactory.makeExpression(expressionType, outputDefinition , desc, result); + Expression,PrismPropertyDefinition> expression = expressionFactory.makeExpression(expressionType, outputDefinition , desc, task, result); variables.addVariableDefinition(ExpressionConstants.VAR_ITERATION, iteration); variables.addVariableDefinition(ExpressionConstants.VAR_ITERATION_TOKEN, iterationToken); @@ -939,7 +932,7 @@ public static boolean isValid(AssignmentType assignmentType, XMLGregorianCalenda public static Mapping createFocusMapping(final MappingFactory mappingFactory, final LensContext context, final MappingType mappingType, ObjectType originObject, ObjectDeltaObject focusOdo, AssignmentPathVariables assignmentPathVariables, PrismObject configuration, - XMLGregorianCalendar now, String contextDesc, OperationResult result) throws SchemaException, ExpressionEvaluationException, ObjectNotFoundException { + XMLGregorianCalendar now, String contextDesc, Task task, OperationResult result) throws SchemaException, ExpressionEvaluationException, ObjectNotFoundException { Integer iteration = null; String iterationToken = null; if (focusOdo.getNewObject() != null) { @@ -952,14 +945,14 @@ public static boolean isValid(AssignmentType assignmentType, XMLGregorianCalenda iterationToken = focusOldType.getIterationToken(); } return createFocusMapping(mappingFactory, context, mappingType, originObject, focusOdo, assignmentPathVariables, - iteration, iterationToken, configuration, now, contextDesc, result); + iteration, iterationToken, configuration, now, contextDesc, task, result); } public static Mapping createFocusMapping(final MappingFactory mappingFactory, final LensContext context, final MappingType mappingType, ObjectType originObject, ObjectDeltaObject focusOdo, AssignmentPathVariables assignmentPathVariables, Integer iteration, String iterationToken, PrismObject configuration, - XMLGregorianCalendar now, String contextDesc, OperationResult result) throws SchemaException, ExpressionEvaluationException, ObjectNotFoundException { + XMLGregorianCalendar now, String contextDesc, final Task task, OperationResult result) throws SchemaException, ExpressionEvaluationException, ObjectNotFoundException { Mapping mapping = mappingFactory.createMapping(mappingType, contextDesc); if (!mapping.isApplicableToChannel(context.getChannel())) { @@ -1027,7 +1020,7 @@ public StringPolicyType resolve() { ObjectReferenceType ref = ((GenerateExpressionEvaluatorType) object).getValuePolicyRef(); try{ ValuePolicyType valuePolicyType = mappingFactory.getObjectResolver().resolve(ref, ValuePolicyType.class, - null, "resolving value policy for generate attribute "+ outputDefinition.getName()+" value", new OperationResult("Resolving value policy")); + null, "resolving value policy for generate attribute "+ outputDefinition.getName()+" value", task, new OperationResult("Resolving value policy")); if (valuePolicyType != null){ return valuePolicyType.getStringPolicy(); } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/AssignmentProcessor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/AssignmentProcessor.java index 36a774c7fe2..8963bfc79fd 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/AssignmentProcessor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/AssignmentProcessor.java @@ -21,7 +21,6 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; -import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; @@ -45,8 +44,6 @@ import com.evolveum.midpoint.model.common.mapping.MappingFactory; import com.evolveum.midpoint.model.impl.controller.ModelUtils; import com.evolveum.midpoint.model.impl.lens.AssignmentEvaluator; -import com.evolveum.midpoint.model.impl.lens.AssignmentPath; -import com.evolveum.midpoint.model.impl.lens.AssignmentPathSegment; import com.evolveum.midpoint.model.impl.lens.Construction; import com.evolveum.midpoint.model.impl.lens.ConstructionPack; import com.evolveum.midpoint.model.impl.lens.EvaluatedAbstractRoleImpl; @@ -56,7 +53,6 @@ import com.evolveum.midpoint.model.impl.lens.LensFocusContext; import com.evolveum.midpoint.model.impl.lens.LensProjectionContext; import com.evolveum.midpoint.model.impl.lens.LensUtil; -import com.evolveum.midpoint.prism.Containerable; import com.evolveum.midpoint.prism.ItemDefinition; import com.evolveum.midpoint.prism.Objectable; import com.evolveum.midpoint.prism.PrismContainer; @@ -115,7 +111,6 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.PolicyConstraintEnforcementType; import com.evolveum.midpoint.xml.ns._public.common.common_3.PolicyConstraintsType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowAssociationType; 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.UserType; @@ -555,7 +550,7 @@ private void processAssignmentsProjectionsWithFocus(LensCo // because there may be interaction from focusMappings of some roles to outbound mappings of other roles. // Now we have complete focus with all the focusMappings so we can evaluate the constructions evaluateConstructions(context, evaluatedAssignmentTriple, task, result); - collectToConstructionMaps(context, evaluatedAssignmentTriple, constructionMapTriple, result); + collectToConstructionMaps(context, evaluatedAssignmentTriple, constructionMapTriple, task, result); if (LOGGER.isTraceEnabled()) { // Dump the maps @@ -921,35 +916,35 @@ private void evaluateConstructions(LensContext context, private void collectToConstructionMaps(LensContext context, DeltaSetTriple> evaluatedAssignmentTriple, - DeltaMapTriple constructionMapTriple, + DeltaMapTriple constructionMapTriple, Task task, OperationResult result) throws ObjectNotFoundException, SchemaException, CommunicationException, ConfigurationException, SecurityViolationException { - collectToConstructionMapFromEvaluatedAssignments(context, evaluatedAssignmentTriple.getZeroSet(), constructionMapTriple, PlusMinusZero.ZERO, result); - collectToConstructionMapFromEvaluatedAssignments(context, evaluatedAssignmentTriple.getPlusSet(), constructionMapTriple, PlusMinusZero.PLUS, result); - collectToConstructionMapFromEvaluatedAssignments(context, evaluatedAssignmentTriple.getMinusSet(), constructionMapTriple, PlusMinusZero.MINUS, result); + collectToConstructionMapFromEvaluatedAssignments(context, evaluatedAssignmentTriple.getZeroSet(), constructionMapTriple, PlusMinusZero.ZERO, task, result); + collectToConstructionMapFromEvaluatedAssignments(context, evaluatedAssignmentTriple.getPlusSet(), constructionMapTriple, PlusMinusZero.PLUS, task, result); + collectToConstructionMapFromEvaluatedAssignments(context, evaluatedAssignmentTriple.getMinusSet(), constructionMapTriple, PlusMinusZero.MINUS, task, result); } private void collectToConstructionMapFromEvaluatedAssignments(LensContext context, Collection> evaluatedAssignments, - DeltaMapTriple constructionMapTriple, PlusMinusZero mode, + DeltaMapTriple constructionMapTriple, PlusMinusZero mode, Task task, OperationResult result) throws ObjectNotFoundException, SchemaException, CommunicationException, ConfigurationException, SecurityViolationException { for (EvaluatedAssignmentImpl evaluatedAssignment: evaluatedAssignments) { if (LOGGER.isTraceEnabled()) { LOGGER.trace("Collecting constructions from evaluated assignment:\n{}", evaluatedAssignment.debugDump()); } DeltaSetTriple> constructionTriple = evaluatedAssignment.getConstructions(); - collectToConstructionMapFromEvaluatedConstructions(context, evaluatedAssignment, constructionTriple.getZeroSet(), constructionMapTriple, mode, PlusMinusZero.ZERO, result); - collectToConstructionMapFromEvaluatedConstructions(context, evaluatedAssignment, constructionTriple.getPlusSet(), constructionMapTriple, mode, PlusMinusZero.PLUS, result); - collectToConstructionMapFromEvaluatedConstructions(context, evaluatedAssignment, constructionTriple.getMinusSet(), constructionMapTriple, mode, PlusMinusZero.MINUS, result); + collectToConstructionMapFromEvaluatedConstructions(context, evaluatedAssignment, constructionTriple.getZeroSet(), constructionMapTriple, mode, PlusMinusZero.ZERO, task, result); + collectToConstructionMapFromEvaluatedConstructions(context, evaluatedAssignment, constructionTriple.getPlusSet(), constructionMapTriple, mode, PlusMinusZero.PLUS, task, result); + collectToConstructionMapFromEvaluatedConstructions(context, evaluatedAssignment, constructionTriple.getMinusSet(), constructionMapTriple, mode, PlusMinusZero.MINUS, task, result); } } private void collectToConstructionMapFromEvaluatedConstructions(LensContext context, - EvaluatedAssignmentImpl evaluatedAssignment, - Collection> evaluatedConstructions, - DeltaMapTriple constructionMapTriple, - PlusMinusZero mode1, PlusMinusZero mode2, - OperationResult result) throws ObjectNotFoundException, SchemaException, CommunicationException, ConfigurationException, SecurityViolationException { + EvaluatedAssignmentImpl evaluatedAssignment, + Collection> evaluatedConstructions, + DeltaMapTriple constructionMapTriple, + PlusMinusZero mode1, PlusMinusZero mode2, + Task task, OperationResult result) throws ObjectNotFoundException, SchemaException, CommunicationException, ConfigurationException, SecurityViolationException { for (Construction construction : evaluatedConstructions) { @@ -959,7 +954,7 @@ private void collectToConstructionMapFromEvaluatedConstruc continue; } - String resourceOid = construction.getResource(result).getOid(); + String resourceOid = construction.getResource(task, result).getOid(); String intent = construction.getIntent(); ShadowKindType kind = construction.getKind(); ResourceType resource = LensUtil.getResource(context, resourceOid, provisioningService, result); @@ -1014,7 +1009,7 @@ private EvaluatedAssignmentImpl evaluateAssignment(Item // Evaluate assignment. This follows to the assignment targets, follows to the inducements, // evaluates all the expressions, etc. EvaluatedAssignmentImpl evaluatedAssignment = assignmentEvaluator.evaluate(assignmentIdi, evaluateOld, source, assignmentPlacementDesc, task, result); - context.rememberResources(evaluatedAssignment.getResources(result)); + context.rememberResources(evaluatedAssignment.getResources(task, result)); result.recordSuccess(); return evaluatedAssignment; } catch (ObjectNotFoundException ex) { diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/CredentialsProcessor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/CredentialsProcessor.java index 09971121097..6308f03f001 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/CredentialsProcessor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/CredentialsProcessor.java @@ -111,7 +111,7 @@ private void processFocusPassword(LensContext context, processFocusCredentialsCommon(context, new ItemPath(UserType.F_CREDENTIALS, CredentialsType.F_PASSWORD), now, task, result); - passwordPolicyProcessor.processPasswordPolicy(focusContext, context, result); + passwordPolicyProcessor.processPasswordPolicy(focusContext, context, task, result); } public void processProjectionCredentials(LensContext context, LensProjectionContext projectionContext, @@ -122,7 +122,7 @@ public void processProjectionCredentials(LensContext c processProjectionPassword((LensContext)context, projectionContext, now, task, result); } - passwordPolicyProcessor.processPasswordPolicy(projectionContext, context, result); + passwordPolicyProcessor.processPasswordPolicy(projectionContext, context, task, result); } private void processProjectionPassword(LensContext context, diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/MappingEvaluationHelper.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/MappingEvaluationHelper.java index 758dc23115f..4f3eae5d2a1 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/MappingEvaluationHelper.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/MappingEvaluationHelper.java @@ -18,27 +18,20 @@ import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; -import java.util.HashSet; -import java.util.List; import java.util.Map; import java.util.Map.Entry; -import java.util.Set; import javax.xml.datatype.DatatypeConstants; import javax.xml.datatype.XMLGregorianCalendar; -import org.apache.commons.lang.mutable.MutableBoolean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.evolveum.midpoint.model.common.mapping.Mapping; import com.evolveum.midpoint.model.common.mapping.MappingFactory; -import com.evolveum.midpoint.model.impl.lens.LensContext; import com.evolveum.midpoint.model.impl.lens.LensElementContext; -import com.evolveum.midpoint.model.impl.lens.LensProjectionContext; import com.evolveum.midpoint.model.impl.lens.LensUtil; import com.evolveum.midpoint.model.impl.trigger.RecomputeTriggerHandler; -import com.evolveum.midpoint.prism.Containerable; import com.evolveum.midpoint.prism.Item; import com.evolveum.midpoint.prism.ItemDefinition; import com.evolveum.midpoint.prism.PrismContainerDefinition; @@ -46,19 +39,13 @@ import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismObjectDefinition; -import com.evolveum.midpoint.prism.PrismPropertyValue; import com.evolveum.midpoint.prism.PrismValue; import com.evolveum.midpoint.prism.delta.ContainerDelta; import com.evolveum.midpoint.prism.delta.ItemDelta; -import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.delta.PrismValueDeltaSetTriple; -import com.evolveum.midpoint.prism.delta.PropertyDelta; import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.schema.constants.ExpressionConstants; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.task.api.Task; -import com.evolveum.midpoint.util.Handler; -import com.evolveum.midpoint.util.PrettyPrinter; import com.evolveum.midpoint.util.exception.ExpressionEvaluationException; import com.evolveum.midpoint.util.exception.ObjectNotFoundException; import com.evolveum.midpoint.util.exception.SchemaException; @@ -68,7 +55,6 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.MappingStrengthType; import com.evolveum.midpoint.xml.ns._public.common.common_3.MappingType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; import com.evolveum.midpoint.xml.ns._public.common.common_3.TriggerType; /** @@ -136,7 +122,7 @@ public collectItemDefinitionsFr PrismObject includeObject = includeRef.asReferenceValue().getObject(); if (includeObject == null) { ObjectTemplateType includeObjectType = modelObjectResolver.resolve(includeRef, ObjectTemplateType.class, - null, "include reference in "+objectTemplateType + " in " + contextDesc, result); + null, "include reference in "+objectTemplateType + " in " + contextDesc, task, result); includeObject = includeObjectType.asPrismObject(); // Store resolved object for future use (e.g. next waves). includeRef.asReferenceValue().setObject(includeObject); @@ -296,7 +294,7 @@ private XMLGregorianCalendar collectTripleFromTemplate(Len PrismObject includeObject = includeRef.asReferenceValue().getObject(); if (includeObject == null) { ObjectTemplateType includeObjectType = modelObjectResolver.resolve(includeRef, ObjectTemplateType.class, - null, "include reference in "+objectTemplateType + " in " + contextDesc, result); + null, "include reference in "+objectTemplateType + " in " + contextDesc, task, result); includeObject = includeObjectType.asPrismObject(); // Store resolved object for future use (e.g. next waves). includeRef.asReferenceValue().setObject(includeObject); @@ -362,12 +360,12 @@ private XM continue; } Mapping mapping = LensUtil.createFocusMapping(mappingFactory, context, mappingType, objectTemplateType, userOdo, - null, iteration, iterationToken, context.getSystemConfiguration(), now, contextDesc, result); + null, iteration, iterationToken, context.getSystemConfiguration(), now, contextDesc, task, result); if (mapping == null) { continue; } - Boolean timeConstraintValid = mapping.evaluateTimeConstraintValid(result); + Boolean timeConstraintValid = mapping.evaluateTimeConstraintValid(task, result); if (timeConstraintValid != null && !timeConstraintValid) { // Delayed mapping. Just schedule recompute time diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/OutboundProcessor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/OutboundProcessor.java index 6cf4529559e..b3d54ecdcbe 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/OutboundProcessor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/OutboundProcessor.java @@ -31,21 +31,16 @@ import com.evolveum.midpoint.model.common.expression.StringPolicyResolver; import com.evolveum.midpoint.model.common.mapping.Mapping; import com.evolveum.midpoint.model.common.mapping.MappingFactory; -import com.evolveum.midpoint.model.common.mapping.PrismValueDeltaSetTripleProducer; import com.evolveum.midpoint.model.impl.lens.Construction; import com.evolveum.midpoint.model.impl.lens.LensContext; -import com.evolveum.midpoint.model.impl.lens.LensFocusContext; import com.evolveum.midpoint.model.impl.lens.LensProjectionContext; import com.evolveum.midpoint.model.impl.lens.LensUtil; -import com.evolveum.midpoint.model.impl.util.Utils; -import com.evolveum.midpoint.prism.Containerable; import com.evolveum.midpoint.prism.ItemDefinition; import com.evolveum.midpoint.prism.OriginType; import com.evolveum.midpoint.prism.PrismContainerDefinition; import com.evolveum.midpoint.prism.PrismContainerValue; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObjectDefinition; -import com.evolveum.midpoint.prism.PrismPropertyDefinition; import com.evolveum.midpoint.prism.PrismPropertyValue; import com.evolveum.midpoint.prism.PrismValue; import com.evolveum.midpoint.prism.delta.ChangeType; @@ -54,7 +49,6 @@ import com.evolveum.midpoint.schema.ResourceShadowDiscriminator; import com.evolveum.midpoint.schema.constants.ExpressionConstants; import com.evolveum.midpoint.schema.result.OperationResult; -import com.evolveum.midpoint.schema.util.ObjectTypeUtil; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.PrettyPrinter; import com.evolveum.midpoint.util.exception.ExpressionEvaluationException; @@ -69,8 +63,6 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.MappingStrengthType; import com.evolveum.midpoint.xml.ns._public.common.common_3.MappingType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceObjectAssociationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowAssociationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; import com.evolveum.midpoint.xml.ns._public.common.common_3.StringPolicyType; @@ -189,7 +181,7 @@ public void processOutbound(LensContext context, LensPr private Mapping evaluateMapping(final Mapping mapping, QName mappingQName, D targetDefinition, ObjectDeltaObject focusOdo, ObjectDeltaObject projectionOdo, String operation, RefinedObjectClassDefinition rOcDef, RefinedObjectClassDefinition assocTargetObjectClassDefinition, - LensContext context, LensProjectionContext projCtx, Task task, OperationResult result) + LensContext context, LensProjectionContext projCtx, final Task task, OperationResult result) throws ExpressionEvaluationException, ObjectNotFoundException, SchemaException { if (!mapping.isApplicableToChannel(context.getChannel())) { LOGGER.trace("Skipping outbound mapping for {} because the channel does not match", mappingQName); @@ -251,7 +243,7 @@ public StringPolicyType resolve() { ObjectReferenceType ref = ((GenerateExpressionEvaluatorType) object).getValuePolicyRef(); try{ ValuePolicyType valuePolicyType = mappingFactory.getObjectResolver().resolve(ref, ValuePolicyType.class, - null, "resolving value policy for generate attribute "+ outputDefinition.getName()+"value", new OperationResult("Resolving value policy")); + null, "resolving value policy for generate attribute "+ outputDefinition.getName()+"value", task, new OperationResult("Resolving value policy")); if (valuePolicyType != null){ return valuePolicyType.getStringPolicy(); } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/PasswordPolicyProcessor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/PasswordPolicyProcessor.java index 8e939ce5e74..d470cf5c55f 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/PasswordPolicyProcessor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/PasswordPolicyProcessor.java @@ -19,6 +19,7 @@ import java.util.ArrayList; import java.util.List; +import com.evolveum.midpoint.task.api.Task; import com.evolveum.prism.xml.ns._public.types_3.ProtectedStringType; import org.springframework.beans.factory.annotation.Autowired; @@ -26,14 +27,11 @@ import com.evolveum.midpoint.common.policy.PasswordPolicyUtils; import com.evolveum.midpoint.model.api.PolicyViolationException; -import com.evolveum.midpoint.model.api.context.ModelState; import com.evolveum.midpoint.model.impl.ModelObjectResolver; import com.evolveum.midpoint.model.impl.lens.LensContext; import com.evolveum.midpoint.model.impl.lens.LensFocusContext; import com.evolveum.midpoint.model.impl.lens.LensObjectDeltaOperation; import com.evolveum.midpoint.model.impl.lens.LensProjectionContext; -import com.evolveum.midpoint.model.impl.lens.LensUtil; -import com.evolveum.midpoint.prism.PrismContainer; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismProperty; import com.evolveum.midpoint.prism.PrismReference; @@ -51,7 +49,6 @@ import com.evolveum.midpoint.util.exception.SystemException; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; -import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType; import com.evolveum.midpoint.xml.ns._public.common.common_3.FocusType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; @@ -92,7 +89,7 @@ void processPasswordPolicy(ValuePolicyType passwordPolicy, PrismProperty passwor } void processPasswordPolicy(LensFocusContext focusContext, - LensContext context, OperationResult result) + LensContext context, Task task, OperationResult result) throws PolicyViolationException, SchemaException { if (!UserType.class.isAssignableFrom(focusContext.getObjectTypeClass())) { @@ -150,7 +147,7 @@ void processPasswordPolicy(LensFocusContext focusContex ValuePolicyType passwordPolicy; if (focusContext.getOrgPasswordPolicy() == null){ - passwordPolicy = determineValuePolicy(userDelta, focusContext.getObjectAny(), context, result); + passwordPolicy = determineValuePolicy(userDelta, focusContext.getObjectAny(), context, task, result); focusContext.setOrgPasswordPolicy(passwordPolicy); } else { passwordPolicy = focusContext.getOrgPasswordPolicy(); @@ -175,13 +172,13 @@ private boolean wasExecuted(ObjectDelta userDelt } //TODO: maybe some caching of orgs????? - private ValuePolicyType determineValuePolicy(ObjectDelta userDelta, PrismObject object, LensContext context, OperationResult result) throws SchemaException{ + private ValuePolicyType determineValuePolicy(ObjectDelta userDelta, PrismObject object, LensContext context, Task task, OperationResult result) throws SchemaException{ //check the modification of organization first - ValuePolicyType valuePolicy = determineValuePolicy(userDelta, result); + ValuePolicyType valuePolicy = determineValuePolicy(userDelta, task, result); //if null, check the existing organization if (valuePolicy == null){ - valuePolicy = determineValuePolicy(object, result); + valuePolicy = determineValuePolicy(object, task, result); } //if still null, just use global policy @@ -196,7 +193,7 @@ private ValuePolicyType determineVa return valuePolicy; } - private ValuePolicyType determineValuePolicy(ObjectDelta userDelta, OperationResult result) + private ValuePolicyType determineValuePolicy(ObjectDelta userDelta, Task task, OperationResult result) throws SchemaException { ReferenceDelta orgDelta = userDelta.findReferenceModification(UserType.F_PARENT_ORG_REF); ValuePolicyType passwordPolicy = null; @@ -212,12 +209,12 @@ private ValuePolicyType determineValuePolicy(ObjectDelta userDelta, Op if (ref != null) { LOGGER.trace("Org {} has specified password policy.", orgType); passwordPolicy = resolver.resolve(ref, ValuePolicyType.class, null, - "resolving password policy for organization", result); + "resolving password policy for organization", task, result); LOGGER.trace("Resolved password policy {}", passwordPolicy); } if (passwordPolicy == null) { - passwordPolicy = determineValuePolicy(org, result); + passwordPolicy = determineValuePolicy(org, task, result); } } catch (ObjectNotFoundException e) { @@ -229,7 +226,7 @@ private ValuePolicyType determineValuePolicy(ObjectDelta userDelta, Op return passwordPolicy; } - private ValuePolicyType determineValuePolicy(PrismObject object, OperationResult result) + private ValuePolicyType determineValuePolicy(PrismObject object, Task task, OperationResult result) throws SchemaException { LOGGER.trace("Determining password policies from object", object); PrismReference orgRef = object.findReference(ObjectType.F_PARENT_ORG_REF); @@ -251,7 +248,7 @@ private ValuePolicyType determineValuePolicy(PrismObject object, OperationResult PrismObject org = resolver.resolve(orgRefValue, "resolving parent org ref", null, null, result); orgs.add(org); - valuePolicy = resolvePolicy(org, result); + valuePolicy = resolvePolicy(org, task, result); } } @@ -261,7 +258,7 @@ private ValuePolicyType determineValuePolicy(PrismObject object, OperationResult // go deeper if (valuePolicy == null) { for (PrismObject orgType : orgs) { - valuePolicy = determineValuePolicy(orgType, result); + valuePolicy = determineValuePolicy(orgType, task, result); if (valuePolicy != null){ return valuePolicy; } @@ -270,7 +267,7 @@ private ValuePolicyType determineValuePolicy(PrismObject object, OperationResult return valuePolicy; } - private ValuePolicyType resolvePolicy(PrismObject org, OperationResult result) + private ValuePolicyType resolvePolicy(PrismObject org, Task task, OperationResult result) throws SchemaException { try { OrgType orgType = org.asObjectable(); @@ -280,7 +277,7 @@ private ValuePolicyType resolvePolicy(PrismObject org, OperationResult } return resolver.resolve(ref, ValuePolicyType.class, null, - "resolving password policy for organization", result); + "resolving password policy for organization", task, result); } catch (ObjectNotFoundException e) { // TODO Auto-generated catch block @@ -291,7 +288,7 @@ private ValuePolicyType resolvePolicy(PrismObject org, OperationResult } void processPasswordPolicy(LensProjectionContext projectionContext, - LensContext context, OperationResult result) throws SchemaException, PolicyViolationException{ + LensContext context, Task task, OperationResult result) throws SchemaException, PolicyViolationException{ ObjectDelta accountDelta = projectionContext.getDelta(); @@ -333,7 +330,7 @@ void processPasswordPolicy(LensProjectionContext projecti // PrismProperty password = getPassword(projectionContext); ValuePolicyType passwordPolicy = null; if (isCheckOrgPolicy(context)){ - passwordPolicy = determineValuePolicy(context.getFocusContext().getObjectAny(), result); + passwordPolicy = determineValuePolicy(context.getFocusContext().getObjectAny(), task, result); context.getFocusContext().setOrgPasswordPolicy(passwordPolicy); } else { passwordPolicy = projectionContext.getEffectivePasswordPolicy(); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ProjectionValuesProcessor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ProjectionValuesProcessor.java index c2cc0b47806..21cf29efa07 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ProjectionValuesProcessor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ProjectionValuesProcessor.java @@ -283,7 +283,7 @@ private void processProjections(LensContext context, checker.setPrismContext(prismContext); checker.setContext(context); checker.setProvisioningService(provisioningService); - checker.check(result); + checker.check(task, result); if (checker.isSatisfiesConstraints()) { LOGGER.trace("Current shadow satisfies uniqueness constraints. Iteration {}, token '{}'", iteration, iterationToken); conflict = false; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ShadowConstraintsChecker.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ShadowConstraintsChecker.java index 16fe52b448d..7be23721bd9 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ShadowConstraintsChecker.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ShadowConstraintsChecker.java @@ -27,6 +27,7 @@ import com.evolveum.midpoint.provisioning.api.ConstraintsCheckingResult; import com.evolveum.midpoint.provisioning.api.ProvisioningService; import com.evolveum.midpoint.schema.result.OperationResult; +import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.exception.CommunicationException; import com.evolveum.midpoint.util.exception.ConfigurationException; import com.evolveum.midpoint.util.exception.ObjectAlreadyExistsException; @@ -103,7 +104,7 @@ public PrismObject getConflictingShadow() { return constraintsCheckingResult.getConflictingShadow(); } - public void check(OperationResult result) throws SchemaException, ObjectAlreadyExistsException, ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException { + public void check(Task task, OperationResult result) throws SchemaException, ObjectAlreadyExistsException, ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException { RefinedObjectClassDefinition projDef = projectionContext.getStructuralObjectClassDefinition(); PrismObject projectionNew = projectionContext.getObjectNew(); @@ -141,7 +142,7 @@ public boolean confirmViolation(String oid) { constraintsCheckingResult = provisioningService.checkConstraints(projDef, projectionNew, projectionContext.getResource(), projectionContext.getOid(), projectionContext.getResourceShadowDiscriminator(), - confirmer, result); + confirmer, task, result); if (constraintsCheckingResult.isSatisfiesConstraints()) { satisfiesConstraints = true; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/CorrelationConfirmationEvaluator.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/CorrelationConfirmationEvaluator.java index 8e705c1a620..0abee1a4a52 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/CorrelationConfirmationEvaluator.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/CorrelationConfirmationEvaluator.java @@ -24,7 +24,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; -import org.w3c.dom.Element; import com.evolveum.midpoint.model.common.expression.Expression; import com.evolveum.midpoint.model.common.expression.ExpressionEvaluationContext; @@ -383,7 +382,7 @@ public boolean evaluateConfirmationExpression(Class foc PrismPropertyDefinition outputDefinition = new PrismPropertyDefinition<>(ExpressionConstants.OUTPUT_ELMENT_NAME, DOMUtil.XSD_BOOLEAN, prismContext); Expression,PrismPropertyDefinition> expression = expressionFactory.makeExpression(expressionType, - outputDefinition, shortDesc, result); + outputDefinition, shortDesc, task, result); ExpressionEvaluationContext params = new ExpressionEvaluationContext(null, variables, shortDesc, task, result); PrismValueDeltaSetTriple> outputTriple = expression.evaluate(params); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/ReconciliationTaskHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/ReconciliationTaskHandler.java index 3d569c094a7..b9300277bb7 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/ReconciliationTaskHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/ReconciliationTaskHandler.java @@ -157,7 +157,15 @@ private void initialize() { @Override public TaskRunResult run(Task coordinatorTask) { LOGGER.trace("ReconciliationTaskHandler.run starting"); + TaskHandlerUtil.initAllStatistics(coordinatorTask); + try { + return runInternal(coordinatorTask); + } finally { + TaskHandlerUtil.storeAllStatistics(coordinatorTask); + } + } + public TaskRunResult runInternal(Task coordinatorTask) { ReconciliationTaskResult reconResult = new ReconciliationTaskResult(); OperationResult opResult = new OperationResult(OperationConstants.RECONCILIATION); @@ -260,7 +268,6 @@ public TaskRunResult run(Task coordinatorTask) { processErrorPartial(runResult, "Security violation", ex, TaskRunResultStatus.PERMANENT_ERROR, resource, coordinatorTask, opResult); } - long beforeResourceReconTimestamp = clock.currentTimeMillis(); long afterResourceReconTimestamp; long afterShadowReconTimestamp; @@ -448,7 +455,7 @@ private boolean performResourceReconciliation(PrismObject resource boolean interrupted; - OperationResult opResult = result.createSubresult(OperationConstants.RECONCILIATION+".ResourceReconciliation"); + OperationResult opResult = result.createSubresult(OperationConstants.RECONCILIATION+".resourceReconciliation"); // Instantiate result handler. This will be called with every search // result in the following iterative search @@ -457,6 +464,8 @@ private boolean performResourceReconciliation(PrismObject resource handler.setSourceChannel(SchemaConstants.CHANGE_CHANNEL_RECON); handler.setStopOnError(false); + coordinatorTask.setExpectedTotal(null); + try { ObjectQuery query = createObjectclassSearchQuery(resource, objectclassDef); @@ -464,7 +473,7 @@ private boolean performResourceReconciliation(PrismObject resource OperationResult searchResult = new OperationResult(OperationConstants.RECONCILIATION+".searchIterative"); handler.createWorkerThreads(coordinatorTask, searchResult); - provisioningService.searchObjectsIterative(ShadowType.class, query, null, handler, searchResult); // note that progress is incremented within the handler, as it extends AbstractSearchIterativeResultHandler + provisioningService.searchObjectsIterative(ShadowType.class, query, null, handler, coordinatorTask, searchResult); // note that progress is incremented within the handler, as it extends AbstractSearchIterativeResultHandler handler.completeProcessing(searchResult); interrupted = !coordinatorTask.canRun(); @@ -473,10 +482,10 @@ private boolean performResourceReconciliation(PrismObject resource String message = "Processed " + handler.getProgress() + " account(s), got " + handler.getErrors() + " error(s)"; if (interrupted) { - message += "; was interrupted during processing."; + message += "; was interrupted during processing"; } if (handler.getProgress() > 0) { - message += " Average time for one object: " + handler.getAverageTime() + " ms (wall clock time average: " + handler.getWallAverageTime() + " ms)."; + message += ". Average time for one object: " + handler.getAverageTime() + " ms (wall clock time average: " + handler.getWallAverageTime() + " ms)."; } OperationResultStatus resultStatus = OperationResultStatus.SUCCESS; @@ -531,6 +540,8 @@ private boolean performShadowReconciliation(final PrismObject reso if (LOGGER.isTraceEnabled()) { LOGGER.trace("Shadow recon query:\n{}", query.debugDump()); } + + long started = System.currentTimeMillis(); final Holder countHolder = new Holder(0L); @@ -549,6 +560,7 @@ public boolean handle(PrismObject shadow) { return task.canRun(); } }; + Utils.searchIterative(repositoryService, ShadowType.class, query, handler , BLOCK_SIZE, opResult); interrupted = !task.canRun(); @@ -562,8 +574,9 @@ public boolean handle(PrismObject shadow) { reconResult.setShadowReconCount(countHolder.getValue()); result.createSubresult(OperationConstants.RECONCILIATION+".shadowReconciliation.statistics") - .recordStatus(OperationResultStatus.SUCCESS, "Processed " + countHolder.getValue() + " shadow(s)" - + (interrupted ? "; was interrupted during processing" : "")); + .recordStatus(OperationResultStatus.SUCCESS, "Processed " + countHolder.getValue() + " shadow(s) in " + + (System.currentTimeMillis() - started) + " ms." + + (interrupted ? " Was interrupted during processing." : "")); return !interrupted; } @@ -633,10 +646,9 @@ private boolean scanForUnfinishedOperations(Task task, String resourceOid, Recon ObjectAlreadyExistsException, CommunicationException, ObjectNotFoundException, ConfigurationException, SecurityViolationException { LOGGER.trace("Scan for unfinished operations starting"); - OperationResult opResult = result.createSubresult(OperationConstants.RECONCILIATION+".RepoReconciliation"); + OperationResult opResult = result.createSubresult(OperationConstants.RECONCILIATION+".repoReconciliation"); opResult.addParam("reconciled", true); - NotFilter notNull = NotFilter.createNot(createFailedOpFilter(null)); AndFilter andFilter = AndFilter.createAnd(notNull, RefFilter.createReferenceEqual(ShadowType.F_RESOURCE_REF, ShadowType.class, prismContext, resourceOid)); @@ -645,10 +657,19 @@ private boolean scanForUnfinishedOperations(Task task, String resourceOid, Recon List> shadows = repositoryService.searchObjects( ShadowType.class, query, null, opResult); + task.setExpectedTotal((long) shadows.size()); // for this phase, obviously + LOGGER.trace("Found {} accounts that were not successfully processed.", shadows.size()); reconResult.setUnOpsCount(shadows.size()); + + long startedAll = System.currentTimeMillis(); + int processedSuccess = 0, processedFailure = 0; for (PrismObject shadow : shadows) { + + long started = System.currentTimeMillis(); + task.recordIterativeOperationStart(shadow.asObjectable()); + OperationResult provisioningResult = new OperationResult(OperationConstants.RECONCILIATION+".finishOperation"); try { RepositoryCache.enter(); @@ -657,7 +678,12 @@ private boolean scanForUnfinishedOperations(Task task, String resourceOid, Recon Utils.clearRequestee(task); provisioningService.finishOperation(shadow, options, task, provisioningResult); // retryFailedOperation(shadow.asObjectable(), opResult); - } catch (Exception ex) { + + task.recordIterativeOperationEnd(shadow.asObjectable(), started, null); + processedSuccess++; + } catch (Throwable ex) { + task.recordIterativeOperationEnd(shadow.asObjectable(), started, ex); + processedFailure++; opResult.recordFatalError("Failed to finish operation with shadow: " + ObjectTypeUtil.toShortString(shadow.asObjectable()) +". Reason: " + ex.getMessage(), ex); Collection modifications = PropertyDelta .createModificationReplacePropertyCollection(ShadowType.F_ATTEMPT_NUMBER, @@ -672,19 +698,26 @@ private boolean scanForUnfinishedOperations(Task task, String resourceOid, Recon RepositoryCache.exit(); } + // TODO record statistics as well incrementAndRecordProgress(task, opResult); if (!task.canRun()) { - return false; + break; } } // for each try the operation again - + + String message = "Processing unfinished operations done. Out of " + shadows.size() + " objects, " + + processedSuccess + " were processed successfully and processing of " + processedFailure + " resulted in failure. " + + "Total time spent: " + (System.currentTimeMillis() - startedAll) + " ms. " + + (!task.canRun() ? "Was interrupted during processing." : ""); + opResult.computeStatus(); - - LOGGER.trace("Scan for unfinished operations finished, processed {} accounts, result: {}", shadows.size(), opResult.getStatus()); - return true; + result.createSubresult(opResult.getOperation()+".statistics").recordStatus(opResult.getStatus(), message); + + LOGGER.debug("{}. Result: {}", message, opResult.getStatus()); + return task.canRun(); } private ObjectFilter createFailedOpFilter(FailedOperationTypeType failedOp) throws SchemaException{ diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/SynchronizationService.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/SynchronizationService.java index 25e545df855..cd6bfc1997a 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/SynchronizationService.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/SynchronizationService.java @@ -28,6 +28,7 @@ import javax.xml.namespace.QName; import com.evolveum.midpoint.prism.polystring.PolyString; +import com.evolveum.midpoint.schema.statistics.StatisticsUtil; import com.evolveum.midpoint.schema.statistics.SynchronizationInformation; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.Validate; @@ -1032,9 +1033,7 @@ public SynchronizationEventInformation(PrismObject current if (currentShadow != null) { final ShadowType shadow = currentShadow.asObjectable(); objectName = PolyString.getOrig(shadow.getName()); - QName oc = shadow.getObjectClass(); - String ocName = oc != null ? oc.getLocalPart() : null; - objectDisplayName = objectName + " (" + shadow.getKind() + " - " + shadow.getIntent() + " - " + ocName + ")"; + objectDisplayName = StatisticsUtil.getDisplayName(shadow); objectOid = currentShadow.getOid(); } task.recordSynchronizationOperationStart(objectName, objectDisplayName, ShadowType.COMPLEX_TYPE, objectOid); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/SynchronizeAccountResultHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/SynchronizeAccountResultHandler.java index 6941b7d9877..2cf19492491 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/SynchronizeAccountResultHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/SynchronizeAccountResultHandler.java @@ -20,6 +20,7 @@ import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition; import com.evolveum.midpoint.model.impl.importer.ImportAccountsFromResourceTaskHandler; import com.evolveum.midpoint.model.impl.util.AbstractSearchIterativeResultHandler; +import com.evolveum.midpoint.model.impl.util.AbstractSearchIterativeTaskHandler; import com.evolveum.midpoint.model.impl.util.Utils; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.delta.ChangeType; @@ -72,6 +73,7 @@ public SynchronizeAccountResultHandler(ResourceType resource, ObjectClassComplex this.resourceOid = resource.getOid(); this.objectClass = objectClass; forceAdd = false; + setRecordIterationStatistics(false); } public boolean isForceAdd() { diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/TaskHandlerUtil.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/TaskHandlerUtil.java index 7390bc87766..912011d95bc 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/TaskHandlerUtil.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/TaskHandlerUtil.java @@ -39,17 +39,46 @@ public class TaskHandlerUtil { private static final transient Trace LOGGER = TraceManager.getTrace(TaskHandlerUtil.class); + public static void initAllStatistics(Task task) { + fetchAllStatistics(task, false, true, true); + } + public static void fetchAllStatistics(Task task) { - fetchOperationalInformation(task); - fetchIterativeTaskInformation(task); - fetchSynchronizationInformation(task); + fetchAllStatistics(task, true, true, true); + } + + public static void fetchAllStatistics(Task task, boolean preserveStatistics, boolean enableIterationStatistics, boolean enableSynchronizationStatistics) { + if (preserveStatistics) { + fetchOperationalInformation(task); + if (enableIterationStatistics) { + fetchIterativeTaskInformation(task); + } + if (enableSynchronizationStatistics) { + fetchSynchronizationInformation(task); + } + } else { + if (enableIterationStatistics) { + task.resetIterativeTaskInformation(null); + } + if (enableSynchronizationStatistics) { + task.resetSynchronizationInformation(null); + } + } } public static void storeAllStatistics(Task task) { + storeAllStatistics(task, true, true); + } + + public static void storeAllStatistics(Task task, boolean enableIterationStatistics, boolean enableSynchronizationStatistics) { try { storeOperationalInformation(task); - storeIterativeTaskInformation(task); - storeSynchronizationInformation(task); + if (enableIterationStatistics) { + storeIterativeTaskInformation(task); + } + if (enableSynchronizationStatistics) { + storeSynchronizationInformation(task); + } task.savePendingModifications(task.getResult()); } catch (SchemaException|ObjectNotFoundException |ObjectAlreadyExistsException |RuntimeException e) { LoggingUtils.logUnexpectedException(LOGGER, "Couldn't store statistical information into task {}", e, task); @@ -84,30 +113,17 @@ public static void fetchIterativeTaskInformation(Task task) { } public static void storeOperationalInformation(Task task) throws SchemaException { - OperationalInformation operationalInformation = task.getOperationalInformation(); - if (operationalInformation == null) { - return; - } - OperationalInformationType operationalInformationType = operationalInformation.getAggregatedValue(); + OperationalInformationType operationalInformationType = task.collectOperationalInformation(); task.setExtensionPropertyValue(SchemaConstants.MODEL_EXTENSION_OPERATIONAL_INFORMATION_PROPERTY_NAME, operationalInformationType); } public static void storeSynchronizationInformation(Task task) throws SchemaException { - SynchronizationInformation synchronizationInformation = task.getSynchronizationInformation(); - if (synchronizationInformation == null) { - return; - } - SynchronizationInformationType synchronizationInformationType = synchronizationInformation.getAggregatedValue(); + SynchronizationInformationType synchronizationInformationType = task.collectSynchronizationInformation(); task.setExtensionPropertyValue(SchemaConstants.MODEL_EXTENSION_SYNCHRONIZATION_INFORMATION_PROPERTY_NAME, synchronizationInformationType); } public static void storeIterativeTaskInformation(Task task) throws SchemaException { - IterativeTaskInformation iterativeTaskInformation = task.getIterativeTaskInformation(); - if (iterativeTaskInformation == null) { - return; - } - IterativeTaskInformationType iterativeTaskInformationType = iterativeTaskInformation.getAggregatedValue(); + IterativeTaskInformationType iterativeTaskInformationType = task.collectIterativeTaskInformation(); task.setExtensionPropertyValue(SchemaConstants.MODEL_EXTENSION_ITERATIVE_TASK_INFORMATION_PROPERTY_NAME, iterativeTaskInformationType); } - } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/AbstractSearchIterativeResultHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/AbstractSearchIterativeResultHandler.java index a93ca6af35c..813d4a5c6d3 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/AbstractSearchIterativeResultHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/AbstractSearchIterativeResultHandler.java @@ -15,14 +15,17 @@ */ package com.evolveum.midpoint.model.impl.util; +import com.evolveum.midpoint.model.impl.sync.TaskHandlerUtil; import com.evolveum.midpoint.prism.PrismProperty; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.repo.cache.RepositoryCache; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResultStatus; +import com.evolveum.midpoint.schema.statistics.StatisticsUtil; import com.evolveum.midpoint.schema.util.ObjectTypeUtil; import com.evolveum.midpoint.task.api.LightweightTaskHandler; import com.evolveum.midpoint.task.api.TaskManager; +import com.evolveum.midpoint.util.exception.ObjectAlreadyExistsException; import com.evolveum.midpoint.util.exception.ObjectNotFoundException; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.exception.SystemException; @@ -46,6 +49,7 @@ import javax.xml.namespace.QName; import java.util.ArrayList; import java.util.List; +import java.util.Set; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.TimeUnit; @@ -74,6 +78,8 @@ public abstract class AbstractSearchIterativeResultHandler private boolean logObjectProgress; private boolean logErrors = true; private boolean recordIterationStatistics = true; // whether we want to do these ourselves or we let SynchronizationService do that for us + private boolean enableIterationStatistics = true; // whether we want to collect these statistics at all + private boolean enableSynchronizationStatistics = false; // whether we want to collect sync statistics private BlockingQueue requestQueue; private AtomicBoolean stopRequestedByAnyWorker = new AtomicBoolean(false); private final long startTime; @@ -143,9 +149,25 @@ public void setRecordIterationStatistics(boolean recordIterationStatistics) { this.recordIterationStatistics = recordIterationStatistics; } + public boolean isEnableIterationStatistics() { + return enableIterationStatistics; + } + + public void setEnableIterationStatistics(boolean enableIterationStatistics) { + this.enableIterationStatistics = enableIterationStatistics; + } + + public boolean isEnableSynchronizationStatistics() { + return enableSynchronizationStatistics; + } + + public void setEnableSynchronizationStatistics(boolean enableSynchronizationStatistics) { + this.enableSynchronizationStatistics = enableSynchronizationStatistics; + } + /* (non-Javadoc) - * @see com.evolveum.midpoint.schema.ResultHandler#handle(com.evolveum.midpoint.prism.PrismObject, com.evolveum.midpoint.schema.result.OperationResult) - */ + * @see com.evolveum.midpoint.schema.ResultHandler#handle(com.evolveum.midpoint.prism.PrismObject, com.evolveum.midpoint.schema.result.OperationResult) + */ @Override public boolean handle(PrismObject object, OperationResult parentResult) { if (object.getOid() == null) { @@ -312,10 +334,16 @@ private void processRequest(ProcessingRequest request, Task workerTask, Operatio null /* TODO */, object.getOid(), startTime, getException(result)); } cont = processError(object, null, result); - } else if (result.isSuccess()) { - // FIXME: hack. Hardcoded ugly summarization of successes. something like - // AbstractSummarizingResultHandler [lazyman] - result.getSubresults().clear(); + } else { + if (isRecordIterationStatistics()) { + workerTask.recordIterativeOperationEnd(objectName, objectDisplayName, + null /* TODO */, object.getOid(), startTime, null); + } + if (result.isSuccess()) { + // FIXME: hack. Hardcoded ugly summarization of successes. something like + // AbstractSummarizingResultHandler [lazyman] + result.getSubresults().clear(); + } } } catch (CommonException|RuntimeException e) { @@ -337,11 +365,14 @@ private void processRequest(ProcessingRequest request, Task workerTask, Operatio // or parentResult as obtained in handle(..) method in single-thread scenario parentResult.summarize(); - if (shouldReportProgress()) { - try { - coordinatorTask.setProgressImmediate(progress, result); // this is necessary for the progress to be immediately available in GUI - } catch (ObjectNotFoundException | SchemaException | RuntimeException e) { - LoggingUtils.logException(LOGGER, "Couldn't record progress for task {}", e, coordinatorTask); + synchronized (coordinatorTask) { + coordinatorTask.setProgress(progress); + if (requestQueue != null) { + workerTask.setProgress(workerTask.getProgress()+1); + } + if (shouldReportProgress()) { + TaskHandlerUtil.storeAllStatistics(coordinatorTask, isEnableIterationStatistics(), isEnableSynchronizationStatistics()); + // includes savePendingModifications - this is necessary for the progress to be immediately available in GUI } } @@ -368,23 +399,7 @@ private void processRequest(ProcessingRequest request, Task workerTask, Operatio // may be overriden protected String getDisplayName(PrismObject object) { - if (object == null) { - return null; - } - O objectable = object.asObjectable(); - if (objectable instanceof UserType) { - return "User " + ((UserType) objectable).getFullName() + " (" + object.getName() + ")"; - } else if (objectable instanceof RoleType) { - return "Role " + ((RoleType) objectable).getDisplayName() + " (" + object.getName() + ")"; - } else if (objectable instanceof OrgType) { - return "Org " + ((OrgType) objectable).getDisplayName() + " (" + object.getName() + ")"; - } else if (objectable instanceof ShadowType) { - ShadowType s = (ShadowType) objectable; - String oc = s.getObjectClass() != null ? s.getObjectClass().getLocalPart() : ""; - return "Shadow " + s.getName() + " (" + s.getKind() + " - " + s.getIntent() + " - " + oc + ")"; - } else { - return objectable.getClass().getSimpleName() + " " + objectable.getName(); - } + return StatisticsUtil.getDisplayName(object); } // TODO implement better @@ -488,6 +503,12 @@ public void createWorkerThreads(Task coordinatorTask, OperationResult opResult) workerSpecificResults.add(workerSpecificResult); Task subtask = coordinatorTask.createSubtask(new WorkerHandler(workerSpecificResult)); + if (isEnableIterationStatistics()) { + subtask.resetIterativeTaskInformation(null); + } + if (isEnableSynchronizationStatistics()) { + subtask.resetSynchronizationInformation(null); + } subtask.setCategory(coordinatorTask.getCategory()); subtask.setResult(new OperationResult(taskOperationPrefix + ".executeWorker", OperationResultStatus.IN_PROGRESS, null)); subtask.setName("Worker thread " + (i+1) + " of " + threadsCount); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/AbstractSearchIterativeTaskHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/AbstractSearchIterativeTaskHandler.java index c98792c508f..b84ddb81baa 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/AbstractSearchIterativeTaskHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/AbstractSearchIterativeTaskHandler.java @@ -30,7 +30,6 @@ import com.evolveum.midpoint.schema.constants.ObjectTypes; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.util.exception.ObjectAlreadyExistsException; -import com.evolveum.midpoint.util.logging.LoggingUtils; import com.evolveum.prism.xml.ns._public.query_3.QueryType; import org.springframework.beans.factory.annotation.Autowired; @@ -72,6 +71,8 @@ public abstract class AbstractSearchIterativeTaskHandler) type, query, queryOptions, resultHandler, opResult); + modelObjectResolver.searchIterative((Class) type, query, queryOptions, resultHandler, coordinatorTask, opResult); } else { repositoryService.searchObjectsIterative(type, query, (ResultHandler) resultHandler, null, opResult); } diff --git a/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/expr/TestModelExpressions.java b/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/expr/TestModelExpressions.java index 9651c46004a..a8b538ea35d 100644 --- a/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/expr/TestModelExpressions.java +++ b/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/expr/TestModelExpressions.java @@ -19,14 +19,12 @@ import static org.testng.AssertJUnit.assertEquals; import java.io.File; -import java.io.FileNotFoundException; import java.io.IOException; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; -import javax.xml.bind.JAXBElement; import javax.xml.bind.JAXBException; import javax.xml.namespace.QName; @@ -131,7 +129,7 @@ public void testHello() throws Exception { ExpressionVariables variables = null; // WHEN - List> scriptOutputs = scriptExpression.evaluate(variables, null, false, TEST_NAME, result); + List> scriptOutputs = scriptExpression.evaluate(variables, null, false, TEST_NAME, null, result); // THEN display("Script output", scriptOutputs); @@ -172,7 +170,7 @@ public void testGetUserByOid() throws Exception { variables.addVariableDefinition(new QName(SchemaConstants.NS_C, "user"), chef); // WHEN - List> scriptOutputs = scriptExpression.evaluate(variables, null, false, TEST_NAME, result); + List> scriptOutputs = scriptExpression.evaluate(variables, null, false, TEST_NAME, null, result); // THEN display("Script output", scriptOutputs); @@ -200,7 +198,7 @@ public void testGetManagersOids() throws Exception { variables.addVariableDefinition(new QName(SchemaConstants.NS_C, "user"), chef); // WHEN - List> scriptOutputs = scriptExpression.evaluate(variables, null, false, TEST_NAME, result); + List> scriptOutputs = scriptExpression.evaluate(variables, null, false, TEST_NAME, null, result); // THEN display("Script output", scriptOutputs); @@ -229,7 +227,7 @@ public void testGetOrgByName() throws Exception { ExpressionVariables variables = new ExpressionVariables(); // WHEN - List> scriptOutputs = scriptExpression.evaluate(variables, null, false, TEST_NAME, result); + List> scriptOutputs = scriptExpression.evaluate(variables, null, false, TEST_NAME, null, result); // THEN display("Script output", scriptOutputs); diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestActivation.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestActivation.java index d551b8f1bbc..1d24de39ec2 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestActivation.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestActivation.java @@ -1532,9 +1532,9 @@ public void test410AssignHermanKhakiAccount() throws Exception { DummyAccount khakiAccount = getDummyAccount(RESOURCE_DUMMY_KHAKI_NAME, USER_HERMAN_USERNAME); assertNotNull("No khaki account", khakiAccount); assertTrue("khaki account not enabled", khakiAccount.isEnabled()); - assertEquals("Wrong quote (validFrom) in khaki account", "from: 1700-05-30T11:00:00Z", + assertEquals("Wrong quote (validFrom) in khaki account", "from: 1700-05-30T11:00:00.000Z", khakiAccount.getAttributeValue(DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_QUOTE_NAME)); - assertEquals("Wrong drink (validTo) in khaki account", "to: 2233-03-23T18:30:00Z", + assertEquals("Wrong drink (validTo) in khaki account", "to: 2233-03-23T18:30:00.000Z", khakiAccount.getAttributeValue(DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_DRINK_NAME)); } diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestSecurity.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestSecurity.java index b0dc94031a8..f8c7c657966 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestSecurity.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestSecurity.java @@ -31,9 +31,7 @@ import com.evolveum.midpoint.prism.PrismObjectDefinition; import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.prism.query.AndFilter; import com.evolveum.midpoint.prism.query.NoneFilter; -import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.query.TypeFilter; import com.evolveum.midpoint.prism.util.PrismAsserts; @@ -49,9 +47,7 @@ import com.evolveum.midpoint.security.api.AuthorizationConstants; import com.evolveum.midpoint.security.api.MidPointPrincipal; import com.evolveum.midpoint.task.api.Task; -import com.evolveum.midpoint.test.IntegrationTestTools; import com.evolveum.midpoint.test.util.TestUtil; -import com.evolveum.midpoint.util.DisplayableValue; import com.evolveum.midpoint.util.exception.CommunicationException; import com.evolveum.midpoint.util.exception.ConfigurationException; import com.evolveum.midpoint.util.exception.ExpressionEvaluationException; @@ -73,7 +69,6 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.OrgType; import com.evolveum.midpoint.xml.ns._public.common.common_3.OwnedObjectSpecificationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.SecurityPolicyType; import com.evolveum.midpoint.xml.ns._public.common.common_3.SecurityQuestionsCredentialsPolicyType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowKindType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; @@ -94,7 +89,6 @@ import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import java.util.List; @@ -1462,7 +1456,7 @@ public void test280AutzJackEndUser() throws Exception { private void assertCredentialsPolicy(PrismObject user) throws ObjectNotFoundException, SchemaException { OperationResult result = new OperationResult("assertCredentialsPolicy"); - CredentialsPolicyType credentialsPolicy = modelInteractionService.getCredentialsPolicy(user, result); + CredentialsPolicyType credentialsPolicy = modelInteractionService.getCredentialsPolicy(user, null, result); result.computeStatus(); TestUtil.assertSuccess(result); assertNotNull("No credentials policy for "+user, credentialsPolicy); diff --git a/model/notifications-impl/src/main/java/com/evolveum/midpoint/notifications/impl/api/transports/SimpleSmsTransport.java b/model/notifications-impl/src/main/java/com/evolveum/midpoint/notifications/impl/api/transports/SimpleSmsTransport.java index 14442648feb..4855423f276 100644 --- a/model/notifications-impl/src/main/java/com/evolveum/midpoint/notifications/impl/api/transports/SimpleSmsTransport.java +++ b/model/notifications-impl/src/main/java/com/evolveum/midpoint/notifications/impl/api/transports/SimpleSmsTransport.java @@ -25,7 +25,6 @@ import com.evolveum.midpoint.notifications.api.transports.Transport; import com.evolveum.midpoint.notifications.impl.NotificationsUtil; import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismPropertyDefinition; import com.evolveum.midpoint.prism.PrismPropertyValue; import com.evolveum.midpoint.prism.delta.PrismValueDeltaSetTriple; @@ -60,8 +59,6 @@ import java.net.URI; import java.net.URLEncoder; import java.util.Date; -import java.util.HashMap; -import java.util.Map; /** * @author mederly @@ -230,7 +227,7 @@ private String evaluateExpression(ExpressionType expressionType, ExpressionVaria QName resultName = new QName(SchemaConstants.NS_C, "result"); PrismPropertyDefinition resultDef = new PrismPropertyDefinition(resultName, DOMUtil.XSD_STRING, prismContext); - Expression,PrismPropertyDefinition> expression = expressionFactory.makeExpression(expressionType, resultDef, shortDesc, result); + Expression,PrismPropertyDefinition> expression = expressionFactory.makeExpression(expressionType, resultDef, shortDesc, task, result); ExpressionEvaluationContext params = new ExpressionEvaluationContext(null, expressionVariables, shortDesc, task, result); PrismValueDeltaSetTriple> exprResult = expression.evaluate(params); diff --git a/model/notifications-impl/src/main/java/com/evolveum/midpoint/notifications/impl/handlers/BaseHandler.java b/model/notifications-impl/src/main/java/com/evolveum/midpoint/notifications/impl/handlers/BaseHandler.java index ccfd54b16a3..2c27bac88ac 100644 --- a/model/notifications-impl/src/main/java/com/evolveum/midpoint/notifications/impl/handlers/BaseHandler.java +++ b/model/notifications-impl/src/main/java/com/evolveum/midpoint/notifications/impl/handlers/BaseHandler.java @@ -21,7 +21,6 @@ import com.evolveum.midpoint.model.common.expression.ExpressionFactory; import com.evolveum.midpoint.model.common.expression.ExpressionVariables; import com.evolveum.midpoint.notifications.api.EventHandler; -import com.evolveum.midpoint.notifications.api.NotificationManager; import com.evolveum.midpoint.notifications.api.events.Event; import com.evolveum.midpoint.notifications.impl.NotificationManagerImpl; import com.evolveum.midpoint.notifications.impl.NotificationsUtil; @@ -129,7 +128,7 @@ protected boolean evaluateBooleanExpression(ExpressionType expressionType, Expre QName resultName = new QName(SchemaConstants.NS_C, "result"); PrismPropertyDefinition resultDef = new PrismPropertyDefinition<>(resultName, DOMUtil.XSD_BOOLEAN, prismContext); - Expression,PrismPropertyDefinition> expression = expressionFactory.makeExpression(expressionType, resultDef, shortDesc, result); + Expression,PrismPropertyDefinition> expression = expressionFactory.makeExpression(expressionType, resultDef, shortDesc, task, result); ExpressionEvaluationContext params = new ExpressionEvaluationContext(null, expressionVariables, shortDesc, task, result); PrismValueDeltaSetTriple> exprResultTriple = expression.evaluate(params); @@ -168,7 +167,7 @@ private List evaluateExpression(ExpressionType expressionType, Expressio QName resultName = new QName(SchemaConstants.NS_C, "result"); PrismPropertyDefinition resultDef = new PrismPropertyDefinition<>(resultName, DOMUtil.XSD_STRING, prismContext); - Expression,PrismPropertyDefinition> expression = expressionFactory.makeExpression(expressionType, resultDef, shortDesc, result); + Expression,PrismPropertyDefinition> expression = expressionFactory.makeExpression(expressionType, resultDef, shortDesc, task, result); ExpressionEvaluationContext params = new ExpressionEvaluationContext(null, expressionVariables, shortDesc, task, result); PrismValueDeltaSetTriple> exprResult = expression.evaluate(params); diff --git a/model/notifications-impl/src/main/java/com/evolveum/midpoint/notifications/impl/helpers/BaseHelper.java b/model/notifications-impl/src/main/java/com/evolveum/midpoint/notifications/impl/helpers/BaseHelper.java index 9e114a6c37d..3ceebbf1798 100644 --- a/model/notifications-impl/src/main/java/com/evolveum/midpoint/notifications/impl/helpers/BaseHelper.java +++ b/model/notifications-impl/src/main/java/com/evolveum/midpoint/notifications/impl/helpers/BaseHelper.java @@ -123,7 +123,7 @@ protected boolean evaluateBooleanExpression(ExpressionType expressionType, Expre QName resultName = new QName(SchemaConstants.NS_C, "result"); PrismPropertyDefinition resultDef = new PrismPropertyDefinition(resultName, DOMUtil.XSD_BOOLEAN, prismContext); - Expression,PrismPropertyDefinition> expression = expressionFactory.makeExpression(expressionType, resultDef, shortDesc, result); + Expression,PrismPropertyDefinition> expression = expressionFactory.makeExpression(expressionType, resultDef, shortDesc, task, result); ExpressionEvaluationContext params = new ExpressionEvaluationContext(null, expressionVariables, shortDesc, task, result); ModelExpressionThreadLocalHolder.pushCurrentResult(result); @@ -171,7 +171,7 @@ private List evaluateExpression(ExpressionType expressionType, Expressio QName resultName = new QName(SchemaConstants.NS_C, "result"); PrismPropertyDefinition resultDef = new PrismPropertyDefinition(resultName, DOMUtil.XSD_STRING, prismContext); - Expression,PrismPropertyDefinition> expression = expressionFactory.makeExpression(expressionType, resultDef, shortDesc, result); + Expression,PrismPropertyDefinition> expression = expressionFactory.makeExpression(expressionType, resultDef, shortDesc, task, result); ExpressionEvaluationContext params = new ExpressionEvaluationContext(null, expressionVariables, shortDesc, task, result); PrismValueDeltaSetTriple> exprResult; diff --git a/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportCreateTaskHandler.java b/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportCreateTaskHandler.java index 44bf62b9d1a..dda748c38c6 100644 --- a/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportCreateTaskHandler.java +++ b/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportCreateTaskHandler.java @@ -3,8 +3,6 @@ import java.io.ByteArrayInputStream; import java.io.File; import java.io.InputStream; -import java.io.Serializable; -import java.io.Writer; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collection; @@ -14,7 +12,6 @@ import java.util.Map; import javax.annotation.PostConstruct; -import javax.xml.bind.JAXBElement; import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.JRTemplate; @@ -24,7 +21,6 @@ import net.sf.jasperreports.engine.JasperReport; import net.sf.jasperreports.engine.export.JRCsvExporter; import net.sf.jasperreports.engine.export.JRRtfExporter; -import net.sf.jasperreports.engine.export.JRXhtmlExporter; import net.sf.jasperreports.engine.export.JRXlsExporter; import net.sf.jasperreports.engine.export.oasis.JROdsExporter; import net.sf.jasperreports.engine.export.oasis.JROdtExporter; @@ -38,12 +34,10 @@ import net.sf.jasperreports.export.SimpleExporterInput; import net.sf.jasperreports.export.SimpleOutputStreamExporterOutput; import net.sf.jasperreports.export.SimpleWriterExporterOutput; -import net.sf.jasperreports.export.WriterExporterOutput; import org.apache.commons.codec.binary.Base64; import org.apache.commons.io.FilenameUtils; import org.apache.commons.lang.StringUtils; -import org.hibernate.param.ParameterSpecification; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -54,23 +48,13 @@ import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismProperty; -import com.evolveum.midpoint.prism.PrismPropertyValue; import com.evolveum.midpoint.prism.delta.ObjectDelta; -import com.evolveum.midpoint.prism.parser.QueryConvertor; -import com.evolveum.midpoint.prism.parser.XNodeSerializer; import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.prism.query.ObjectFilter; -import com.evolveum.midpoint.prism.query.ObjectQuery; -import com.evolveum.midpoint.prism.util.RawTypeUtil; -import com.evolveum.midpoint.prism.xml.XmlTypeConverter; -import com.evolveum.midpoint.prism.xnode.PrimitiveXNode; -import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.report.api.ReportConstants; import com.evolveum.midpoint.report.api.ReportService; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.MiscSchemaUtil; import com.evolveum.midpoint.schema.util.ObjectResolver; -import com.evolveum.midpoint.schema.util.ParamsTypeUtil; import com.evolveum.midpoint.schema.util.ReportTypeUtil; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.task.api.TaskCategory; @@ -86,14 +70,11 @@ import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.xml.ns._public.common.common_3.ExportType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ParamsType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ReportOutputType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ReportParameterType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ReportType; import com.evolveum.midpoint.xml.ns._public.common.common_3.SubreportType; -import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType; import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; -import com.evolveum.prism.xml.ns._public.types_3.RawType; @Component public class ReportCreateTaskHandler implements TaskHandler{ @@ -156,8 +137,8 @@ public TaskRunResult run(Task task) { long progress = task.getProgress(); try { - ReportType parentReport = objectResolver.resolve(task.getObjectRef(), ReportType.class, null, "resolving report", result); - Map parameters = completeReport(parentReport, result); + ReportType parentReport = objectResolver.resolve(task.getObjectRef(), ReportType.class, null, "resolving report", task, result); + Map parameters = completeReport(parentReport, task, result); PrismContainer reportParams = (PrismContainer) task.getExtensionItem(ReportConstants.REPORT_PARAMS_PROPERTY_NAME); if (reportParams != null) { @@ -205,11 +186,11 @@ public TaskRunResult run(Task task) { return runResult; } - private Map completeReport(ReportType parentReport, OperationResult result) throws SchemaException, ObjectNotFoundException{ - return completeReport(parentReport, null, null, result); + private Map completeReport(ReportType parentReport, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException{ + return completeReport(parentReport, null, null, task, result); } - private Map completeReport(ReportType parentReport, JasperReport subReport, String subReportName, OperationResult result) throws SchemaException, ObjectNotFoundException{ + private Map completeReport(ReportType parentReport, JasperReport subReport, String subReportName, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException{ Map params = new HashMap(); if (subReport != null && StringUtils.isNotBlank(subReportName)){ @@ -220,7 +201,7 @@ private Map completeReport(ReportType parentReport, JasperReport params.putAll(parameters); LOGGER.trace("create report params : {}", parameters); - Map subreportParameters = processSubreportParameters(parentReport, result); + Map subreportParameters = processSubreportParameters(parentReport, task, result); params.putAll(subreportParameters); return params; } @@ -287,11 +268,11 @@ private Map prepareReportParameters(ReportType reportType, Opera return params; } - private Map processSubreportParameters(ReportType reportType, OperationResult subreportResult) throws SchemaException, ObjectNotFoundException{ + private Map processSubreportParameters(ReportType reportType, Task task, OperationResult subreportResult) throws SchemaException, ObjectNotFoundException{ Map subreportParameters = new HashMap(); for(SubreportType subreport : reportType.getSubreport()) { - Map subreportParam = getSubreportParameters(subreport, subreportResult); + Map subreportParam = getSubreportParameters(subreport, task, subreportResult); LOGGER.trace("create subreport params : {}", subreportParam); subreportParameters.putAll(subreportParam); @@ -299,11 +280,11 @@ private Map processSubreportParameters(ReportType reportType, Op return subreportParameters; } - private Map getSubreportParameters(SubreportType subreportType, OperationResult subResult) + private Map getSubreportParameters(SubreportType subreportType, Task task, OperationResult subResult) throws SchemaException, ObjectNotFoundException { Map reportParams = new HashMap(); ReportType reportType = objectResolver.resolve(subreportType.getReportRef(), ReportType.class, null, - "resolve subreport", subResult); + "resolve subreport", task, subResult); Map parameters = prepareReportParameters(reportType, subResult); reportParams.putAll(parameters); @@ -311,7 +292,7 @@ private Map getSubreportParameters(SubreportType subreportType, JasperReport jasperReport = ReportTypeUtil.loadJasperReport(reportType); reportParams.put(subreportType.getName(), jasperReport); - Map subReportParams = processSubreportParameters(reportType, subResult); + Map subReportParams = processSubreportParameters(reportType, task, subResult); reportParams.putAll(subReportParams); return reportParams; diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/itemApproval/InitializeLoopThroughApproversInLevel.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/itemApproval/InitializeLoopThroughApproversInLevel.java index 14c30c5041f..a22439905a5 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/itemApproval/InitializeLoopThroughApproversInLevel.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/itemApproval/InitializeLoopThroughApproversInLevel.java @@ -141,7 +141,7 @@ private Collection evaluateExpression(ExpressionType appro PrismContext prismContext = expressionFactory.getPrismContext(); QName approverOidName = new QName(SchemaConstants.NS_C, "approverOid"); PrismPropertyDefinition approverOidDef = new PrismPropertyDefinition(approverOidName, DOMUtil.XSD_STRING, prismContext); - Expression,PrismPropertyDefinition> expression = expressionFactory.makeExpression(approverExpression, approverOidDef, "approverExpression", result); + Expression,PrismPropertyDefinition> expression = expressionFactory.makeExpression(approverExpression, approverOidDef, "approverExpression", task, result); ExpressionEvaluationContext params = new ExpressionEvaluationContext(null, expressionVariables, "approverExpression", task, result); PrismValueDeltaSetTriple> exprResult = expression.evaluate(params); @@ -164,7 +164,7 @@ private boolean evaluateBooleanExpression(ExpressionType expressionType, Express PrismContext prismContext = expressionFactory.getPrismContext(); QName resultName = new QName(SchemaConstants.NS_C, "result"); PrismPropertyDefinition resultDef = new PrismPropertyDefinition(resultName, DOMUtil.XSD_BOOLEAN, prismContext); - Expression,PrismPropertyDefinition> expression = expressionFactory.makeExpression(expressionType, resultDef, "automatic approval expression", result); + Expression,PrismPropertyDefinition> expression = expressionFactory.makeExpression(expressionType, resultDef, "automatic approval expression", task, result); ExpressionEvaluationContext params = new ExpressionEvaluationContext(null, expressionVariables, "automatic approval expression", task, result); PrismValueDeltaSetTriple> exprResultTriple = expression.evaluate(params); diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/general/GcpExpressionHelper.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/general/GcpExpressionHelper.java index a902ea6ac66..9c576485cc5 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/general/GcpExpressionHelper.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/general/GcpExpressionHelper.java @@ -44,8 +44,6 @@ import javax.xml.namespace.QName; import java.util.Collection; -import java.util.HashMap; -import java.util.Map; /** * @author mederly @@ -82,7 +80,7 @@ private boolean evaluateBooleanExpression(ExpressionType expressionType, Express PrismContext prismContext = expressionFactory.getPrismContext(); QName resultName = new QName(SchemaConstants.NS_C, "result"); PrismPropertyDefinition resultDef = new PrismPropertyDefinition(resultName, DOMUtil.XSD_BOOLEAN, prismContext); - Expression,PrismPropertyDefinition> expression = expressionFactory.makeExpression(expressionType, resultDef, opContext, result); + Expression,PrismPropertyDefinition> expression = expressionFactory.makeExpression(expressionType, resultDef, opContext, taskFromModel, result); ExpressionEvaluationContext params = new ExpressionEvaluationContext(null, expressionVariables, opContext, taskFromModel, result); PrismValueDeltaSetTriple> exprResultTriple = expression.evaluate(params); diff --git a/provisioning/provisioning-api/src/main/java/com/evolveum/midpoint/provisioning/api/ProvisioningService.java b/provisioning/provisioning-api/src/main/java/com/evolveum/midpoint/provisioning/api/ProvisioningService.java index 557ca86fd7f..eb881a68266 100644 --- a/provisioning/provisioning-api/src/main/java/com/evolveum/midpoint/provisioning/api/ProvisioningService.java +++ b/provisioning/provisioning-api/src/main/java/com/evolveum/midpoint/provisioning/api/ProvisioningService.java @@ -211,13 +211,13 @@ public int synchronize(ResourceShadowDiscriminator shadowCoordinates, Task task, * Should fail if object type is wrong. Should fail if unknown property is * specified in the query. * - * @param query - * search query * @param paging * paging specification to limit operation result (optional) - * @param parentResult - * parent OperationResult (in/out) - * @return all objects of specified type that match search criteria (subject + * @param query + * search query + * @param task + *@param parentResult + * parent OperationResult (in/out) @return all objects of specified type that match search criteria (subject * to paging) * * @throws IllegalArgumentException @@ -230,15 +230,15 @@ public int synchronize(ResourceShadowDiscriminator shadowCoordinates, Task task, * @throws SecurityViolationException * Security violation while communicating with the connector or processing provisioning policies */ - public SearchResultList> searchObjects(Class type, ObjectQuery query, Collection> options, OperationResult parentResult) + public SearchResultList> searchObjects(Class type, ObjectQuery query, Collection> options, Task task, OperationResult parentResult) throws SchemaException, ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException; /** * Options: if noFetch or raw, we count only shadows from the repository. */ - public Integer countObjects(Class type, ObjectQuery query, Collection> options, OperationResult parentResult) - throws SchemaException, ObjectNotFoundException, CommunicationException, ConfigurationException, + public Integer countObjects(Class type, ObjectQuery query, Collection> options, Task task, OperationResult parentResult) + throws SchemaException, ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException; /** @@ -254,10 +254,10 @@ public Integer countObjects(Class type, ObjectQuery qu * search query * @param handler * result handler - * @param parentResult + * @param task + *@param parentResult * parent OperationResult (in/out) - * - * @throws IllegalArgumentException + * @throws IllegalArgumentException * wrong object type * @throws GenericConnectorException * unknown connector framework error @@ -268,8 +268,8 @@ public Integer countObjects(Class type, ObjectQuery qu * @throws SecurityViolationException * Security violation while communicating with the connector or processing provisioning policies */ - public SearchResultMetadata searchObjectsIterative(Class type, ObjectQuery query, Collection> options, - final ResultHandler handler, final OperationResult parentResult) + public SearchResultMetadata searchObjectsIterative(Class type, ObjectQuery query, Collection> options, + final ResultHandler handler, Task task, final OperationResult parentResult) throws SchemaException, ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException; /** @@ -418,15 +418,15 @@ public void executeScript(String resourceOid, Provisionin * @param resourceOid OID of the resource to fetch objects from * @param objectClass Object class of the objects to fetch * @param paging paging specification to limit operation result (optional) - * @param parentResult - * parent OperationResult (in/out) - * @return resource objects in a form of "detached shadows" + * @param task + *@param parentResult + * parent OperationResult (in/out) @return resource objects in a form of "detached shadows" * @throws ObjectNotFoundException specified resource object does not exist * @throws SchemaException error handling resource schema * @throws CommunicationException error communicating with the resource */ public List> listResourceObjects(String resourceOid, QName objectClass, ObjectPaging paging, - OperationResult parentResult) throws SchemaException, ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException; + Task task, OperationResult parentResult) throws SchemaException, ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException; public void finishOperation(PrismObject object, ProvisioningOperationOptions options, Task task, OperationResult parentResult) @@ -484,7 +484,7 @@ ConstraintsCheckingResult checkConstraints(RefinedObjectClassDefinition shadowDe String shadowOid, ResourceShadowDiscriminator resourceShadowDiscriminator, ConstraintViolationConfirmer constraintViolationConfirmer, - OperationResult parentResult) throws CommunicationException, ObjectAlreadyExistsException, SchemaException, SecurityViolationException, ConfigurationException, ObjectNotFoundException; + Task task, OperationResult parentResult) throws CommunicationException, ObjectAlreadyExistsException, SchemaException, SecurityViolationException, ConfigurationException, ObjectNotFoundException; void enterConstraintsCheckerCache(); diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/consistency/impl/ObjectAlreadyExistHandler.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/consistency/impl/ObjectAlreadyExistHandler.java index f9ddb07e24f..79fc2c55536 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/consistency/impl/ObjectAlreadyExistHandler.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/consistency/impl/ObjectAlreadyExistHandler.java @@ -20,14 +20,11 @@ import java.util.Collection; import java.util.List; -import javax.xml.namespace.QName; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.PrismProperty; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.query.AndFilter; import com.evolveum.midpoint.prism.query.EqualFilter; @@ -157,7 +154,7 @@ public boolean handle(PrismObject object, OperationResult parentResult) { }; - provisioningService.searchObjectsIterative(ShadowType.class, query, null, handler, parentResult); + provisioningService.searchObjectsIterative(ShadowType.class, query, null, handler, task, parentResult); return foundAccount; } diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ConstraintsChecker.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ConstraintsChecker.java index cb3ea498daa..df9406c6fa5 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ConstraintsChecker.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ConstraintsChecker.java @@ -37,6 +37,7 @@ import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.processor.ResourceAttributeDefinition; import com.evolveum.midpoint.schema.result.OperationResult; +import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.MiscUtil; import com.evolveum.midpoint.util.caching.AbstractCache; import com.evolveum.midpoint.util.exception.CommunicationException; @@ -123,7 +124,7 @@ public void setConstraintViolationConfirmer(ConstraintViolationConfirmer constra private ConstraintsCheckingResult constraintsCheckingResult; - public ConstraintsCheckingResult check(OperationResult result) throws SchemaException, ObjectAlreadyExistsException, ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException { + public ConstraintsCheckingResult check(Task task, OperationResult result) throws SchemaException, ObjectAlreadyExistsException, ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException { constraintsCheckingResult = new ConstraintsCheckingResult(); constraintsCheckingResult.setSatisfiesConstraints(true); @@ -145,7 +146,7 @@ public ConstraintsCheckingResult check(OperationResult result) throws SchemaExce continue; } constraintsCheckingResult.getCheckedAttributes().add(attr.getElementName()); - boolean unique = checkAttributeUniqueness(attr, shadowDefinition, resourceType, shadowOid, result); + boolean unique = checkAttributeUniqueness(attr, shadowDefinition, resourceType, shadowOid, task, result); if (!unique) { LOGGER.debug("Attribute {} conflicts with existing object (in {})", attr, resourceShadowDiscriminator); constraintsCheckingResult.getConflictingAttributes().add(attr.getElementName()); @@ -157,7 +158,7 @@ public ConstraintsCheckingResult check(OperationResult result) throws SchemaExce } private boolean checkAttributeUniqueness(PrismProperty identifier, RefinedObjectClassDefinition accountDefinition, - ResourceType resourceType, String oid, OperationResult result) throws SchemaException, ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException { + ResourceType resourceType, String oid, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException { List> identifierValues = identifier.getValues(); if (identifierValues.isEmpty()) { @@ -175,11 +176,11 @@ private boolean checkAttributeUniqueness(PrismProperty identifier, RefinedObject EqualFilter.createEqual(new ItemPath(ShadowType.F_ATTRIBUTES, identifier.getDefinition().getName()), identifier.getDefinition(), identifierValues), isNotDead)); - boolean unique = checkUniqueness(oid, identifier, query, result); + boolean unique = checkUniqueness(oid, identifier, query, task, result); return unique; } - private boolean checkUniqueness(String oid, PrismProperty identifier, ObjectQuery query, OperationResult result) throws SchemaException, ObjectNotFoundException, SecurityViolationException, CommunicationException, ConfigurationException { + private boolean checkUniqueness(String oid, PrismProperty identifier, ObjectQuery query, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException, SecurityViolationException, CommunicationException, ConfigurationException { if (Cache.isOk(resourceType.getOid(), oid, shadowDefinition.getTypeName(), identifier.getDefinition().getName(), identifier.getValues())) { return true; @@ -190,7 +191,7 @@ private boolean checkUniqueness(String oid, PrismProperty identifier, ObjectQuer // because there could be a matching rule; see ShadowManager.processQueryMatchingRuleFilter. // Besides that, now the constraint checking is cached at a higher level, so this is not a big issue any more. Collection> options = SelectorOptions.createCollection(GetOperationOptions.createNoFetch()); - List> foundObjects = provisioningService.searchObjects(ShadowType.class, query, options, result); + List> foundObjects = provisioningService.searchObjects(ShadowType.class, query, options, task, result); if (LOGGER.isTraceEnabled()) { LOGGER.trace("Uniqueness check of {} resulted in {} results, using query:\n{}", new Object[]{identifier, foundObjects.size(), query.debugDump()}); diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ProvisioningServiceImpl.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ProvisioningServiceImpl.java index 6680d2574af..c3e4e14ff45 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ProvisioningServiceImpl.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ProvisioningServiceImpl.java @@ -483,8 +483,8 @@ private PrismProperty getTokenProperty(ResourceShadowDiscriminator shadowCoordin } @Override - public SearchResultList> searchObjects(Class type, ObjectQuery query, - Collection> options, OperationResult parentResult) throws SchemaException, ObjectNotFoundException, CommunicationException, + public SearchResultList> searchObjects(Class type, ObjectQuery query, + Collection> options, Task task, OperationResult parentResult) throws SchemaException, ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException { OperationResult result = parentResult.createSubresult(ProvisioningService.class.getName() + ".searchObjects"); @@ -512,7 +512,7 @@ public boolean handle(PrismObject object, OperationResult parentResult) { } }; - metadata = searchObjectsIterative(type, query, options, handler, result); + metadata = searchObjectsIterative(type, query, options, handler, task, result); } catch (ConfigurationException e) { ProvisioningUtil.recordFatalError(LOGGER, result, "Could not search objects: configuration problem: " + e.getMessage(), e); @@ -641,7 +641,7 @@ private PrismObject completeObject(Class type, Pris } - public Integer countObjects(Class type, ObjectQuery query, Collection> options, OperationResult parentResult) + public Integer countObjects(Class type, ObjectQuery query, Collection> options, Task task, OperationResult parentResult) throws SchemaException, ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException { @@ -676,7 +676,7 @@ public Integer countObjects(Class type, ObjectQuery qu Integer count; try { - count = getShadowCache(Mode.STANDARD).countObjects(query, result); + count = getShadowCache(Mode.STANDARD).countObjects(query, task, result); result.computeStatus(); } catch (ConfigurationException e) { ProvisioningUtil.recordFatalError(LOGGER, result, null, e); @@ -929,7 +929,7 @@ public OperationResult testResource(String resourceOid) throws ObjectNotFoundExc @SuppressWarnings({ "rawtypes", "unchecked" }) @Override public List> listResourceObjects(String resourceOid, - QName objectClass, ObjectPaging paging, OperationResult parentResult) throws SchemaException, + QName objectClass, ObjectPaging paging, Task task, OperationResult parentResult) throws SchemaException, ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException { final OperationResult result = parentResult.createSubresult(ProvisioningService.class.getName() @@ -962,7 +962,7 @@ public boolean handle(ShadowType shadow) { }; try { - getShadowCache(Mode.STANDARD).searchObjectsIterative(query, null, shadowHandler, false, result); + getShadowCache(Mode.STANDARD).searchObjectsIterative(query, null, shadowHandler, false, task, result); } catch (ConfigurationException ex) { result.recordFatalError(ex.getMessage(), ex); result.cleanupResult(ex); @@ -1023,9 +1023,9 @@ public void finishOperation(PrismObject object, Provis @SuppressWarnings({ "rawtypes", "unchecked" }) @Override - public SearchResultMetadata searchObjectsIterative(final Class type, ObjectQuery query, - Collection> options, - final ResultHandler handler, final OperationResult parentResult) throws SchemaException, + public SearchResultMetadata searchObjectsIterative(final Class type, ObjectQuery query, + Collection> options, + final ResultHandler handler, Task task, final OperationResult parentResult) throws SchemaException, ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException { Validate.notNull(parentResult, "Operation result must not be null."); @@ -1189,7 +1189,7 @@ public boolean handle(ShadowType shadowType) { SearchResultMetadata metadata; try { - metadata = getShadowCache(Mode.STANDARD).searchObjectsIterative(query, options, shadowHandler, true, result); + metadata = getShadowCache(Mode.STANDARD).searchObjectsIterative(query, options, shadowHandler, true, task, result); result.computeStatus(); } catch (ConfigurationException e) { ProvisioningUtil.recordFatalError(LOGGER, result, null, e); @@ -1433,7 +1433,7 @@ public ConstraintsCheckingResult checkConstraints(RefinedObjectClassDefinition s String shadowOid, ResourceShadowDiscriminator resourceShadowDiscriminator, ConstraintViolationConfirmer constraintViolationConfirmer, - OperationResult parentResult) throws CommunicationException, ObjectAlreadyExistsException, SchemaException, SecurityViolationException, ConfigurationException, ObjectNotFoundException { + Task task, OperationResult parentResult) throws CommunicationException, ObjectAlreadyExistsException, SchemaException, SecurityViolationException, ConfigurationException, ObjectNotFoundException { OperationResult result = parentResult.createSubresult(ProvisioningService.class.getName() + ".checkConstraints"); ConstraintsChecker checker = new ConstraintsChecker(); checker.setCacheRepositoryService(cacheRepositoryService); @@ -1446,7 +1446,7 @@ public ConstraintsCheckingResult checkConstraints(RefinedObjectClassDefinition s checker.setResourceShadowDiscriminator(resourceShadowDiscriminator); checker.setConstraintViolationConfirmer(constraintViolationConfirmer); try { - ConstraintsCheckingResult retval = checker.check(result); + ConstraintsCheckingResult retval = checker.check(task, result); result.computeStatus(); return retval; } catch (CommunicationException|ObjectAlreadyExistsException|SchemaException|SecurityViolationException|ConfigurationException|ObjectNotFoundException|RuntimeException e) { diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowCache.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowCache.java index 847fc918bbd..e1faf3f201a 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowCache.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowCache.java @@ -702,12 +702,12 @@ private PrismObject extendShadow(PrismObject shadow, Ope public SearchResultMetadata searchObjectsIterative(ObjectQuery query, - Collection> options, final ShadowHandler handler, - final boolean readFromRepository, final OperationResult parentResult) throws SchemaException, + Collection> options, final ShadowHandler handler, + final boolean readFromRepository, Task task, final OperationResult parentResult) throws SchemaException, ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException { ResourceShadowDiscriminator coordinates = ObjectQueryUtil.getCoordinates(query.getFilter()); - final ProvisioningContext ctx = ctxFactory.create(coordinates, null, parentResult); + final ProvisioningContext ctx = ctxFactory.create(coordinates, task, parentResult); ctx.assertDefinition(); applyDefinition(ctx, query); @@ -934,7 +934,7 @@ private PrismObject createShadowInRepository(ProvisioningContext ctx return repoShadow; } - public Integer countObjects(ObjectQuery query, final OperationResult result) throws SchemaException, + public Integer countObjects(ObjectQuery query, Task task, final OperationResult result) throws SchemaException, ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException { ResourceShadowDiscriminator coordinates = ObjectQueryUtil.getCoordinates(query.getFilter()); @@ -999,7 +999,7 @@ public boolean handle(ShadowType object) { SelectorOptions.createCollection(new ItemPath(ShadowType.F_ASSOCIATION), GetOperationOptions.createRetrieve(RetrieveOption.EXCLUDE)); SearchResultMetadata resultMetadata; try { - resultMetadata = searchObjectsIterative(query, options, handler, false, result); + resultMetadata = searchObjectsIterative(query, options, handler, false, task, result); } catch (SchemaException | ObjectNotFoundException | ConfigurationException | SecurityViolationException e) { result.recordFatalError(e); throw e; @@ -1026,7 +1026,7 @@ public boolean handle(ShadowType object) { Collection> options = SelectorOptions.createCollection(new ItemPath(ShadowType.F_ASSOCIATION), GetOperationOptions.createRetrieve(RetrieveOption.EXCLUDE)); - searchObjectsIterative(query, options, handler, false, result); + searchObjectsIterative(query, options, handler, false, task, result); // TODO: better error handling result.computeStatus(); result.cleanupResult(); diff --git a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestConnectorDiscovery.java b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestConnectorDiscovery.java index f13d00fa916..83270d48812 100644 --- a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestConnectorDiscovery.java +++ b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestConnectorDiscovery.java @@ -45,7 +45,6 @@ import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.xml.ns._public.common.common_3.ConnectorType; -import com.evolveum.prism.xml.ns._public.query_3.PagingType; /** * @author Radovan Semancik @@ -104,7 +103,7 @@ public void testListConnectors() throws Exception{ OperationResult result = new OperationResult(TestConnectorDiscovery.class.getName() + ".listConnectorsTest"); - List> connectors = provisioningService.searchObjects(ConnectorType.class, null, null, result); + List> connectors = provisioningService.searchObjects(ConnectorType.class, null, null, null, result); assertNotNull(connectors); for (PrismObject connector : connectors){ diff --git a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestDummy.java b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestDummy.java index c57b9a9c76f..b0406d7a7d3 100644 --- a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestDummy.java +++ b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestDummy.java @@ -1313,7 +1313,7 @@ public boolean handle(PrismObject object, OperationResult parentResu rememberShadowFetchOperationCount(); // WHEN - provisioningService.searchObjectsIterative(ShadowType.class, query, null, handler, result); + provisioningService.searchObjectsIterative(ShadowType.class, query, null, handler, null, result); // THEN result.computeStatus(); @@ -1334,7 +1334,7 @@ public boolean handle(PrismObject object, OperationResult parentResu rememberShadowFetchOperationCount(); // WHEN - provisioningService.searchObjectsIterative(ShadowType.class, query, null, handler, result); + provisioningService.searchObjectsIterative(ShadowType.class, query, null, handler, null, result); // THEN @@ -1385,7 +1385,7 @@ public boolean handle(PrismObject object, OperationResult parentResu rememberShadowFetchOperationCount(); // WHEN - provisioningService.searchObjectsIterative(ShadowType.class, query, options, handler, result); + provisioningService.searchObjectsIterative(ShadowType.class, query, options, handler, null, result); // THEN result.computeStatus(); @@ -1457,7 +1457,7 @@ public void test114SearchAllShadows() throws Exception { // WHEN List> allShadows = provisioningService.searchObjects(ShadowType.class, - query, null, result); + query, null, null, result); // THEN result.computeStatus(); @@ -1486,7 +1486,7 @@ public void test115CountAllShadows() throws Exception { display("All shadows query", query); // WHEN - Integer count = provisioningService.countObjects(ShadowType.class, query, null, result); + Integer count = provisioningService.countObjects(ShadowType.class, query, null, null, result); // THEN result.computeStatus(); @@ -1510,7 +1510,7 @@ public void test116SearchNullQueryResource() throws Exception { // WHEN List> allResources = provisioningService.searchObjects(ResourceType.class, - new ObjectQuery(), null, result); + new ObjectQuery(), null, null, result); // THEN result.computeStatus(); @@ -1533,7 +1533,7 @@ public void test117CountNullQueryResource() throws Exception { + ".test117CountNullQueryResource"); // WHEN - int count = provisioningService.countObjects(ResourceType.class, new ObjectQuery(), null, result); + int count = provisioningService.countObjects(ResourceType.class, new ObjectQuery(), null, null, result); // THEN result.computeStatus(); @@ -2038,7 +2038,7 @@ public void test151SearchDisabledAccounts() throws Exception { syncServiceMock.reset(); // WHEN - SearchResultList> resultList = provisioningService.searchObjects(ShadowType.class, query, null, result); + SearchResultList> resultList = provisioningService.searchObjects(ShadowType.class, query, null, null, result); // THEN result.computeStatus(); @@ -2157,7 +2157,7 @@ public void test155SearchDisabledAccounts() throws Exception { syncServiceMock.reset(); // WHEN - SearchResultList> resultList = provisioningService.searchObjects(ShadowType.class, query, null, result); + SearchResultList> resultList = provisioningService.searchObjects(ShadowType.class, query, null, null, result); // THEN result.computeStatus(); @@ -2370,7 +2370,7 @@ public void test160SearchLockedAccounts() throws Exception { syncServiceMock.reset(); // WHEN - SearchResultList> resultList = provisioningService.searchObjects(ShadowType.class, query, null, result); + SearchResultList> resultList = provisioningService.searchObjects(ShadowType.class, query, null, null, result); // THEN result.computeStatus(); @@ -2485,7 +2485,7 @@ public void test163SearchLockedAccounts() throws Exception { syncServiceMock.reset(); // WHEN - SearchResultList> resultList = provisioningService.searchObjects(ShadowType.class, query, null, result); + SearchResultList> resultList = provisioningService.searchObjects(ShadowType.class, query, null, null, result); // THEN result.computeStatus(); @@ -2712,7 +2712,7 @@ public boolean handle(PrismObject object, OperationResult parentResu if (useRepo) { repositoryService.searchObjectsIterative(ShadowType.class, query, handler, null, result); } else { - provisioningService.searchObjectsIterative(ShadowType.class, query, options, handler, result); + provisioningService.searchObjectsIterative(ShadowType.class, query, options, handler, null, result); } // THEN diff --git a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestDummySecurity.java b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestDummySecurity.java index 8f5442cee7d..99029cd40ee 100644 --- a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestDummySecurity.java +++ b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestDummySecurity.java @@ -19,10 +19,7 @@ */ package com.evolveum.midpoint.provisioning.test.impl; -import static com.evolveum.midpoint.test.DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_TITLE_NAME; -import static com.evolveum.midpoint.test.DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_FULLNAME_NAME; import static com.evolveum.midpoint.test.util.TestUtil.assertFailure; -import static com.evolveum.midpoint.test.IntegrationTestTools.assertProvisioningAccountShadow; import static com.evolveum.midpoint.test.util.TestUtil.assertSuccess; import static com.evolveum.midpoint.test.IntegrationTestTools.display; import static org.testng.AssertJUnit.assertEquals; @@ -32,105 +29,33 @@ import static org.testng.AssertJUnit.assertTrue; import java.io.File; -import java.io.FileNotFoundException; -import java.util.ArrayList; import java.util.Collection; -import java.util.Date; -import java.util.GregorianCalendar; import java.util.List; -import java.util.Set; -import javax.xml.bind.JAXBException; -import javax.xml.datatype.XMLGregorianCalendar; -import javax.xml.namespace.QName; - -import org.apache.commons.lang.StringUtils; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ContextConfiguration; import org.testng.AssertJUnit; import org.testng.annotations.Test; -import org.w3c.dom.Element; - -import com.evolveum.icf.dummy.resource.DummyAccount; -import com.evolveum.icf.dummy.resource.DummyGroup; -import com.evolveum.icf.dummy.resource.DummyPrivilege; -import com.evolveum.icf.dummy.resource.DummySyncStyle; -import com.evolveum.midpoint.common.monitor.InternalMonitor; -import com.evolveum.midpoint.common.refinery.RefinedAttributeDefinition; -import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition; -import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; + import com.evolveum.midpoint.prism.Containerable; import com.evolveum.midpoint.prism.PrismContainer; -import com.evolveum.midpoint.prism.PrismContainerDefinition; import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.PrismProperty; -import com.evolveum.midpoint.prism.PrismPropertyDefinition; -import com.evolveum.midpoint.prism.PrismPropertyValue; -import com.evolveum.midpoint.prism.delta.ChangeType; -import com.evolveum.midpoint.prism.delta.DiffUtil; -import com.evolveum.midpoint.prism.delta.ItemDelta; import com.evolveum.midpoint.prism.delta.ObjectDelta; -import com.evolveum.midpoint.prism.delta.PropertyDelta; -import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.query.ObjectQuery; -import com.evolveum.midpoint.prism.schema.PrismSchema; -import com.evolveum.midpoint.prism.util.PrismAsserts; -import com.evolveum.midpoint.prism.util.PrismTestUtil; -import com.evolveum.midpoint.prism.xml.XmlTypeConverter; -import com.evolveum.midpoint.provisioning.ProvisioningTestUtil; -import com.evolveum.midpoint.provisioning.api.ResourceObjectShadowChangeDescription; -import com.evolveum.midpoint.provisioning.ucf.api.ConnectorInstance; -import com.evolveum.midpoint.provisioning.ucf.impl.ConnectorFactoryIcfImpl; -import com.evolveum.midpoint.schema.CapabilityUtil; -import com.evolveum.midpoint.schema.DeltaConvertor; -import com.evolveum.midpoint.schema.GetOperationOptions; -import com.evolveum.midpoint.schema.ResultHandler; -import com.evolveum.midpoint.schema.constants.SchemaConstants; -import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition; import com.evolveum.midpoint.schema.processor.ResourceAttribute; -import com.evolveum.midpoint.schema.processor.ResourceAttributeContainer; -import com.evolveum.midpoint.schema.processor.ResourceAttributeDefinition; -import com.evolveum.midpoint.schema.processor.ResourceSchema; import com.evolveum.midpoint.schema.result.OperationResult; -import com.evolveum.midpoint.schema.util.ConnectorTypeUtil; -import com.evolveum.midpoint.schema.util.ObjectQueryUtil; -import com.evolveum.midpoint.schema.util.ObjectTypeUtil; import com.evolveum.midpoint.schema.util.ShadowUtil; -import com.evolveum.midpoint.schema.util.ResourceTypeUtil; import com.evolveum.midpoint.schema.util.SchemaTestConstants; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.test.DummyResourceContoller; import com.evolveum.midpoint.test.IntegrationTestTools; -import com.evolveum.midpoint.test.ObjectChecker; -import com.evolveum.midpoint.test.ProvisioningScriptSpec; import com.evolveum.midpoint.test.util.TestUtil; -import com.evolveum.midpoint.util.exception.CommunicationException; -import com.evolveum.midpoint.util.exception.ConfigurationException; -import com.evolveum.midpoint.util.exception.ObjectAlreadyExistsException; -import com.evolveum.midpoint.util.exception.ObjectNotFoundException; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.exception.SecurityViolationException; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; -import com.evolveum.midpoint.xml.ns._public.common.api_types_3.ObjectModificationType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ActivationStatusType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ActivationType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.CachingMetadataType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.CapabilitiesType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.CapabilityCollectionType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ConnectorType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationProvisioningScriptsType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ProvisioningScriptType; -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.XmlSchemaType; -import com.evolveum.midpoint.xml.ns._public.resource.capabilities_3.ActivationCapabilityType; -import com.evolveum.midpoint.xml.ns._public.resource.capabilities_3.CredentialsCapabilityType; -import com.evolveum.midpoint.xml.ns._public.resource.capabilities_3.ScriptCapabilityType; -import com.evolveum.midpoint.xml.ns._public.resource.capabilities_3.TestConnectionCapabilityType; /** * The test of Provisioning service on the API level. The test is using dummy @@ -353,7 +278,7 @@ public void test310SearchAllShadows() throws Exception { // WHEN List> allShadows = provisioningService.searchObjects(ShadowType.class, - query, null, result); + query, null, null, result); // THEN result.computeStatus(); diff --git a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestDummyUuidNonUniqueName.java b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestDummyUuidNonUniqueName.java index 795ceebc0da..7c7ed7a8e13 100644 --- a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestDummyUuidNonUniqueName.java +++ b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestDummyUuidNonUniqueName.java @@ -22,9 +22,7 @@ import static org.testng.AssertJUnit.assertTrue; import java.io.File; -import java.io.FileNotFoundException; import java.io.IOException; -import java.net.ConnectException; import java.util.List; import javax.xml.namespace.QName; @@ -34,7 +32,6 @@ import org.testng.annotations.Test; import com.evolveum.icf.dummy.resource.DummyAccount; -import com.evolveum.midpoint.prism.ItemDefinition; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismPropertyDefinition; import com.evolveum.midpoint.prism.PrismPropertyValue; @@ -47,11 +44,8 @@ import com.evolveum.midpoint.prism.util.PrismAsserts; import com.evolveum.midpoint.provisioning.ProvisioningTestUtil; import com.evolveum.midpoint.provisioning.ucf.impl.ConnectorFactoryIcfImpl; -import com.evolveum.midpoint.schema.GetOperationOptions; import com.evolveum.midpoint.schema.result.OperationResult; -import com.evolveum.midpoint.schema.util.ShadowUtil; import com.evolveum.midpoint.task.api.Task; -import com.evolveum.midpoint.test.IntegrationTestTools; import com.evolveum.midpoint.test.util.TestUtil; import com.evolveum.midpoint.util.DOMUtil; import com.evolveum.midpoint.util.exception.CommunicationException; @@ -60,8 +54,6 @@ import com.evolveum.midpoint.util.exception.ObjectNotFoundException; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.exception.SecurityViolationException; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ActivationStatusType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ActivationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowKindType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; @@ -206,7 +198,7 @@ private void searchFettucini(int expectedNumberOfFettucinis) throws SchemaExcept ObjectQuery query = new ObjectQuery(); query.setFilter(filter); // WHEN - List> shadows = provisioningService.searchObjects(ShadowType.class, query, null, result); + List> shadows = provisioningService.searchObjects(ShadowType.class, query, null, null, result); assertEquals("Wrong number of Fettucinis found", expectedNumberOfFettucinis, shadows.size()); } diff --git a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestOpenDJ.java b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestOpenDJ.java index a27f4325dc9..0363650bcf2 100644 --- a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestOpenDJ.java +++ b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestOpenDJ.java @@ -96,7 +96,6 @@ import com.evolveum.midpoint.schema.util.SchemaDebugUtil; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.task.api.TaskManager; -import com.evolveum.midpoint.test.DummyResourceContoller; import com.evolveum.midpoint.test.IntegrationTestTools; import com.evolveum.midpoint.test.ldap.OpenDJController; import com.evolveum.midpoint.test.util.MidPointAsserts; @@ -569,7 +568,7 @@ public void test020ListResourceObjects() throws Exception { OperationResult result = new OperationResult(TestOpenDJ.class.getName()+"." + TEST_NAME); // WHEN List> objectList = provisioningService.listResourceObjects( - RESOURCE_OPENDJ_OID, RESOURCE_OPENDJ_ACCOUNT_OBJECTCLASS, null, result); + RESOURCE_OPENDJ_OID, RESOURCE_OPENDJ_ACCOUNT_OBJECTCLASS, null, null, result); // THEN assertNotNull(objectList); assertFalse("Empty list returned",objectList.isEmpty()); @@ -1120,7 +1119,7 @@ public boolean handle(PrismObject prismObject, OperationResult paren }; // WHEN - provisioningService.searchObjectsIterative(ShadowType.class, query, null, handler, result); + provisioningService.searchObjectsIterative(ShadowType.class, query, null, handler, null, result); // THEN display("Count", objects.size()); @@ -1406,7 +1405,7 @@ public boolean handle(PrismObject object, OperationResult parentResu return objectTypeList.add(object.asObjectable()); } - }, result); + }, null, result); // TODO: check result System.out.println("ObjectType list size: " + objectTypeList.size()); @@ -1441,7 +1440,7 @@ public void test201SearchObjects() throws Exception { rememberConnectorSimulatedPagingSearchCount(); // WHEN - SearchResultList> searchResults = provisioningService.searchObjects(ShadowType.class, query, null, result); + SearchResultList> searchResults = provisioningService.searchObjects(ShadowType.class, query, null, null, result); // THEN result.computeStatus(); @@ -1471,7 +1470,7 @@ public void test202SearchObjectsCompexFilter() throws Exception { // WHEN List> objListType = - provisioningService.searchObjects(ShadowType.class, query, null, result); + provisioningService.searchObjects(ShadowType.class, query, null, null, result); // THEN for (PrismObject objType : objListType) { @@ -1503,7 +1502,7 @@ public void test230SearchObjectsPagedNoOffset() throws Exception { // WHEN List> searchResults = - provisioningService.searchObjects(ShadowType.class, query, null, result); + provisioningService.searchObjects(ShadowType.class, query, null, null, result); // THEN result.computeStatus(); @@ -1534,7 +1533,7 @@ public void test231SearchObjectsPagedOffsetZero() throws Exception { // WHEN List> searchResults = - provisioningService.searchObjects(ShadowType.class, query, null, result); + provisioningService.searchObjects(ShadowType.class, query, null, null, result); // THEN result.computeStatus(); @@ -1564,7 +1563,7 @@ public void test232SearchObjectsPagedOffset() throws Exception { rememberConnectorSimulatedPagingSearchCount(); // WHEN - SearchResultList> searchResults = provisioningService.searchObjects(ShadowType.class, query, null, result); + SearchResultList> searchResults = provisioningService.searchObjects(ShadowType.class, query, null, null, result); // THEN result.computeStatus(); @@ -1604,7 +1603,7 @@ public void test250CountObjects() throws Exception { ObjectQuery query = QueryJaxbConvertor.createObjectQuery(ShadowType.class, queryType, prismContext); // WHEN - Integer count = provisioningService.countObjects(ShadowType.class, query, null, result); + Integer count = provisioningService.countObjects(ShadowType.class, query, null, null, result); // THEN result.computeStatus(); @@ -1834,7 +1833,7 @@ public void test330SearchForPosixAccount() throws Exception { // WHEN List> objListType = - provisioningService.searchObjects(ShadowType.class, query, null, result); + provisioningService.searchObjects(ShadowType.class, query, null, null, result); // THEN for (PrismObject objType : objListType) { @@ -2001,7 +2000,7 @@ public void test410CreateLdapGroupAndSearchGroups() throws Exception { // WHEN TestUtil.displayWhen(TEST_NAME); - SearchResultList> resultList = provisioningService.searchObjects(ShadowType.class, query, null, result); + SearchResultList> resultList = provisioningService.searchObjects(ShadowType.class, query, null, null, result); // THEN TestUtil.displayThen(TEST_NAME); diff --git a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestOpenDJNegative.java b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestOpenDJNegative.java index 29fb9108f32..ea2481f0a1e 100644 --- a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestOpenDJNegative.java +++ b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestOpenDJNegative.java @@ -23,7 +23,6 @@ import static org.testng.AssertJUnit.assertNull; import static org.testng.AssertJUnit.assertTrue; -import java.io.File; import java.util.List; import javax.xml.namespace.QName; @@ -247,7 +246,7 @@ public void test120ListResourceObjects() throws Exception { try { // WHEN List> objectList = provisioningService.listResourceObjects( - RESOURCE_OPENDJ_OID, RESOURCE_OPENDJ_ACCOUNT_OBJECTCLASS, null, result); + RESOURCE_OPENDJ_OID, RESOURCE_OPENDJ_ACCOUNT_OBJECTCLASS, null, null, result); AssertJUnit.fail("listResourceObjects succeeded unexpectedly"); } catch (ConfigurationException e) { @@ -276,7 +275,7 @@ public void test121SearchAccounts() throws SchemaException, ObjectNotFoundExcept try { // WHEN - provisioningService.searchObjects(ShadowType.class, query, null, result); + provisioningService.searchObjects(ShadowType.class, query, null, null, result); AssertJUnit.fail("searchObjectsIterative succeeded unexpectedly"); } catch (ConfigurationException e) { @@ -314,7 +313,7 @@ public boolean handle(PrismObject prismObject, OperationResult paren try { // WHEN - provisioningService.searchObjectsIterative(ShadowType.class, query, null, handler, result); + provisioningService.searchObjectsIterative(ShadowType.class, query, null, handler, null, result); AssertJUnit.fail("searchObjectsIterative succeeded unexpectedly"); } catch (ConfigurationException e) { @@ -528,7 +527,7 @@ public void test520ListResourceObjects() throws Exception { try { // WHEN List> objectList = provisioningService.listResourceObjects( - RESOURCE_OPENDJ_OID, RESOURCE_OPENDJ_ACCOUNT_OBJECTCLASS, null, result); + RESOURCE_OPENDJ_OID, RESOURCE_OPENDJ_ACCOUNT_OBJECTCLASS, null, null, result); AssertJUnit.fail("listResourceObjects succeeded unexpectedly"); } catch (CommunicationException e) { @@ -557,7 +556,7 @@ public void test521SearchAccounts() throws SchemaException, ObjectNotFoundExcept try { // WHEN - provisioningService.searchObjects(ShadowType.class, query, null, result); + provisioningService.searchObjects(ShadowType.class, query, null, null, result); AssertJUnit.fail("searchObjectsIterative succeeded unexpectedly"); } catch (CommunicationException e) { @@ -594,7 +593,7 @@ public boolean handle(PrismObject prismObject, OperationResult paren try { // WHEN - provisioningService.searchObjectsIterative(ShadowType.class, query, null, handler, result); + provisioningService.searchObjectsIterative(ShadowType.class, query, null, handler, null, result); AssertJUnit.fail("searchObjectsIterative succeeded unexpectedly"); } catch (CommunicationException e) { diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/util/SimpleTaskAdapter.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/util/SimpleTaskAdapter.java index 4ad8a956f48..0faf6282f9e 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/util/SimpleTaskAdapter.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/util/SimpleTaskAdapter.java @@ -46,6 +46,7 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationResultStatusType; import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationalInformationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ScheduleType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; import com.evolveum.midpoint.xml.ns._public.common.common_3.SynchronizationInformationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ThreadStopActionType; @@ -672,6 +673,21 @@ public IterativeTaskInformation getIterativeTaskInformation() { return null; } + @Override + public OperationalInformationType collectOperationalInformation() { + return null; + } + + @Override + public IterativeTaskInformationType collectIterativeTaskInformation() { + return null; + } + + @Override + public SynchronizationInformationType collectSynchronizationInformation() { + return null; + } + @Override public Long getExpectedTotal() { return null; //To change body of implemented methods use File | Settings | File Templates. @@ -730,4 +746,12 @@ public void recordIterativeOperationEnd(String objectName, String objectDisplayN @Override public void recordIterativeOperationStart(String objectName, String objectDisplayName, QName objectType, String objectOid) { } + + @Override + public void recordIterativeOperationEnd(ShadowType shadow, long started, Throwable exception) { + } + + @Override + public void recordIterativeOperationStart(ShadowType shadow) { + } } diff --git a/repo/task-api/src/main/java/com/evolveum/midpoint/task/api/Task.java b/repo/task-api/src/main/java/com/evolveum/midpoint/task/api/Task.java index 278a3020a7d..3bf9f73d7f7 100644 --- a/repo/task-api/src/main/java/com/evolveum/midpoint/task/api/Task.java +++ b/repo/task-api/src/main/java/com/evolveum/midpoint/task/api/Task.java @@ -945,6 +945,12 @@ void savePendingModifications(OperationResult parentResult) throws ObjectNotFoun IterativeTaskInformation getIterativeTaskInformation(); + OperationalInformationType collectOperationalInformation(); + + IterativeTaskInformationType collectIterativeTaskInformation(); + + SynchronizationInformationType collectSynchronizationInformation(); + void recordState(String message); void recordProvisioningOperation(String resourceOid, String resourceName, QName objectClassName, ProvisioningOperation operation, boolean success, int count, long duration); @@ -957,8 +963,12 @@ void savePendingModifications(OperationResult parentResult) throws ObjectNotFoun void recordSynchronizationOperationStart(String objectName, String objectDisplayName, QName objectType, String objectOid); + void recordIterativeOperationEnd(ShadowType shadow, long started, Throwable exception); + void recordIterativeOperationEnd(String objectName, String objectDisplayName, QName objectType, String objectOid, long started, Throwable exception); + void recordIterativeOperationStart(ShadowType shadow); + void recordIterativeOperationStart(String objectName, String objectDisplayName, QName objectType, String objectOid); void resetOperationalInformation(OperationalInformationType value); diff --git a/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/TaskQuartzImpl.java b/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/TaskQuartzImpl.java index 359e2ac6a92..de63db992c7 100644 --- a/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/TaskQuartzImpl.java +++ b/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/TaskQuartzImpl.java @@ -35,6 +35,7 @@ import com.evolveum.midpoint.prism.delta.PropertyDelta; import com.evolveum.midpoint.prism.delta.ReferenceDelta; import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.query.EqualFilter; import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.prism.query.ObjectQuery; @@ -45,6 +46,7 @@ import com.evolveum.midpoint.schema.statistics.IterativeTaskInformation; import com.evolveum.midpoint.schema.statistics.OperationalInformation; import com.evolveum.midpoint.schema.statistics.ProvisioningOperation; +import com.evolveum.midpoint.schema.statistics.StatisticsUtil; import com.evolveum.midpoint.schema.statistics.SynchronizationInformation; import com.evolveum.midpoint.task.api.LightweightIdentifier; import com.evolveum.midpoint.task.api.LightweightTaskHandler; @@ -73,6 +75,7 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationResultType; import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationalInformationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ScheduleType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; import com.evolveum.midpoint.xml.ns._public.common.common_3.SynchronizationInformationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskBindingType; import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskExecutionStatusType; @@ -93,6 +96,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -123,8 +127,8 @@ public class TaskQuartzImpl implements Task { private PrismObject requestee; // temporary information private OperationalInformation operationalInformation = new OperationalInformation(); - private SynchronizationInformation synchronizationInformation = new SynchronizationInformation(); - private IterativeTaskInformation iterativeTaskInformation = new IterativeTaskInformation(); + private SynchronizationInformation synchronizationInformation; // has to be explicitly enabled + private IterativeTaskInformation iterativeTaskInformation; // has to be explicitly enabled /** * Lightweight asynchronous subtasks. @@ -2553,6 +2557,57 @@ public IterativeTaskInformation getIterativeTaskInformation() { return iterativeTaskInformation; } + @Override + public OperationalInformationType collectOperationalInformation() { + if (operationalInformation == null) { + return null; + } + OperationalInformationType rv = new OperationalInformationType(); + OperationalInformation.addTo(rv, operationalInformation.getAggregatedValue()); + for (Task subtask : getLightweightAsynchronousSubtasks()) { + OperationalInformation info = subtask.getOperationalInformation(); + if (info != null) { + OperationalInformation.addTo(rv, info.getAggregatedValue()); + } + } + rv.setTimestamp(XmlTypeConverter.createXMLGregorianCalendar(new Date())); + return rv; + } + + @Override + public IterativeTaskInformationType collectIterativeTaskInformation() { + if (iterativeTaskInformation == null) { + return null; + } + IterativeTaskInformationType rv = new IterativeTaskInformationType(); + IterativeTaskInformation.addTo(rv, iterativeTaskInformation.getAggregatedValue(), false); + for (Task subtask : getLightweightAsynchronousSubtasks()) { + IterativeTaskInformation info = subtask.getIterativeTaskInformation(); + if (info != null) { + IterativeTaskInformation.addTo(rv, info.getAggregatedValue(), false); + } + } + rv.setTimestamp(XmlTypeConverter.createXMLGregorianCalendar(new Date())); + return rv; + } + + @Override + public SynchronizationInformationType collectSynchronizationInformation() { + if (synchronizationInformation == null) { + return null; + } + SynchronizationInformationType rv = new SynchronizationInformationType(); + SynchronizationInformation.addTo(rv, synchronizationInformation.getAggregatedValue()); + for (Task subtask : getLightweightAsynchronousSubtasks()) { + SynchronizationInformation info = subtask.getSynchronizationInformation(); + if (info != null) { + SynchronizationInformation.addTo(rv, info.getAggregatedValue()); + } + } + rv.setTimestamp(XmlTypeConverter.createXMLGregorianCalendar(new Date())); + return rv; + } + @Override public void recordState(String message) { if (LOGGER.isDebugEnabled()) { // TODO consider this @@ -2571,9 +2626,7 @@ public void recordProvisioningOperation(String resourceOid, String resourceName, @Override public void recordNotificationOperation(String transportName, boolean success, long duration) { - if (operationalInformation != null) { - operationalInformation.recordNotificationOperation(transportName, success, duration); - } + operationalInformation.recordNotificationOperation(transportName, success, duration); } @Override @@ -2584,23 +2637,43 @@ public void recordMappingOperation(String objectOid, String objectName, String m @Override public synchronized void recordSynchronizationOperationEnd(String objectName, String objectDisplayName, QName objectType, String objectOid, long started, Throwable exception, SynchronizationInformation increment) { recordIterativeOperationEnd(objectName, objectDisplayName, objectType, objectOid, started, exception); - synchronizationInformation.recordSynchronizationOperationEnd(objectName, objectDisplayName, objectType, objectOid, started, exception, increment); + if (synchronizationInformation != null) { + synchronizationInformation.recordSynchronizationOperationEnd(objectName, objectDisplayName, objectType, objectOid, started, exception, increment); + } } @Override public synchronized void recordSynchronizationOperationStart(String objectName, String objectDisplayName, QName objectType, String objectOid) { recordIterativeOperationStart(objectName, objectDisplayName, objectType, objectOid); - synchronizationInformation.recordSynchronizationOperationStart(objectName, objectDisplayName, objectType, objectOid); + if (synchronizationInformation != null) { + synchronizationInformation.recordSynchronizationOperationStart(objectName, objectDisplayName, objectType, objectOid); + } } @Override public synchronized void recordIterativeOperationEnd(String objectName, String objectDisplayName, QName objectType, String objectOid, long started, Throwable exception) { - iterativeTaskInformation.recordOperationEnd(objectName, objectDisplayName, objectType, objectOid, started, exception); + if (iterativeTaskInformation != null) { + iterativeTaskInformation.recordOperationEnd(objectName, objectDisplayName, objectType, objectOid, started, exception); + } + } + + @Override + public void recordIterativeOperationEnd(ShadowType shadow, long started, Throwable exception) { + recordIterativeOperationEnd(PolyString.getOrig(shadow.getName()), StatisticsUtil.getDisplayName(shadow), + ShadowType.COMPLEX_TYPE, shadow.getOid(), started, exception); + } + + @Override + public void recordIterativeOperationStart(ShadowType shadow) { + recordIterativeOperationStart(PolyString.getOrig(shadow.getName()), StatisticsUtil.getDisplayName(shadow), + ShadowType.COMPLEX_TYPE, shadow.getOid()); } @Override public synchronized void recordIterativeOperationStart(String objectName, String objectDisplayName, QName objectType, String objectOid) { - iterativeTaskInformation.recordOperationStart(objectName, objectDisplayName, objectType, objectOid); + if (iterativeTaskInformation != null) { + iterativeTaskInformation.recordOperationStart(objectName, objectDisplayName, objectType, objectOid); + } } @Override diff --git a/testing/sanity/src/test/java/com/evolveum/midpoint/testing/sanity/TestSanity.java b/testing/sanity/src/test/java/com/evolveum/midpoint/testing/sanity/TestSanity.java index bed60ee2244..8e33c3ad53d 100644 --- a/testing/sanity/src/test/java/com/evolveum/midpoint/testing/sanity/TestSanity.java +++ b/testing/sanity/src/test/java/com/evolveum/midpoint/testing/sanity/TestSanity.java @@ -137,7 +137,6 @@ import com.evolveum.midpoint.util.exception.ObjectAlreadyExistsException; import com.evolveum.midpoint.util.exception.ObjectNotFoundException; import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.util.exception.SecurityViolationException; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.xml.ns._public.common.api_types_3.ObjectDeltaListType; @@ -1338,7 +1337,7 @@ public boolean handle(PrismObject prismObject, OperationResult paren // WHEN - provisioningService.searchObjectsIterative(ShadowType.class, q, null, handler, result); + provisioningService.searchObjectsIterative(ShadowType.class, q, null, handler, task, result); // THEN diff --git a/testing/sanity/src/test/java/com/evolveum/midpoint/testing/sanity/TestSanityLegacy.java b/testing/sanity/src/test/java/com/evolveum/midpoint/testing/sanity/TestSanityLegacy.java index b294e14ea92..239d68c6f72 100644 --- a/testing/sanity/src/test/java/com/evolveum/midpoint/testing/sanity/TestSanityLegacy.java +++ b/testing/sanity/src/test/java/com/evolveum/midpoint/testing/sanity/TestSanityLegacy.java @@ -35,11 +35,6 @@ import static org.testng.AssertJUnit.fail; import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; import java.util.ArrayList; import java.util.Collection; import java.util.Date; @@ -127,7 +122,6 @@ import com.evolveum.midpoint.test.IntegrationTestTools; import com.evolveum.midpoint.test.ObjectChecker; import com.evolveum.midpoint.test.ldap.OpenDJController; -import com.evolveum.midpoint.test.util.DerbyController; import com.evolveum.midpoint.test.util.TestUtil; import com.evolveum.midpoint.util.DOMUtil; import com.evolveum.midpoint.util.DebugUtil; @@ -137,7 +131,6 @@ import com.evolveum.midpoint.util.exception.ObjectAlreadyExistsException; import com.evolveum.midpoint.util.exception.ObjectNotFoundException; import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.util.exception.SecurityViolationException; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.xml.ns._public.common.api_types_3.ObjectDeltaListType; @@ -1107,7 +1100,7 @@ public boolean handle(PrismObject prismObject, OperationResult paren // WHEN - provisioningService.searchObjectsIterative(ShadowType.class, q, null, handler, result); + provisioningService.searchObjectsIterative(ShadowType.class, q, null, handler, task, result); // THEN