diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebComponentUtil.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebComponentUtil.java index 1d120e00970..dc9c5e2c67d 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebComponentUtil.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebComponentUtil.java @@ -63,6 +63,7 @@ import com.evolveum.midpoint.schema.*; import com.evolveum.midpoint.schema.util.LocalizationUtil; import com.evolveum.midpoint.task.api.Task; +import com.evolveum.midpoint.task.api.TaskBinding; import com.evolveum.midpoint.util.*; import com.evolveum.midpoint.util.exception.*; import com.evolveum.midpoint.web.component.DateLabelComponent; @@ -77,6 +78,7 @@ import com.evolveum.midpoint.web.page.admin.valuePolicy.PageValuePolicy; import com.evolveum.midpoint.web.util.ObjectTypeGuiDescriptor; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; +import com.evolveum.midpoint.xml.ns._public.model.scripting_3.ScriptingExpressionType; import com.evolveum.prism.xml.ns._public.types_3.ObjectDeltaType; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang.StringUtils; @@ -134,6 +136,7 @@ import com.evolveum.midpoint.security.api.AuthorizationConstants; import com.evolveum.midpoint.security.api.MidPointPrincipal; import com.evolveum.midpoint.task.api.TaskCategory; +import com.evolveum.midpoint.task.api.TaskExecutionStatus; import com.evolveum.midpoint.util.logging.LoggingUtils; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; @@ -620,6 +623,40 @@ public static TaskType createSingleRecurrenceTask(String taskName, QName applica } return task; } + + public static void executeBulkAction(PageBase pageBase, ScriptingExpressionType script, Task task, OperationResult result ) + throws SchemaException, SecurityViolationException, ObjectNotFoundException, ExpressionEvaluationException, + CommunicationException, ConfigurationException{ + + pageBase.getScriptingService().evaluateExpressionInBackground(script, task, result); + } + + public static void executeMemberOperation(Task operationalTask, QName type, ObjectQuery memberQuery, + ScriptingExpressionType script, OperationResult parentResult, PageBase pageBase) throws SchemaException { + + MidPointPrincipal owner = SecurityUtils.getPrincipalUser(); + operationalTask.setOwner(owner.getUser().asPrismObject()); + + operationalTask.setBinding(TaskBinding.LOOSE); + operationalTask.setInitialExecutionStatus(TaskExecutionStatus.RUNNABLE); + operationalTask.setThreadStopAction(ThreadStopActionType.RESTART); + ScheduleType schedule = new ScheduleType(); + schedule.setMisfireAction(MisfireActionType.EXECUTE_IMMEDIATELY); + operationalTask.makeSingle(schedule); + operationalTask.setName(WebComponentUtil.createPolyFromOrigString(parentResult.getOperation())); + + try { + executeBulkAction(pageBase, script, operationalTask, parentResult); + parentResult.recordInProgress(); + parentResult.setBackgroundTaskOid(operationalTask.getOid()); + pageBase.showResult(parentResult); + } catch (ObjectNotFoundException | SchemaException + | ExpressionEvaluationException | CommunicationException | ConfigurationException + | SecurityViolationException e) { + parentResult.recordFatalError(pageBase.createStringResource("WebComponentUtil.message.startPerformed.fatalError.submit").getString(), e); + LoggingUtils.logUnexpectedException(LOGGER, "Couldn't submit bulk action to execution", e); + } + } public static void executeMemberOperation(Task operationalTask, QName type, ObjectQuery memberQuery, ObjectDelta delta, String category, OperationResult parentResult, PageBase pageBase) throws SchemaException{ diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/MemberOperationsHelper.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/MemberOperationsHelper.java index 907ee7204ea..203c785d8a5 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/MemberOperationsHelper.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/MemberOperationsHelper.java @@ -6,6 +6,7 @@ import java.util.List; import java.util.Set; +import javax.xml.bind.JAXBElement; import javax.xml.namespace.QName; import com.evolveum.midpoint.prism.query.QueryFactory; @@ -18,18 +19,24 @@ import com.evolveum.midpoint.gui.api.util.WebComponentUtil; import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils; import com.evolveum.midpoint.model.api.ModelPublicConstants; +import com.evolveum.midpoint.prism.MutablePrismPropertyDefinition; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismObjectDefinition; +import com.evolveum.midpoint.prism.PrismPropertyDefinition; import com.evolveum.midpoint.prism.PrismReferenceValue; +import com.evolveum.midpoint.prism.PrismValue; import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.query.builder.S_AtomicFilterExit; 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.ObjectTypeUtil; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.task.api.TaskCategory; +import com.evolveum.midpoint.util.DOMUtil; +import com.evolveum.midpoint.util.QNameUtil; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.logging.LoggingUtils; import com.evolveum.midpoint.util.logging.Trace; @@ -43,12 +50,23 @@ 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.OrgType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleType; import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType; +import com.evolveum.midpoint.xml.ns._public.model.scripting_3.ActionExpressionType; +import com.evolveum.midpoint.xml.ns._public.model.scripting_3.ActionParameterValueType; +import com.evolveum.midpoint.xml.ns._public.model.scripting_3.ScriptingExpressionType; +import com.evolveum.midpoint.xml.ns._public.model.scripting_3.SearchExpressionType; +import com.evolveum.prism.xml.ns._public.query_3.QueryType; +import com.evolveum.prism.xml.ns._public.types_3.RawType; public class MemberOperationsHelper { private static final Trace LOGGER = TraceManager.getTrace(AbstractRoleMemberPanel.class); + private static final String UNASSIGN_OPERATION = "unassign"; + private static final String ROLE_PARAMETER = "role"; + private static final String RELATION_PARAMETER = "relation"; + public static void recomputeMembersPerformed(PageBase modelServiceLocator, QueryScope scope, ObjectQuery query, Collection supportedRelations, AjaxRequestTarget target) { Task operationalTask = modelServiceLocator.createSimpleTask(getTaskName("Recompute", scope)); executeMemberOperation(modelServiceLocator, operationalTask, FocusType.COMPLEX_TYPE, query, null, @@ -56,24 +74,44 @@ public static void recomputeMembersPerformed(PageBase modelServiceLocator, Query } - public static void unassignMembersPerformed(PageBase pageBase, R targetObject, QueryScope scope, ObjectQuery query, Collection relation, QName type, AjaxRequestTarget target) { - Task operationalTask = pageBase.createSimpleTask(getTaskName("Remove", scope)); - ObjectDelta delta = prepareAssignmentDelta(targetObject, type, relation, MemberOperation.REMOVE, pageBase.getPrismContext(), operationalTask.getResult()); - executeMemberOperation(pageBase, operationalTask, type, query, delta, - TaskCategory.EXECUTE_CHANGES, target); - + public static void unassignOtherOrgMembersPerformed(PageBase pageBase, R targetObject, QueryScope scope, ObjectQuery query, Collection relations, AjaxRequestTarget target) { + unassignMembersPerformed(pageBase, targetObject, scope, query, relations, ObjectType.COMPLEX_TYPE, target); } - public static void unassignOtherOrgMembersPerformed(PageBase pageBase, R targetObject, QueryScope scope, ObjectQuery query, Collection relations, AjaxRequestTarget target) { - Task operationalTask = pageBase.createSimpleTask(getTaskName("Remove", scope, false)); - ObjectDelta delta = prepareObjectTypeDelta(targetObject, relations, MemberOperation.REMOVE, operationalTask.getResult(), pageBase.getPrismContext()); - if (delta == null) { - return; + public static void unassignMembersPerformed(PageBase pageBase, R targetObject, QueryScope scope, ObjectQuery query, Collection relations, QName type, AjaxRequestTarget target) { + Task operationalTask = pageBase.createSimpleTask(getTaskName("Remove", scope)); + + SearchExpressionType script = new SearchExpressionType(); + script.setType(type); + ActionExpressionType expression = new ActionExpressionType(); + expression.setType(UNASSIGN_OPERATION); + + //hack using fake definition because of type + PrismPropertyDefinition def = pageBase.getPrismContext().definitionFactory().createPropertyDefinition( + AbstractRoleType.F_NAME, DOMUtil.XSD_STRING); + PrismValue value = pageBase.getPrismContext().itemFactory().createValue(targetObject.getOid()); + try { + value.applyDefinition(def); + } catch (SchemaException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); } - executeMemberOperation(pageBase, operationalTask, ObjectType.COMPLEX_TYPE, - query, delta, TaskCategory.EXECUTE_CHANGES, target); + expression.parameter(new ActionParameterValueType().name(ROLE_PARAMETER).value( + new RawType(value, DOMUtil.XSD_STRING, pageBase.getPrismContext()))); + relations.forEach(relation -> { + expression.parameter(new ActionParameterValueType().name(RELATION_PARAMETER).value(QNameUtil.qNameToUri(relation))); + }); + script.setScriptingExpression(new JAXBElement(SchemaConstants.S_ACTION, + ActionExpressionType.class, expression)); + try { + script.setQuery(pageBase.getQueryConverter().createQueryType(query)); + } catch (SchemaException e) { + e.printStackTrace(); //TODO + } + executeMemberOperation(pageBase, operationalTask, type, query, script, target); + } public static void deleteMembersPerformed(PageBase pageBase, QueryScope scope, ObjectQuery query, QName type, AjaxRequestTarget target) { @@ -343,5 +381,22 @@ protected static void executeMemberOperation(PageBase modelServiceLocator, Task target.add(modelServiceLocator.getFeedbackPanel()); } + + protected static void executeMemberOperation(PageBase modelServiceLocator, Task operationalTask, QName type, ObjectQuery memberQuery, + ScriptingExpressionType script, AjaxRequestTarget target) { + + OperationResult parentResult = operationalTask.getResult(); + + try { + WebComponentUtil.executeMemberOperation(operationalTask, type, memberQuery, script, parentResult, modelServiceLocator); + } catch (SchemaException e) { + parentResult.recordFatalError(parentResult.getOperation(), e); + LoggingUtils.logUnexpectedException(LOGGER, + "Failed to execute operation " + parentResult.getOperation(), e); + target.add(modelServiceLocator.getFeedbackPanel()); + } + + target.add(modelServiceLocator.getFeedbackPanel()); + } }