【问题标题】:load EMF instance model and then create a object in it programmatically加载 EMF 实例模型,然后以编程方式在其中创建一个对象
【发布时间】:2019-01-28 20:02:33
【问题描述】:

我需要加载 EMF 实例模型,然后只需在单独的插件中编码即可在其中创建一个对象。

请用代码 sn-p 向我解释一下如何创建这个对象?

假设我们有简单的元模型:

【问题讨论】:

  • 你的问题没有多大意义,听起来你需要做的就是从 XML 或任何地方加载一个 EMF 模型,获取一个作为你的 UserObject 的 EObject,然后将该引用传递给另一个插件或类它可以添加或修改您加载的对象,然后将其保存回磁盘或做任何您想做的事情。这是你要问的吗?
  • 我找到了解决办法

标签: emf eclipse-emf


【解决方案1】:

如果要加载一个XML模型,只要在Eclipse插件中使用,就应该这么简单:

ResourceSet resourceSet = new ResourceSetImpl();
Resource resource = resourceSet.getResource(fileURI, true);

要在您的模型中创建一些对象,您需要使用由 EMF 从您的.ecore 生成的 gactory。如果您的.ecore 描述了一个名为Database 的包,那么您的工厂将在DatabaseFactory.java 中生成。

User newUser = DatabaseFactory.INSTANCE.createUser();
newUser.setFirstName("xxxx");

Login login = DatabaseFactory.INSTANCE.createLogin();
login.setPassword("12345678");

newUser.getPasswords().add(login);

resource.getContents().add(newUser);

要在此模型中检索您的 User

User user = (User) resource.eContents().get(0);

(这只是一个例子,当然get(0)是有风险的。)

【讨论】:

  • 我想补充一点,答案中给出的代码也适用于任何 Eclipse 插件之外,在普通的非 Eclipse Java 项目中。
【解决方案2】:

公共对象执行(ExecutionEvent 事件)抛出 ExecutionException { IWorkbenchWindow 窗口 = HandlerUtil.getActiveWorkbenchWindowChecked(event); ISelection 选择 = window.getSelectionService().getSelection("org.eclipse.jdt.ui.PackageExplorer"); MessageDialog.openInformation(window.getShell(),"Test", selection.toString());

                TreeSelection treeSelection = (TreeSelection) selection;
                TreePath[] treePaths = treeSelection.getPaths();
                TreePath treePath = treePaths[0];
                Object lastSegmentObj = treePath.getLastSegment();
                IFile file = (IFile) ((IAdaptable) lastSegmentObj).getAdapter(IFile.class);
                String path = file.getRawLocationURI().toString(); 
                URI uri = URI.createURI(path);

                User imodesene = UserFactory.eINSTANCE.createModesene();
                    imodesene.eAdapters().add(new EContentAdapter() {
                            @Override
                            public void notifyChanged(Notification notification) {
                                super.notifyChanged(notification);
                            }   
                        });

                ResourceSet resourceSet = new ResourceSetImpl();
                Resource resource = resourceSet.getResource(uri, true);
                imodesene = (User) resource.getContents().get(0);

                MessageDialog.openInformation(window.getShell(),"Test", "Load --- Name :"+imodesene.getName()+"\n");

                List<String> NetworkNodes = new ArrayList<>();
                EList<Network> listeNetwork = imodesene.getNetworkFacet().getNetwork();
                for (int it = 0; it < listeNetwork.size(); it++) {
                    EList<Node> listeNode = listeNetwork.get(it).getNodes();
                    for (int itt = 0; itt < listeNode.size(); itt++) {
                        NetworkNodes.add(listeNode.get(itt).getId());
                        }
                    }


                EList<PhysicalEnvironment> listeEnv = imodesene.getPhysicalEnvFacet().getPhysicalEnv();
                for (int it = 0; it < listeEnv.size(); it++) {
                    for (int itt = 0; itt < NetworkNodes.size(); itt++) {
                        NodeInstance nodeInstance = ModeseneFactory.eINSTANCE.createNodeInstance();
                        nodeInstance.setID(NetworkNodes.get(itt));
                        listeEnv.get(it).getZones().get(0).getNodes().add(nodeInstance);

                        }
                    }




            try {
                resource.save(null);
            } catch (IOException e) {
                e.printStackTrace();
            }

            MessageDialog.openInformation(window.getShell(),"Test", "--- END ---");


    return null;
}

}

【讨论】:

    猜你喜欢
    • 2018-03-23
    • 2012-04-29
    • 2014-05-07
    • 1970-01-01
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 1970-01-01
    相关资源
    最近更新 更多