Java ATL转换-空输出
我试图将XText与EMF的ATL模型到模型转换结合起来。 我正在读取我的DSL,将其转储到EMF的XMI资源中,并将其放入ATL api中:ATL不会给我任何错误并正确运行:Java ATL转换-空输出,java,xtext,emf,eclipse-atl,Java,Xtext,Emf,Eclipse Atl,我试图将XText与EMF的ATL模型到模型转换结合起来。 我正在读取我的DSL,将其转储到EMF的XMI资源中,并将其放入ATL api中:ATL不会给我任何错误并正确运行: Number of instructions executed: 38 无论我做什么,我的OutModel(palData)都保持为空(null)。如果我从这里获取所有文件(hdl.ecore、pal.ecore、hdl.xmi)并将它们放入示例ATL项目中,我会得到一个正确的输出 那么,是否有任何神奇的参数,我需要扔
Number of instructions executed: 38
无论我做什么,我的OutModel(palData)都保持为空(null)。如果我从这里获取所有文件(hdl.ecore、pal.ecore、hdl.xmi)并将它们放入示例ATL项目中,我会得到一个正确的输出
那么,是否有任何神奇的参数,我需要扔到EMFVM发射器
触发ATL的我的代码:
//创建内容
EMFModelFactory emfFactory=新的EMFModelFactory();
XMIResourceFactoryImpl xmiFactory=新的xmiresourcefactorympl();
EMFExtractor extractor=新的EMFExtractor();
EMFInjector EMFInjector=新的EMFInjector();
ResourceSet ResourceSet=new ResourceSetImpl();
//负荷模型
EMFReferenceModel hdlMetaModel=(EMFReferenceModel)emfFactory.newReferenceModel();
emfInjector.inject(hdlMetaModel,resourceSet.getResource(URI.createFileURI(“org.xtext.hal/model/generated/Hdl.ecore”),true);
EMFModel hdlData=(EMFModel)emfFactory.newModel(hdlMetaModel);
EMFReferenceModel palMetaModel=(EMFReferenceModel)emfFactory.newReferenceModel();
emfInjector.inject(palMetaModel,resourceSet.getResource(URI.createFileURI(“org.xtext.hal/model/Pal.ecore”),true);
EMFModel palData=(EMFModel)emfFactory.newModel(palMetaModel);
palData.setIsTarget(true);
//加载xtext内容,转换为xmi
Resource xmiResource=xmiFactory.createResource(URI.createURI(“org.xtext.hal/model/generated/Hdl.xmi”);
xmiResource.getContents().addAll(hdlModel.getContents());
emfInjector.inject(hdlData,xmiResource);
//ATL变换
InputStream asm=新文件InputStream(“org.xtext.hal/model/Pal.asm”);
EMFVMLauncher启动器=新的EMFVMLauncher();
HashMap选项=新建HashMap();
期权。看跌期权(“showSummary”、“true”);
期权。看跌期权(“步进”、“真实”);
initialize(Collections.emptyMap());
addInModel(hdlData,“IN”,“hdl”);
launcher.addOutModel(palData,“OUT”,“pal”);
launcher.launch(ILauncher.DEBUG_模式,新的NullProgressMonitor(),选项,asm);
//获得输出
资源t_palData=palData.getResource();
t_palData.setURI(URI.createURI(“palData.xmi”);//线程“main”java.lang.NullPointerException中出现异常
t_palData.save(空);
我的地址是ATL:
-- @path hdl=/org.xtext.hal/model/generated/Hdl.ecore
-- @path pal=/org.xtext.hal/model/Pal.ecore
module HDL2PAL;
create OUT : pal from IN : hdl;
rule Foobar
{
from
s : hdl!Model
to
t : pal!AddressSpace (
name <- s.name
)
}
--@path hdl=/org.xtext.hal/model/generated/hdl.ecore
--@path pal=/org.xtext.hal/model/pal.ecore
模块HDL2PAL;
从输入:hdl创建输出:pal;
规则Foobar
{
从…起
s:hdl!模型
到
朋友!地址空间(
name加载模型后,您正在从文件加载HDL元模型:
EMFReferenceModel hdlMetaModel=(EMFReferenceModel)emfFactory.newReferenceModel();
emfInjector.inject(hdlMetaModel,resourceSet.getResource(URI.createFileURI(“org.xtext.hal/model/generated/Hdl.ecore”),true)
现有的“hdl模型”将包含链接到EClass的其他实例的EObjects,而不是您加载到“hdl模型”中的实例。因此,如果ATL尝试确定“hdl!模型”的所有实例,它将找不到任何内容:实际实例引用的是“hdl!模型”的另一个版本。解决方案是获取由xText加载的HDL元模型的预加载版本
另外,关于ATL的大多数支持讨论将在上继续。您可能想在那里继续讨论。谢谢。这可能是一个提示。但是我如何才能选择正确的实例?我尝试从原始resourceSetProvider获取这两个(模型和元模型):emfInjector.inject(hdlMetaModel,resourceSetProvider.get().getResource(URI.createURI(“org.xtext.hal/model/generated/Hdl.ecore”),true);Resource Resource=resourceSetProvider.get().getResource(URI.createURI(“hdlData.Hdl”),true);但运气不好。嘿,德瓦格拉尔,你介意看看吗
<?xml version="1.0" encoding="UTF-8"?>
<ecore:EPackage xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="hdl" nsURI="http://www.xtext.org/hal/Hdl" nsPrefix="hdl">
<eClassifiers xsi:type="ecore:EClass" name="Model">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
</eClassifiers>
</ecore:EPackage>
<?xml version="1.0" encoding="UTF-8"?>
<ecore:EPackage xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="pal" nsURI="http://www.xtext.org/hal/Pal" nsPrefix="pal">
<eClassifiers xsi:type="ecore:EClass" name="AddressSpace">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
</eClassifiers>
</ecore:EPackage>
<?xml version="1.0" encoding="ASCII"?>
<hdl:Model xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:hdl="http://www.xtext.org/hal/Hdl" name="bar"/>
<?xml version="1.0" encoding="ISO-8859-1"?>
<pal:AddressSpace xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:pal="http://www.xtext.org/hal/Pal" name="bar"/>
main:0 getasm
stack: HDL2PAL : ASMModule
locals: self=HDL2PAL : ASMModule
main:1 push OclParametrizedType
stack: HDL2PAL : ASMModule, 'OclParametrizedType'
locals: self=HDL2PAL : ASMModule
main:2 push #native
stack: HDL2PAL : ASMModule, 'OclParametrizedType', '#native'
locals: self=HDL2PAL : ASMModule
main:3 new
stack: HDL2PAL : ASMModule, <unnamed>(null)
locals: self=HDL2PAL : ASMModule
main:4 dup
stack: HDL2PAL : ASMModule, <unnamed>(null), <unnamed>(null)
locals: self=HDL2PAL : ASMModule
main:5 push Collection
stack: HDL2PAL : ASMModule, <unnamed>(null), <unnamed>(null), 'Collection'
locals: self=HDL2PAL : ASMModule
main:6 pcall J.setName(S):V
locals: self=HDL2PAL : ASMModule Calling <unnamed>(null).setName('Collection')
stack: HDL2PAL : ASMModule, Collection(null)
locals: self=HDL2PAL : ASMModule
main:7 dup
stack: HDL2PAL : ASMModule, Collection(null), Collection(null)
locals: self=HDL2PAL : ASMModule
main:8 push OclSimpleType
stack: HDL2PAL : ASMModule, Collection(null), Collection(null), 'OclSimpleType'
locals: self=HDL2PAL : ASMModule
main:9 push #native
stack: HDL2PAL : ASMModule, Collection(null), Collection(null), 'OclSimpleType', '#native'
locals: self=HDL2PAL : ASMModule
main:10 new
stack: HDL2PAL : ASMModule, Collection(null), Collection(null), <unnamed>
locals: self=HDL2PAL : ASMModule
main:11 dup
stack: HDL2PAL : ASMModule, Collection(null), Collection(null), <unnamed>, <unnamed>
locals: self=HDL2PAL : ASMModule
main:12 push OclAny
stack: HDL2PAL : ASMModule, Collection(null), Collection(null), <unnamed>, <unnamed>, 'OclAny'
locals: self=HDL2PAL : ASMModule
main:13 pcall J.setName(S):V
locals: self=HDL2PAL : ASMModule Calling <unnamed>.setName('OclAny')
stack: HDL2PAL : ASMModule, Collection(null), Collection(null), OclAny
locals: self=HDL2PAL : ASMModule
main:14 pcall J.setElementType(J):V
locals: self=HDL2PAL : ASMModule Calling Collection(null).setElementType(OclAny)
stack: HDL2PAL : ASMModule, Collection(OclAny)
locals: self=HDL2PAL : ASMModule
main:15 set col
stack:
locals: self=HDL2PAL : ASMModule
main:16 getasm
stack: HDL2PAL : ASMModule
locals: self=HDL2PAL : ASMModule
main:17 push TransientLinkSet
stack: HDL2PAL : ASMModule, 'TransientLinkSet'
locals: self=HDL2PAL : ASMModule
main:18 push #native
stack: HDL2PAL : ASMModule, 'TransientLinkSet', '#native'
locals: self=HDL2PAL : ASMModule
main:19 new
stack: HDL2PAL : ASMModule, TransientLinkSet {}
locals: self=HDL2PAL : ASMModule
main:20 set links
stack:
locals: self=HDL2PAL : ASMModule
main:21 getasm
stack: HDL2PAL : ASMModule
locals: self=HDL2PAL : ASMModule
main:22 pcall A.__matcher__():V
locals: self=HDL2PAL : ASMModule Calling HDL2PAL : ASMModule.__matcher__()
__matcher__:0 getasm
stack: HDL2PAL : ASMModule
locals: self=HDL2PAL : ASMModule
__matcher__:1 pcall A.__matchFoobar():V
locals: self=HDL2PAL : ASMModule Calling HDL2PAL : ASMModule.__matchFoobar()
__matchFoobar:0 push Model
stack: 'Model'
locals: self=HDL2PAL : ASMModule
__matchFoobar:1 push hdl
stack: 'Model', 'hdl'
locals: self=HDL2PAL : ASMModule
__matchFoobar:2 findme
stack: hdl!Model
locals: self=HDL2PAL : ASMModule
__matchFoobar:3 push IN
stack: hdl!Model, 'IN'
locals: self=HDL2PAL : ASMModule
__matchFoobar:4 call MMOF!Classifier;.allInstancesFrom(S):QJ
locals: self=HDL2PAL : ASMModule Calling hdl!Model.allInstancesFrom('IN')
stack: OrderedSet {}
locals: self=HDL2PAL : ASMModule
__matchFoobar:5 iterate
stack:
locals:
stack:
locals:
stack:
locals: self=HDL2PAL : ASMModule
main:23 getasm
stack: HDL2PAL : ASMModule
locals: self=HDL2PAL : ASMModule
main:24 pcall A.__exec__():V
locals: self=HDL2PAL : ASMModule Calling HDL2PAL : ASMModule.__exec__()
__exec__:0 getasm
stack: HDL2PAL : ASMModule
locals: self=HDL2PAL : ASMModule
__exec__:1 get links
stack: TransientLinkSet {}
locals: self=HDL2PAL : ASMModule
__exec__:2 push Foobar
stack: TransientLinkSet {}, 'Foobar'
locals: self=HDL2PAL : ASMModule
__exec__:3 call NTransientLinkSet;.getLinksByRule(S):QNTransientLink;
locals: self=HDL2PAL : ASMModule Calling TransientLinkSet {}.getLinksByRule('Foobar')
stack: []
locals: self=HDL2PAL : ASMModule
__exec__:4 iterate
stack:
locals:
stack:
locals: