2016-12-16 67 views
0

要有一个上下文,我目前正在研究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)开发的。

+0

你想实现自己的特定代码生成迭代,而不是使用现有的EMF生成?可以将ecore xmi加载到java对象,并将proxys解析为另一个EPackage的交叉引用EClasses,从而在两者之间建立连接。你可以更具体地了解你如何生成? –

+0

我还没有完全理解你的问题。你需要用它们的连接加载两个Epackage吗?所以你可以识别B的超类型A? –

+0

基本上我需要能够找到定义EClass的.ecore文件。 –

回答

1

如果你只是想获得的文件路径,其中的EClass定义使用资源URI Ecore元文件

尝试:

ePackage.eResource().getURI()它给你的实际URI到Ecore的文件,在其中该软件包及其所有的EClass都已定义。例如:file:/Users/../../yourPath/projectA.ecore 您也可以使用getNsURI(),getName()来标识两个ecore文件。

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

试图通过resourceSet.getResources()