Основные понятия (ресурс, набор ресурсов, фабрика ресурсов и реестр):
Прежде чем ответить на этот вопрос, я объясню некоторые концепции 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