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

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

JavaClassRunnerList
   0..* JavaClass

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

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

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

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

Это возможно?

2 ответа

Решение

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

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

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

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

Обратите внимание, что вам нужно будет реализовать конкретные конвертеры для каждого созданного типа 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);
}
Другие вопросы по тегам