Commit 7555548d authored by Martti Käärik's avatar Martti Käärik
Browse files

Added property editors for editing data uses for:

Message, Block, BoundedLoopBehaviour, PeriodicBehaviour, TimeOperation, TimerStart, TimeConstraint, Assignment, Assertion,

Change-Id: I4d9dc5f986904b6fdf26333ed2cc02deaeb2b99c
parent a439a1b7
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Export-Package: org.etsi.mts.tdl.graphical.labels,
 org.etsi.mts.tdl.graphical.labels.services,
 org.etsi.mts.tdl.graphical.labels.serializer,
 org.etsi.mts.tdl.graphical.labels.parser,
 org.etsi.mts.tdl.graphical.labels.parser.antlr,
 org.etsi.mts.tdl.graphical.labels.parser.antlr.internal,
 org.etsi.mts.tdl.graphical.labels.validation,
+170 −1
Original line number Diff line number Diff line
<?xml version="1.0" encoding="UTF-8"?>
<description:Group xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:description="http://www.eclipse.org/sirius/description/1.1.0" xmlns:description_1="http://www.eclipse.org/sirius/diagram/sequence/description/2.0.0" xmlns:description_2="http://www.eclipse.org/sirius/diagram/description/1.1.0" xmlns:style="http://www.eclipse.org/sirius/diagram/description/style/1.1.0" xmlns:tool="http://www.eclipse.org/sirius/diagram/sequence/description/tool/2.0.0" xmlns:tool_1="http://www.eclipse.org/sirius/description/tool/1.1.0" xmlns:tool_2="http://www.eclipse.org/sirius/diagram/description/tool/1.1.0" name="TDL" version="11.1.1.201610211630">
<description:Group xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:description="http://www.eclipse.org/sirius/description/1.1.0" xmlns:description_1="http://www.eclipse.org/sirius/diagram/sequence/description/2.0.0" xmlns:description_2="http://www.eclipse.org/sirius/diagram/description/1.1.0" xmlns:properties="http://www.eclipse.org/sirius/properties/1.0.0" xmlns:properties-ext-widgets-reference="http://www.eclipse.org/sirius/properties/1.0.0/ext/widgets/reference" xmlns:style="http://www.eclipse.org/sirius/diagram/description/style/1.1.0" xmlns:tool="http://www.eclipse.org/sirius/diagram/sequence/description/tool/2.0.0" xmlns:tool_1="http://www.eclipse.org/sirius/description/tool/1.1.0" xmlns:tool_2="http://www.eclipse.org/sirius/diagram/description/tool/1.1.0" name="TDL" version="11.1.1.201610211630">
  <ownedViewpoints name="org.etsi.mts.tdl" label="TDL">
    <ownedRepresentations xsi:type="description_1:SequenceDiagramDescription" name="TestDescriptionDiagram" label="TDL Behavior" domainClass="tdl.TestDescription" enablePopupBars="true" endsOrdering="[getOccurrences()->select(e|eventEnds->includes(e))/]" instanceRolesOrdering="[testConfiguration.connection.endPoint->sortedBy(ref|ref.component.name + '.' + ref.gate.name)/]">
      <metamodel href="../../org.etsi.mts.tdl.model/model/tdl.ecore#/"/>
