我发现Papyrus非常有用的功能之一是能够通过在Eclipse UI之外使用UML2运行时以编程方式查询它创建的UML模型。这非常适合运行简单的工具,例如,使用POI生成文档或为Talend MDM工具编写模型驱动的配置。但是,虽然通过加载资源集中的资源可以轻松地遍历和处理模型树,但是操作.notation文件中的图表已经证明是一个更大的挑战。
我已经明确了(通过检查org.eclipse.papyrus.infra.export.ExportAllDiagrams
的源代码),我可以在其中加载所有资源并从.notation文件中找到Diagram
元素:
File uml = new File(model + ".uml");
File di = new File(model + ".di");
File notation = new File(model + ".notation");
URI umlUri = URI.createFileURI(uml.getAbsolutePath());
URI diUri = URI.createFileURI(di.getAbsolutePath());
URI notationUri = URI.createFileURI(notation.getAbsolutePath());
final ModelSet resourceSet = new ModelSet();
resourceSet.getPackageRegistry().put(UMLPackage.eNS_URI, UMLPackage.eINSTANCE);
resourceSet.getPackageRegistry().put(NotationPackage.eNS_URI, NotationPackage.eINSTANCE);
resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put(Resource.Factory.Registry.DEFAULT_EXTENSION, new XMIResourceFactoryImpl());
resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("notation", new XMIResourceFactoryImpl());
resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put(UMLResource.FILE_EXTENSION, UMLResource.Factory.INSTANCE);
try {
resourceSet.getLoadOptions().put(XMLResource.OPTION_DEFER_IDREF_RESOLUTION, true);
resourceSet.getLoadOptions().put(XMLResource.OPTION_DEFER_ATTACHMENT, true);
resourceSet.getResource(diUri, true);
resourceSet.getResource(umlUri, true);
resourceSet.getResource(notationUri, true);
List<Diagram> diagrams = new ArrayList<Diagram>();
for (Iterator<Notifier> i = resourceSet.getAllContents(); i.hasNext();) {
Notifier n = i.next();
if (n instanceof Diagram) {
diagrams.add((Diagram) n);
}
}
//export(diagrams);
} finally {
// Unload the resource set so that we don't leak loads of UML content in the CacheAdapter
unload(resourceSet);
}
但是,ExportAllDiagrams
类最终使用org.eclipse.gmf.runtime.diagram.ui.render.util.CopyToImageUtil
来呈现图表,此时它会失败,因为它依赖于DiagramUIRenderPlugin
和DiagramUIRenderPlugin.getInstance()
返回null。
然后我看了一下org.eclipse.gmf.runtime.diagram.ui.render.clipboard.DiagramSVGGenerator
,但是在初始化各种eclipse插件时需要遇到类似的问题。
我没有Eclipse插件系统的经验,但我假设平台加载并初始化插件,因此,到目前为止尝试的方法需要在Eclipse GUI环境中运行才能工作。有没有其他方法可以用来轻松地将图表呈现给SVG而不依赖于整个Eclipse运行时?