Skip to content

Commit

Permalink
Removed obsolete ApprovalSchema/ApprovalLevel classes. Moved from 'le…
Browse files Browse the repository at this point in the history
…vel' to 'stage'-related names in ItemApproval BPMN process.
  • Loading branch information
mederly committed Apr 6, 2017
1 parent 295f29f commit b086ca3
Show file tree
Hide file tree
Showing 31 changed files with 230 additions and 347 deletions.
Expand Up @@ -36,7 +36,7 @@
import com.evolveum.midpoint.web.page.admin.workflow.dto.WorkItemDto;
import com.evolveum.midpoint.web.session.UserProfileStorage;
import com.evolveum.midpoint.web.util.OnePageParameterEncoder;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ApprovalLevelType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ApprovalStageDefinitionType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType;
import org.apache.wicket.AttributeModifier;
Expand Down Expand Up @@ -211,7 +211,7 @@ public void onClick(AjaxRequestTarget target) {
add(additionalInformation);

WorkItemDto dto = getModelObject();
ApprovalLevelType level = WfContextUtil.getCurrentApprovalLevel(dto.getWorkflowContext());
ApprovalStageDefinitionType level = WfContextUtil.getCurrentStageDefinition(dto.getWorkflowContext());
if (level != null && level.getFormRef() != null && level.getFormRef().getOid() != null) {
String formOid = level.getFormRef().getOid();
ObjectType focus = dto.getFocus(pageBase);
Expand Down
Expand Up @@ -158,19 +158,19 @@ public static List<SchemaAttachedPolicyRuleType> getAttachedPolicyRules(WfContex
.collect(Collectors.toList());
}

public static ApprovalLevelType getCurrentApprovalLevel(WfContextType wfc) {
public static ApprovalStageDefinitionType getCurrentStageDefinition(WfContextType wfc) {
if (wfc == null || wfc.getStageNumber() == null) {
return null;
}
return getApprovalLevel(wfc, wfc.getStageNumber());
return getStageDefinition(wfc, wfc.getStageNumber());
}

public static ApprovalLevelType getApprovalLevel(WfContextType wfc, int stageNumber) {
public static ApprovalStageDefinitionType getStageDefinition(WfContextType wfc, int stageNumber) {
ItemApprovalProcessStateType info = getItemApprovalProcessInfo(wfc);
if (info == null || info.getApprovalSchema() == null) {
return null;
}
List<ApprovalLevelType> levels = info.getApprovalSchema().getLevel().stream()
List<ApprovalStageDefinitionType> levels = info.getApprovalSchema().getLevel().stream()
.filter(level -> level.getOrder() != null && level.getOrder() == stageNumber)
.collect(Collectors.toList());
if (levels.size() > 1) {
Expand Down Expand Up @@ -230,14 +230,14 @@ public static String getCurrentStageOutcome(WfContextType wfc, List<StageComplet
return event.getOutcome();
}

public static String getLevelDiagName(ApprovalLevelType level) {
public static String getStageDiagName(ApprovalStageDefinitionType level) {
return level.getOrder() + ":" + level.getName()
+ (level.getDisplayName() != null ? " (" + level.getDisplayName() + ")" : "");
}

public static void orderAndRenumberLevels(ApprovalSchemaType schema) {
public static void orderAndRenumberStages(ApprovalSchemaType schema) {
// Sorting uses set(..) method which is not available on prism structures. So we do sort on a copy (ArrayList).
List<ApprovalLevelType> levels = new ArrayList<>(schema.getLevel());
List<ApprovalStageDefinitionType> levels = new ArrayList<>(schema.getLevel());
levels.sort(Comparator.comparing(level -> level.getOrder(), Comparator.nullsLast(Comparator.naturalOrder())));
for (int i = 0; i < levels.size(); i++) {
levels.get(i).setOrder(i+1);
Expand All @@ -248,7 +248,7 @@ public static void orderAndRenumberLevels(ApprovalSchemaType schema) {

public static void checkLevelsOrdering(ApprovalSchemaType schema) {
for (int i = 0; i < schema.getLevel().size(); i++) {
ApprovalLevelType level = schema.getLevel().get(i);
ApprovalStageDefinitionType level = schema.getLevel().get(i);
if (level.getOrder() == null) {
throw new IllegalStateException("Level without order: " + level);
}
Expand Down
Expand Up @@ -53,7 +53,7 @@
<xsd:sequence>
<xsd:element name="name" type="xsd:string" minOccurs="0"/>
<xsd:element name="description" type="xsd:string" minOccurs="0"/>
<xsd:element name="level" type="c:ApprovalLevelType" minOccurs="1" maxOccurs="unbounded">
<xsd:element name="level" type="c:ApprovalStageDefinitionType" minOccurs="1" maxOccurs="unbounded">
<xsd:annotation>
<xsd:documentation>
Levels, or stages, of the approval process.
Expand All @@ -63,7 +63,7 @@
</xsd:sequence>
</xsd:complexType>

<xsd:complexType name="ApprovalLevelType">
<xsd:complexType name="ApprovalStageDefinitionType">
<xsd:annotation>
<xsd:documentation>
One "level" (or stage) in the approval process.
Expand Down
Expand Up @@ -316,7 +316,7 @@ public void delegateWorkItem(String workItemId, List<ObjectReferenceType> delega
ActivitiUtil.fillInWorkItemEvent(event, principal, workItemId, variables, prismContext);
MidpointUtil.recordEventInTask(event, null, ActivitiUtil.getTaskOid(variables), result);

ApprovalLevelType level = WfContextUtil.getCurrentApprovalLevel(wfTask.getWorkflowContext());
ApprovalStageDefinitionType level = WfContextUtil.getCurrentStageDefinition(wfTask.getWorkflowContext());
MidpointUtil.createTriggersForTimedActions(workItemId, escalationLevel,
XmlTypeConverter.toDate(workItem.getCreateTimestamp()),
deadline, wfTask, level.getTimedActions(), result);
Expand Down
Expand Up @@ -29,7 +29,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.wf.impl.processes.itemApproval.ApprovalLevel;
import com.evolveum.midpoint.wf.impl.processes.itemApproval.ProcessVariableNames;
import com.evolveum.midpoint.wf.impl.util.MiscDataUtil;
import com.evolveum.midpoint.wf.impl.util.SerializationSafeContainer;
Expand Down Expand Up @@ -60,29 +59,22 @@ public class ActivitiUtil implements Serializable {
private static final Trace LOGGER = TraceManager.getTrace(ActivitiUtil.class);

@NotNull
public static ApprovalLevelType getAndVerifyCurrentStage(DelegateExecution execution, Task wfTask, boolean stageInContextSet,
public static ApprovalStageDefinitionType getAndVerifyCurrentStage(DelegateExecution execution, Task wfTask, boolean stageInContextSet,
PrismContext prismContext) {
int levelIndex = getRequiredVariable(execution, ProcessVariableNames.LEVEL_INDEX, Integer.class, prismContext);
int stageNumber = levelIndex+1;
ApprovalLevelType level;
int stageNumber = getRequiredVariable(execution, ProcessVariableNames.STAGE_NUMBER_LOCAL, Integer.class, prismContext);
ApprovalStageDefinitionType stageDefinition;
if (stageInContextSet) {
level = WfContextUtil.getCurrentApprovalLevel(wfTask.getWorkflowContext());
if (level == null) {
stageDefinition = WfContextUtil.getCurrentStageDefinition(wfTask.getWorkflowContext());
if (stageDefinition == null) {
throw new IllegalStateException("No current stage information in " + wfTask);
}
} else {
level = WfContextUtil.getApprovalLevel(wfTask.getWorkflowContext(), stageNumber);
if (level == null) {
stageDefinition = WfContextUtil.getStageDefinition(wfTask.getWorkflowContext(), stageNumber);
if (stageDefinition == null) {
throw new IllegalStateException("No stage #" + stageNumber + " in " + wfTask);
}
}
ApprovalLevel wfLevel = getRequiredVariable(execution, ProcessVariableNames.LEVEL, ApprovalLevel.class, prismContext);
if (!level.getOrder().equals(wfLevel.getOrder()) || level.getOrder() != stageNumber) {
throw new IllegalStateException("Current stage number in " + wfTask + " (" + level.getOrder()
+ "), number present in activiti process (" + wfLevel
+ "), and the stage number according to activiti process (" + stageNumber + ") do not match.");
}
return level;
return stageDefinition;
}

public PrismContext getPrismContext() {
Expand Down
Expand Up @@ -82,7 +82,7 @@ public class CommonProcessVariableNames {
// URI of the work item outcome
public static final String VARIABLE_OUTCOME = "outcome";

// Stage number - if process can be conceptually divided into stages. Starts at 0.
// Stage number - if process can be conceptually divided into stages. Starts at 1.
// Null if not applicable. [Integer]
public static final String VARIABLE_STAGE_NUMBER = "stageNumber";

Expand Down Expand Up @@ -110,7 +110,7 @@ public class CommonProcessVariableNames {
// Null if unknown or not applicable. [String]
public static final String VARIABLE_ESCALATION_LEVEL_DISPLAY_NAME = "escalationLevelDisplayName";

// Additional information (for approver) - generated by evaluating appropriate expression in schema level - may be specific for each approver
// Additional information (for approver) - generated by evaluating appropriate expression in stage definition - may be specific for each approver
// [SafeSerializationContainer of List<InformationType>]
public static final String ADDITIONAL_INFORMATION = "additionalInformation";

Expand Down

This file was deleted.

Expand Up @@ -35,6 +35,4 @@ public interface ApprovalRequest<I extends Serializable> extends Serializable {
ApprovalSchemaType getApprovalSchemaType();

I getItemToApprove();

ApprovalSchema getApprovalSchema();
}
Expand Up @@ -65,11 +65,11 @@ private ApprovalSchemaType getSchema(ApprovalSchemaType schema, List<ObjectRefer
return schema;
} else {
schema = new ApprovalSchemaType(prismContext);
ApprovalLevelType level = new ApprovalLevelType(prismContext);
level.getApproverRef().addAll(CloneUtil.cloneCollectionMembers(approverRef));
level.getApproverExpression().addAll(approverExpression);
level.setAutomaticallyApproved(automaticallyApproved);
schema.getLevel().add(level);
ApprovalStageDefinitionType stageDef = new ApprovalStageDefinitionType(prismContext);
stageDef.getApproverRef().addAll(CloneUtil.cloneCollectionMembers(approverRef));
stageDef.getApproverExpression().addAll(approverExpression);
stageDef.setAutomaticallyApproved(automaticallyApproved);
schema.getLevel().add(stageDef);
return schema;
}
}
Expand All @@ -96,11 +96,6 @@ public ApprovalSchemaType getApprovalSchemaType() {
return approvalSchemaType;
}

@Override
public ApprovalSchema getApprovalSchema() {
return new ApprovalSchema(getApprovalSchemaType());
}

@Override
public I getItemToApprove() {
return itemToApprove;
Expand Down

This file was deleted.

Expand Up @@ -34,31 +34,31 @@
public class ApprovalSchemaHelper {

public void prepareSchema(ApprovalSchemaType schema, RelationResolver relationResolver, ReferenceResolver referenceResolver) {
WfContextUtil.orderAndRenumberLevels(schema);
for (ApprovalLevelType level : schema.getLevel()) {
prepareLevel(level, relationResolver, referenceResolver);
WfContextUtil.orderAndRenumberStages(schema);
for (ApprovalStageDefinitionType stageDef : schema.getLevel()) {
prepareStage(stageDef, relationResolver, referenceResolver);
}
}

public void prepareLevel(ApprovalLevelType level, RelationResolver relationResolver, ReferenceResolver referenceResolver) {
public void prepareStage(ApprovalStageDefinitionType stageDef, RelationResolver relationResolver, ReferenceResolver referenceResolver) {
try {
// resolves filters in approvers
List<ObjectReferenceType> resolvedApprovers = new ArrayList<>();
for (ObjectReferenceType ref : level.getApproverRef()) {
for (ObjectReferenceType ref : stageDef.getApproverRef()) {
resolvedApprovers.addAll(referenceResolver.resolveReference(ref, "approver ref"));
}
// resolves approver relations
resolvedApprovers.addAll(relationResolver.getApprovers(level.getApproverRelation()));
level.getApproverRef().clear();
level.getApproverRef().addAll(resolvedApprovers);
level.getApproverRelation().clear();
resolvedApprovers.addAll(relationResolver.getApprovers(stageDef.getApproverRelation()));
stageDef.getApproverRef().clear();
stageDef.getApproverRef().addAll(resolvedApprovers);
stageDef.getApproverRelation().clear();

// default values
if (level.getOutcomeIfNoApprovers() == null) {
level.setOutcomeIfNoApprovers(ApprovalLevelOutcomeType.REJECT);
if (stageDef.getOutcomeIfNoApprovers() == null) {
stageDef.setOutcomeIfNoApprovers(ApprovalLevelOutcomeType.REJECT);
}
if (level.getGroupExpansion() == null) {
level.setGroupExpansion(GroupExpansionType.BY_CLAIMING_WORK_ITEMS);
if (stageDef.getGroupExpansion() == null) {
stageDef.setGroupExpansion(GroupExpansionType.BY_CLAIMING_WORK_ITEMS);
}
} catch (ExpressionEvaluationException | ObjectNotFoundException | SchemaException e) {
throw new SystemException("Couldn't prepare approval schema for execution: " + e.getMessage(), e); // todo propagate these exceptions?
Expand All @@ -70,10 +70,10 @@ public boolean shouldBeSkipped(ApprovalSchemaType schema) {
return schema.getLevel().stream().allMatch(this::shouldBeSkipped);
}

private boolean shouldBeSkipped(ApprovalLevelType level) {
if (!level.getApproverRelation().isEmpty()) {
throw new IllegalStateException("Schema level was not prepared correctly; contains unresolved approver relations: " + level);
private boolean shouldBeSkipped(ApprovalStageDefinitionType stage) {
if (!stage.getApproverRelation().isEmpty()) {
throw new IllegalStateException("Schema stage was not prepared correctly; contains unresolved approver relations: " + stage);
}
return level.getOutcomeIfNoApprovers() == ApprovalLevelOutcomeType.SKIP && level.getApproverRef().isEmpty() && level.getApproverExpression().isEmpty();
return stage.getOutcomeIfNoApprovers() == ApprovalLevelOutcomeType.SKIP && stage.getApproverRef().isEmpty() && stage.getApproverExpression().isEmpty();
}
}

0 comments on commit b086ca3

Please sign in to comment.