Skip to content

Commit

Permalink
"Cleanup Activiti processes" functionality
Browse files Browse the repository at this point in the history
  • Loading branch information
mederly committed Apr 20, 2017
1 parent ac3274f commit a214a68
Show file tree
Hide file tree
Showing 11 changed files with 172 additions and 87 deletions.
Expand Up @@ -144,6 +144,7 @@ <h3 class="box-title"><wicket:message key="PageAbout.title.jvmProperties"/></h3>
<a class="btn btn-default" wicket:id="testRepositoryCheckOrgClosure"/>
<a class="btn btn-default" wicket:id="reindexRepositoryObjects"/>
<a class="btn btn-default" wicket:id="testProvisioning"/>
<a class="btn btn-default" wicket:id="cleanupActivitiProcesses" />
</div>

</wicket:extend>
Expand Down
Expand Up @@ -19,6 +19,7 @@
import com.evolveum.midpoint.gui.api.model.LoadableModel;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.model.api.ModelPublicConstants;
import com.evolveum.midpoint.model.api.WorkflowService;
import com.evolveum.midpoint.schema.LabeledString;
import com.evolveum.midpoint.schema.ProvisioningDiag;
import com.evolveum.midpoint.schema.RepositoryDiag;
Expand Down Expand Up @@ -70,6 +71,7 @@ public class PageAbout extends PageAdminConfiguration {
private static final String OPERATION_TEST_REPOSITORY_CHECK_ORG_CLOSURE = DOT_CLASS + "testRepositoryCheckOrgClosure";
private static final String OPERATION_GET_REPO_DIAG = DOT_CLASS + "getRepoDiag";
private static final String OPERATION_SUBMIT_REINDEX = DOT_CLASS + "submitReindex";
private static final String OPERATION_CLEANUP_ACTIVITI_PROCESSES = DOT_CLASS + "cleanupActivitiProcesses";
private static final String OPERATION_GET_PROVISIONING_DIAG = DOT_CLASS + "getProvisioningDiag";

private static final String ID_BUILD = "build";
Expand All @@ -81,6 +83,7 @@ public class PageAbout extends PageAdminConfiguration {
private static final String ID_TEST_REPOSITORY_CHECK_ORG_CLOSURE = "testRepositoryCheckOrgClosure";
private static final String ID_REINDEX_REPOSITORY_OBJECTS = "reindexRepositoryObjects";
private static final String ID_TEST_PROVISIONING = "testProvisioning";
private static final String ID_CLEANUP_ACTIVITI_PROCESSES = "cleanupActivitiProcesses";
private static final String ID_IMPLEMENTATION_SHORT_NAME = "implementationShortName";
private static final String ID_IMPLEMENTATION_DESCRIPTION = "implementationDescription";
private static final String ID_IS_EMBEDDED = "isEmbedded";
Expand Down Expand Up @@ -255,6 +258,16 @@ public void onClick(AjaxRequestTarget target) {
}
};
add(testProvisioning);

AjaxButton cleanupActivitiProcesses = new AjaxButton(ID_CLEANUP_ACTIVITI_PROCESSES,
createStringResource("PageAbout.button.cleanupActivitiProcesses")) {

@Override
public void onClick(AjaxRequestTarget target) {
cleanupActivitiProcessesPerformed(target);
}
};
add(cleanupActivitiProcesses);
}

