Основные понятия (ресурс, 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);
Ответ на этот вопрос здесь (https://www.eclipse.org/forums/index.php?&t=msg&th=126417). Я попытаюсь использовать его и опубликую детали вместе с чистым кодом в качестве ответа, если я смогу продолжить. – qartal
Мне все еще интересно, есть ли у кого-нибудь мысли о «ps». часть вопроса. – qartal