Commit 0a323fd0 authored by Martti Käärik's avatar Martti Käärik
Browse files

Create tools for Alternative, Bounded Loop, Conditional, Parallel, Unbounded...

Create tools for Alternative, Bounded Loop, Conditional, Parallel, Unbounded Loop, Block, Message, Break, Stop, Verdict Assignment, Test Description Reference, Action Reference, Inline Action, Timer Start, Timer Stop, Wait, Quiescence, Time Label, Time Constraint, Data Instance Use, Variable Use, Function Call.

Change-Id: I7f1fe6656adc08a613bf6809a0954b2ee5372c60
parent 5e5cba86
Loading
Loading
Loading
Loading
+347 −1

File changed.

Preview size limit exceeded, changes collapsed.

+7 −0
Original line number Original line Diff line number Diff line
@@ -74,6 +74,13 @@
            providerClass="org.etsi.mts.tdl.graphical.sirius.layout.RefreshExtensionProvider">
            providerClass="org.etsi.mts.tdl.graphical.sirius.layout.RefreshExtensionProvider">
      </refreshExtensionProvider>
      </refreshExtensionProvider>
   </extension>
   </extension>
   <extension
         point="org.eclipse.sirius.externalJavaAction">
      <javaActions
            actionClass="org.etsi.mts.tdl.graphical.sirius.actions.CreateAction"
            id="org.etsi.mts.tdl.graphical.viewpoint.createAction">
      </javaActions>
   </extension>




</plugin>
</plugin>
+33 −6
Original line number Original line Diff line number Diff line
@@ -8,16 +8,20 @@ import org.eclipse.sirius.diagram.DSemanticDiagram;
import org.eclipse.sirius.diagram.sequence.ordering.EventEnd;
import org.eclipse.sirius.diagram.sequence.ordering.EventEnd;
import org.etsi.mts.tdl.Behaviour;
import org.etsi.mts.tdl.Behaviour;
import org.etsi.mts.tdl.Block;
import org.etsi.mts.tdl.Block;
import org.etsi.mts.tdl.MultipleCombinedBehaviour;
import org.etsi.mts.tdl.SingleCombinedBehaviour;
import org.etsi.mts.tdl.SingleCombinedBehaviour;
import org.etsi.mts.tdl.Target;
import org.etsi.mts.tdl.Target;
import org.etsi.mts.tdl.TestDescription;
import org.etsi.mts.tdl.TestDescription;
import org.etsi.mts.tdl.tdlFactory;


public class BehaviourModifications {
public class BehaviourModifications {
	
	
	private ModelHelper helper = new ModelHelper();
	private ModelHelper helper = new ModelHelper();
	
	
	public static void addBehaviour(EObject startingEndPredecessor, DDiagramElement diagramElement, Behaviour behaviour) {
	public static void addBehaviour(EObject startingEndPredecessor, Object diagramElement, Behaviour behaviour) {
		DSemanticDiagram diagram = (DSemanticDiagram) ((DDiagramElement)diagramElement).getParentDiagram();
		DSemanticDiagram diagram =
				diagramElement instanceof DSemanticDiagram ? (DSemanticDiagram) diagramElement :
				(DSemanticDiagram) ((DDiagramElement)diagramElement).getParentDiagram();
		TestDescription td = (TestDescription) diagram.getTarget();
		TestDescription td = (TestDescription) diagram.getTarget();
		addBehaviour(startingEndPredecessor, td, behaviour);
		addBehaviour(startingEndPredecessor, td, behaviour);
	}
	}
@@ -34,11 +38,16 @@ public class BehaviourModifications {
		} else if (endPredecessor instanceof Block) {
		} else if (endPredecessor instanceof Block) {
			parent = (Block) endPredecessor;
			parent = (Block) endPredecessor;
			
			
		} else if (endPredecessor == null) {
		} else if (endPredecessor == null || endPredecessor instanceof TestDescription) {
			parent = ((SingleCombinedBehaviour)td.getBehaviourDescription().getBehaviour()).getBlock();
			parent = ((SingleCombinedBehaviour)td.getBehaviourDescription().getBehaviour()).getBlock();
			
			
		} else
		} else {
			prev = (Behaviour) BehaviourProvider.getBegin(endPredecessor);
			EObject begin = BehaviourProvider.getBegin(endPredecessor);
			if (begin instanceof Block)
				prev = (Behaviour)begin.eContainer();
			else
				prev = (Behaviour) begin;
		}
		
		
		if (parent == null && prev != null)
		if (parent == null && prev != null)
			parent = (Block) prev.eContainer();
			parent = (Block) prev.eContainer();
@@ -47,7 +56,7 @@ public class BehaviourModifications {
		list.remove(behaviour);
		list.remove(behaviour);
		int index = 0;
		int index = 0;
		if (prev != null)
		if (prev != null)
			index = parent.getBehaviour().indexOf(prev) + 1;
			index = list.indexOf(prev) + 1;
		list.add(index, behaviour);
		list.add(index, behaviour);
	}
	}
	
	
