{"record":{"id":"e960a13ef071a51e","repo":"flowable/flowable-engine","slug":"pre-upgrade-java-delegate-can-t-be-set-when-anothe","errorCode":null,"errorMessage":"Pre upgrade java delegate can't be set when another pre-upgrade task was already specified.","messagePattern":"Pre upgrade java delegate 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":105,"sourceCode":"            if (script != null) {\n                this.preUpgradeScript = script;\n            } else {\n                throw new IllegalArgumentException(\"Pre upgrade script can't be null.\");\n            }\n        } else {\n            throw new IllegalArgumentException(\"Pre upgrade script can't be set when another pre-upgrade task was already specified.\");\n        }\n    }\n\n    public void setPreUpgradeJavaDelegate(String javaDelegateClassName) {\n        if (this.preUpgradeScript == null && this.preUpgradeJavaDelegateExpression == null) {\n            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) {","sourceCodeStart":87,"sourceCodeEnd":123,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-engine/src/main/java/org/flowable/engine/impl/migration/ProcessInstanceMigrationDocumentImpl.java#L87-L123","documentation":"Only one pre-upgrade task is allowed. If a pre-upgrade script or delegate expression was already set, calling setPreUpgradeJavaDelegate throws IllegalArgumentException regardless of the delegate value.","triggerScenarios":"Calling setPreUpgradeJavaDelegate on a ProcessInstanceMigrationDocumentImpl where preUpgradeScript or preUpgradeJavaDelegateExpression is already non-null.","commonSituations":"Setting a script in JSON and a delegate programmatically; accumulating configuration from multiple sources onto one document; template code that sets several upgrade hooks.","solutions":["Keep exactly one of script / Java delegate / delegate expression per document","Remove the earlier setPreUpgradeScript or setPreUpgradeJavaDelegateExpression call","Use separate documents for separate configurations"],"exampleFix":"// before\ndocument.setPreUpgradeScript(script);\ndocument.setPreUpgradeJavaDelegate(\"com.acme.PreUpgrader\");\n// after\ndocument.setPreUpgradeJavaDelegate(\"com.acme.PreUpgrader\");","handlingStrategy":"validation","validationCode":"if (doc != null && (preScriptSet || preExpressionSet)) {\n    throw new IllegalStateException(\"Pre-upgrade task already set; delegate is mutually exclusive\");\n}","typeGuard":null,"tryCatchPattern":"try {\n    document.setPreUpgradeJavaDelegate(delegateClass);\n} catch (IllegalArgumentException e) {\n    throw new IllegalStateException(\"Conflicting pre-upgrade configuration\", e);\n}","preventionTips":["Pick one pre-upgrade mechanism per migration document","Centralize pre-upgrade configuration in one builder method","Audit JSON + programmatic configuration for overlap"],"tags":["flowable","process-migration","conflict","pre-upgrade"],"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"}