Могу ли я создать метамодель Ecore, которая позволяет моделям ссылаться на классы Java? - PullRequest
2 голосов
/ 05 марта 2012

Предположим, я хочу создать метамодель Ecore, которая выглядит примерно так, предназначенная для "запуска" списка классов:

JavaClassRunnerList
   0..* JavaClass

И предположим, у меня есть какой-то Java-проект с именами классовPrintsHello, PrintsSeparator и PrintsWorld.

Я хотел бы иметь возможность писать модели, которые выглядят следующим образом:

JavaClassRunnerList
   PrintsHello.class
   PrintsSeparator.class
   PrintsWorld.class
   PrintsSeparator.class
   PrintsSeparator.class

Я хочу, чтобы моя модель былавозможность включать проект Java и распознавать его классы как выбор для ссылок на модели (возможно, совмещенный с тем же проектом, в котором находится модель.)

Возможно ли это?

Ответы [ 2 ]

2 голосов
/ 05 марта 2012

Эд Меркс сказал следующее.См. Остальную часть обсуждения в теме.

Вы можете использовать тип данных Ecore EJavaClass, чтобы создать многозначный атрибут.Возможно, вам будет лучше просто использовать имена классов и использовать загрузчик классов для преобразования элементов в реальные экземпляры классов.

То же самое относится и к ссылкам на IProject;Вы можете использовать строку, а затем преобразовать ее в IProject, используя корень рабочей области.

0 голосов
/ 20 апреля 2018

Вам следует определить дополнительные типы EDat для вашего ecore для каждого Java-класса, на который вы хотите сослаться (с «Имя типа экземпляра» = полное имя класса java), и просто использовать эти типы данных для ввода некоторых ваших атрибутов EAtt.

Обратите внимание, что вам придется реализовывать конкретные конвертеры для каждого созданного типа EDataty, если вы хотите сохранить значения EAttribute в файлах ресурсов.

Пример с EDatatype с именем 'Date', с instanceTypeName = 'java.util.Date', вам нужно будет предоставить реализацию для следующих двух методов в реализации вашей фабрики:

/**
 * <!-- begin-user-doc -->
 * <!-- end-user-doc -->
 * @generated
 */
public Date createDateFromString(EDataType eDataType, String initialValue) {
    // TODO replace with your implementation
    return (Date)super.createFromString(eDataType, initialValue);
}

/**
 * <!-- begin-user-doc -->
 * <!-- end-user-doc -->
 * @generated
 */
public String convertDateToString(EDataType eDataType, Object instanceValue) {
    // TODO replace with your implementation
    return super.convertToString(eDataType, instanceValue);
}
...