I am currently researching the 2026.06 migration. We update document models at runtime and previously had to re-expand these models in whatever CDMs they were included in. I had hoped that some day, this mechanism could be included in A12 out of the box, but A12 went the opposite way and removed the API in 2026.06.
So since I was apparently doing it wrong, how is the use-case supposed to be handled? How can I update models if one of their dependent models changed?
I can not re-run the Workflow Conversion at runtime, because A) its API is not designed for it (working with files) and B) we don’t want to store the source models and there is not reverse expansion.
Am I supposed to update all the dependent models manually? This requires relying on internals again on how the workspace expansion works. E.g. which fields IDs are generated and in what shape the original model is inserted.
The recommendation is to keep the modeling-time (source) models and run t
he workspace conversion framework over them. If you need to adjust the result,
add your own manipulation as a conversion step rather than patching the runti
me output. This does mean keeping a copy of the source models, since they are
the input you manipulate and re-convert from.
The bundled runner for the workspace conversion framework is file-oriented. The conversion itself is in-memory, so you can replace it, using only the public dataservices-wcf-api.
Build a workspace from your current source models with WorkspaceFactory, then fold your converters over it. No files, no reverse expansion:
import com.mgmtp.a12.dataservices.wcf.WorkspaceConverter;
import com.mgmtp.a12.dataservices.wcf.WorkspaceFactory;
import com.mgmtp.a12.dataservices.wcf.domain.Workspace;
List<WorkspaceConverter> converters = ...; // sorted by @WcfConverter#order
WorkspaceFactory f = WorkspaceFactory.getInstance();
Workspace ws = f.createWorkspace();
ws.getModels().put(id, f.createModelTuple(header, modelJson)); // your source models
for (WorkspaceConverter c : converters) {
ws = c.convert(ws);
}
// ws now holds the regenerated runtime models
Important: pass the complete, ordered chain. The CDM→runtime expansion is only one @WcfConverter; others contribute the rest of the runtime shape. @WcfConverter is RUNTIME-retained, so you can sort by order() reflectively.