Search in sources :

Example 1 with Modification

use of org.osate.ge.internal.services.AadlModificationService.Modification 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;
}
Also used : ExecutionEvent(org.eclipse.core.commands.ExecutionEvent) ArrayListMultimap(com.google.common.collect.ArrayListMultimap) DiagramElement(org.osate.ge.internal.diagram.runtime.DiagramElement) BusinessObjectHandler(org.osate.ge.businessobjecthandling.BusinessObjectHandler) URI(org.eclipse.emf.common.util.URI) ListMultimap(com.google.common.collect.ListMultimap) CanDeleteContext(org.osate.ge.businessobjecthandling.CanDeleteContext) Modification(org.osate.ge.internal.services.AadlModificationService.Modification) EmbeddedBusinessObject(org.osate.ge.internal.model.EmbeddedBusinessObject) DefaultAnnexSubclause(org.osate.aadl2.DefaultAnnexSubclause) MessageFormat(java.text.MessageFormat) ArrayList(java.util.ArrayList) HandlerUtil(org.eclipse.ui.handlers.HandlerUtil) InternalDiagramEditor(org.osate.ge.internal.ui.editor.InternalDiagramEditor) CustomDeleteContext(org.osate.ge.businessobjecthandling.CustomDeleteContext) Predicates(com.google.common.base.Predicates) MessageDialog(org.eclipse.jface.dialogs.MessageDialog) IEditorPart(org.eclipse.ui.IEditorPart) EmfContainerProvider(org.osate.ge.EmfContainerProvider) PlatformUI(org.eclipse.ui.PlatformUI) ReferenceBuilderService(org.osate.ge.services.ReferenceBuilderService) Collection(java.util.Collection) CustomDeleter(org.osate.ge.businessobjecthandling.CustomDeleter) RawDeleter(org.osate.ge.businessobjecthandling.RawDeleter) EcoreUtil(org.eclipse.emf.ecore.util.EcoreUtil) EObject(org.eclipse.emf.ecore.EObject) ExecutionException(org.eclipse.core.commands.ExecutionException) Display(org.eclipse.swt.widgets.Display) CanonicalBusinessObjectReference(org.osate.ge.CanonicalBusinessObjectReference) DiagramElementUtil(org.osate.ge.internal.util.DiagramElementUtil) Objects(java.util.Objects) Consumer(java.util.function.Consumer) AgeDiagram(org.osate.ge.internal.diagram.runtime.AgeDiagram) List(java.util.List) ExecutionMode(org.osate.ge.internal.services.ActionExecutor.ExecutionMode) AgeHandlerUtil(org.osate.ge.internal.ui.handlers.AgeHandlerUtil) RawDeleteContext(org.osate.ge.businessobjecthandling.RawDeleteContext) Entry(java.util.Map.Entry) Resource(org.eclipse.emf.ecore.resource.Resource) AnnexSubclause(org.osate.aadl2.AnnexSubclause) AadlModificationService(org.osate.ge.internal.services.AadlModificationService) AbstractHandler(org.eclipse.core.commands.AbstractHandler) NamedElement(org.osate.aadl2.NamedElement) AnnexLibrary(org.osate.aadl2.AnnexLibrary) Modification(org.osate.ge.internal.services.AadlModificationService.Modification) Resource(org.eclipse.emf.ecore.resource.Resource) RawDeleteContext(org.osate.ge.businessobjecthandling.RawDeleteContext) IEditorPart(org.eclipse.ui.IEditorPart) URI(org.eclipse.emf.common.util.URI) InternalDiagramEditor(org.osate.ge.internal.ui.editor.InternalDiagramEditor) DiagramElement(org.osate.ge.internal.diagram.runtime.DiagramElement) Entry(java.util.Map.Entry) AadlModificationService(org.osate.ge.internal.services.AadlModificationService) ReferenceBuilderService(org.osate.ge.services.ReferenceBuilderService) EObject(org.eclipse.emf.ecore.EObject) ArrayList(java.util.ArrayList) List(java.util.List) ArrayListMultimap(com.google.common.collect.ArrayListMultimap) ListMultimap(com.google.common.collect.ListMultimap) RawDeleter(org.osate.ge.businessobjecthandling.RawDeleter)

Aggregations

Predicates (com.google.common.base.Predicates)1 ArrayListMultimap (com.google.common.collect.ArrayListMultimap)1 ListMultimap (com.google.common.collect.ListMultimap)1 MessageFormat (java.text.MessageFormat)1 ArrayList (java.util.ArrayList)1 Collection (java.util.Collection)1 List (java.util.List)1 Entry (java.util.Map.Entry)1 Objects (java.util.Objects)1 Consumer (java.util.function.Consumer)1 AbstractHandler (org.eclipse.core.commands.AbstractHandler)1 ExecutionEvent (org.eclipse.core.commands.ExecutionEvent)1 ExecutionException (org.eclipse.core.commands.ExecutionException)1 URI (org.eclipse.emf.common.util.URI)1 EObject (org.eclipse.emf.ecore.EObject)1 Resource (org.eclipse.emf.ecore.resource.Resource)1 EcoreUtil (org.eclipse.emf.ecore.util.EcoreUtil)1 MessageDialog (org.eclipse.jface.dialogs.MessageDialog)1 Display (org.eclipse.swt.widgets.Display)1 IEditorPart (org.eclipse.ui.IEditorPart)1