Статьи

Подсказки EMF: доступ к метаданным модели, сериализация в элемент / атрибут

Два совета для Eclipse Modeling Framework (EMF) 2.2.1:

  1. Доступ к метамодели модели — доступ к EClass / атрибуту по имени — так что вы можете установить атрибут, когда вы знаете только его имя и не имеете его EAttribute
  2. Как заставить EMF сериализовать объект как элемент XML вместо атрибута XML

Извините за довольно либеральное и немного запутанное использование терминов модель, экземпляр модели и метамодель

Совет 1: Доступ к метамодели модели — доступ к EClass / атрибуту по имени

Обычно вы не можете выполнять какие-либо операции с экземпляром динамической модели EMF, такие как создание экземпляра EObject или настройка его свойства через eSet, без соответствующих объектов метамодели, таких как EClass и EAttribute. Но есть решение — вы можете создать экземпляр ExtendedMetaData и использовать его методы для поиска объектов метамодели на основе критериев поиска, таких как имя элемента и пространство имен.

Примеры

Создать ExtendedMetaData из модели

Одним из способов создания экземпляра метаданных является создание экземпляра BasicExtendedMetaData на основе реестра, содержащего все зарегистрированные пакеты. Обычно это доступно либо через ResourceSet. getPackageRegistry () или глобально, через EPackage.Registry. МОМЕНТ .

import org.eclipse.emf.ecore.util.*;
...
ExtendedMetaData modelMetaData = new BasicExtendedMetaData(myResourceSet.getPackageRegistry());

Получить EClass для пространства имен и имени

При условии, что ваша модель содержит элемент с именем Book и пространством имен http://example.com/book:

EClass bookEClass = (EClass) modelMetaData.getType("http://example.com/book", "Book");

Получить EClass ‘атрибут по имени

Осторожно: некоторые свойства (например, описанные именованными сложными типами) представлены не EAttribute, а EReference (оба расширяют EStructuralFeature ) и доступны как элементы EClass, а не атрибуты, даже если с точки зрения разработчика они атрибуты класса-владельца.

Предположим, что книга имеет имя атрибута:

EStructuralFeature nameAttr = modelMetaData.getElement(bookEClass, null, "name");

Пространство имен является нулевым, поскольку обычно атрибуты / вложенные элементы не классифицируются со схемой.

Вот как вы должны вывести имя и URI пространства имен атрибута / элемента:

System.out.println("attr: " + modelMetaData.getNamespace(nameAttr) + ":" + nameAttr.getName());
//prints "null:name"

Совет 2. Как заставить EMF сериализовать объект как элемент XML вместо атрибута XML

Обычно EMF хранит простые свойства Java в качестве атрибутов элемента XML, представляющего класс-владелец:

<b:Book b:xmlns="..." name="The Book of Songs" />

но вы можете предпочесть иметь его как вложенный элемент:

<b:Book b:xmlns="...">
<name>The Book of Songs</name>
</b:Book>

Для этого:

  1. Включите опцию сохранения OPTION_EXTENDED_META_DATA (чтобы расширенные метаданные, такие как аннотации и карта XML, не игнорировались)
  2. Скажите EMF, что вы хотите, чтобы это свойство было сохранено как элемент

    1. Прикрепив к нему аннотацию (не показана)
    2. Предоставляя карту XML с этой информацией при сохранении

Чтобы включить расширенные метаданные:

Map<String, Object> saveOptions = new HashMap<String, Object>();
saveOptions.put(XMLResource.OPTION_EXTENDED_META_DATA, Boolean.TRUE);

Согласно некоторым документам, значение должно быть реализацией ExtendedMetaData, согласно другим Boolean. TRUE — правильный выбор — я использую последний, потому что это проще и работает для меня.

Чтобы указать EMF написать свойство как элемент при переходе в XML:

import org.eclipse.emf.ecore.xmi.impl.*;
...
EAttribute bookNameEAttribute = ...; // retrieved e.g. from meta data, see Tip 1
XMLMapImpl map = new XMLMapImpl();
XMLInfoImpl x = new XMLInfoImpl();
x.setXMLRepresentation(XMLInfoImpl.ELEMENT);
map.add(bookNameEAttribute, x);
saveOptions.put(XMLResource.OPTION_XML_MAP, map);

XMLInfoImpl позволяет настроить пространство имен, имя и представление элемента.

При сохранении вы просто укажите параметры сохранения:

EObject target = ...;
org.eclipse.emf.ecore.resource.Resource outResource = ...;
outResource.getContents().add(target);
outResource.save(saveOptions);

Ссылка : Redbook Eclipse Development с использованием среды графического редактирования и Eclipse Modeling Framework , страница 74, раздел 2.3.4

От http://theholyjava.wordpress.com/2011/01/11/emf-tips-accessing-model-meta-data-serializing-into-elementattribute/