如何加载模型实例?问题:不能是案例

Posted

技术标签:

【中文标题】如何加载模型实例?问题:不能是案例【英文标题】:How to load model instance? Issue: Cannot be case 【发布时间】:2021-11-29 01:00:55 【问题描述】:

我正在编写一个代码来获取 EMF 模型实例的所有内容。我尝试按照在此处找到的本教程进行操作:Create and modify ecore files and their instances from code 以加载模型。

在本教程中,模型实例是一个 XMI 文件。就我而言,我有一个.myExt 文件(我在创建此模型实例在ecore 中符合的元模型时决定的扩展名)。我写了以下代码,但出现以下错误:


    class GetModelObjects 
        ResourceSet resourceSet = new ResourceSetImpl()
        Resource metamodel
        EPackage mp
        Resource model
        EFactory mappinginstance
        //EList <EObject> modelobjects = new BasicEList<EObject>()
        def doTransform() 
            resourceSet.resourceFactoryRegistry.extensionToFactoryMap.put("ecore", new EcoreResourceFactoryImpl)
            resourceSet.resourceFactoryRegistry.extensionToFactoryMap.put("myext", new MyExtFactoryImpl)
            metamodel = resourceSet.getResource(URI.createFileURI("myext.ecore"), true)
            mp = metamodel.contents.get(0) as EPackage
            resourceSet.packageRegistry.put("http://www.example.org/myExt", metamodel)
            model = resourceSet.getResource(URI.createURI("model.myext"), true)
            mappinginstance = mp.getEFactoryInstance
            System.out.println("Model:" + model.contents)
        

        def static void main(String[] args) 
            new GetModelObjects().doTransform()
        
    

class myExt.impl.MyExtFactoryImpl cannot be cast to class org.eclipse.emf.ecore.resource.Resource$Factory (myExt.impl.MyExtFactoryImpl
  and org.eclipse.emf.ecore.resource.Resource$Factory are in unnamed module of loader 'app')

我不太确定的一件事,我认为可能是这个错误的原因,是这一行:

  resourceSet. resourceFactoryRegistry.extensionToFactoryMap.put("myext", new MyExtFactoryImpl)

因为我不确定这是否是应该放置在这里的工厂。 我非常感谢您对此的任何意见。

提前谢谢你!

【问题讨论】:

【参考方案1】:

作为参考,请使用 Vogella 的教程:https://www.vogella.com/tutorials/EclipseEMF/article.html#load-an-existing-model

您收到的错误消息有点奇怪,我会检查 MyExtFactoryImpl(应该是为您的元模型生成的工厂实现)是否按预期工作(例如 MyExtFactoryImpl.eINSTANCE.createXXX())。此外,错误看起来可能与 Java 模块有关,因此请检查一下(您的类路径中是否有 EMF 资源等?)

【讨论】:

【参考方案2】:

如果您的 .myext 模型被保存为 XMI 文件,您需要一个 XMIResourceFactoryImpl 来加载文件。在您的示例中,这将给出:

resourceSet.resourceFactoryRegistry.extensionToFactoryMap.put("myext", new XMIResourceFactoryImpl())

MyExtFactoryImpl 是创建 MyExt 元模型实例的工厂,它不处理加载实际文件。

【讨论】:

以上是关于如何加载模型实例?问题:不能是案例的主要内容,如果未能解决你的问题,请参考以下文章

单例模式

数据库数据恢复ASM磁盘组掉线,ASM实例不能mount的Oracle数据库数据恢复案例

类加载器深入理解和双亲委托模型的案例分析

如何在 Django 中序列化模型实例?

通过扩大IE使用内存,解决skyline在IE下模型不能加载的方法

为啥 google breakpad 不能处理所有崩溃?我该如何调试这些案例?