@@ -1938,4 +1938,173 @@
    <ownedJavaExtensions qualifiedClassName="org.etsi.mts.tdl.graphical.extensions.ModelHelper"/>
    <ownedJavaExtensions qualifiedClassName="org.etsi.mts.tdl.graphical.extensions.BehaviourModifications"/>
  </ownedViewpoints>
  <extensions xsi:type="properties:ViewExtensionDescription" identifier="org.eclipse.sirius.ui.properties">
    <pages identifier="org.eclipse.sirius.ui.properties.defaultpage" labelExpression="aql:self.className()" semanticCandidateExpression="aql:input.getAllSemanticElements()" groups="//@extensions.0/@groups.1 //@extensions.0/@groups.2 //@extensions.0/@groups.3 //@extensions.0/@groups.4 //@extensions.0/@groups.5 //@extensions.0/@groups.6 //@extensions.0/@groups.8 //@extensions.0/@groups.7 //@extensions.0/@groups.9 //@extensions.0/@groups.0"/>
    <groups identifier="org.eclipse.sirius.ui.properties.defaultgroup" labelExpression="Properties" semanticCandidateExpression="var:self" preconditionExpression="">
      <controls xsi:type="properties:DynamicMappingFor" iterator="eStructuralFeature" iterableExpression="aql:input.emfEditServices(self).getEStructuralFeatures()">
        <ifs predicateExpression="aql:input.emfEditServices(self).needsTextWidget(eStructuralFeature) and not input.emfEditServices(self).isMultiline(eStructuralFeature)">
          <widget xsi:type="properties:TextDescription" identifier="sirius_default_rules_mono_string" labelExpression="aql:input.emfEditServices(self).getText(eStructuralFeature)+':'" helpExpression="aql:input.emfEditServices(self).getDescription(eStructuralFeature)" isEnabledExpression="aql:eStructuralFeature.changeable" valueExpression="aql:self.eGet(eStructuralFeature.name)">
            <initialOperation>
              <firstModelOperations xsi:type="tool_1:ChangeContext" browseExpression="aql:input.emfEditServices(self).setValue(eStructuralFeature, newValue)"/>
            </initialOperation>
            <conditionalStyles preconditionExpression="aql:eStructuralFeature.lowerBound==1">
              <style>
                <labelFontFormat>bold</labelFontFormat>
              </style>
            </conditionalStyles>
          </widget>
        </ifs>
        <ifs predicateExpression="aql:input.emfEditServices(self).needsTextWidget(eStructuralFeature) and input.emfEditServices(self).isMultiline(eStructuralFeature)">
          <widget xsi:type="properties:TextAreaDescription" identifier="sirius_default_rules_multi_string" labelExpression="aql:input.emfEditServices(self).getText(eStructuralFeature)+':'" helpExpression="aql:input.emfEditServices(self).getDescription(eStructuralFeature)" isEnabledExpression="aql:eStructuralFeature.changeable" valueExpression="aql:self.eGet(eStructuralFeature.name)">
            <initialOperation>
              <firstModelOperations xsi:type="tool_1:ChangeContext" browseExpression="aql:input.emfEditServices(self).setValue(eStructuralFeature, newValue)"/>
            </initialOperation>
            <conditionalStyles preconditionExpression="aql:eStructuralFeature.lowerBound==1">
              <style>
                <labelFontFormat>bold</labelFontFormat>
              </style>
            </conditionalStyles>
          </widget>
        </ifs>
        <ifs predicateExpression="aql:input.emfEditServices(self).needsCheckboxWidget(eStructuralFeature)">
          <widget xsi:type="properties:CheckboxDescription" identifier="sirius_default_rules_mono_boolean" labelExpression="aql:input.emfEditServices(self).getText(eStructuralFeature)" helpExpression="aql:input.emfEditServices(self).getDescription(eStructuralFeature)" isEnabledExpression="aql:eStructuralFeature.changeable" valueExpression="aql:self.eGet(eStructuralFeature.name)">
            <initialOperation>
              <firstModelOperations xsi:type="tool_1:ChangeContext" browseExpression="aql:input.emfEditServices(self).setValue(eStructuralFeature, newValue)"/>
            </initialOperation>
            <conditionalStyles preconditionExpression="aql:eStructuralFeature.lowerBound==1">
              <style>
                <labelFontFormat>bold</labelFontFormat>
              </style>
            </conditionalStyles>
          </widget>
        </ifs>
        <ifs predicateExpression="aql:eStructuralFeature.eType.oclIsKindOf(ecore::EEnum) and not(eStructuralFeature.many)">
          <widget xsi:type="properties:RadioDescription" identifier="sirius_default_rules_enum" labelExpression="aql:input.emfEditServices(self).getText(eStructuralFeature)+':'" helpExpression="aql:input.emfEditServices(self).getDescription(eStructuralFeature)" isEnabledExpression="aql:eStructuralFeature.changeable" valueExpression="aql:eStructuralFeature.eType.getEEnumLiteralByLiteral(self.eGet(eStructuralFeature.name).toString())" candidatesExpression="aql:eStructuralFeature.eType.eLiterals" candidateDisplayExpression="aql:candidate.name" numberOfColumns="5">
            <initialOperation>
              <firstModelOperations xsi:type="tool_1:ChangeContext" browseExpression="aql:input.emfEditServices(self).setValue(eStructuralFeature, newValue.instance)"/>
            </initialOperation>
            <conditionalStyles preconditionExpression="aql:eStructuralFeature.lowerBound==1">
              <style>
                <labelFontFormat>bold</labelFontFormat>
              </style>
            </conditionalStyles>
          </widget>
        </ifs>
        <ifs predicateExpression="aql:eStructuralFeature.oclIsKindOf(ecore::EAttribute) and eStructuralFeature.many">
          <widget xsi:type="properties:ListDescription" identifier="sirius_default_rules_eattribute_many" labelExpression="aql:input.emfEditServices(self).getText(eStructuralFeature)+':'" helpExpression="aql:input.emfEditServices(self).getDescription(eStructuralFeature)" isEnabledExpression="aql:eStructuralFeature.changeable" valueExpression="aql:self.eGet(eStructuralFeature.name)" displayExpression="var:value"/>
        </ifs>
        <ifs predicateExpression="aql:eStructuralFeature.oclIsKindOf(ecore::EReference)">
          <widget xsi:type="properties-ext-widgets-reference:ExtReferenceDescription" identifier="sirius_default_rules_ereference" labelExpression="aql:input.emfEditServices(self).getText(eStructuralFeature)+':'" helpExpression="aql:input.emfEditServices(self).getDescription(eStructuralFeature)" referenceNameExpression="aql:eStructuralFeature.name"/>
        </ifs>
      </controls>
    </groups>
    <groups identifier="org.etsi.mts.tdl.properties.messageGroup" labelExpression="TDL Properties" domainClass="tdl.Message" semanticCandidateExpression="var:self">
      <controls xsi:type="properties:TextAreaDescription" identifier="messageArgument" labelExpression="Argument" valueExpression="aql:self.serialise(self.argument)" lineCount="3">
        <initialOperation>
          <firstModelOperations xsi:type="tool_1:ChangeContext" browseExpression="var:self">
            <subModelOperations xsi:type="tool_1:ExternalJavaAction" name="parseMessageArgumentAction" id="org.etsi.mts.tdl.graphical.viewpoint.parseAction">
              <parameters name="element" value="var:self"/>
              <parameters name="newValue" value="var:newValue"/>
            </subModelOperations>
          </firstModelOperations>
        </initialOperation>
      </controls>
    </groups>
    <groups identifier="org.etsi.mts.tdl.properties.blockGroup" labelExpression="TDL Properties" domainClass="tdl.Block" semanticCandidateExpression="var:self">
      <controls xsi:type="properties:TextAreaDescription" identifier="guardExpression" labelExpression="Guard" valueExpression="aql:self.serialise(self.guard.expression->any(d|true))" lineCount="3">
        <initialOperation>
          <firstModelOperations xsi:type="tool_1:ChangeContext" browseExpression="var:self">
            <subModelOperations xsi:type="tool_1:ExternalJavaAction" name="parseMessageArgumentAction" id="org.etsi.mts.tdl.graphical.viewpoint.parseAction">
              <parameters name="element" value="var:self"/>
              <parameters name="newValue" value="var:newValue"/>
            </subModelOperations>
          </firstModelOperations>
        </initialOperation>
      </controls>
    </groups>
    <groups identifier="org.etsi.mts.tdl.properties.boundedLoopGroup" labelExpression="TDL Properties" domainClass="tdl.BoundedLoopBehaviour" semanticCandidateExpression="var:self">
      <controls xsi:type="properties:TextAreaDescription" identifier="numIteration" labelExpression="Iterations" valueExpression="aql:self.serialise(self.numIteration.expression->any(d|true))" lineCount="3">
        <initialOperation>
          <firstModelOperations xsi:type="tool_1:ChangeContext" browseExpression="var:self">
            <subModelOperations xsi:type="tool_1:ExternalJavaAction" name="parseMessageArgumentAction" id="org.etsi.mts.tdl.graphical.viewpoint.parseAction">
              <parameters name="element" value="var:self"/>
              <parameters name="newValue" value="var:newValue"/>
            </subModelOperations>
          </firstModelOperations>
        </initialOperation>
      </controls>
    </groups>
    <groups identifier="org.etsi.mts.tdl.properties.periodicGroup" labelExpression="TDL Properties" domainClass="tdl.PeriodicBehaviour" semanticCandidateExpression="var:self">
      <controls xsi:type="properties:TextAreaDescription" identifier="period" labelExpression="Period" valueExpression="aql:self.serialise(self.period.expression->any(d|true))" lineCount="3">
        <initialOperation>
          <firstModelOperations xsi:type="tool_1:ChangeContext" browseExpression="var:self">
            <subModelOperations xsi:type="tool_1:ExternalJavaAction" name="parseMessageArgumentAction" id="org.etsi.mts.tdl.graphical.viewpoint.parseAction">
              <parameters name="element" value="var:self"/>
              <parameters name="newValue" value="var:newValue"/>
            </subModelOperations>
          </firstModelOperations>
        </initialOperation>
      </controls>
    </groups>
    <groups identifier="org.etsi.mts.tdl.properties.timeOperationGroup" labelExpression="TDL Properties" domainClass="tdl.TimeOperation" semanticCandidateExpression="var:self">
      <controls xsi:type="properties:TextAreaDescription" identifier="period" labelExpression="Period" valueExpression="aql:self.serialise(self.period)" lineCount="3">
        <initialOperation>
          <firstModelOperations xsi:type="tool_1:ChangeContext" browseExpression="var:self">
            <subModelOperations xsi:type="tool_1:ExternalJavaAction" name="parseMessageArgumentAction" id="org.etsi.mts.tdl.graphical.viewpoint.parseAction">
              <parameters name="element" value="var:self"/>
              <parameters name="newValue" value="var:newValue"/>
            </subModelOperations>
          </firstModelOperations>
        </initialOperation>
      </controls>
    </groups>
    <groups identifier="org.etsi.mts.tdl.properties.timerStartGroup" labelExpression="TDL Properties" domainClass="tdl.TimerStart" semanticCandidateExpression="var:self">
      <controls xsi:type="properties:TextAreaDescription" identifier="period" labelExpression="Period" valueExpression="aql:self.serialise(self.period)" lineCount="3">
        <initialOperation>
          <firstModelOperations xsi:type="tool_1:ChangeContext" browseExpression="var:self">
            <subModelOperations xsi:type="tool_1:ExternalJavaAction" name="parseMessageArgumentAction" id="org.etsi.mts.tdl.graphical.viewpoint.parseAction">
              <parameters name="element" value="var:self"/>
              <parameters name="newValue" value="var:newValue"/>
            </subModelOperations>
          </firstModelOperations>
        </initialOperation>
      </controls>
    </groups>
    <groups identifier="org.etsi.mts.tdl.properties.timeConstraintGroup" labelExpression="TDL Properties" domainClass="tdl.TimeConstraint" semanticCandidateExpression="var:self">
      <controls xsi:type="properties:TextAreaDescription" identifier="timeConstraintExpression" labelExpression="Constraint" valueExpression="aql:self.serialise(self.timeConstraintExpression)" lineCount="3">
        <initialOperation>
          <firstModelOperations xsi:type="tool_1:ChangeContext" browseExpression="var:self">
            <subModelOperations xsi:type="tool_1:ExternalJavaAction" name="parseMessageArgumentAction" id="org.etsi.mts.tdl.graphical.viewpoint.parseAction">
              <parameters name="element" value="var:self"/>
              <parameters name="newValue" value="var:newValue"/>
            </subModelOperations>
          </firstModelOperations>
        </initialOperation>
      </controls>
    </groups>
    <groups identifier="org.etsi.mts.tdl.properties.assignmentGroup" labelExpression="TDL Properties" domainClass="tdl.Assignment" semanticCandidateExpression="var:self">
      <controls xsi:type="properties:TextAreaDescription" identifier="expression" labelExpression="Expression" valueExpression="aql:self.serialise(self.expression)" lineCount="3">
        <initialOperation>
          <firstModelOperations xsi:type="tool_1:ChangeContext" browseExpression="var:self">
            <subModelOperations xsi:type="tool_1:ExternalJavaAction" name="parseMessageArgumentAction" id="org.etsi.mts.tdl.graphical.viewpoint.parseAction">
              <parameters name="element" value="var:self"/>
              <parameters name="newValue" value="var:newValue"/>
            </subModelOperations>
          </firstModelOperations>
        </initialOperation>
      </controls>
    </groups>
    <groups identifier="org.etsi.mts.tdl.properties.assertionGroup" labelExpression="TDL Properties" domainClass="tdl.Assertion" semanticCandidateExpression="var:self">
      <controls xsi:type="properties:TextAreaDescription" identifier="condition" labelExpression="Condition" valueExpression="aql:self.serialise(self.condition)" lineCount="3">
        <initialOperation>
          <firstModelOperations xsi:type="tool_1:ChangeContext" browseExpression="var:self">
            <subModelOperations xsi:type="tool_1:ExternalJavaAction" name="parseMessageArgumentAction" id="org.etsi.mts.tdl.graphical.viewpoint.parseAction">
              <parameters name="element" value="var:self"/>
              <parameters name="newValue" value="var:newValue"/>
            </subModelOperations>
          </firstModelOperations>
        </initialOperation>
      </controls>
    </groups>
  </extensions>
