要有一个上下文,我目前正在研究ecore到java模型的转换。实际上,我正在阅读一些ecore文件并生成恰好是有效的java接口源代码的字符串。ECore反射和交叉引用
举个例子,这里是我的代码生成工作流程。
projectA.ecore:
定义一个的EClass 'A'
package projectA : projectA = 'http://www.example.org/projectA'
{
class A;
}
projectB.ecore:
定义一个的EClass 'B',其使用从 'A' 继承交叉引用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 reflection 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到字符串转换的类。技术上它是使用Xtend(https://github.com/manuelleduc/ecore-oa/blob/master/fr.inria.diverse.ecorealgebragenerator/src/fr/inria/diverse/objectalgebragenerator/popup/actions/GenerateAlgebra.xtend)开发的。
你想实现自己的特定代码生成迭代,而不是使用现有的EMF生成?可以将ecore xmi加载到java对象,并将proxys解析为另一个EPackage的交叉引用EClasses,从而在两者之间建立连接。你可以更具体地了解你如何生成? –
我还没有完全理解你的问题。你需要用它们的连接加载两个Epackage吗?所以你可以识别B的超类型A? –
基本上我需要能够找到定义EClass的.ecore文件。 –