Как определить карту в Xcore

Согласно EMF FAQ, возможно создать Карту в EMF:

EMap в основном представляет собой список экземпляров java.util.Map$Entry. Поэтому для создания карты вам необходимо сначала смоделировать запись карты, выполнив следующие действия:

  1. Создайте EClass с именем [Type1]To[Type2]Map, где [Type1] представляет тип ключа, а [Type2] представляет тип значения.
  2. Установите для свойства Имя класса экземпляра вновь созданного EClass значение java.util.Map$Entry.
  3. Создайте EAttribute или EReference с именем "key" и установите для него EDataType или EClass.
  4. Создайте EAttribute или EReference с именем "value" и установите для него EDataType или EClass.

Теперь, когда вы создаете EReference где-то, который использует этот класс записи карты в качестве своего EClass, генератор кода EMF обнаружит этот особый случай и сгенерирует для вас правильно типизированный получатель / установщик EMap вместо обычного получателя / установщика EList.

Могу ли я использовать это с моделями Xcore? Я не уверен, выполним ли шаг #2 в Xcore или он вообще поддерживает карты.

1 ответ

Решение

Для меня это работает.

DataPoints.xcore:

...
class KeyValuePair wraps java.util.Map$Entry {
    String key
    String value
}

class KeyValueList {
    contains KeyValuePair[] entries
}

Вышеуказанные результаты в KeyValueListImpl класс с getEntries метод, который выглядит так:

public EMap<String, String> getEntries() {
    if (entries == null) {
        entries = new EcoreEMap<String,String>(DataPointsPackage.Literals.KEY_VALUE_PAIR, KeyValuePairImpl.class, this, DataPointsPackage.KEY_VALUE_LIST__ENTRIES);
    }
    return entries;
}
Другие вопросы по тегам