Реализация кэшированных квалифицированных имен в ECore

У меня есть классы Container и Containable, и я хотел бы реализовать квалифицированные имена ( root/containerA/containerB/containsableXYZ)

Итак, Container наследуется от Containable, а Containable имеет свойство fullName, которое я устанавливаю как производное, временное и изменчивое, которое работает

return (parent != null) ? parent.getName() + SEPARATOR + getName() : getName();

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

Но если родительский контейнер изменяется - как мне автоматически пересчитать его путь?

1 ответ

Решение

В EMF объекты содержатся в ресурсе, который имеет древовидную иерархию. Что вы можете сделать, это расширить Ресурс для перехвата, когда объект присоединяется или отсоединяется от дерева.

Смотрите: ResourceImpl.attached ()

Другая вещь, которую вы можете сделать, это переопределить метод eBasicSetContainer() в вашем классе. Лучше всего иметь абстрактный общий корневой класс для всех ваших модельных классов. Тогда вы можете перехватить этот метод и обновить путь, когда новые объекты контейнера не равны NULL.

В обоих случаях (перехват Resource или EObject) убедитесь, что вы также заново вычислите путь любого элемента в поддереве изменяемого элемента. Это можно легко сделать, пересчитав путь рекурсивно итерируя по поддереву, используя: EcoreUtil.getAllProperContents (EObject)

Кстати, вы также можете использовать EcoreUtil.getIdentification(), которая возвращает полное имя элемента, используя его URI.

Другие вопросы по тегам