IBM에는 동적 EMF에 대한 주제가 있습니다.
작성자가 emf에서 작동하는 방식에 익숙하다면 꽤 간단합니다. 모든 EPackage는 자신의 EFactory
및 EPackage
Instances를 가지고 있습니다. Instances는 메타 모델 자체에 대한 정보 (생성) 또는 저장소 정보 (에펙)를 처리합니다.
는 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);
업데이트 :
/*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
입니다.
/*
* 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을 살펴보십시오.
또한 어떻게
주셔서 감사합니다 도움을 EClasses 사이의 관계를 초기화하는 방법을 보여 위의 코드를 업데이트,하지만 난 하나 개 더 질문이 있습니다 : 어떻게 두 클래스 사이의 관계를 만들 것입니까? 일반적인 Reference 나 SuperType 관계처럼? – ConveniencePatterns
내 대답 업데이트 –