Могу ли я создать метамодель 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);
}