</description:Group>
+4 −0
Original line number Diff line number Diff line
@@ -80,6 +80,10 @@
            actionClass="org.etsi.mts.tdl.graphical.sirius.actions.CreateAction"
            id="org.etsi.mts.tdl.graphical.viewpoint.createAction">
      </javaActions>
      <javaActions
            actionClass="org.etsi.mts.tdl.graphical.sirius.actions.ParseAction"
            id="org.etsi.mts.tdl.graphical.viewpoint.parseAction">
      </javaActions>
   </extension>


+4 −0
Original line number Diff line number Diff line
@@ -32,6 +32,10 @@ import org.etsi.mts.tdl.tdlPackage;

public class ModelHelper {
	
	public String className(EObject element) {
		return element.eClass().getName();
	}
	
	public EObject owner(EObject element) {
		return element.eContainer();
	}
+146 −0
Original line number Diff line number Diff line
package org.etsi.mts.tdl.graphical.sirius.actions;

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

import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.sirius.tools.api.ui.IExternalJavaAction;
import org.eclipse.ui.statushandlers.StatusManager;
import org.eclipse.xtext.nodemodel.INode;
import org.eclipse.xtext.parser.IParseResult;
import org.eclipse.xtext.resource.IResourceFactory;
import org.eclipse.xtext.resource.XtextResource;
import org.eclipse.xtext.resource.XtextResourceSet;
import org.etsi.mts.tdl.Assertion;
import org.etsi.mts.tdl.Assignment;
import org.etsi.mts.tdl.Block;
import org.etsi.mts.tdl.BoundedLoopBehaviour;
import org.etsi.mts.tdl.DataUse;
import org.etsi.mts.tdl.LocalExpression;
import org.etsi.mts.tdl.Message;
import org.etsi.mts.tdl.PeriodicBehaviour;
import org.etsi.mts.tdl.TimeConstraint;
import org.etsi.mts.tdl.TimeOperation;
import org.etsi.mts.tdl.TimerStart;
import org.etsi.mts.tdl.tdlFactory;
import org.etsi.mts.tdl.tdlPackage;
import org.etsi.mts.tdl.graphical.labels.DataStandaloneSetup;
import org.etsi.mts.tdl.graphical.labels.parser.RuleBasedDataParser;
import org.etsi.mts.tdl.graphical.viewpoint.Activator;

import com.google.inject.Injector;

public class ParseAction implements IExternalJavaAction {