@@ -63,4 +72,22 @@ public class BehaviourModifications {
		
		
		return selection;
		return selection;
	}
	}
	
	public static void addBlock(EObject endPredecessor, MultipleCombinedBehaviour combinedBheviour) {
		if (endPredecessor instanceof EventEnd)
			endPredecessor = ((EventEnd) endPredecessor).getSemanticEnd();

		Block prevBlock;
		if (endPredecessor instanceof Block)
			prevBlock = (Block) endPredecessor;
		else {
			EObject begin = BehaviourProvider.getBegin(endPredecessor);
			while (!(begin instanceof Block))
				begin = begin.eContainer();
			prevBlock = (Block) begin;
		}
		List<Block> blocks = combinedBheviour.getBlock();
		blocks.add(prevBlock == null || !blocks.contains(prevBlock) ? 0 : blocks.indexOf(prevBlock) + 1,
				tdlFactory.eINSTANCE.createBlock());
	}
}
}
+92 −6
Original line number Original line Diff line number Diff line
package org.etsi.mts.tdl.graphical.extensions;
package org.etsi.mts.tdl.graphical.extensions;


import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.List;


import org.eclipse.emf.common.util.TreeIterator;
import org.eclipse.emf.common.util.TreeIterator;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EObject;
import org.etsi.mts.tdl.Action;
import org.etsi.mts.tdl.Behaviour;
import org.etsi.mts.tdl.Behaviour;
import org.etsi.mts.tdl.BehaviourDescription;
import org.etsi.mts.tdl.BehaviourDescription;
import org.etsi.mts.tdl.ComponentInstance;
import org.etsi.mts.tdl.DataInstance;
import org.etsi.mts.tdl.DataType;
import org.etsi.mts.tdl.Element;
import org.etsi.mts.tdl.ElementImport;
import org.etsi.mts.tdl.Function;
import org.etsi.mts.tdl.Package;
import org.etsi.mts.tdl.SimpleDataInstance;
import org.etsi.mts.tdl.Target;
import org.etsi.mts.tdl.Target;
import org.etsi.mts.tdl.TestConfiguration;
import org.etsi.mts.tdl.TestConfiguration;
import org.etsi.mts.tdl.TestDescription;
import org.etsi.mts.tdl.TestDescription;
import org.etsi.mts.tdl.Timer;
import org.etsi.mts.tdl.Variable;
import org.etsi.mts.tdl.tdlPackage;


public class ModelHelper {
public class ModelHelper {


