Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何用Java代码生成EMF模型_Java_Eclipse_Eclipse Emf_Eclipse Emf Ecore - Fatal编程技术网

如何用Java代码生成EMF模型

如何用Java代码生成EMF模型,java,eclipse,eclipse-emf,eclipse-emf-ecore,Java,Eclipse,Eclipse Emf,Eclipse Emf Ecore,我想用Java代码生成EMF模型。例如,我想创建一个新的Ecore建模项目,并构建一个简单的模型,如许多教程中所示(如)。但是我不想用GUI手工完成。我想学习如何使用Java代码创建模型 我试图找到关于这个主题的教程。但令我失望的是,我找不到太多关于这个话题的信息。我只能找到一些。但是没有关于创建新模型的内容。只是浏览API对我没有帮助 关于这个话题有什么消息来源吗?如果没有,我如何通过java代码创建EMF模型?有一个关于动态EMF的主题 但如果您熟悉emf中的创建工作方式,那么这是非常直接的

我想用Java代码生成EMF模型。例如,我想创建一个新的Ecore建模项目,并构建一个简单的模型,如许多教程中所示(如)。但是我不想用GUI手工完成。我想学习如何使用Java代码创建模型

我试图找到关于这个主题的教程。但令我失望的是,我找不到太多关于这个话题的信息。我只能找到一些。但是没有关于创建新模型的内容。只是浏览API对我没有帮助

关于这个话题有什么消息来源吗?如果没有,我如何通过java代码创建EMF模型?

有一个关于动态EMF的主题

但如果您熟悉emf中的创建工作方式,那么这是非常直接的。每个EPackage都有自己的
EFactory
EPackage
实例,它们处理创建(工厂)或存储有关元模型本身的信息(EPackage)

Ecore拥有自己的
EPackage
EFactory
,因此完全可以像这样动态创建新的元模型:

    /*Use the Ecore factory*/
    EcoreFactory ecoreFactory = EcoreFactory.eINSTANCE;
    /*Create your EPackage*/
    EPackage myPackage = ecoreFactory.createEPackage();
    /*set EPackage properties*/
    myPackage.setName("myTest");
    myPackage.setNsPrefix("myTest");
    myPackage.setNsURI("http://com.myTest");

    /*Create your first EClass*/
    EClass myFirstEClass = ecoreFactory.createEClass();
    myFirstEClass.setName("myClass");
    /*Add to your EPackage's EClassifiers*/
    /*EClasses and EDatatypes implement both EClassifiers*/
    myPackage.getEClassifiers().add(myFirstEClass);

    /*Create your first EAtttribute*/
    EAttribute myFirstEAtt = ecoreFactory.createEAttribute();
    myFirstEAtt.setName("name");
    /*Use the EcorePackage Datatypes -> here EString*/
    myFirstEAtt.setEType(EcorePackage.eINSTANCE.getEString());
    /*use EStructuralFeatures to add your EAtt*/
    /*EReferences and EAttributes are both EStructuralfeatures*/
    myFirstEClass.getEStructuralFeatures().add(myFirstEAtt);
    /*
     * Save your EPackage to file ecore file:
     */

    /*Initialize your EPackage*/
    myPackage.eClass();
    Resource.Factory.Registry reg = Resource.Factory.Registry.INSTANCE;
    Map<String, Object> m = reg.getExtensionToFactoryMap();
    /*add default .ecore extension for ecore file*/
    m.put(EcorePackage.eNAME, new XMIResourceFactoryImpl());

    // Obtain a new resource set
    ResourceSet resSet = new ResourceSetImpl();
    // create a resource
    Resource resource = null;
    try {
        resource = resSet.createResource(URI.createFileURI("/Your/Path/To/Directory/myTest.ecore"));
    } catch (Exception e) {
        e.printStackTrace();
    }
    /*add your EPackage as root, everything is hierarchical included in this first node*/
    resource.getContents().add(myPackage);

    // now save the content.
    try {
        resource.save(Collections.EMPTY_MAP);
    } catch (IOException e) {
        e.printStackTrace();
    }
更新:

    /*Create your second EClass*/
    EClass mySecondEClass = ecoreFactory.createEClass();
    mySecondEClass.setName("mySecondClass");
    myPackage.getEClassifiers().add(mySecondEClass);

    /*now, the firstClass should hold instances of secondClass*/
    /*1. create EReference (Ereferences unlike EAttributes define relationships between EClasses)*/
    EReference secondClassesRef = ecoreFactory.createEReference();
    secondClassesRef.setName("secondClasses");
    /*set containment true -> every EObject must have a Container*/
    secondClassesRef.setContainment(true);
    /*set Type to your EClass*/
    secondClassesRef.setEType(mySecondEClass);
    /*set upperbound -> now the reference is an EList*/
    secondClassesRef.setUpperBound(ETypedElement.UNBOUNDED_MULTIPLICITY);

    /*finally add ERef to EClass*/
    myFirstEClass.getEStructuralFeatures().add(secondClassesRef);

    /*and for example supertypes*/
    myFirstEClass.getESuperTypes().add(mySecondEClass);
现在,您有了自己的
EPackage
,带有一个新的
EClass
,其中包含
EAttribute
类型的名称
EString

