EMF рекурсивные субпредложения

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

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

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;
    }

Metamodel

1 ответ

Не изменяйте основные сгенерированные геттеры и сеттеры 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);
}
Другие вопросы по тегам