2015-05-04 4 views
0

Мой вопрос состоит из двух частей:Создание и изменение Ecore файлов и их экземпляры из кода

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

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

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

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

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

+0

Ответ на этот вопрос здесь (https://www.eclipse.org/forums/index.php?&t=msg&th=126417). Я попытаюсь использовать его и опубликую детали вместе с чистым кодом в качестве ответа, если я смогу продолжить. – qartal

+0

Мне все еще интересно, есть ли у кого-нибудь мысли о «ps». часть вопроса. – qartal

ответ

5

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

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

Еще две концепции: Resource Factory и Registry. Фабричные классы используются для генерации ресурсов, а реестры отслеживают список этих заводов в ресурсах. В зависимости от того, как хранится наш ресурс, мы можем использовать разные фабрики для управления ими. Например, EcoreResourceFactoryImpl, XMLResourceFactoryImpl и XMIResourceFactoryImpl некоторые примеры фабричных реализаций, которые могут быть использованы для обработки, соответственно, Ecore, XML и XMI файлы. Если мы хотим использовать эти заводы для обработки ресурсов в resourceSet, нам нужно сначала поместить их в список реестра resourceSet. Таким образом, для каждого ресурса, указанного выше, есть список реестра.

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

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

ResourceSet resourceSet = new ResourceSetImpl(); 

Тогда в реестре этого ResourceSet, мы должны зарегистрировать Заводы, которые мы хотим работать с :

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

Выше две строки кода просто зарегистрировать EcoreResourceFactoryImpl и XMIResourceFactoryImpl как, соответственно, Ecore и XMi фи (обратите внимание, что ecore и xmi являются расширениями файлов там). Я предположил, что мое расширение метамодельного файла является ecore, а расширение моей модели - xmi.

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

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

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

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

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

И затем, зарегистрировать этот пакет в registry list of packages нашего набора ресурсов, как показано ниже:

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

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

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

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

Изменение Metamodel:

, например, для создания нового класса в файле 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); 

myMetaodel.save(null);