为了获得上下文,我目前正在研究从ecore到Java模型的转换。实际上,我正在读取一些ecore文件并生成一个字符串,该字符串恰好是有效的Java接口源代码。

例如,这是我的代码生成工作流程。

projectA.ecore:

定义一个EClass'A'

package projectA : projectA = 'http://www.example.org/projectA'
{
    class A;
}


projectB.ecore:

定义一个EClass'B',它使用对a.ecore的交叉引用从'A'继承来获得对其的访问。

import projectA : '../../projectA/model/projectA.ecore#/';

package projectB : projectB = 'http://www.example.org/projectB'
{
    class B extends projectA::A;
}


首先从这些ecore生成projectA.ecore的接口:

package projecta;

interface ProjectA<A> {
  // ...
}


现在,我想对projectB.ecore做同样的事情,并获得以下接口:

package projectb;

import projecta.ProjectA;

interface ProjectB<A,B> extends ProjectA<A> {
  // ...
}


为此,我需要检测A is和使用交叉引用访问的EClass并在projectA.ecore中进行一些分析,以生成有效的接口扩展,包导入...

我在ecore反射API中环顾四周,但没有找到一种干净明显的方法。这可能吗?是的,如何?

编辑:技术细节

我正在使用这种代码加载ecore:

final ResourceSetImpl resourceSet = new ResourceSetImpl();
resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("ecore", new XMIResourceFactoryImpl());
final Resource resource = resourceSet.getResource(uri, true);
final EPackage ePackage = (EPackage) resource.getContents().get(0);
final String fileContent = new GenerateAlgebra().process(ePackage);


GenerateAlgebra是专用于.ecore到String转换的类。从技术上讲,它是使用Xtend(https://github.com/manuelleduc/ecore-oa/blob/master/fr.inria.diverse.ecorealgebragenerator/src/fr/inria/diverse/objectalgebragenerator/popup/actions/GenerateAlgebra.xtend)开发的。

最佳答案

如果只想获取定义了EClass的ecore文件的文件路径,请使用资源URI

尝试:

ePackage.eResource().getURI()为您提供到ecore文件的实际URI,在其中定义了软件包及其所有EClass。类似于:file:/Users/../../yourPath/projectA.ecore
您还可以使用getNsURI()getName()来标识两个ecore文件。

如果像您一样使用Resourceset,并且在多个ecore文件之间具有交叉引用,则该set也会尝试加载所有其他Resources。这意味着,通过调用resourceSet.getResource(uri, true)资源集应包含两个资源。

尝试遍历resourceSet.getResources()

10-02 23:21