EMF рекурсивные субпредложения - PullRequest
0 голосов
/ 04 февраля 2019

Как видите, у метамодели есть Тест, который имеет свойства.Они также могут иметь подвойства.

Теперь я хочу написать метод, который возвращает свойства, а также все другие свойства.Здесь наивный подход без рекурсии.Пожалуйста, помогите мне.

public EList<TestProperty> getProperties() {
        if (properties == null) {
            properties = new EObjectContainmentEList<TestProperty>(TestProperty.class, this,
                    Iec62264Package.TEST__PROPERTIES);
        }
        for (TestProperty property : properties) {
            properties.add(property.getSubProperties());
        }
        return properties;
    }

Метамодель

1 Ответ

0 голосов
/ 07 февраля 2019

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

Вы можете добавить EMethod getAllProperties или EReference allProperties с Derived = true.Вы сможете предоставить свою конкретную реализацию, и такого рода функции не участвуют в сохранении EMF.

Итак, сохраните ваши свойства EReference и его метод получения getProperties () как есть, добавьте getAllProperties ()EMethod или allProperties выводят EReference и кодируют его с помощью чего-то вроде:

/**
 * @generated
 */
public EList<TestProperty> getProperties() {
    if (properties == null) {
        properties = new EObjectContainmentEList<TestProperty>(TestProperty.class, this,
                Iec62264Package.TEST__PROPERTIES);
    }
    return properties;
}

/**
 * @generated NOT
 */
public EList<TestProperty> getAllProperties() {
    List<TestProperty> allProperties = new ArrayList<TestProperty>();
    for (TestProperty subProperty : getSubProperties()) {
        allProperties.add(subProperty);
        allProperties.addAll(subProperty.getAllProperties())
    }
    return allProperties;
}

И метода или производного EReference allProperties в TestProperty EClass, который возвращает все подвойства.

В качестве альтернативы выможет также использовать или получить вдохновение от волшебного Xtext EcoreUtil2.getAllContentsOfType (myTest, TestProperty.class) и реализовать свой метод с помощью:

/**
 * @generated NOT
 */
public EList<TestProperty> getAllProperties() {
    return EcoreUtil2.getAllContentsOfType(this, TestProperty.class);
}
...