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