Я использую 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 одновременно, создавая только один корневой объект.
Кто-нибудь может мне помочь, пожалуйста?