Загрузка нескольких файлов xmi с помощью EMF

Я использую EMF в течение трех недель. Я уже создал свою метамодель и экземпляр с помощью работающего приложения Eclipse. Теперь моя проблема заключается в том, что у меня есть несколько файлов XMI, сохраненных работающим экземпляром Eclipse, и я хочу проанализировать их, чтобы создать другой текстовый файл, обрабатывающий данные в файлах xmi. Для этого я использую XMIResource API EMF, и когда я загружаю файл без перекрестных ссылок на другие документы xmi, все идет хорошо. Однако, когда я загружаю документ xmi с перекрестными ссылками на другие документы xmi, все перекрестные ссылки не сохраняются должным образом в моей модели Java.

Я использовал этот фрагмент кода для загрузки файлов xmi:

XMIResource resourceInTy = new XMIResourceImpl(URI.createURI("file:/runtime-New_configuration/ApplicationInstance/instancesTypes.model"));
    resourceInTy.load(null);
    Environment env1 = (Environment) resourceInTy.getContents().get(0);

    XMIResource resourceContRel = new XMIResourceImpl(URI.createURI("file:/runtime-New_configuration/ApplicationInstance/ContextRelations.model"));
    resourceContRel.load(null);
    Environment env2 = (Environment) resourceContRel.getContents().get(0);

    env.setTypes(env1.getTypes());
    env.setInstances(env1.getInstances());
    env.setContextRelations(env2.getContextRelations());

Как видите, объект «Окружающая среда» — это мой корневой объект всей метамодели, который должен содержать все правильно установленные объекты EList после разбора файлов xmi.

Проблема здесь в том, что внутри EList «ContextRelations» должна быть ссылка на другой объект с именем «Параметр», который имеет ссылку на тип объекта. Если я попытаюсь получить тип, появится нулевая ссылка! Я глубоко искал еще один вопрос об этой проблеме, но самый близкий, который я нашел, был вопрос без ответа, доступный по этой ссылке: Загрузка нескольких файлов с помощью загрузки ресурсов EMF?

Вот два файла xmi: ContextRelations.model.

<parameters number="5">
  <type href="instancesTypes.model#//@types.0"/>
</parameters>
<parameters number="6">
  <type href="instancesTypes.model#//@types.4"/>
</parameters>
<contextRelations name="in"parameters="//@parameters.0//@parameters.1">
  <initialComplexEvent href="Events.model#//@events.0"/>
  <endingComplexEvent href="Events.model#//@events.1"/>
</contextRelations>

Типы экземпляров.model

<types name="Emp"/>
<types name="Cam"/>
<types name="Comp"/>
<types name="Fi"/>
<types name="Loc"/>
<types name="St"/>
<types name="Read"/>
<instances name="Alice" type="//@types.0"/>
<instances name="r01" type="//@types.4"/>
<instances name="Bob" type="//@types.0"/>
<instances name="cctv1" type="//@types.1"/>
<instances name="doc" type="//@types.3"/>
<instances name="m1" type="//@types.2"/>
<instances name="m2" type="//@types.2"/>
<instances name="m3" type="//@types.2"/>
<instances name="nfc01" type="//@types.6"/>
<instances name="usb1" type="//@types.5"/>

Второстепенный вопрос:

Как видите, я использую три корневых объекта: env1 и env2 используются как временные переменные, которые помещают свое содержимое в основной корневой объект (env). Я делаю это, потому что не знаю, как анализировать все файлы xmi одновременно, создавая только один корневой объект.

Кто-нибудь может мне помочь, пожалуйста?


person mlat92    schedule 18.04.2017    source источник


Ответы (1)


Я решил проблему благодаря этой веб-странице: http://www.bar54.de/2012/04/emf-load-model-with-eproxyuri-references/

По сути, мне пришлось создать набор ресурсов, поместив все ресурсы внутри набора, чтобы решить прокси (перекрестные ссылки).

person mlat92    schedule 19.04.2017