flowable/flowable-engine · error · UnsupportedOperationException

Not implemented yet!!!

Error message

Not implemented yet!!!

What it means

During migration validation, when an activity mapping targets the parent process via a call activity (mapping.isToParentProcess()), Flowable's migration manager throws UnsupportedOperationException because migrating to a parent process across the call-activity boundary is not yet implemented.

Solutions

  1. Remove toParentProcess mappings; migrate to activities within the same or another regular process definition instead.
  2. Split the migration: end/restart the child instance and migrate the parent instance separately.
  3. Check whether a newer Flowable release supports parent-process migration targets and upgrade.
  4. Wrap validation in try-catch and fall back to manual instance manipulation if this pattern is essential.

Example fix

// before
mapping.fromActivity("subTask").toParentProcess("parentApprovalTask");

// after
mapping.fromActivity("subTask").toActivity("approvalTask"); // same-level target only
Defensive patterns

Strategy: validation

Validate before calling

for (ActivityMigrationMapping m : mappings) {
    if (m.isToParentProcess()) throw new IllegalStateException("parent-process migration target not supported");
}

Try / catch

try {
    processInstanceMigrationBuilder.migrate();
} catch (UnsupportedOperationException e) {
    logger.error("Unsupported migration target: " + e.getMessage());
}

Prevention

When it happens

Trigger: Executing a process instance migration (doValidateActivityMappings via doValidateProcessInstanceMigration) where any ActivityMigrationMapping is configured with toParentProcess(true) / a toCallActivityId.

Common situations: Trying to migrate instances out of a call-activity scope up into the parent process definition; generically built models that accidentally enable parent-process targets; attempting a feature not supported in the installed Flowable version.

Understand the failure class

Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.

Related errors


AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11). Data as JSON: /api/errors/c3ec72404de28010. Report an issue: GitHub.

Appendix: source

Thrown at modules/flowable-engine/src/main/java/org/flowable/engine/impl/migration/ProcessInstanceMigrationManagerImpl.java:299

                                procDefKey = document.getProcessInstanceVariables().getOrDefault(procDefKey.substring(2, procDefKey.length() - 1), procDefKey).toString();
                            }
                        }
                        try {
                            ProcessDefinition mappingProcDef = resolveProcessDefinition(procDefKey, mapping.getCallActivityProcessDefinitionVersion(), document.getMigrateToProcessDefinitionTenantId(), commandContext);
                            mappingModel = ProcessDefinitionUtil.getBpmnModel(mappingProcDef.getId());
                        } catch (FlowableException e) {
                            validationResult.addValidationMessage(e.getMessage() + " for call activity element with id '" + mapping.getToCallActivityId() + "' in the process definition with id '" + mappingModel.getMainProcess().getId() + "'");
                            continue;
                        }
                    } else {
                        validationResult.addValidationMessage("There's no call activity element with id '" + mapping.getToCallActivityId() + "' in the process definition with id '" + mappingModel.getMainProcess().getId() + "'");
                        continue;
                    }
                }

                if (mapping.isToParentProcess()) {
                    FlowElement callActivityFlowElement = newModel.getFlowElement(mapping.getToCallActivityId());
                    throw new UnsupportedOperationException("Not implemented yet!!!");
                }

                //Check the target flow element
                List<String> toActivityIds = mapping.getToActivityIds();
                for (String targetActivityId : toActivityIds) {
                    if (!isActivityIdInProcessDefinitionModel(targetActivityId, mappingModel)) {
                        validationResult.addValidationMessage("Invalid mapping for '" + execution.getCurrentActivityId() + "' to '" + 
                        		targetActivityId + "', cannot be found in the process definition with id '" + mappingModel.getMainProcess().getId() + "'");
                        continue;
                    }
                    //We cannot move an activity inside a MultiInstance container
                    FlowElement targetFlowElement = mappingModel.getFlowElement(targetActivityId);
                    String targetFlowElementMultiInstanceParentId = getFlowElementMultiInstanceParentId(targetFlowElement);
                    if (targetFlowElementMultiInstanceParentId != null) {
                        validationResult.addValidationMessage("Invalid mapping for '" + execution.getCurrentActivityId() + "' to '" + targetActivityId + "', cannot migrate arbitrarily inside a Multi Instance container '" + 
                        		targetFlowElementMultiInstanceParentId + "' inside process definition with id '" + mappingModel.getMainProcess().getId() + "'");
                        continue;
                    }

View on GitHub (pinned to d6d39ce1c6)