Skip to content

Commit

Permalink
Merge branch 'master' of https://github.com/Evolveum/midpoint
Browse files Browse the repository at this point in the history
  • Loading branch information
KaterynaHonchar committed Mar 5, 2019
2 parents 53c6d50 + a23ebb9 commit 96e1716
Show file tree
Hide file tree
Showing 2 changed files with 105 additions and 13 deletions.
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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{
Expand Down
Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -43,37 +50,68 @@
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<QName> supportedRelations, AjaxRequestTarget target) {
Task operationalTask = modelServiceLocator.createSimpleTask(getTaskName("Recompute", scope));
executeMemberOperation(modelServiceLocator, operationalTask, FocusType.COMPLEX_TYPE, query, null,
TaskCategory.RECOMPUTATION, target);

}

public static <R extends AbstractRoleType> void unassignMembersPerformed(PageBase pageBase, R targetObject, QueryScope scope, ObjectQuery query, Collection<QName> 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 <R extends AbstractRoleType> void unassignOtherOrgMembersPerformed(PageBase pageBase, R targetObject, QueryScope scope, ObjectQuery query, Collection<QName> relations, AjaxRequestTarget target) {
unassignMembersPerformed(pageBase, targetObject, scope, query, relations, ObjectType.COMPLEX_TYPE, target);
}

public static <R extends AbstractRoleType> void unassignOtherOrgMembersPerformed(PageBase pageBase, R targetObject, QueryScope scope, ObjectQuery query, Collection<QName> 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 <R extends AbstractRoleType> void unassignMembersPerformed(PageBase pageBase, R targetObject, QueryScope scope, ObjectQuery query, Collection<QName> 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<Object> 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<ActionExpressionType>(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) {
Expand Down Expand Up @@ -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());
}

}

0 comments on commit 96e1716

Please sign in to comment.