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
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
.
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());
Dziękuję bardzo za odpowiedź :) – capint
Stephane SUPERB ODPOWIEDZI !!!!!! Wielkie dzięki Stephane! Nie mogę ci wystarczająco podziękować ..... Technika "ecore file" jest tym, czego szukam! –
Cześć, niesamowite dziękuję! Musiałem trochę zmodyfikować kod, żeby działał. Proszę zobaczyć moją odpowiedź dla szczegółów. – Andrei