	@Override
	public void execute(Collection<? extends EObject> selections, Map<String, Object> parameters) {
		EObject element = (EObject) parameters.get("element");
		String newValue = (String) parameters.get("newValue");
		
		try {
			DataUse value = (DataUse) parse(element.eResource().getURI(), newValue, "DataUse");
			
			if (value != null) {
				EClass type = element.eClass();
				List<LocalExpression> localExpressions = null;
				switch (type.getClassifierID()) {
				
				case tdlPackage.MESSAGE:
					((Message)element).setArgument(value);
					break;
					
				case tdlPackage.BLOCK:
					localExpressions = ((Block)element).getGuard();
				case tdlPackage.BOUNDED_LOOP_BEHAVIOUR:
					if (element instanceof BoundedLoopBehaviour)
						localExpressions = ((BoundedLoopBehaviour) element).getNumIteration();
				case tdlPackage.PERIODIC_BEHAVIOUR:
					if (element instanceof PeriodicBehaviour)
						localExpressions = ((PeriodicBehaviour) element).getPeriod();
					
					LocalExpression localExp;
					if (localExpressions.isEmpty())
						localExpressions.add(localExp = tdlFactory.eINSTANCE.createLocalExpression());
					else
						localExp = localExpressions.get(0);
					localExp.setExpression(value);
					break;

				case tdlPackage.WAIT:
				case tdlPackage.QUIESCENCE:
					((TimeOperation)element).setPeriod(value);
					break;

				case tdlPackage.TIMER_START:
					((TimerStart)element).setPeriod(value);
					break;

				case tdlPackage.TIME_CONSTRAINT:
					((TimeConstraint)element).setTimeConstraintExpression(value);
					break;

				case tdlPackage.ASSIGNMENT:
					((Assignment)element).setExpression(value);
					break;

				case tdlPackage.ASSERTION:
					((Assertion)element).setCondition(value);
					break;
				}
			}
			
		} catch (IOException e) {
			StatusManager.getManager().handle(new Status(IStatus.ERROR, Activator.PLUGIN_ID, e.getMessage()));
		}
	}