	public TestDescription getTestDescription(Behaviour b) {
	public TestDescription getTestDescription(EObject behaviourContent) {
		EObject c = b;
		EObject c = behaviourContent;
		while (c != null) {
		while (c != null) {
			if (c instanceof TestDescription)
			if (c instanceof TestDescription)
				return (TestDescription) c;
				return (TestDescription) c;
@@ -23,13 +36,86 @@ public class ModelHelper {
		return null;
		return null;
	}
	}
	
	
	public TestConfiguration getTestConfiguration(Behaviour b) {
	public TestConfiguration getTestConfiguration(EObject behaviourContent) {
		TestDescription td = getTestDescription(b);
		TestDescription td = getTestDescription(behaviourContent);
		return td != null ? td.getTestConfiguration() : null;
		return td != null ? td.getTestConfiguration() : null;
	}
	}
	
	
	public List<TestDescription> getTestDescriptions(EObject context) {
		List<TestDescription> tdList = (List<TestDescription>) getOf(context, tdlPackage.eINSTANCE.getTestDescription());
		TestDescription td = getTestDescription(context);
		tdList.remove(td);
		return tdList;
	}

	public List<Function> getFunctions(EObject context) {
		return (List<Function>) getOf(context, tdlPackage.eINSTANCE.getFunction());
	}

	public List<Action> getActions(EObject context) {
		return (List<Action>) getOf(context, tdlPackage.eINSTANCE.getAction());
	}

	public List<DataInstance> getDataInstances(EObject context) {
		return (List<DataInstance>) getOf(context, tdlPackage.eINSTANCE.getDataInstance());
	}

	public List<Variable> getVariables(EObject context) {
		List<Variable> vars = new LinkedList<Variable>();
		TestDescription td = getTestDescription(context);
		for (ComponentInstance c: td.getTestConfiguration().getComponentInstance())
			vars.addAll(c.getType().getVariable());
		return vars;
	}

	public List<Timer> getTimers(EObject context) {
		List<Timer> timers = new LinkedList<Timer>();
		TestDescription td = getTestDescription(context);
		for (ComponentInstance c: td.getTestConfiguration().getComponentInstance())
			timers.addAll(c.getType().getTimer());
		return timers;
	}
	
	private List<? extends Element> getOf(EObject context, EClassifier eClass) {
		List<Element> list = new LinkedList<Element>();
		for (Element e: visibleElements(context))
			if (eClass.isInstance(e))
				list.add(e);
		return list;
	}
	
	public List<SimpleDataInstance> getVerdicts(EObject context) {
		List<SimpleDataInstance> verdicts = new LinkedList<SimpleDataInstance>();
		for (Element e: visibleElements(context))
			if (e instanceof SimpleDataInstance) {
				DataType type = ((SimpleDataInstance) e).getDataType();
				if (type.getName().equalsIgnoreCase("Verdict"))
					verdicts.add((SimpleDataInstance) e);
			}
		return verdicts;
	}
	
	private List<Element> visibleElements(EObject context) {
		List<Element> elements = new LinkedList<Element>();
		
		while (!(context instanceof Package))
			context = context.eContainer();
		
		Package p = (Package) context;
		elements.addAll(p.getPackagedElement());
		
		for (ElementImport imp: p.getImport()) {
			if (imp.getImportedElement().isEmpty())
				elements.addAll(imp.getImportedPackage().getPackagedElement());
			else
				elements.addAll(imp.getImportedElement());
		}
		
		return elements;
	}
	
	public List<EObject> allBehaviours(TestDescription e) {
	public List<EObject> allBehaviours(TestDescription e) {
		List<EObject> behaviours = new ArrayList<EObject>();
		List<EObject> behaviours = new LinkedList<EObject>();
		TreeIterator<EObject> iter = e.eAllContents();
		TreeIterator<EObject> iter = e.eAllContents();
		while (iter.hasNext()) {
		while (iter.hasNext()) {
			EObject c = iter.next();
			EObject c = iter.next();
+254 −0
Original line number Original line Diff line number Diff line
package org.etsi.mts.tdl.graphical.sirius.actions;

import java.util.Collection;
import java.util.List;
import java.util.Map;

import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.sirius.tools.api.ui.IExternalJavaAction;
import org.etsi.mts.tdl.Action;
import org.etsi.mts.tdl.ActionBehaviour;
import org.etsi.mts.tdl.ActionReference;
import org.etsi.mts.tdl.AlternativeBehaviour;
import org.etsi.mts.tdl.Assertion;
import org.etsi.mts.tdl.Assignment;
import org.etsi.mts.tdl.AtomicBehaviour;
import org.etsi.mts.tdl.Behaviour;
import org.etsi.mts.tdl.Block;
import org.etsi.mts.tdl.BoundedLoopBehaviour;
import org.etsi.mts.tdl.ComponentInstance;
import org.etsi.mts.tdl.ComponentInstanceRole;
import org.etsi.mts.tdl.DataInstance;
import org.etsi.mts.tdl.DataInstanceUse;
import org.etsi.mts.tdl.DataUse;
import org.etsi.mts.tdl.Function;
import org.etsi.mts.tdl.FunctionCall;
import org.etsi.mts.tdl.GateReference;
import org.etsi.mts.tdl.Interaction;
import org.etsi.mts.tdl.Message;
import org.etsi.mts.tdl.MultipleCombinedBehaviour;
import org.etsi.mts.tdl.ParallelBehaviour;
import org.etsi.mts.tdl.PeriodicBehaviour;
import org.etsi.mts.tdl.SingleCombinedBehaviour;
import org.etsi.mts.tdl.Target;
import org.etsi.mts.tdl.TestDescription;
import org.etsi.mts.tdl.TestDescriptionReference;
import org.etsi.mts.tdl.TimeConstraint;
import org.etsi.mts.tdl.TimeLabel;
import org.etsi.mts.tdl.TimeOperation;
import org.etsi.mts.tdl.Timer;
import org.etsi.mts.tdl.TimerOperation;
import org.etsi.mts.tdl.TimerStart;
import org.etsi.mts.tdl.Variable;
import org.etsi.mts.tdl.VariableUse;
import org.etsi.mts.tdl.VerdictAssignment;
import org.etsi.mts.tdl.tdlFactory;
import org.etsi.mts.tdl.tdlPackage;
import org.etsi.mts.tdl.graphical.extensions.BehaviourModifications;
import org.etsi.mts.tdl.graphical.extensions.ModelHelper;

public class CreateAction implements IExternalJavaAction {

	@Override
	public void execute(Collection<? extends EObject> selections, Map<String, Object> parameters) {
		
		EObject endPredecessor = (EObject) parameters.get("startingEndPredecessor");
		List<GateReference> lifelines = (List<GateReference>) parameters.get("lifelines");
		EObject target = (EObject) parameters.get("target");
		EObject element = (EObject) parameters.get("element");
		
		String metaClassName = (String) parameters.get("class");
		EClassifier eClass = tdlPackage.eINSTANCE.getEClassifier(metaClassName);
		
		Behaviour behaviour = null;
		switch (eClass.getClassifierID()) {
		case tdlPackage.MESSAGE:
			behaviour = createMessage(parameters);
			break;
			
		case tdlPackage.ALTERNATIVE_BEHAVIOUR:
		case tdlPackage.BOUNDED_LOOP_BEHAVIOUR:
		case tdlPackage.CONDITIONAL_BEHAVIOUR:
		case tdlPackage.PARALLEL_BEHAVIOUR:
		case tdlPackage.UNBOUNDED_LOOP_BEHAVIOUR:
			behaviour = createCombinedBehaviour(parameters, eClass);
			break;

		case tdlPackage.DEFAULT_BEHAVIOUR:
		case tdlPackage.INTERRUPT_BEHAVIOUR:
		case tdlPackage.PERIODIC_BEHAVIOUR:
			return;

		case tdlPackage.BLOCK:
			BehaviourModifications.addBlock(endPredecessor, (MultipleCombinedBehaviour) target);
			return;
			
		case tdlPackage.BREAK:
		case tdlPackage.STOP:
			behaviour = (Behaviour) EcoreUtil.create((EClass) eClass);
			break;
			
		case tdlPackage.ACTION_REFERENCE:
			behaviour = (Behaviour) EcoreUtil.create((EClass) eClass);
			((ActionReference)behaviour).setAction((Action) element);
			break;
			
		case tdlPackage.INLINE_ACTION:
			for (GateReference gRef : lifelines) {
				ComponentInstance comp = gRef.getComponent();
				behaviour = (Behaviour) EcoreUtil.create((EClass) eClass);
				((ActionBehaviour)behaviour).setComponentInstance(comp);
				break;
			}
			break;
			
		case tdlPackage.VERDICT_ASSIGNMENT:
			behaviour = (Behaviour) EcoreUtil.create((EClass) eClass);
			DataInstanceUse verdictDataUse = tdlFactory.eINSTANCE.createDataInstanceUse();
			verdictDataUse.setDataInstance((DataInstance) element);
			((VerdictAssignment)behaviour).setVerdict(verdictDataUse);
			break;

		case tdlPackage.TEST_DESCRIPTION_REFERENCE:
			behaviour = (Behaviour) EcoreUtil.create((EClass) eClass);
			((TestDescriptionReference)behaviour).setTestDescription((TestDescription) element);
			break;

		case tdlPackage.TIMER_START:
		case tdlPackage.TIMER_STOP:
			for (ComponentInstance c: new ModelHelper().getTestDescription(endPredecessor).getTestConfiguration().getComponentInstance()) {
				if (c.getType().getTimer().contains(element)) {
					behaviour = (Behaviour) EcoreUtil.create((EClass) eClass);
					((TimerOperation)behaviour).setTimer((Timer) element);
					((TimerOperation)behaviour).setComponentInstance(c);
					break;
				}
			}
			break;

		case tdlPackage.WAIT:
		case tdlPackage.QUIESCENCE:
			ComponentInstance tester = null;
			for (GateReference gRef : lifelines) {
				ComponentInstance comp = gRef.getComponent();
				if (comp.getRole() == ComponentInstanceRole.TESTER)
					if (tester == null)
						tester = comp;
					else {
						tester = null;
						break;
					}
			}
			behaviour = (Behaviour) EcoreUtil.create((EClass) eClass);
			((TimeOperation)behaviour).setComponentInstance(tester);
			
			break;

		case tdlPackage.TIME_LABEL:
			TimeLabel tl = (TimeLabel) EcoreUtil.create((EClass) eClass);
			((AtomicBehaviour)element).setTimeLabel(tl);
			return;
			
		case tdlPackage.TIME_CONSTRAINT:
			TimeConstraint tc = (TimeConstraint) EcoreUtil.create((EClass) eClass);
			((AtomicBehaviour)element).getTimeConstraint().add(tc);
			return;

		case tdlPackage.DATA_INSTANCE_USE:
			DataInstanceUse dataInstanceUse = tdlFactory.eINSTANCE.createDataInstanceUse();
			dataInstanceUse.setDataInstance((DataInstance) element);
			setDataUse(target, dataInstanceUse);
			return;

		case tdlPackage.VARIABLE_USE:
			VariableUse variableUse = tdlFactory.eINSTANCE.createVariableUse();
			variableUse.setVariable((Variable) element);
			for (ComponentInstance c: new ModelHelper().getTestDescription(target).getTestConfiguration().getComponentInstance()) {
				if (c.getType().getVariable().contains(element)) {
					variableUse.setComponentInstance(c);
					break;
				}
			}
			setDataUse(target, variableUse);
			return;

		case tdlPackage.FUNCTION_CALL:
			FunctionCall functionCall = tdlFactory.eINSTANCE.createFunctionCall();
			functionCall.setFunction((Function) element);
			setDataUse(target, functionCall);
			return;
			
		default:
			return;
		}
		
		if (behaviour == null)
			return;
		
		BehaviourModifications.addBehaviour(endPredecessor, parameters.get("diagramElement"), behaviour);

	}
	
	private Behaviour createMessage(Map<String, Object> parameters) {

		Message msg = tdlFactory.eINSTANCE.createMessage();
		
		msg.setSourceGate((GateReference) parameters.get("source"));

		Target t = tdlFactory.eINSTANCE.createTarget();
		msg.getTarget().add(t);
		t.setTargetGate((GateReference) parameters.get("target"));
		
		return msg;
	}

	
	private Behaviour createCombinedBehaviour(Map<String, Object> parameters, EClassifier eClass) {
		Behaviour behaviour = (Behaviour) EcoreUtil.create((EClass) eClass);
		Block block = tdlFactory.eINSTANCE.createBlock();
		if (behaviour instanceof SingleCombinedBehaviour)
			((SingleCombinedBehaviour) behaviour).setBlock(block);	
		else if (behaviour instanceof MultipleCombinedBehaviour)
			((MultipleCombinedBehaviour) behaviour).getBlock().add(block);
		
		if (behaviour instanceof AlternativeBehaviour ||
				behaviour instanceof ParallelBehaviour)
			((MultipleCombinedBehaviour) behaviour).getBlock().add(tdlFactory.eINSTANCE.createBlock());
			
		return behaviour;
	}
	
	private void setDataUse(EObject target, DataUse dataUse) {
		if (target instanceof Target) {
			Interaction interaction = (Interaction) target.eContainer();
			if (interaction instanceof Message)
				((Message) interaction).setArgument(dataUse);
		} else if (target instanceof BoundedLoopBehaviour)
			((BoundedLoopBehaviour) target).setNumIteration(dataUse);
		else if (target instanceof PeriodicBehaviour)
			((PeriodicBehaviour) target).setPeriod(dataUse);
		else if (target instanceof Block)
			((Block) target).setGuard(dataUse);
		else if (target instanceof Assertion)
			((Assertion) target).setCondition(dataUse);
		else if (target instanceof Assignment)
			((Assignment) target).setExpression(dataUse);
		else if (target instanceof TimeConstraint)
			((TimeConstraint) target).setTimeConstraintExpression(dataUse);
		else if (target instanceof TimerStart)
			((TimerStart) target).setPeriod(dataUse);
		else if (target instanceof TimeOperation)
			((TimeOperation) target).setPeriod(dataUse);
		else if (target instanceof TimeConstraint)
			((TimeConstraint) target).setTimeConstraintExpression(dataUse);
	}

	@Override
	public boolean canExecute(Collection<? extends EObject> selections) {
		return true;
	}

}