diff options
2 files changed, 80 insertions, 25 deletions
diff --git a/incubation/org.eclipse.sirius.ui.properties/src/org/eclipse/sirius/ui/properties/internal/SiriusToolServices.java b/incubation/org.eclipse.sirius.ui.properties/src/org/eclipse/sirius/ui/properties/internal/SiriusToolServices.java index 4ac35e685e..9fdd029e44 100644 --- a/incubation/org.eclipse.sirius.ui.properties/src/org/eclipse/sirius/ui/properties/internal/SiriusToolServices.java +++ b/incubation/org.eclipse.sirius.ui.properties/src/org/eclipse/sirius/ui/properties/internal/SiriusToolServices.java @@ -11,6 +11,8 @@ package org.eclipse.sirius.ui.properties.internal; import java.util.Collection; +import java.util.LinkedHashSet; +import java.util.Set; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EObject; @@ -22,8 +24,10 @@ import org.eclipse.sirius.business.api.query.EObjectQuery; import org.eclipse.sirius.business.api.session.Session; import org.eclipse.sirius.ecore.extender.business.api.accessor.ModelAccessor; import org.eclipse.sirius.ext.base.Option; +import org.eclipse.sirius.properties.ViewExtensionDescription; import org.eclipse.sirius.tools.api.command.SiriusCommand; import org.eclipse.sirius.tools.api.command.ui.NoUICallback; +import org.eclipse.sirius.ui.properties.internal.tabprovider.SiriusTabDescriptorProvider; import org.eclipse.sirius.viewpoint.DRepresentation; import org.eclipse.sirius.viewpoint.DSemanticDecorator; import org.eclipse.sirius.viewpoint.description.Viewpoint; @@ -48,29 +52,65 @@ public class SiriusToolServices { */ public EObject executeOperation(EObject eObject, String initialCommandUri) { Session session = new EObjectQuery(eObject).getSession(); - ModelAccessor modelAccessor = session.getModelAccessor(); - TaskHelper taskHelper = new TaskHelper(modelAccessor, new NoUICallback()); + ModelOperation modelOperation = findModelOperation(initialCommandUri, session); + if (modelOperation != null) { + ModelAccessor modelAccessor = session.getModelAccessor(); + ICommandTask task = new TaskHelper(modelAccessor, new NoUICallback()).buildTaskFromModelOperation(eObject, modelOperation); + SiriusCommand command = new SiriusCommand(session.getTransactionalEditingDomain(), "SiriusToolServices#executeOperation"); + command.getTasks().add(task); + session.getTransactionalEditingDomain().getCommandStack().execute(command); + } + return eObject; + } - ModelOperation modelOperation = null; + /** + * Resolves the actual {@link ModelOperation} to execute given its URI. + * + * @param initialCommandUri + * the URI of the operation to search for. + * @param session + * the Sirius session which determines the scope to search into. + * @return the {@link ModelOperation} instance found at the specified URI, + * either in one of the VSMs for which at least one Viewpoint is + * currently enabled in the session, or from the default ruleset, or + * <code>null</code> if no matching operation could be located. + */ + private ModelOperation findModelOperation(String initialCommandUri, Session session) { + URI commandResourceURI = URI.createURI(initialCommandUri).trimFragment(); + for (Resource res : getResourcesInScope(session)) { + if (commandResourceURI.equals(res.getURI())) { + EObject modelOperationEObject = res.getEObject(URI.createURI(initialCommandUri).fragment()); + if (modelOperationEObject instanceof InitialOperation) { + return ((InitialOperation) modelOperationEObject).getFirstModelOperations(); + } + } + } + return null; + } + /** + * Returns all the (VSM-like) resources in which to search for the + * {@link ModelOperation} to execute. + * + * @param session + * the Sirius session. + * @return all the resources in which to look for the ModelOperation, in + * order of preference. + */ + private Set<Resource> getResourcesInScope(Session session) { + Set<Resource> result = new LinkedHashSet<>(); Collection<Viewpoint> selectedViewpoints = session.getSelectedViewpoints(true); for (Viewpoint viewpoint : selectedViewpoints) { Resource eResource = viewpoint.eResource(); - if (eResource != null && URI.createURI(initialCommandUri).trimFragment().equals(eResource.getURI())) { - EObject modelOperationEObject = eResource.getEObject(URI.createURI(initialCommandUri).fragment()); - if (modelOperationEObject instanceof InitialOperation) { - modelOperation = ((InitialOperation) modelOperationEObject).getFirstModelOperations(); - } + if (eResource != null) { + result.add(eResource); } } - - if (modelOperation != null) { - ICommandTask task = taskHelper.buildTaskFromModelOperation(eObject, modelOperation); - SiriusCommand command = new SiriusCommand(session.getTransactionalEditingDomain(), "SiriusToolServices#executeOperation"); - command.getTasks().add(task); - session.getTransactionalEditingDomain().getCommandStack().execute(command); + ViewExtensionDescription defaults = SiriusTabDescriptorProvider.getDefaultRules(); + if (defaults != null && defaults.eResource() != null) { + result.add(defaults.eResource()); } - return eObject; + return result; } /** diff --git a/incubation/org.eclipse.sirius.ui.properties/src/org/eclipse/sirius/ui/properties/internal/tabprovider/SiriusTabDescriptorProvider.java b/incubation/org.eclipse.sirius.ui.properties/src/org/eclipse/sirius/ui/properties/internal/tabprovider/SiriusTabDescriptorProvider.java index 9bb1254fd4..89589341c5 100644 --- a/incubation/org.eclipse.sirius.ui.properties/src/org/eclipse/sirius/ui/properties/internal/tabprovider/SiriusTabDescriptorProvider.java +++ b/incubation/org.eclipse.sirius.ui.properties/src/org/eclipse/sirius/ui/properties/internal/tabprovider/SiriusTabDescriptorProvider.java @@ -63,7 +63,28 @@ public class SiriusTabDescriptorProvider implements IEEFTabDescriptorProvider { * The URI of the model containing the default value of the properties page * to create. */ - private static final String DEFAULT_PROPERTIES_URI = "platform:/plugin/org.eclipse.sirius.ui.properties/model/properties.xmi"; + private static final URI DEFAULT_PROPERTIES_URI = URI.createURI("platform:/plugin/org.eclipse.sirius.ui.properties/model/properties.xmi", true); + + private static final ResourceSet DEFAULT_RULES = new ResourceSetImpl(); + + /** + * Returns the global default rules which apply when nothing more specific + * was specified. + * + * @return the global default rules. + */ + public static ViewExtensionDescription getDefaultRules() { + Resource resource = DEFAULT_RULES.getResource(DEFAULT_PROPERTIES_URI, true); + if (resource == null) { + SiriusUIPropertiesPlugin.getPlugin().error(Messages.SiriusTabDescriptorProvider_DefaultPropertiesNotFound); + } else { + List<EObject> contents = resource.getContents(); + if (contents.size() > 0 && contents.get(0) instanceof ViewExtensionDescription) { + return (ViewExtensionDescription) contents.get(0); + } + } + return null; + } @Override public Collection<IEEFTabDescriptor> get(IWorkbenchPart part, ISelection selection) { @@ -143,15 +164,9 @@ public class SiriusTabDescriptorProvider implements IEEFTabDescriptorProvider { } if (effectivePages.size() == 0) { - ResourceSet resourceSet = new ResourceSetImpl(); - URI uri = URI.createURI(DEFAULT_PROPERTIES_URI, true); - Resource resource = resourceSet.getResource(uri, true); - if (resource != null) { - List<EObject> contents = resource.getContents(); - if (contents.size() > 0 && contents.get(0) instanceof ViewExtensionDescription) { - ViewExtensionDescription viewExtensionDescription = (ViewExtensionDescription) contents.get(0); - effectivePages.addAll(viewExtensionDescription.getPages()); - } + ViewExtensionDescription viewExtensionDescription = getDefaultRules(); + if (viewExtensionDescription != null) { + effectivePages.addAll(viewExtensionDescription.getPages()); } else { SiriusUIPropertiesPlugin.getPlugin().error(Messages.SiriusTabDescriptorProvider_DefaultPropertiesNotFound); } |