	@Override
	public boolean canExecute(Collection<? extends EObject> selections) {
		return true;
	}
	
	private EObject parse(URI uri, String text, String rule) throws IOException {
		Injector xtextInjector = new DataStandaloneSetup().createInjectorAndDoEMFRegistration();
		IResourceFactory resourceFactory = xtextInjector.getInstance(IResourceFactory.class);
		XtextResourceSet rs = xtextInjector.getInstance(XtextResourceSet.class);
		rs.setClasspathURIContext(getClass());

		XtextResource xr = (XtextResource)resourceFactory.createResource(URI.createURI(uri.toString()));
		rs.getResources().add(xr);

		RuleBasedDataParser parser = (RuleBasedDataParser)xr.getParser();
		parser.setDefaultRuleName(rule);
		xr.reparse(text);

		List<EObject> contents = xr.getContents();
		if (contents.isEmpty()) {
			IParseResult result = xr.getParseResult();
			StringBuilder errorMessage = new StringBuilder();
			for (INode err: result.getSyntaxErrors()) {
				errorMessage.append(err.getSyntaxErrorMessage().getMessage());
				errorMessage.append(System.getProperty("line.separator"));
			}
			StatusManager.getManager().handle(new Status(IStatus.ERROR, Activator.PLUGIN_ID, errorMessage.toString()),
					StatusManager.SHOW);
			return null;
		}

		//Resolve cross references using linker
		EObject element = contents.get(0);
		EcoreUtil.resolveAll(xr);
		EObject resolved = contents.get(0);
		if (!resolved.eClass().isInstance(element))
			//If linker replaced root element, resolve the new element 
			EcoreUtil.resolveAll(xr);

		return resolved;
	}

}