Как получить доступ к определенным EStructuralFeatures модели EMF?

Я знаю, что есть способы получить доступ к EAttribute модели Eclipse EMF по ее featureID или по ее имени с помощью различных косвенных подходов. Для этого я нашел следующее: Eclipse EMF: Как получить доступ к EAttribute по имени?

Но что, если я не знаю имени атрибута, который хочу получить? Допустим, на основе дизайна модель имеет некоторые фиксированные атрибуты разработчика, а также функции, которые могут быть установлены пользователем динамически.

Итак, на данный момент я использую getEAllStructuralFeatures() и использую индексы через get() для доступа к атрибутам, созданным пользователем, поскольку я знаю, что список, который я получаю, будет иметь фиксированные атрибуты модели в качестве его первых элементов, начинающихся с индекс 0. Но я нахожу это решение неясным и неэффективным. Также в некоторых случаях, что я хочу работать, не подходит.

E.g: IEMFEditProperty prop = EMFEditProperties.list(editingDomain, EMFMODELPackage.Literals.EMFMODEL.getEAllStructuralFeatures().get(X));

Знаете ли вы решение или обходной путь для этой проблемы? Насколько я понимаю, не существует прямых методов получения таких динамически создаваемых признаков модели.

Каждая помощь будет оценена.


person DanglingElse    schedule 08.11.2013    source источник


Ответы (1)


Недавно я работал над похожим случаем, когда сначала попытался определить EStructuralFeature для доступа именно к настройке/атрибуту объекта, который мне нужен.

Но если вы посмотрите, как все работает внутри ECore, вы обнаружите, что это никогда не будет работать, поскольку индексы привязаны к идентификатору объекта EStructuralFeature объектов, созданных во время выполнения для определенного контекста (т.е. EClass пример).

Тогда мой подход заключался в том, чтобы либо проверить функции, предложенные EClass.getEAllStructuralFeatures, либо перебрать функции и проверить объект, возвращенный EObject.eGet для этой самой функции (где EClass eClass = eObject.eClass()).

Пример: в профиле UML я определил стереотип UML под названием «Боб» со свойством, называемым FactoryEntity. Свойство должно ссылаться на UML-класс со стереотипом «сущность», который ближе всего к этому самому bean-компоненту и для которого будет сгенерирован статический фабричный метод.

введите здесь описание изображения

В модели у меня будет один класс UML, типизированный как Bean, и один как Entity.

введите здесь описание изображения

И для класса, набранного как «Боб», я бы установил значение для атрибута/свойства factoryEntity, определенного в профиле.

введите здесь описание изображения

Тогда вопрос заключался в том, как значение свойства будет доступно в ECore. В итоге я перебрал Список доступных EStructuralFeature EClass EObject и проверил тип объекта, возвращаемый eGet.

final EObject eObject = (EObject) holdingClass.getValue(stereotype, stereoTypePropertyName);

final EList<EStructuralFeature> allEStructFeats = eObject.eClass().getEAllStructuralFeatures();

for(EStructuralFeature esf : allEStructFeats)
{
    final Object o = eobject.eGet(esf);

    if(o instanceof org.eclipse.uml2.uml.Class)
    {
        return (org.eclipse.uml2.uml.Class) o;
    }
}

Возможно, это не самый элегантный способ доступа к структурным функциям, но это единственный способ, который я считаю достаточно надежным.

Пожалуйста, дайте мне знать, если у вас есть какие-либо предложения по улучшению этого.

person mwhs    schedule 18.11.2013