private RepositoryDiag loadRepoDiagModel() {
Expand Down Expand Up @@ -372,6 +385,20 @@ private void testProvisioningPerformed(AjaxRequestTarget target) {
target.add(getFeedbackPanel());
}

private void cleanupActivitiProcessesPerformed(AjaxRequestTarget target) {
OperationResult result = new OperationResult(OPERATION_CLEANUP_ACTIVITI_PROCESSES);
try {
WorkflowService workflowService = getWorkflowService();
workflowService.cleanupActivitiProcesses(result);
} catch (SecurityViolationException|SchemaException|RuntimeException e) {
result.recordFatalError(e);
} finally {
result.computeStatusIfUnknown();
}
showResult(result);
target.add(getFeedbackPanel());
}

/**
* It's here only because of some IDEs - it's not properly filtering resources during maven build.
* "describe" variable is not replaced.
Expand Down
Expand Up @@ -940,6 +940,7 @@ OrgUnitBrowser.search=Search
OrgUnitBrowser.title=Choose new parent for org. unit
PageAbout.allRightsReserved=&copy;2014 Evolveum.
PageAbout.button.testProvisioning=Provisioning self test
PageAbout.button.cleanupActivitiProcesses=Clean-up Activiti processes
PageAbout.button.testRepositoryCheckOrgClosure=Check and repair org closure consistency
PageAbout.button.reindexRepositoryObjects=Reindex repository objects
PageAbout.button.testRepository=Repository self test
Expand Down
Expand Up @@ -72,7 +72,8 @@ public enum ModelAuthorizationAction implements DisplayableValue<String> {
DELEGATE_OWN_WORK_ITEMS("delegateOwnWorkItems", "Delegate own work items", "DELEGATE_OWN_WORK_ITEMS_HELP"),
READ_ALL_WORK_ITEMS("readAllWorkItems", "Read all work items", "READ_ALL_WORK_ITEMS_HELP"), // currently not implemented seriously
STOP_APPROVAL_PROCESS_INSTANCE("stopApprovalProcessInstance", "Stop approval process instance", "STOP_APPROVAL_PROCESS_INSTANCE_HELP"),

CLEANUP_PROCESS_INSTANCES("cleanupProcessInstances", "Cleanup process instances", "CLEANUP_PROCESS_INSTANCES_HELP"),

AUDIT_READ("auditRead", "Audit Read", "AUDIT_READ_HELP"),
// Authorization to create a user-level (custom) audit record. Does not apply to internal records that are created automatically by the model without
// any special authorization
Expand Down
Expand Up @@ -36,4 +36,6 @@ void stopProcessInstance(String instanceId, String username, OperationResult par

void delegateWorkItem(String workItemId, List<ObjectReferenceType> delegates, WorkItemDelegationMethodType method,
OperationResult parentResult) throws ObjectNotFoundException, SecurityViolationException, SchemaException;

void cleanupActivitiProcesses(OperationResult parentResult) throws SchemaException, SecurityViolationException;
}
Expand Up @@ -17,6 +17,7 @@
package com.evolveum.midpoint.model.api.expr;

import com.evolveum.midpoint.model.api.ModelExecuteOptions;
import com.evolveum.midpoint.model.api.WorkflowService;
import com.evolveum.midpoint.model.api.context.ModelContext;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.crypto.EncryptionException;
Expand Down Expand Up @@ -1054,4 +1055,6 @@ List<ObjectReferenceType> getMembersAsReferences(String orgOid)
MidPointPrincipal getPrincipal() throws SecurityViolationException;

String getChannel();

WorkflowService getWorkflowService();
}
Expand Up @@ -2051,7 +2051,14 @@ public void delegateWorkItem(String workItemId, List<ObjectReferenceType> delega
OperationResult parentResult) throws ObjectNotFoundException, SecurityViolationException, SchemaException {
getWorkflowManagerChecked().delegateWorkItem(workItemId, delegates, method, parentResult);
}
//endregion

@Override
public void cleanupActivitiProcesses(OperationResult parentResult) throws SchemaException, SecurityViolationException {
securityEnforcer.authorize(ModelAuthorizationAction.CLEANUP_PROCESS_INSTANCES.getUrl(), null, null, null, null, null, parentResult);
getWorkflowManagerChecked().cleanupActivitiProcesses(parentResult);
}

//endregion

//region Scripting (bulk actions)
@Deprecated
Expand Down
Expand Up @@ -19,78 +19,55 @@
import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition;
import com.evolveum.midpoint.common.refinery.RefinedResourceSchema;
import com.evolveum.midpoint.common.refinery.RefinedResourceSchemaImpl;
import com.evolveum.midpoint.model.api.ModelExecuteOptions;
import com.evolveum.midpoint.model.api.ModelService;
import com.evolveum.midpoint.model.api.WorkflowService;
import com.evolveum.midpoint.model.api.context.ModelContext;
import com.evolveum.midpoint.model.api.context.SynchronizationPolicyDecision;
import com.evolveum.midpoint.model.api.expr.MidpointFunctions;
import com.evolveum.midpoint.model.common.expression.script.ScriptExpressionEvaluationContext;
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.LensProjectionContext;
import com.evolveum.midpoint.model.impl.lens.SynchronizationIntent;
import com.evolveum.midpoint.prism.*;
import com.evolveum.midpoint.prism.crypto.EncryptionException;
import com.evolveum.midpoint.prism.crypto.Protector;
import com.evolveum.midpoint.prism.delta.ItemDelta;
import com.evolveum.midpoint.prism.delta.ObjectDelta;
import com.evolveum.midpoint.prism.marshaller.XPathHolder;
import com.evolveum.midpoint.prism.match.DefaultMatchingRule;
import com.evolveum.midpoint.prism.match.PolyStringOrigMatchingRule;
import com.evolveum.midpoint.prism.marshaller.XPathHolder;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.prism.polystring.PolyString;
import com.evolveum.midpoint.prism.query.AndFilter;
import com.evolveum.midpoint.prism.query.EqualFilter;
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.prism.query.RefFilter;
import com.evolveum.midpoint.prism.query.builder.QueryBuilder;
import com.evolveum.midpoint.provisioning.api.ProvisioningService;
import com.evolveum.midpoint.repo.api.RepositoryService;
import com.evolveum.midpoint.schema.DeltaConvertor;
import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.ResourceShadowDiscriminator;
import com.evolveum.midpoint.schema.ResultHandler;
import com.evolveum.midpoint.schema.SelectorOptions;
import com.evolveum.midpoint.schema.*;
import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.util.*;
import com.evolveum.midpoint.security.api.MidPointPrincipal;
import com.evolveum.midpoint.security.api.SecurityEnforcer;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.util.Holder;
import com.evolveum.midpoint.util.exception.CommunicationException;
import com.evolveum.midpoint.util.exception.ConfigurationException;
import com.evolveum.midpoint.util.exception.ExpressionEvaluationException;
import com.evolveum.midpoint.util.exception.ObjectAlreadyExistsException;
import com.evolveum.midpoint.util.exception.ObjectNotFoundException;
import com.evolveum.midpoint.util.exception.PolicyViolationException;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.util.exception.SecurityViolationException;
import com.evolveum.midpoint.util.exception.SystemException;
import com.evolveum.midpoint.util.exception.*;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
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.PasswordCapabilityType;

import com.evolveum.prism.xml.ns._public.types_3.ObjectDeltaType;
import com.evolveum.prism.xml.ns._public.types_3.PolyStringType;
import com.evolveum.prism.xml.ns._public.types_3.ProtectedStringType;
import org.apache.commons.lang.Validate;
import org.jetbrains.annotations.NotNull;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

import com.evolveum.midpoint.model.api.ModelExecuteOptions;
import com.evolveum.midpoint.model.api.ModelService;
import com.evolveum.midpoint.model.common.expression.script.ScriptExpressionEvaluationContext;
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.LensProjectionContext;
import com.evolveum.midpoint.model.impl.lens.SynchronizationIntent;
import com.evolveum.prism.xml.ns._public.types_3.ObjectDeltaType;
import com.evolveum.prism.xml.ns._public.types_3.PolyStringType;
import com.evolveum.prism.xml.ns._public.types_3.ProtectedStringType;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.stream.Collectors;

import javax.xml.namespace.QName;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
Expand All @@ -100,6 +77,11 @@
import javax.xml.stream.events.EndElement;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.stream.Collectors;

/**
* @author semancik
Expand All @@ -110,16 +92,16 @@ public class MidpointFunctionsImpl implements MidpointFunctions {

private static final Trace LOGGER = TraceManager.getTrace(MidpointFunctionsImpl.class);

@Autowired(required=true)
@Autowired
private PrismContext prismContext;

@Autowired(required=true)
@Autowired
private ModelService modelService;

@Autowired(required=true)
@Autowired
private ModelObjectResolver modelObjectResolver;

@Autowired(required=true)
@Autowired
@Qualifier("cacheRepositoryService")
private RepositoryService repositoryService;

Expand All @@ -129,13 +111,16 @@ public class MidpointFunctionsImpl implements MidpointFunctions {
@Autowired
private SecurityEnforcer securityEnforcer;

@Autowired(required = true)
@Autowired
private transient Protector protector;

@Autowired
private OrgStructFunctionsImpl orgStructFunctions;

public String hello(String name) {

@Autowired
private WorkflowService workflowService;

public String hello(String name) {
return "Hello "+name;
}

Expand All @@ -148,7 +133,6 @@ public List<String> toList(String... s) {
return Arrays.asList(s);
}


@Override
public UserType getUserByOid(String oid) throws ObjectNotFoundException, SchemaException {
return repositoryService.getObject(UserType.class, oid, null, new OperationResult("getUserByOid")).asObjectable();
Expand Down Expand Up @@ -1290,4 +1274,9 @@ public String getChannel() {
Task task = getCurrentTask();
return task != null ? task.getChannel() : null;
}

@Override
public WorkflowService getWorkflowService() {
return workflowService;
}
}
Expand Up @@ -120,4 +120,6 @@ ChangesByState getChangesByState(TaskType childTask, TaskType rootTask, ModelInt
throws SchemaException, ObjectNotFoundException;

void synchronizeWorkflowRequests(OperationResult parentResult);

void cleanupActivitiProcesses(OperationResult parentResult) throws SchemaException;
}
Expand Up @@ -65,38 +65,17 @@ public class WorkflowManagerImpl implements WorkflowManager, TaskDeletionListene

private static final transient Trace LOGGER = TraceManager.getTrace(WorkflowManagerImpl.class);

@Autowired(required = true)
private PrismContext prismContext;

@Autowired(required = true)
private WfConfiguration wfConfiguration;

@Autowired(required = true)
private ProcessInstanceProvider processInstanceProvider;

@Autowired(required = true)
private ProcessInstanceManager processInstanceManager;

@Autowired(required = true)
private WfTaskController wfTaskController;

@Autowired(required = true)
private WorkItemProvider workItemProvider;

@Autowired(required = true)
private WorkItemManager workItemManager;

@Autowired(required = true)
private WfTaskUtil wfTaskUtil;

@Autowired(required = true)
private MiscDataUtil miscDataUtil;

@Autowired(required = true)
private SystemObjectCache systemObjectCache;

@Autowired(required = true)
private TaskManager taskManager;
@Autowired private PrismContext prismContext;
@Autowired private WfConfiguration wfConfiguration;
@Autowired private ProcessInstanceProvider processInstanceProvider;
@Autowired private ProcessInstanceManager processInstanceManager;
@Autowired private WfTaskController wfTaskController;
@Autowired private WorkItemProvider workItemProvider;
@Autowired private WorkItemManager workItemManager;
@Autowired private WfTaskUtil wfTaskUtil;
@Autowired private MiscDataUtil miscDataUtil;
@Autowired private SystemObjectCache systemObjectCache;
@Autowired private TaskManager taskManager;

private static final String DOT_INTERFACE = WorkflowManager.class.getName() + ".";

Expand Down Expand Up @@ -280,4 +259,16 @@ public ChangesByState getChangesByState(TaskType childTask, TaskType rootTask, M
return miscDataUtil.getChangesByStateForChild(childTask, rootTask, modelInteractionService, prismContext, result);
}

@Override
public void cleanupActivitiProcesses(OperationResult parentResult) throws SchemaException {
OperationResult result = parentResult.createSubresult(DOT_INTERFACE + ".cleanupActivitiProcesses");
try {
processInstanceManager.cleanupActivitiProcesses(result);
} catch (Throwable t) {
result.recordFatalError("Couldn't cleanup Activiti processes: " + t.getMessage(), t);
throw t;
} finally {
result.recordSuccessIfUnknown();
}
}
}

0 comments on commit a214a68

Please sign in to comment.