为了了解上下文,我目前正在研究 ecore 到 java 模型的转换。实际上,我正在阅读一些 ecore 文件并生成一个字符串,该字符串恰好是一个有效的 java 接口源代码。
例如,这是我的代码生成工作流程。
项目A.ecore:
定义一个 EClass 'A'
package projectA : projectA = 'http://www.example.org/projectA'
{
class A;
}
项目B.ecore:
定义一个从 'A' 继承的 EClass 'B',使用对 a.ecore 的交叉引用来访问它。
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 和 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)。