{"record":{"id":"4d0f5d3b4bbb4969","repo":"flowable/flowable-engine","slug":"pre-upgrade-expression-can-t-be-set-when-another-p","errorCode":null,"errorMessage":"Pre upgrade expression can't be set when another pre-upgrade task was already specified.","messagePattern":"Pre upgrade expression can't be set when another pre-upgrade task was already specified\\.","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"modules/flowable-engine/src/main/java/org/flowable/engine/impl/migration/ProcessInstanceMigrationDocumentImpl.java","lineNumber":117,"sourceCode":"            if (StringUtils.isNotEmpty(javaDelegateClassName)) {\n                this.preUpgradeJavaDelegate = javaDelegateClassName;\n            } else {\n                throw new IllegalArgumentException(\"Pre upgrade java delegate can't be empty or null.\");\n            }\n        } else {\n            throw new IllegalArgumentException(\"Pre upgrade java delegate can't be set when another pre-upgrade task was already specified.\");\n        }\n    }\n\n    public void setPreUpgradeJavaDelegateExpression(String expression) {\n        if (this.preUpgradeScript == null && this.preUpgradeJavaDelegate == null) {\n            if (StringUtils.isNotEmpty(expression)) {\n                this.preUpgradeJavaDelegateExpression = expression;\n            } else {\n                throw new IllegalArgumentException(\"Pre upgrade expression can't be empty or null.\");\n            }\n        } else {\n            throw new IllegalArgumentException(\"Pre upgrade expression can't be set when another pre-upgrade task was already specified.\");\n        }\n    }\n\n    public void setPostUpgradeScript(Script script) {\n        if (this.postUpgradeJavaDelegate == null && this.postUpgradeJavaDelegateExpression == null) {\n            if (script != null) {\n                this.postUpgradeScript = script;\n            } else {\n                throw new IllegalArgumentException(\"Post upgrade script can't be null.\");\n            }\n        } else {\n            throw new IllegalArgumentException(\"Post upgrade script can't be set when another post-upgrade task was already specified.\");\n        }\n    }\n\n    public void setPostUpgradeJavaDelegate(String javaDelegateClassName) {\n        if (this.postUpgradeScript == null && this.postUpgradeJavaDelegateExpression == null) {\n            if (StringUtils.isNotEmpty(javaDelegateClassName)) {","sourceCodeStart":99,"sourceCodeEnd":135,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-engine/src/main/java/org/flowable/engine/impl/migration/ProcessInstanceMigrationDocumentImpl.java#L99-L135","documentation":"Only one pre-upgrade task may be configured. If a pre-upgrade script or Java delegate was already set, calling setPreUpgradeJavaDelegateExpression throws IllegalArgumentException even if the expression itself is valid.","triggerScenarios":"Calling setPreUpgradeJavaDelegateExpression after setPreUpgradeScript or setPreUpgradeJavaDelegate on the same ProcessInstanceMigrationDocumentImpl.","commonSituations":"Combining script-based and expression-based upgrade hooks from different sources; sequential builder configuration copied from examples showing each option separately.","solutions":["Configure exactly one pre-upgrade task per document","Remove the earlier setPreUpgradeScript/setPreUpgradeJavaDelegate call if the expression is intended","Build a fresh document when configuration must change"],"exampleFix":"// before\ndocument.setPreUpgradeJavaDelegate(\"com.acme.PreUpgrader\");\ndocument.setPreUpgradeJavaDelegateExpression(\"${preUpgrader}\");\n// after\ndocument.setPreUpgradeJavaDelegateExpression(\"${preUpgrader}\");","handlingStrategy":"validation","validationCode":"if (doc != null && (preScriptSet || preDelegateSet)) {\n    throw new IllegalStateException(\"Pre-upgrade task already set; expression is mutually exclusive\");\n}","typeGuard":null,"tryCatchPattern":"try {\n    document.setPreUpgradeJavaDelegateExpression(expression);\n} catch (IllegalArgumentException e) {\n    throw new IllegalStateException(\"Conflicting pre-upgrade configuration\", e);\n}","preventionTips":["Choose script, delegate class, or expression — never more than one","Wrap document configuration in a single well-tested method","Rebuild a fresh document instead of reconfiguring an existing one"],"tags":["flowable","process-migration","conflict","expression"],"backgroundTag":"mutually-exclusive-options","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"}