EMF/GMF/Papyrus - установить явное значение ElementImpl - свойство вне кода

У меня есть EMF-модель и сгенерированный редактор. В модели / редакторе возможно связать Элемент "Единица"(U) с "Спецификацией"(S). Теперь я хочу иметь специализированный CSS-стиль для S, если хотя бы один U удовлетворяет S. Но (насколько мне известно) нет способа сделать это (например, с помощью селекторов) в таблице стилей CSS для Папирус.

По этой причине я добавил дополнительное свойство для S, которое называется "Mapped" (должно быть истинным, когда хотя бы один U удовлетворяет S, в противном случае это ложное). Затем я попытался установить "Mapped"-Property вне кода, когда было добавлено одно или несколько соединений (в handleNotification - Метод):

notifier.setMapped(true);

с исключением:

IllegalstateException: Cannot modify resource set without a write transaction

Второе решение привело к другому Исключению, но с тем же семантическим результатом:

ed.getCommandStack().execute(SetCommand.create(ed, notifier,
    xyzPackage.Literals.SPECIFICATION__MAPPED, true));

за исключением:

java.lang.IllegalStateException: Cannot activate read/write 
    transaction in read-only transaction context

Кто-нибудь знает, как обрабатывать эти исключения или есть хороший обходной путь? Основная цель заключается в том, чтобы CSS-файл распознавал изменение свойства Mapped.

Большое спасибо:)

2 ответа

Решение

Нашел решение для моей проблемы:

Кажется, что басовый асинхронный...

Чтобы успешно изменить свойства EObjects Следующее я должен был сделать:

public void SpecificationEditPart.handleNotification(Notification event)
{

    EObject eObject = (EObject)event.getNotifier();

    SpecificationImpl notifier = (SpecificationImpl)eObject;

    EList<Satisfy> satisfyRelationList = notifier.getIncoming();

    int satisfyRelationListSize = satisfyRelationList.size();

    TransactionalEditingDomain ted = (TransactionalEditingDomain)AdapterFactoryEditingDomain.getEditingDomainFor(eObject);

    try
    {
        ted.runExclusive(new Runnable()
        {
            public void run ()
            {
                Display display = PlatformUI.getWorkbench().getDisplay();
                display.asyncExec(new Runnable()
                {
                    public void run ()
                    {
                        ted.getCommandStack().execute(new SetCommand(this.ted, notifier, xxxPackage.Literals.SPECIFICATION__MAPPED, true));
                    }
                });
            }
        });
    }
    catch (InterruptedException e)
    {
        e.printStackTrace();
    }
}

Вам нужно использовать API транзакций для внесения изменений в EMF. Все изменения, внесенные в модель, должны быть выполнены с помощью команд.

Посмотрите на API

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