2012-02-21 15 views
9

Używam silnika transformacji, aby utworzyć meta-model Ecore w czasie wykonywania i zastanawiam się, w jaki sposób możemy zarejestrować ten meta-model z EMF, aby mógł rozpoznać meta-model?Meta-model rejestruje programowo

Odpowiedz

16

Jeśli kod generowany przez metamodelu:

resourceSet.getPackageRegistry() 
    .put(org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage.eINSTANCE.getNsURI() 
    , org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage.eINSTANCE); 

(tutaj na "genmodel" metamodelu)

Jeśli masz tylko plik .ecore:

// register globally the Ecore Resource Factory to the ".ecore" extension 
// weird that we need to do this, but well... 
Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put(
    "ecore", new EcoreResourceFactoryImpl()); 

ResourceSet rs = new ResourceSetImpl(); 
// enable extended metadata 
final ExtendedMetaData extendedMetaData = new BasicExtendedMetaData(rs.getPackageRegistry()); 
rs.getLoadOptions().put(XMLResource.OPTION_EXTENDED_META_DATA, 
    extendedMetaData); 

Resource r = rs.getResource(uriOfYourModel, true); 
EObject eObject = r.getContents().get(0); 
if (eObject instanceof EPackage) { 
    EPackage p = (EPackage)eObject; 
    rs.getPackageRegistry().put(p.getNsURI(), p); 
} 

Możesz znaleźć nieco więcej na temat tego kodu here za pomocą metody o nazwie registerEcorePackages(), u sed, aby zarejestrować plik .ecore w obszarze roboczym (z pełną ścieżką obszaru roboczego) w naszym niestandardowym rejestrze pakietów. Jeśli chcesz zarejestrować swój metamodel w globalnym rejestrze paczek EMF, zastąp resourceSet.getPackageRegistry() przez EPackage.Registry.INSTANCE.

+1

Dziękuję bardzo za odpowiedź :) – capint

+0

Stephane SUPERB ODPOWIEDZI !!!!!! Wielkie dzięki Stephane! Nie mogę ci wystarczająco podziękować ..... Technika "ecore file" jest tym, czego szukam! –

+0

Cześć, niesamowite dziękuję! Musiałem trochę zmodyfikować kod, żeby działał. Proszę zobaczyć moją odpowiedź dla szczegółów. – Andrei

1

musiałem zmodyfikować kod z @sbegaudeau trochę go do pracy:

Wymień

rs.getPackageRegistry().put(p.getNsURI(), p);

z

EPackage.Registry.INSTANCE.put(p.getNsURI(), p);

też jakoś nie mogę się zarejestrować typ .ecore. Musiał użyć „*”: Resource.Factory.Registry.INSTANCE. getExtensionToFactoryMap().put("*", new EcoreResourceFactoryImpl());

Powiązane problemy