protected boolean isStageContainerOfAnyPlanItemDefinition(String stageId, Collection<PlanItemMoveEntry> moveToPlanItems) { Optional<Stage> isUsed = moveToPlanItems.stream() .map(PlanItemMoveEntry::getNewPlanItem) .map(PlanItem::getPlanItemDefinition) .map(PlanItemDefinition::getParentStage) .filter(Objects::nonNull) .filter(elementStage -> elementStage.getId().equals(stageId)) .findAny(); return isUsed.isPresent(); }
@Override protected void writePlanItemDefinitionBody(CmmnModel model, Stage stage, XMLStreamWriter xtw) throws Exception { super.writePlanItemDefinitionBody(model, stage, xtw); for (PlanItem planItem : stage.getPlanItems()) { PlanItemExport.writePlanItem(model, planItem, xtw); } for (Sentry sentry : stage.getSentries()) { SentryExport.writeSentry(sentry, xtw); } for (PlanItemDefinition planItemDefinition : stage.getPlanItemDefinitions()) { PlanItemDefinitionExport.writePlanItemDefinition(model, planItemDefinition, xtw); } if (stage.isPlanModel() && stage.getExitCriteria() != null && !stage.getExitCriteria().isEmpty()) { CriteriaExport.writeCriteriaElements(ELEMENT_EXIT_CRITERION, stage.getExitCriteria(), xtw); } } }
@Override protected void writePlanItemDefinitionSpecificAttributes(Stage stage, XMLStreamWriter xtw) throws Exception { super.writePlanItemDefinitionSpecificAttributes(stage, xtw); if (StringUtils.isNotEmpty(stage.getFormKey())) { xtw.writeAttribute(FLOWABLE_EXTENSIONS_PREFIX, FLOWABLE_EXTENSIONS_NAMESPACE, ATTRIBUTE_FORM_KEY, stage.getFormKey()); } if (stage.isAutoComplete()) { xtw.writeAttribute(ATTRIBUTE_IS_AUTO_COMPLETE, Boolean.toString(stage.isAutoComplete())); } if (StringUtils.isNotEmpty(stage.getAutoCompleteCondition())) { xtw.writeAttribute(FLOWABLE_EXTENSIONS_PREFIX, FLOWABLE_EXTENSIONS_NAMESPACE, ATTRIBUTE_AUTO_COMPLETE_CONDITION, stage.getAutoCompleteCondition()); } if (stage.getDisplayOrder() != null) { xtw.writeAttribute(FLOWABLE_EXTENSIONS_PREFIX, FLOWABLE_EXTENSIONS_NAMESPACE, ATTRIBUTE_DISPLAY_ORDER, String.valueOf(stage.getDisplayOrder())); } if (!stage.isIncludeInStageOverview()) { // if it's missing, it's true by default xtw.writeAttribute(FLOWABLE_EXTENSIONS_PREFIX, FLOWABLE_EXTENSIONS_NAMESPACE, ATTRIBUTE_INCLUDE_IN_STAGE_OVERVIEW, "false"); } }
protected static void internalGetParentPlanItems(PlanItem planItem, List<PlanItem> parentPlanItems) { Stage parentStage = planItem.getParentStage(); if (parentStage != null && !parentStage.isPlanModel()) { PlanItem parentPlanItem = parentStage.findPlanItemForPlanItemDefinitionInPlanFragmentOrUpwards(parentStage.getId()); if (parentPlanItem != null) { parentPlanItems.add(parentPlanItem); internalGetParentPlanItems(parentPlanItem, parentPlanItems); } } }
elementNode.put("id", caseObject.getPlanModel().getId()); elementNode.put("name", caseObject.getPlanModel().getName()); GraphicInfo graphicInfo = pojoModel.getGraphicInfo(caseObject.getPlanModel().getId()); if (graphicInfo != null) { fillGraphicInfo(elementNode, graphicInfo, true); elementArray.add(elementNode); processCriteria(caseObject.getPlanModel().getExitCriteria(), "ExitCriterion", pojoModel, elementArray); processElements(caseObject.getPlanModel().getPlanItems(), pojoModel, elementArray, associationArray, completedElements, activeElements, availableElements, diagramInfo);
List<Stage> stages = cmmnModel.getPrimaryCase().getPlanModel().findPlanItemDefinitionsOfType(Stage.class, true); List<StageResponse> stageResponses = new ArrayList<>(stages.size()); for (Stage stage : stages) { if (stage.isIncludeInStageOverview()) { StageResponse stageResponse = new StageResponse(stage.getId(), stage.getName()); Optional<PlanItemInstance> planItemInstance = getPlanItemInstance(stagePlanItemInstances, stage);
if (!caseInstanceChangeState.getCreatedStageInstances().containsKey(stage.getId()) && !isStageAncestorOfAnyPlanItemInstance(stage.getId(), movingPlanItemInstances)) { stagesToCreate.put(stage.getId(), stage); stage = stage.getParentStage(); if (!caseInstanceChangeState.getCreatedStageInstances().containsKey(stage.getId())) { PlanItemInstanceEntity stageInstance = createStageHierarchy(stage, defaultContinueParentPlanItemInstance, stagesToCreate, movingPlanItemInstanceIds, caseInstanceChangeState, movePlanItemInstanceEntityContainer, commandContext); caseInstanceChangeState.addCreatedStageInstance(stage.getId(), stageInstance); PlanItemDefinition newPlanItemDefinition = newPlanItem.getPlanItemDefinition(); PlanItemInstanceEntity parentPlanItemInstance = null; if (newPlanItemDefinition.getParentStage() != null && caseInstanceChangeState.getCreatedStageInstances().containsKey(newPlanItemDefinition.getParentStage().getId())) { parentPlanItemInstance = caseInstanceChangeState.getCreatedStageInstances().get(newPlanItemDefinition.getParentStage().getId()); } else { parentPlanItemInstance = defaultContinueParentPlanItemInstance; for (PlanItem stagePlanItem : newPlanItem.getParentStage().getPlanItems()) { if (!stagePlanItem.getId().equals(newPlanItem.getId())) { PlanItemInstanceEntity childStagePlanItemInstance = CommandContextUtil.getPlanItemInstanceEntityManager(commandContext)
MovePlanItemInstanceEntityContainer movePlanItemInstanceEntityContainer, CommandContext commandContext) { if (caseInstanceChangeState.getCurrentStageInstances().containsKey(stage.getId())) { return (PlanItemInstanceEntity) caseInstanceChangeState.getCurrentStageInstances().get(stage.getId()).get(0); if (caseInstanceChangeState.getCreatedStageInstances().containsKey(stage.getId())) { return caseInstanceChangeState.getCreatedStageInstances().get(stage.getId()); if (stage.getParentStage() != null && !stage.getParentStage().isPlanModel()) { parentStageInstance = createStageHierarchy(stage.getParentStage(), defaultParentPlanItemInstance, stagesToCreate, movingPlanItemInstanceIds, caseInstanceChangeState, movePlanItemInstanceEntityContainer, commandContext); caseInstanceChangeState.getCreatedStageInstances().put(stage.getParentStage().getId(), parentStageInstance); List<PlanItemInstanceEntity> existingPlanItemInstances = planItemInstanceEntityManager.findByCaseInstanceIdAndPlanItemId(movePlanItemInstanceEntityContainer.getCaseInstanceId(), stage.getPlanItem().getId()); PlanItemInstanceEntity newPlanItemInstance = null; if (!existingPlanItemInstances.isEmpty()) { newPlanItemInstance = planItemInstanceEntityManager.createChildPlanItemInstance(stage.getPlanItem(), movePlanItemInstanceEntityContainer.getCaseDefinitionId(), movePlanItemInstanceEntityContainer.getCaseInstanceId(), parentStageInstance != null ? parentStageInstance.getId() : null, movePlanItemInstanceEntityContainer.getTenantId(), true);
protected static void writePlanModel(Stage stage, CmmnModel model, XMLStreamWriter xtw) throws Exception { createCmmnShape(model, stage.getId(), xtw); for (Criterion criterion : stage.getExitCriteria()) { createCmmnShape(model, criterion.getId(), xtw); } }
if (caseModel.getPlanModel().getPlanItems().isEmpty()) {
protected FormInfo getStartForm(CaseDefinition caseDefinition) { FormInfo formInfo = null; CmmnModel cmmnModel = repositoryService.getCmmnModel(caseDefinition.getId()); Case caze = cmmnModel.getCaseById(caseDefinition.getKey()); Stage stage = caze.getPlanModel(); if (StringUtils.isNotEmpty(stage.getFormKey())) { CmmnDeployment deployment = repositoryService.createDeploymentQuery().deploymentId(caseDefinition.getDeploymentId()).singleResult(); formInfo = formRepositoryService.getFormModelByKeyAndParentDeploymentId(stage.getFormKey(), deployment.getParentDeploymentId(), caseDefinition.getTenantId(), cmmnEngineConfiguration.isFallbackToDefaultTenant()); } if (formInfo == null) { // Definition found, but no form attached throw new FlowableObjectNotFoundException("Case definition does not have a start form defined: " + caseDefinition.getId()); } return formInfo; } }
protected void processPlanFragment(CmmnModel cmmnModel, PlanFragment planFragment) { processPlanItems(cmmnModel, planFragment); if (planFragment instanceof Stage) { Stage stage = (Stage) planFragment; for (PlanItemDefinition planItemDefinition : stage.getPlanItemDefinitions()) { if (planItemDefinition instanceof PlanFragment) { processPlanFragment(cmmnModel, (PlanFragment) planItemDefinition); } } if (!stage.getExitCriteria().isEmpty()) { resolveExitCriteriaSentry(stage); } } }
while (isOrphan && parentStage != null && !parentStage.isPlanModel()) { List<PlanItemInstanceEntity> nonTerminalStagePlanItemInstances = CaseInstanceUtil .findNonTerminalChildPlanItemInstances(caseInstanceEntity, parentStage.getPlanItem()); if (!nonTerminalStagePlanItemInstances.isEmpty()) { isOrphan = false; } else { parentStage = parentStage.getParentStage();
protected boolean planItemsShareDirectParentStage(PlanItem planItemOne, PlanItem planItemTwo) { Stage parentStage = planItemOne.getParentStage(); return parentStage.findPlanItemInPlanFragmentOrDownwards(planItemTwo.getId()) != null; }
protected boolean isStageCompletable(PlanItemInstanceEntity stagePlanItemInstanceEntity, Stage stage) { boolean allRequiredChildrenInEndState = isEndStateReachedForAllRequiredChildPlanItems(stagePlanItemInstanceEntity); if (allRequiredChildrenInEndState) { stagePlanItemInstanceEntity.setCompleteable(true); } if (stagePlanItemInstanceEntity.isCompleteable()) { if (stage.isAutoComplete()) { return true; } else { return isAvailableChildPlanCompletionNeutralOrNotActive(stagePlanItemInstanceEntity); } } else { return false; } }
protected List<FormDefinition> getFormDefinitionsFromModel(Case caseModel, CaseDefinition caseDefinition) { Set<String> formKeys = new HashSet<>(); List<FormDefinition> formDefinitions = new ArrayList<>(); // for all user tasks List<HumanTask> humanTasks = caseModel.getPlanModel().findPlanItemDefinitionsOfType(HumanTask.class, true); for (HumanTask humanTask : humanTasks) { if (StringUtils.isNotEmpty(humanTask.getFormKey())) { formKeys.add(humanTask.getFormKey()); } } for (String formKey : formKeys) { addFormDefinitionToCollection(formDefinitions, formKey, caseDefinition); } return formDefinitions; }
@Override protected String getPlanItemDefinitionXmlElementValue(Stage stage) { // start plan model or stage element if (stage.isPlanModel()) { return ELEMENT_PLAN_MODEL; } else { return ELEMENT_STAGE; } }
elementNode.put("id", caseObject.getPlanModel().getId()); elementNode.put("name", caseObject.getPlanModel().getName()); GraphicInfo graphicInfo = pojoModel.getGraphicInfo(caseObject.getPlanModel().getId()); if (graphicInfo != null) { fillGraphicInfo(elementNode, graphicInfo, true); elementArray.add(elementNode); processCriteria(caseObject.getPlanModel().getExitCriteria(), "ExitCriterion", pojoModel, elementArray); processElements(caseObject.getPlanModel().getPlanItems(), pojoModel, elementArray, flowArray, diagramInfo);
protected void processElements(List<PlanItem> planItemList, CmmnModel model, ArrayNode elementArray, ArrayNode flowArray, GraphicInfo diagramInfo) { for (PlanItem planItem : planItemList) { ObjectNode elementNode = objectMapper.createObjectNode(); elementNode.put("id", planItem.getId()); elementNode.put("name", planItem.getName()); GraphicInfo graphicInfo = model.getGraphicInfo(planItem.getId()); if (graphicInfo != null) { fillGraphicInfo(elementNode, graphicInfo, true); fillDiagramInfo(graphicInfo, diagramInfo); } PlanItemDefinition planItemDefinition = planItem.getPlanItemDefinition(); String className = planItemDefinition.getClass().getSimpleName(); elementNode.put("type", className); if (planItemDefinition instanceof ServiceTask) { ServiceTask serviceTask = (ServiceTask) planItemDefinition; if (HttpServiceTask.HTTP_TASK.equals(serviceTask.getType())) { elementNode.put("taskType", "http"); } } elementArray.add(elementNode); processCriteria(planItem.getEntryCriteria(), "EntryCriterion", model, elementArray); processCriteria(planItem.getExitCriteria(), "ExitCriterion", model, elementArray); if (planItemDefinition instanceof Stage) { Stage stage = (Stage) planItemDefinition; processElements(stage.getPlanItems(), model, elementArray, flowArray, diagramInfo); } } }
protected void setCaseDefinitionVersionsAndIds(CmmnParseResult parseResult, Map<CaseDefinitionEntity, CaseDefinitionEntity> mapNewToOldCaseDefinitions) { for (CaseDefinitionEntity caseDefinition : parseResult.getAllCaseDefinitions()) { int version = 1; CaseDefinitionEntity latest = mapNewToOldCaseDefinitions.get(caseDefinition); if (latest != null) { version = latest.getVersion() + 1; } caseDefinition.setVersion(version); if (usePrefixId) { caseDefinition.setId(caseDefinition.getIdPrefix() + idGenerator.getNextId()); } else { caseDefinition.setId(idGenerator.getNextId()); } Case caseObject = parseResult.getCmmnCaseForCaseDefinition(caseDefinition); if (caseObject.getPlanModel().getFormKey() != null) { caseDefinition.setHasStartFormKey(true); } } }