{"record":{"id":"66bfbdcc8087971e","repo":"flowable/flowable-engine","slug":"the-case-instance","errorCode":null,"errorMessage":"The case instance ","messagePattern":"The case instance ","errorType":"exception","errorClass":"FlowableIllegalStateException","httpStatus":null,"severity":"error","filePath":"modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/cmd/ReactivateHistoricCaseInstanceCmd.java","lineNumber":107,"sourceCode":"        }\n\n        // set transient case variables, if the builder contains any\n        if (reactivationBuilder.hasTransientVariables()) {\n            caseInstanceEntity.setTransientVariables(reactivationBuilder.getTransientVariables());\n        }\n\n        // if there is an available condition on the reactivation event listener, evaluate it to make sure the listener is available for reactivation\n        Case caze = CaseDefinitionUtil.getCase(instance.getCaseDefinitionId());\n        ReactivateEventListener reactivateEventListener = caze.getReactivateEventListener();\n        String availableConditionExpression = reactivateEventListener.getReactivationAvailableConditionExpression();\n        if (StringUtils.isNotEmpty(availableConditionExpression)) {\n            Object listenerAvailable = CommandContextUtil.getCmmnEngineConfiguration()\n                .getExpressionManager()\n                .createExpression(availableConditionExpression)\n                .getValue(caseInstanceEntity);\n\n            if (!Boolean.TRUE.equals(listenerAvailable)) {\n                throw new FlowableIllegalStateException(\"The case instance \" + caseInstanceEntity.getId()\n                    + \" cannot be reactivated, as the available condition of its reactivate event listener did not evaluate to true.\");\n            }\n        }\n        \n        if (StringUtils.isNotEmpty(instance.getCallbackId()) && ReferenceTypes.PLAN_ITEM_CHILD_CASE.equals(instance.getCallbackType())) {\n            PlanItemInstanceEntityManager planItemInstanceEntityManager = cmmnEngineConfiguration.getPlanItemInstanceEntityManager();\n            PlanItemInstance parentPlanItemInstance = planItemInstanceEntityManager.findById(instance.getCallbackId());\n            if (parentPlanItemInstance != null) {\n                Case parentCase = CaseDefinitionUtil.getCase(parentPlanItemInstance.getCaseDefinitionId());\n                PlanItem planItem = parentCase.getPlanModel().findPlanItemForPlanItemDefinitionInPlanFragmentOrDownwards(parentPlanItemInstance.getPlanItemDefinitionId());\n                PlanItemInstanceEntity toActivateParentPlanItemInstance = planItemInstanceEntityManager\n                        .createPlanItemInstanceEntityBuilder()\n                        .planItem(planItem)\n                        .caseDefinitionId(parentPlanItemInstance.getCaseDefinitionId())\n                        .caseInstanceId(parentPlanItemInstance.getCaseInstanceId())\n                        .tenantId(parentPlanItemInstance.getTenantId())\n                        .create();\n                ","sourceCodeStart":89,"sourceCodeEnd":125,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/cmd/ReactivateHistoricCaseInstanceCmd.java#L89-L125","documentation":"Thrown as FlowableIllegalStateException when the case being reactivated has a reactivate event listener with an available condition expression, and evaluating that expression against the new runtime case instance did not return Boolean.TRUE. The engine only allows reactivation through a listener whose availability condition currently holds.","triggerScenarios":"Calling reactivateCaseInstance on a case whose CMMN model defines a reactivation (event) listener with an availableCondition that evaluates to false/null, e.g. because the referenced variables do not exist in the reactivated case context.","commonSituations":"Model changed after the original run so the condition now references variables that are not set; expression typo making it evaluate to null; reactivation attempted at a point in time when business data no longer satisfies the condition.","solutions":["Set the case/plan-item variables the available condition depends on (e.g. via reactivationBuilder.variable(...)) before reactivating so the expression evaluates to true","Fix or relax the availableCondition expression in the CMMN XML on the reactivation event listener","Use a different reactivation plan item whose condition is met, or remove the condition if unconditional reactivation is intended"],"exampleFix":"// before\nruntimeService.createCaseInstanceReactivationBuilder()\n    .caseInstanceId(caseId)\n    .reactivate();\n// after\nruntimeService.createCaseInstanceReactivationBuilder()\n    .caseInstanceId(caseId)\n    .variable(\"reactivationAllowed\", true) // satisfies the listener's available condition\n    .reactivate();","handlingStrategy":"validation","validationCode":"// set variables the listener's available condition depends on before reactivation\nbuilder.variable(\"reactivationAllowed\", true);","typeGuard":null,"tryCatchPattern":"try { builder.reactivate(); }\ncatch (FlowableIllegalStateException e) { log.warn(\"available condition false for {}\", caseId); }","preventionTips":["Review the reactivation listener's availableCondition expression and ensure its variables are supplied","Test the expression against the reactivated case context","Keep the condition simple and null-safe in the CMMN model"],"tags":["cmmn","expression","reactivation","listener"],"backgroundTag":"invalid-state-transition","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-18T11:17:12.947Z"}