Bug 521306 - [SysML 1.4] Package diagram conversion from UML
- provide an IModelConversionCommand to convert a model from UML to
SysML 1.4
Change-Id: I1b7b5e1547c5cb1cd46f09aeecb78005c0998dcb
Signed-off-by: Benoit Maggi <benoit.maggi@cea.fr>
diff --git a/gui/org.eclipse.papyrus.sysml14.architecture/resources/sysml14.architecture b/gui/org.eclipse.papyrus.sysml14.architecture/resources/sysml14.architecture
index e02f972..b3e0e11 100644
--- a/gui/org.eclipse.papyrus.sysml14.architecture/resources/sysml14.architecture
+++ b/gui/org.eclipse.papyrus.sysml14.architecture/resources/sysml14.architecture
@@ -3,7 +3,7 @@
<stakeholders xmi:id="org.eclipse.papyrus.sysml14.stackholder.systemsEngineer" id="org.eclipse.papyrus.sysml14.stackholder.systemsEngineer" name="Systems Engineer" description="An engineer interested in system development" concerns="org.eclipse.papyrus.sysml14.concern.requirements org.eclipse.papyrus.sysml14.concern.parametrics"/>
<concerns xmi:id="org.eclipse.papyrus.sysml14.concern.requirements" id="org.eclipse.papyrus.sysml14.concern.requirements" name="Requirements" description="The concern of developing the system's requirements"/>
<concerns xmi:id="org.eclipse.papyrus.sysml14.concern.parametrics" id="org.eclipse.papyrus.sysml14.concern.parametrics" name="Parametrics" description="The concern of developing the system's parametrics"/>
- <contexts xsi:type="architecture:ArchitectureDescriptionLanguage" xmi:id="org.eclipse.papyrus.sysml.architecture.SysML14" id="org.eclipse.papyrus.sysml.architecture.SysML14" name="SysML 1.4" description="The Systems Modeling Language" icon="platform:/plugin/org.eclipse.papyrus.sysml14/resources/icons/SysML.gif" creationCommandClass="org.eclipse.papyrus.sysml14.architecture.CreateSysML14ModelCommand">
+ <contexts xsi:type="architecture:ArchitectureDescriptionLanguage" xmi:id="org.eclipse.papyrus.sysml.architecture.SysML14" id="org.eclipse.papyrus.sysml.architecture.SysML14" name="SysML 1.4" description="The Systems Modeling Language" icon="platform:/plugin/org.eclipse.papyrus.sysml14/resources/icons/SysML.gif" creationCommandClass="org.eclipse.papyrus.sysml14.architecture.CreateSysML14ModelCommand" conversionCommandClass="org.eclipse.papyrus.sysml14.architecture.internal.UMLtoSyML14ModelConversionCommand">
<viewpoints xmi:id="org.eclipse.papyrus.sysml14.analysis" id="org.eclipse.papyrus.sysml14.analysis" name="Systems Analysis" description="A viewpoint allowing systems analysis with SysML" icon="platform:/plugin/org.eclipse.papyrus.uml.architecture/icons/viewpoint.gif">
<representationKinds xsi:type="nattablerepresentation:PapyrusTable" href="#org.eclipse.papyrus.sysml14.table.allocation"/>
<representationKinds xsi:type="gmfdiagrepresentation:PapyrusDiagram" href="#org.eclipse.papyrus.sysml14.diagram.requirement"/>
diff --git a/gui/org.eclipse.papyrus.sysml14.architecture/src/org/eclipse/papyrus/sysml14/architecture/internal/UMLtoSyML14ModelConversionCommand.java b/gui/org.eclipse.papyrus.sysml14.architecture/src/org/eclipse/papyrus/sysml14/architecture/internal/UMLtoSyML14ModelConversionCommand.java
new file mode 100644
index 0000000..0e15ede
--- /dev/null
+++ b/gui/org.eclipse.papyrus.sysml14.architecture/src/org/eclipse/papyrus/sysml14/architecture/internal/UMLtoSyML14ModelConversionCommand.java
@@ -0,0 +1,139 @@
+/*****************************************************************************
+ * Copyright (c) 2017 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Benoit Maggi (CEA LIST) benoit.maggi@cea.fr - Initial API and implementation
+ *****************************************************************************/
+package org.eclipse.papyrus.sysml14.architecture.internal;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.transaction.RollbackException;
+import org.eclipse.gmf.runtime.common.core.command.AbstractCommand;
+import org.eclipse.gmf.runtime.common.core.command.CommandResult;
+import org.eclipse.gmf.runtime.common.core.command.CompositeCommand;
+import org.eclipse.gmf.runtime.common.core.command.ICommand;
+import org.eclipse.gmf.runtime.common.core.command.IdentityCommand;
+import org.eclipse.gmf.runtime.notation.Diagram;
+import org.eclipse.papyrus.infra.architecture.commands.IModelConversionCommand;
+import org.eclipse.papyrus.infra.core.resource.ModelSet;
+import org.eclipse.papyrus.infra.emf.gmf.util.GMFUnsafe;
+import org.eclipse.papyrus.infra.gmfdiag.common.model.NotationModel;
+import org.eclipse.papyrus.infra.gmfdiag.style.PapyrusDiagramStyle;
+import org.eclipse.papyrus.sysml14.architecture.util.SysML14chitectureUtil;
+
+/**
+ * Class to allow conversion to SysML 1.4 context
+ *
+ */
+public class UMLtoSyML14ModelConversionCommand implements IModelConversionCommand {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.papyrus.infra.architecture.commands.IModelConversionCommand#convertModel(org.eclipse.papyrus.infra.core.resource.ModelSet)
+ */
+ @Override
+ public void convertModel(ModelSet modelSet) {
+ NotationModel model = (NotationModel) modelSet.getModel(NotationModel.MODEL_ID);
+ CompositeCommand compositeCommand = new CompositeCommand("Conversion to SysML 1.4 context");
+ for (Resource current : model.getResources()) {
+ for (EObject element : current.getContents()) {
+ if (element instanceof Diagram) {
+ ICommand convertDiagram = convertDiagram((Diagram) element);
+ compositeCommand.add(convertDiagram);
+ }
+ }
+ }
+
+ try {
+ GMFUnsafe.write(modelSet.getTransactionalEditingDomain(), compositeCommand);
+ } catch (ExecutionException | InterruptedException | RollbackException e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * Provide an ICommand for each diagram that need a conversion
+ * @param diagram
+ * @return
+ */
+ public ICommand convertDiagram(Diagram diagram) {
+ for (Object object : diagram.getStyles()) {
+ if (object instanceof PapyrusDiagramStyle) {
+ switch (((PapyrusDiagramStyle) object).getDiagramKindId()) {
+ // FIXME: UML Representation kind ids should be provided by API core
+ case "org.eclipse.papyrus.uml.diagram.package":
+ return new SetPapyrusDiagramStyleCommand(diagram, SysML14chitectureUtil.DIAGRAM_PACKAGE_ID);
+ case "org.eclipse.papyrus.uml.diagram.activity":
+ return new SetPapyrusDiagramStyleCommand(diagram, SysML14chitectureUtil.DIAGRAM_ACTIVITY_ID);
+ case "org.eclipse.papyrus.uml.diagram.stateMachine":
+ return new SetPapyrusDiagramStyleCommand(diagram, SysML14chitectureUtil.DIAGRAM_STATE_MACHINE_ID);
+ case "org.eclipse.papyrus.uml.diagram.useCase":
+ return new SetPapyrusDiagramStyleCommand(diagram, SysML14chitectureUtil.DIAGRAM_USE_CASE_ID);
+ default:// not conversion available
+ break;
+ }
+ }
+ }
+ return IdentityCommand.INSTANCE;
+ }
+
+ ///////////////////////////////////////////////////////////////////////////////
+ /**
+ * FIXME: Should be provided as API by the core
+ * TODO: should be undoable
+ * A command to set the diagram kind to a diagram
+ */
+ private class SetPapyrusDiagramStyleCommand extends AbstractCommand {
+
+ private Diagram diagram;
+ private String diagramKind;
+
+ public SetPapyrusDiagramStyleCommand(Diagram diagram, String newStyle) {
+ super("Set new diagram kind for Papyrus Style");
+ this.diagram = diagram;
+ this.diagramKind = newStyle;
+ }
+
+ @Override
+ protected CommandResult doExecuteWithResult(IProgressMonitor progressMonitor, IAdaptable info)
+ throws ExecutionException {
+ for (Object object : diagram.getStyles()) {
+ if (object instanceof PapyrusDiagramStyle) {
+ ((PapyrusDiagramStyle) object).setDiagramKindId(diagramKind);
+ }
+ }
+ return CommandResult.newOKCommandResult();
+ }
+
+ @Override
+ public boolean canUndo() {
+ return false;
+ }
+
+ @Override
+ public boolean canRedo() {
+ return false;
+ }
+
+ @Override
+ protected CommandResult doRedoWithResult(IProgressMonitor progressMonitor, IAdaptable info)
+ throws ExecutionException {
+ throw new ExecutionException("Should not be called, canRedo false"); //$NON-NLS-1$
+ }
+
+ @Override
+ protected CommandResult doUndoWithResult(IProgressMonitor progressMonitor, IAdaptable info)
+ throws ExecutionException {
+ throw new ExecutionException("Should not be called, canUndo false"); //$NON-NLS-1$
+ }
+ }
+ ////////////////////////////////////////////////////////////////////////////////
+}