Создание и изменение файлов ecore и их экземпляров из кода

Мой вопрос состоит из двух частей:

1) Как я могу создать и/или изменить, а затем сохранить файлы EMF ecore (метамодели ecore с суффиксами .ecore) из моего кода scala/java?

2) Как я могу создать и/или изменить экземпляр файла ecore (то есть модель, соответствующую метамодели ecore) из моего кода scala/java?

Я ищу, есть ли какие-то возможные способы сделать это, кроме прямого манипулирования соответствующими XML-файлами с использованием XML API.

Предоставление кодового спинета или ссылки на него очень ценится.

ps. В качестве фоновой мысли мне интересно, могу ли я использовать один API для выполнения обеих вышеперечисленных задач, поскольку мы можем рассматривать файл ecore как модель/экземпляр Ecore.ecore.


person qartal    schedule 04.05.2015    source источник
comment
Ответ на этот вопрос находится здесь (eclipse.org/forums/index.php? &t=msg&th=126417). Я попытаюсь использовать его и опубликую подробности вместе с чистым кодом в качестве ответа, если смогу продолжить.   -  person qartal    schedule 04.05.2015
comment
Мне все еще интересно, есть ли у кого мысли по поводу ps. часть вопроса.   -  person qartal    schedule 04.05.2015


Ответы (1)


Основные понятия (ресурс, набор ресурсов, фабрика ресурсов и реестр):

Прежде чем ответить на этот вопрос, я объясню некоторые концепции ecore API. Первые две концепции: Ресурс и Набор ресурсов. Resource — это представление постоянного ресурса (например, файла ecore) на программном уровне, а ResourceSet — это просто набор таких ресурсов. Каждый документ метамодели ecore, а также документ модели (соответствующий своей метамодели) является ресурсом. Поэтому первым шагом для работы с этими файлами является представление их на программном уровне как ресурсов в наборе ресурсов.

Еще две концепции: Фабрика ресурсов и Реестр. Фабричные классы используются для генерации ресурсов, и реестры отслеживают список этих фабрик в наборах ресурсов. В зависимости от того, как хранятся наши ресурсы, мы можем использовать разные фабрики для управления ими. Например, EcoreResourceFactoryImpl, XMLResourceFactoryImpl и XMIResourceFactoryImpl — это некоторые примеры реализаций фабрики, которые можно использовать для обработки, соответственно, ecore< /em>, xml и xmi. Если мы хотим использовать эти фабрики для обработки ресурсов в наборе ресурсов, нам нужно сначала поместить их в список реестра набора ресурсов. Итак, для каждого набора ресурсов, о котором я упоминал выше, существует список реестра.

Учитывая все вышесказанное, давайте посмотрим, как происходит загрузка и изменение файла ecore (метамодели) и файла экземпляра (модели) в коде Java.

Во-первых, нам нужно создать набор ресурсов для представления наших постоянных ресурсов, с которыми мы хотели бы работать:

ResourceSet resourceSet = new ResourceSetImpl(); 

Затем в реестре этого набора ресурсов нам нужно зарегистрировать Фабрики, с которыми мы хотим работать:

resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("ecore", new EcoreResourceFactoryImpl());
resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("xmi", new  XMIResourceFactoryImpl());

Выше двух строк кода просто зарегистрируйте EcoreResourceFactoryImpl и XMIResourceFactoryImpl как файловые фабрики ecore и xmi соответственно (обратите внимание, что ecore и xmi< /em> — это расширения файлов). Я предположил, что расширение моего файла метамодели — ecore, а расширение файла моей модели — xmi.

После регистрации этих фабрик мы теперь можем попросить наш ResourceSet загрузить файл нашей метамодели (т. е. ecore), как показано ниже:

Resource myMetaModel= resourceSet.getResource(URI.createFileURI("./univ.ecore"), true);

univ.ecore — это имя моего файла ecore.

Для загрузки файла модели нам нужно сделать еще один шаг! Нам нужно сначала зарегистрировать еще одну вещь в нашем наборе ресурсов. То есть зарегистрировать пакет нашей метамодели ecore в списке реестра пакетов в нашем наборе ресурсов. Для этого нам нужно сначала получить представление нашего пакета ecore на уровне программирования, как показано ниже:

EPackage univEPackage = (EPackage) myMetaModel.getContents().get(0);

Затем зарегистрируйте этот пакет в список реестра пакетов нашего набора ресурсов, как показано ниже:

resourceSet.getPackageRegistry().put("http://gholizadeh.org", univEPackage);

Теперь мы готовы загрузить нашу модель (файл xmi). Для этого используем следующий код:

Resource myModel = resourceSet.getResource( URI.createURI( "./univModel.xmi"), true);

Теперь мы перенесли и нашу метамодель, и файлы модели на уровень программирования, и мы можем просто манипулировать ими в коде.

Изменить метамодель:

Например, для создания нового класса в файле ecore мы используем EcoreFactory API: сначала мы получаем экземпляр этого класса, как показано ниже:

EcoreFactory theCoreFactory = EcoreFactory.eINSTANCE;

а затем создайте EClass следующим образом:

EClass adultEClass= theCoreFactory.createEClass();

Затем, чтобы сохранить этот класс, нам нужно добавить его в список наших загруженных классификаторов пакетов ecore, как показано ниже:

univEPackage.getEClassifiers().add(adultEClass);

Для внесения дополнительных изменений вам необходимо более подробно ознакомиться с ecore API.

Изменить модель:

для изменения модели нам нужно создать объекты типа EObject. Как и в случае с EcoreFactory выше, для этого нам нужна фабрика. Но вместо EcoreFactory нам нужна фабрика объектов. Для каждого пакета ecore существует определенная фабрика объектов типа EFactory, которую мы можем получить следующим образом:

EFactory univInstance = univEPackage.getEFactoryInstance();

Обратите внимание, что univEPackage в приведенном выше коде представляет наш пакет ecore (см. несколько абзацев выше). После этого мы готовы создавать объекты для нашей модели. Например

EObject adultObject = univInstance.create(adultEClass);

создайте объект типа AdultEClass в нашей модели. Обратите внимание, что для сохранения этого вновь созданного объекта нам нужно добавить его к содержимому нашего ресурса (который представляет нашу модель, то есть myModel). Поскольку наш постоянный файл имеет формат xmi и имеет только один корень, нам нужно поместить все наши объекты в список и добавить этот список в наш ресурс:

EList<EObject> ModelObjects = new BasicEList<EObject>(); 
ModelObjects.add(adultObject);

myModel.getContents().addAll(ModelObjects);

Хранение файлов модели и метамодели:

Наконец, после того, как мы изменили нашу метамодель и элементы модели, нам нужно снова сохранить их в соответствующих файлах. Это просто делается путем вызова метода сохранения их соответствующих ресурсов:

myModel.save(null);

myMetaModel.save(null);
person qartal    schedule 07.05.2015
comment
Здравствуйте, вы знаете, почему у меня эта ошибка? java.lang.SecurityException: информация о подписывающей стороне класса org.eclipse.emf.ecore.resource.URIConverter$Loadable не соответствует информации о подписывающей стороне других классов в том же пакете в java.lang.ClassLoader.checkCerts(ClassLoader.java:898) - person Sofiane Belhadj Kacem; 13.10.2018