为了具有上下文,我目前正在进行从ecore到java模型的转换。实际上,我正在读取一些ecore文件并生成一个字符串,该字符串恰好是一个有效的java接口源代码。
举个例子,下面是我的代码生成工作流。
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 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到字符串转换的类。从技术上讲,它是使用https://github.com/manuelleduc/ecore-oa/blob/master/fr.inria.diverse.ecorealgebragenerator/src/fr/inria/diverse/objectalgebragenerator/popup/actions/GenerateAlgebra.xtend开发的。
发布于 2016-12-19 14:49:43
如果您只想获得定义EClass的ecore文件的文件路径,请使用资源URI
尝试:
ePackage.eResource().getURI(),它为您提供了定义包及其所有EClasses的ecore文件的实际URI。类似于:file:/Users/../../yourPath/projectA.ecore,您也可以使用getNsURI(),getName()来识别两个ecore文件。
如果您像以前一样使用Resourceset,并且在几个ecore文件之间有交叉引用,那么这个集合也会尝试加载所有其他资源。这意味着,通过调用resourceSet.getResource(uri, true),资源集应该包含这两个资源。
尝试遍历resourceSet.getResources()
https://stackoverflow.com/questions/41185865
复制相似问题