现在还可以将新的EPackage保存到
.ecore
文件中,如下所示:

    /*Use the Ecore factory*/
    EcoreFactory ecoreFactory = EcoreFactory.eINSTANCE;
    /*Create your EPackage*/
    EPackage myPackage = ecoreFactory.createEPackage();
    /*set EPackage properties*/
    myPackage.setName("myTest");
    myPackage.setNsPrefix("myTest");
    myPackage.setNsURI("http://com.myTest");

    /*Create your first EClass*/
    EClass myFirstEClass = ecoreFactory.createEClass();
    myFirstEClass.setName("myClass");
    /*Add to your EPackage's EClassifiers*/
    /*EClasses and EDatatypes implement both EClassifiers*/
    myPackage.getEClassifiers().add(myFirstEClass);

    /*Create your first EAtttribute*/
    EAttribute myFirstEAtt = ecoreFactory.createEAttribute();
    myFirstEAtt.setName("name");
    /*Use the EcorePackage Datatypes -> here EString*/
    myFirstEAtt.setEType(EcorePackage.eINSTANCE.getEString());
    /*use EStructuralFeatures to add your EAtt*/
    /*EReferences and EAttributes are both EStructuralfeatures*/
    myFirstEClass.getEStructuralFeatures().add(myFirstEAtt);
    /*
     * Save your EPackage to file ecore file:
     */

    /*Initialize your EPackage*/
    myPackage.eClass();
    Resource.Factory.Registry reg = Resource.Factory.Registry.INSTANCE;
    Map<String, Object> m = reg.getExtensionToFactoryMap();
    /*add default .ecore extension for ecore file*/
    m.put(EcorePackage.eNAME, new XMIResourceFactoryImpl());

    // Obtain a new resource set
    ResourceSet resSet = new ResourceSetImpl();
    // create a resource
    Resource resource = null;
    try {
        resource = resSet.createResource(URI.createFileURI("/Your/Path/To/Directory/myTest.ecore"));
    } catch (Exception e) {
        e.printStackTrace();
    }
    /*add your EPackage as root, everything is hierarchical included in this first node*/
    resource.getContents().add(myPackage);

    // now save the content.
    try {
        resource.save(Collections.EMPTY_MAP);
    } catch (IOException e) {
        e.printStackTrace();
    }
/*
*将EPackage保存到文件ecore文件:
*/
/*初始化您的EPackage*/
myPackage.eClass();
Resource.Factory.Registry reg=Resource.Factory.Registry.INSTANCE;
Map m=reg.getExtensionFactoryMap();
/*为ecore文件添加default.ecore扩展名*/
m、 put(EcorePackage.eNAME,新的XMIResourceFactoryImpl());
//获取新的资源集
ResourceSet RESET=新的ResourceSetImpl();
//创建资源
Resource=null;
试一试{
resource=reset.createResource(URI.createFileURI(“/Your/Path/To/Directory/myTest.ecore”);
}捕获(例外e){
e、 printStackTrace();
}
/*将您的EPackage添加为root,所有内容都包含在第一个节点中*/
resource.getContents().add(myPackage);
//现在保存内容。
试一试{
resource.save(Collections.EMPTY_MAP);
}捕获(IOE异常){
e、 printStackTrace();
}
反之亦然,如果要加载现有ecore EPackage:

    /*
     * load existing EPackage
     */
    EcorePackage.eINSTANCE.eClass();
    /*Initialize your EPackage*/
    final Resource.Factory.Registry reg = Resource.Factory.Registry.INSTANCE;
    final Map<String, Object> m = reg.getExtensionToFactoryMap();
    m.put(EcorePackage.eNAME, new XMIResourceFactoryImpl());

    final ResourceSet resSet = new ResourceSetImpl();
    Resource resource = null;
    try {
        resource = resSet.getResource(URI.createFileURI("/Your/Path/To/Directory/myTest.ecore"), true);
    } catch (Exception e) {
        e.printStackTrace();
    }
    /*load root and cast to EPackage*/
    final EPackage root = (EPackage) resource.getContents().get(0);
/*
*加载现有EPackage
*/
EcorePackage.eINSTANCE.eClass();
/*初始化您的EPackage*/
final Resource.Factory.Registry reg=Resource.Factory.Registry.INSTANCE;
最终映射m=reg.getExtensionFactoryMap();
m、 put(EcorePackage.eNAME,新的XMIResourceFactoryImpl());
final ResourceSet RESET=新的ResourceSetImpl();
Resource=null;
试一试{
resource=reset.getResource(URI.createFileURI(“/Your/Path/To/Directory/myTest.ecore”),true);
}捕获(例外e){
e、 printStackTrace();
}
/*将根部和铸件装入EPackage*/
最终EPackage根=(EPackage)resource.getContents().get(0);
更新: Ecore当然有自己的元模型。在中,您可以看到ecore体系结构的一个很好的概述

因此,如果您想使用动态EMF,您需要了解这一点。正如我向您展示的,动态创建
EPackage
非常简单,但是您需要知道如何设置ecore模型的基本属性(EClass、EAttributes、erereference、EType、containment、supertypes…)。一旦理解了体系结构,就很容易了。看看页面底部的UML图


我还更新了上面的代码,向您展示了如何初始化EClasses之间的关系

谢谢您的帮助,但我还有一个问题:如何在两个类之间创建关系?像普通引用还是超类型关系?更新了我的答案