2016-10-23 16 views
1

자바 코드로 EMF 모델을 생성하고 싶습니다. 예를 들어, 새로운 Ecore Modeling Project를 만들고 많은 튜토리얼에서 볼 수 있듯이 (예 : vogella tutorial) 간단한 모델을 만들고 싶습니다. 하지만 저는 GUI를 사용하여 수동으로하고 싶지 않습니다. EMF-Ecore-API을 사용하여 Java 코드로 모델을 작성하는 방법을 배우고 싶습니다.Java 코드로 EMF 모델을 생성하는 방법

이 주제에 대한 자습서를 찾으려고했습니다. 그러나 실망 스럽지만 나는이 주제에 관해 많이 알지 못했다. 내가 찾을 수 있었던 유일한 것은 약간 code snippets to load and modify existing models by code이었다. 그러나 새로운 모델을 만드는 것에 대해서는 아무것도 없습니다. API를 살펴보면 도움이되지 않았습니다.

이 주제에 대한 출처가 있습니까? 그렇다면 자바 코드로 EMF 모델을 어떻게 만들 수 있습니까?

답변

2

IBM에는 동적 EMF에 대한 주제가 있습니다.

작성자가 emf에서 작동하는 방식에 익숙하다면 꽤 간단합니다. 모든 EPackage는 자신의 EFactoryEPackage Instances를 가지고 있습니다. Instances는 메타 모델 자체에 대한 정보 (생성) 또는 저장소 정보 (에펙)를 처리합니다.

는 Ecore는 EPackageEFactory이 때문에이 같은 즉석에서 새로운 메타 모델을 만들 절대적으로 가능 자신이 있습니다

/*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); 

업데이트 :

/*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에이 새 EClassEAttribute 유형 이름이 EString

입니다.

/* 
    * 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); 

이 업데이트 : 는 Ecore이의이 기존는 Ecore EPackage를로드 할 경우,

/* 
    * 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(); 
    } 

그 반대 : 지금은이 같은 .ecore 파일에 새 EPackage을 저장할 수도 있습니다 물론 자체 메타 모델. Docs에서 ecore 아키텍처에 대한 훌륭한 개요를 찾을 수 있습니다.

동적 EMF를 사용하려면이를 이해해야합니다. 내가 보여 주었 듯이 EPackage을 동적으로 생성하는 것은 매우 간단하지만 ecore 모델 (EClass, EAttributes, EReferences, EType, containment, superpertypes ...)의 기본 속성을 설정하는 방법을 알아야합니다. 일단 아키텍처를 이해하면 꽤 쉽습니다. 페이지 하단의 UML-Diagram을 살펴보십시오.

또한 어떻게

+0

주셔서 감사합니다 도움을 EClasses 사이의 관계를 초기화하는 방법을 보여 위의 코드를 업데이트,하지만 난 하나 개 더 질문이 있습니다 : 어떻게 두 클래스 사이의 관계를 만들 것입니까? 일반적인 Reference 나 SuperType 관계처럼? – ConveniencePatterns

+1

내 대답 업데이트 –