use of org.osate.ge.businessobjecthandling.RawDeleter in project osate2 by osate.
the class DeleteHandler method execute.
@Override
public Object execute(final ExecutionEvent event) throws ExecutionException {
final IEditorPart activeEditor = HandlerUtil.getActiveEditor(event);
if (!(activeEditor instanceof InternalDiagramEditor)) {
throw new RuntimeException("Unexpected editor: " + activeEditor);
}
final InternalDiagramEditor ageEditor = (InternalDiagramEditor) activeEditor;
final ReferenceBuilderService refBuilder = Objects.requireNonNull((ReferenceBuilderService) ageEditor.getAdapter(ReferenceBuilderService.class), "Unable to retrieve reference builder service");
final AadlModificationService aadlModificationService = Objects.requireNonNull((AadlModificationService) ageEditor.getAdapter(AadlModificationService.class), "Unable to retrieve modification service");
// Get diagram and selected elements
final List<DiagramElement> selectedDiagramElements = AgeHandlerUtil.getSelectedDiagramElements();
if (!canExecute(selectedDiagramElements)) {
throw new RuntimeException("canExecute() returned false");
}
if (!confirmDelete(selectedDiagramElements)) {
return null;
}
final boolean boIsContext = anyBoIsDiagramContext(selectedDiagramElements, ageEditor.getDiagram(), refBuilder);
ageEditor.getActionExecutor().execute("Delete", ExecutionMode.NORMAL, () -> {
if (anyRequiresRawDelete(selectedDiagramElements)) {
if (selectedDiagramElements.size() != 1) {
throw new RuntimeException("Deleting multiple elements when using DeleteRaw is not supported");
}
final DiagramElement deToDelete = selectedDiagramElements.get(0);
// This is safe because we have already check that at least one business object requires a raw deletion and there is exactly one
// business object being deleted.
final RawDeleter deleter = (RawDeleter) deToDelete.getBusinessObjectHandler();
deleter.delete(new RawDeleteContext(deToDelete.getBusinessObject()));
} else if (anyIsInAnnex(selectedDiagramElements)) {
if (selectedDiagramElements.size() != 1) {
throw new RuntimeException("Deleting multiple elements when deleting an element inside of an annex is not supported");
}
// Handle annex specially because we need to modify the annex itself instead of the root of the model.
// Only a single annex element can be modified at a time because modifying annex elements as part of a
// group is not supported.
final BusinessObjectRemoval modInfo = createBusinessObjectRemovalOrRemoveDiagramElement(selectedDiagramElements.get(0));
if (modInfo != null) {
aadlModificationService.modify(modInfo.staleBoToModify, (boToModify) -> {
modInfo.remover.accept(boToModify);
});
}
} else {
// Group elements to be removed by resource. All the elements will be removed as part of the same modification.
// This ensures that the appropriate element is retrieved regardless of the order in the model or the URI scheme.
final ListMultimap<Resource, BusinessObjectRemoval> removals = ArrayListMultimap.create();
for (final DiagramElement de : selectedDiagramElements) {
final BusinessObjectRemoval removal = createBusinessObjectRemovalOrRemoveDiagramElement(de);
if (removal != null) {
removals.put(removal.staleBoToModify.eResource(), removal);
}
}
// Perform the modifications. One modification will be performed for each resource.
final List<AadlModificationService.Modification<?, ?>> modifications = new ArrayList<>();
for (final Entry<Resource, Collection<BusinessObjectRemoval>> entry : removals.asMap().entrySet()) {
final Resource resource = entry.getKey();
final EObject root = Objects.requireNonNull(resource.getContents().get(0), "unable to retrieve root element");
final Modification<EObject, EObject> mod = AadlModificationService.Modification.create(root, (rootToModify) -> {
// could change in between removals and an incorrect element will be removed.
for (final BusinessObjectRemoval removal : entry.getValue()) {
final URI uri = EcoreUtil.getURI(removal.staleBoToModify);
Objects.requireNonNull(uri, "unable to retrieve uri for " + removal.staleBoToModify);
removal.boToModify = rootToModify.eResource().getResourceSet().getEObject(uri, true);
}
// Remove the business object using the stored business object to modify
for (final BusinessObjectRemoval removal : entry.getValue()) {
removal.remover.accept(removal.boToModify);
}
});
modifications.add(mod);
}
if (!modifications.isEmpty()) {
aadlModificationService.modify(modifications);
}
}
return null;
});
if (boIsContext) {
// Close the editor if the context was deleted
Display.getDefault().syncExec(() -> ageEditor.closeEditor());
} else {
ageEditor.clearSelection();
}
return null;
}
Aggregations