Eclipse: как программно конвертировать UML в ecore
Я загрузил файл xmi с диаграммой uml. В результате я получаю org.eclipse.uml2.uml.Package.
Теперь я хочу программно преобразовать его в Ecore (ePackage).
Я уже взглянул на UML2EcoreConverter из org.eclipse.uml2.uml.util.UMLUtil. Но это метод преобразования мне не понятен.
2 ответа
Вместо того, чтобы идти прямо к UML2EcoreConverter, взгляните на
org.eclipse.uml2.uml.util.UMLUtil.convertToEcore(пакет, карта)
Он принимает пакет и карту опций и возвращает преобразованные EPackage(s). Карта опций может передаваться опциями из UMLUtil.UML2EcoreConverter.OPTION__* в качестве ключей. Возможные значения: UMLUtil.OPTION_ DISCARD / OPTION _IGNORE / OPTION_ PROCESS / OPTION _REPORT. Все параметры по умолчанию имеют значение OPTION__IGNORE.
Большинство из этих опций предназначены для обработки концепций диаграмм классов UML2, которые не отображаются в Ecore, поэтому вы можете контролировать, как они должны обрабатываться.
Для расширенного отображения функций (подмножество / объединение, переопределение...) см. OPTION_ REDEFINING *, OPTION_ SUBSETTING *, OPTION__UNION_PROPERTIES, OPTION_ DUPLICATE *. Все должно быть в порядке, чтобы установить все это в OPTION_PROCESS.
Один из вариантов, который вы можете отключить, - OPTION__SUPER_CLASS_ORDER. Это изменит порядок обобщений и реализаций интерфейса в алфавитном порядке, что может вызвать проблемы реализации, если вы хотите наследовать конкретную супер реализацию. Другой - OPTION__CAMEL_CASE_NAMES, который будет обрабатывать имена классов и объектов, чтобы принудительно использовать строгую схему наблюдения за верблюдами. Это имеет смысл только в тех случаях, когда ваши UML-артефакты не имеют допустимых имен Java. Просто установите для них OPTION_IGNORE или, чтобы увидеть, где они что-то изменит, на OPTION_REPORT.
Также есть convertFromEcore(...) для обратного.
В случае, если вы хотите лучше понять внутреннюю работу UML2EcoreConverter: в основном это простой рекурсивный посетитель, который обходит модель UML, конвертирует каждый артефакт в его эквивалент Ecore и выполняет некоторую очистку. Он расширяет UMLSwitch для обработки различных метаклассов. Например, чтобы увидеть, как свойство UML преобразуется в EStructuralFeature, взгляните на caseProperty(...)