Зарегистрируйте метамодель Ecore программно - PullRequest
9 голосов
/ 22 февраля 2012

Я использую механизм преобразования для создания метамодели Ecore во время выполнения, и мне интересно, как мы можем зарегистрировать эту метамодель в EMF, чтобы она могла распознавать метамодель?

Ответы [ 2 ]

16 голосов
/ 22 февраля 2012

Если у вас есть код, сгенерированный вашей метамоделью:

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

(здесь для метамодели "genmodel")

Если у вас есть только файл .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);
}

Вы можете найти немного больше об этом коде здесь с помощью метода с именем registerEcorePackages(), который используется для регистрации файла .ecore в рабочей области (с полным путем к рабочей области) в нашем реестре пользовательских пакетов. Если вы хотите зарегистрировать свою метамодель в глобальном реестре пакетов EMF, замените resourceSet.getPackageRegistry() на EPackage.Registry.INSTANCE.

1 голос
/ 30 апреля 2015

Мне пришлось немного изменить код из @sbegaudeau, чтобы он работал:

Заменить

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

с

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

Кроме того, почему-то я не могу зарегистрировать тип .ecore. Пришлось использовать "*": Resource.Factory.Registry.INSTANCE. getExtensionToFactoryMap().put("*", new EcoreResourceFactoryImpl());

...