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. Все изменения, внесенные в модель, должны быть выполнены с помощью команд.