gpt4 book ai didi

java - ECore 反射和交叉引用

转载 作者:行者123 更新时间:2023-12-01 09:07:04 26 4
gpt4 key购买 nike

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

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

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生成一个接口(interface):

package projecta;

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

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

package projectb;

import projecta.ProjectA;

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

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

我环顾了 corere 反射 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 ) 开发的。

最佳答案

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

尝试:

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

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

尝试迭代resourceSet.getResources()

关于java - ECore 反射和交叉引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41185865/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com