diff options
author | cbrun | 2017-01-19 11:20:42 +0000 |
---|---|---|
committer | cbrun | 2017-02-01 16:41:45 +0000 |
commit | 1d8e0b635ccfaac3f4f00a7979601d955f7357d6 (patch) | |
tree | 20c04d56345bfbcf3197111776e6382355d81baf | |
parent | 416dad1cc188d3cd0096f2453f958090f3c62170 (diff) | |
download | org.eclipse.sirius-1d8e0b635ccfaac3f4f00a7979601d955f7357d6.tar.gz org.eclipse.sirius-1d8e0b635ccfaac3f4f00a7979601d955f7357d6.tar.xz org.eclipse.sirius-1d8e0b635ccfaac3f4f00a7979601d955f7357d6.zip |
[510126] Specify types for DiagramCreationDescription
Add the code and supporting test case so that the variables self,
container and containerview in DiagramCreationDescription have their
most specific types depending using the VSM structure
Bug: 510126
Change-Id: I97922cb9cc1297411ee256fc9c3c5100593c7730
Signed-off-by: Cedric Brun <cedric.brun@obeo.fr>
3 files changed, 55 insertions, 2 deletions
diff --git a/plugins/org.eclipse.sirius.diagram/src-core/org/eclipse/sirius/diagram/business/internal/dialect/description/DiagramInterpretedExpressionQuery.java b/plugins/org.eclipse.sirius.diagram/src-core/org/eclipse/sirius/diagram/business/internal/dialect/description/DiagramInterpretedExpressionQuery.java index 04c68360ea..1729c30018 100644 --- a/plugins/org.eclipse.sirius.diagram/src-core/org/eclipse/sirius/diagram/business/internal/dialect/description/DiagramInterpretedExpressionQuery.java +++ b/plugins/org.eclipse.sirius.diagram/src-core/org/eclipse/sirius/diagram/business/internal/dialect/description/DiagramInterpretedExpressionQuery.java @@ -76,6 +76,7 @@ import org.eclipse.sirius.viewpoint.description.style.BasicLabelStyleDescription import org.eclipse.sirius.viewpoint.description.tool.EditMaskVariables; import org.eclipse.sirius.viewpoint.description.tool.ModelOperation; import org.eclipse.sirius.viewpoint.description.tool.OperationAction; +import org.eclipse.sirius.viewpoint.description.tool.RepresentationCreationDescription; import org.eclipse.sirius.viewpoint.description.tool.ToolDescription; import org.eclipse.sirius.viewpoint.description.tool.ToolPackage; @@ -268,10 +269,41 @@ public class DiagramInterpretedExpressionQuery extends AbstractInterpretedExpres collectPotentialContainerTypes(possibleContainerTypes, Sets.<String> newLinkedHashSet(), ((ReconnectEdgeDescription) target).getMappings()); availableVariables.put(IInterpreterSiriusVariables.CONTAINER, VariableType.fromStrings(possibleContainerTypes)); } + if (target instanceof RepresentationCreationDescription) { + typeVariablesForDiagramCreationRepresentation((RepresentationCreationDescription) target, availableVariables); + } return availableVariables; } + private void typeVariablesForDiagramCreationRepresentation(RepresentationCreationDescription desc, Map<String, VariableType> availableVariables) { + Collection<String> possibleSemanticTypes = Sets.newLinkedHashSet(); + Collection<String> possibleViewTypes = Sets.newLinkedHashSet(); + Collection<String> possibleContainerViewTypes = Sets.newLinkedHashSet(); + Collection<String> possibleContainerTypes = Sets.newLinkedHashSet(); + for (DiagramElementMapping n : Iterables.filter(desc.getMappings(), DiagramElementMapping.class)) { + collectTypes(possibleSemanticTypes, possibleViewTypes, n); + collectPotentialContainerTypes(possibleContainerTypes, possibleContainerViewTypes, n); + } + refineVariableType(availableVariables, SELF, possibleSemanticTypes); + if (this.feature == ToolPackage.Literals.ABSTRACT_TOOL_DESCRIPTION__PRECONDITION) { + /* + * then we are validating the attribute expressions of the tool. + */ + availableVariables.put(IInterpreterSiriusVariables.CONTAINER, VariableType.fromStrings(possibleContainerTypes)); + availableVariables.put(IInterpreterSiriusVariables.CONTAINER_VIEW, VariableType.fromStrings(possibleContainerViewTypes)); + } else if (this.feature != ToolPackage.Literals.REPRESENTATION_CREATION_DESCRIPTION__BROWSE_EXPRESSION) { + /* + * we are in the model operations + */ + availableVariables.put(IInterpreterSiriusVariables.CONTAINER_VIEW, VariableType.fromStrings(possibleContainerViewTypes)); + if (desc.getRepresentationNameVariable() != null && !StringUtil.isEmpty(desc.getRepresentationNameVariable().getName())) { + availableVariables.put(desc.getRepresentationNameVariable().getName(), VariableType.fromJavaClass(java.lang.String.class)); // $NON-NLS-1$ + } + + } + } + private void collectEdgeCreationDescriptionVariableTypes(Map<String, VariableType> availableVariables, EdgeCreationDescription tool) { Collection<String> possibleSemanticSources = Sets.newLinkedHashSet(); Collection<String> possibleViewSources = Sets.newLinkedHashSet(); @@ -380,6 +412,9 @@ public class DiagramInterpretedExpressionQuery extends AbstractInterpretedExpres refineVariableType(availableVariables, tool.getElement().getName(), possibleSemanticTypes); refineVariableType(availableVariables, tool.getElementView().getName(), possibleViewTypes); } + if (toolContext instanceof RepresentationCreationDescription) { + typeVariablesForDiagramCreationRepresentation((RepresentationCreationDescription) toolContext, availableVariables); + } } } diff --git a/plugins/org.eclipse.sirius.tests.junit/data/unit/vsm/validateVariableTypes.odesign b/plugins/org.eclipse.sirius.tests.junit/data/unit/vsm/validateVariableTypes.odesign index ac8aefe213..d040d12dd7 100644 --- a/plugins/org.eclipse.sirius.tests.junit/data/unit/vsm/validateVariableTypes.odesign +++ b/plugins/org.eclipse.sirius.tests.junit/data/unit/vsm/validateVariableTypes.odesign @@ -160,7 +160,7 @@ </style> </conditionnalStyles> </containerMappings> - <containerMappings name="InteractionContainer" navigationDescriptions="//@ownedViewpoints[name='VSMTypes']/@ownedRepresentations[name='SelfTypeInference']/@defaultLayer/@toolSections.0/@ownedTools[name='toDiagram']" preconditionExpression="aql:containerView.edges->size() > 0" semanticCandidatesExpression="aql:containerView.target.eAllContents(interactions::Interaction)" domainClass="interactions.Interaction"> + <containerMappings name="InteractionContainer" detailDescriptions="//@ownedViewpoints[name='VSMTypes']/@ownedRepresentations[name='SelfTypeInference']/@defaultLayer/@toolSections.0/@ownedTools[name='Create%20diag%20from%20interaction']" navigationDescriptions="//@ownedViewpoints[name='VSMTypes']/@ownedRepresentations[name='SelfTypeInference']/@defaultLayer/@toolSections.0/@ownedTools[name='toDiagram']" preconditionExpression="aql:containerView.edges->size() > 0" semanticCandidatesExpression="aql:containerView.target.eAllContents(interactions::Interaction)" domainClass="interactions.Interaction"> <subContainerMappings name="InteractionContainerInContainer" semanticCandidatesExpression="var:self" domainClass="interactions.Interaction"> <style xsi:type="style:WorkspaceImageDescription" borderSizeComputationExpression="1" arcWidth="1" arcHeight="1" workspacePath="/org.eclipse.emf.ecore.edit/icons/full/obj16/EClass.gif"> <borderColor xsi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/> @@ -551,6 +551,17 @@ </firstModelOperations> </initialOperation> </ownedTools> + <ownedTools xsi:type="tool_1:DiagramCreationDescription" name="Create diag from interaction" precondition="aql:self.participants->size() > 0 and container.ownedInteractions->size() > 0" titleExpression="aql:self.participants->size()" browseExpression="aql:self.participants->first()" diagramDescription="//@ownedViewpoints[name='VSMTypes']/@ownedRepresentations[name='SelfTypeInference']"> + <initialOperation> + <firstModelOperations xsi:type="tool:ChangeContext" browseExpression="var:self"> + <subModelOperations xsi:type="tool:If" conditionExpression="aql:self.name = diagramName"> + <subModelOperations xsi:type="tool:ChangeContext" browseExpression="aql:containerView.edges"/> + </subModelOperations> + </firstModelOperations> + </initialOperation> + <containerViewVariable name="containerView"/> + <representationNameVariable name="diagramName"/> + </ownedTools> <subSections name="Ignored"> <ownedTools xsi:type="tool_1:DirectEditLabel" name="ElementType"> <mask mask="{0}"/> diff --git a/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/api/dialect/description/AbstractInterpretedExpressionQuery.java b/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/api/dialect/description/AbstractInterpretedExpressionQuery.java index 19d1b64fc1..cf750de8c6 100644 --- a/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/api/dialect/description/AbstractInterpretedExpressionQuery.java +++ b/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/api/dialect/description/AbstractInterpretedExpressionQuery.java @@ -52,6 +52,7 @@ import org.eclipse.sirius.viewpoint.description.tool.If; import org.eclipse.sirius.viewpoint.description.tool.InitialOperation; import org.eclipse.sirius.viewpoint.description.tool.ModelOperation; import org.eclipse.sirius.viewpoint.description.tool.OperationAction; +import org.eclipse.sirius.viewpoint.description.tool.RepresentationCreationDescription; import org.eclipse.sirius.viewpoint.description.tool.RepresentationNavigationDescription; import org.eclipse.sirius.viewpoint.description.tool.SelectionWizardDescription; import org.eclipse.sirius.viewpoint.description.tool.ToolDescription; @@ -310,6 +311,12 @@ public abstract class AbstractInterpretedExpressionQuery implements IInterpreted availableVariables.put(tool.getRepresentationNameVariable().getName(), VariableType.fromJavaClass(java.lang.String.class)); // $NON-NLS-1$ } } + if (operationContext instanceof RepresentationCreationDescription) { + RepresentationCreationDescription tool = (RepresentationCreationDescription) operationContext; + if (tool.getRepresentationNameVariable() != null && !StringUtil.isEmpty(tool.getRepresentationNameVariable().getName())) { + availableVariables.put(tool.getRepresentationNameVariable().getName(), VariableType.fromJavaClass(java.lang.String.class)); // $NON-NLS-1$ + } + } addVariablesFromToolContext(operationContext); if (operationContext instanceof SelectionWizardDescription) { IInterpreterContext iContext = SiriusInterpreterContextFactory.createInterpreterContext(operationContext, ToolPackage.Literals.ABSTRACT_TOOL_DESCRIPTION__PRECONDITION); @@ -414,7 +421,7 @@ public abstract class AbstractInterpretedExpressionQuery implements IInterpreted */ found = new EObjectQuery(target).getFirstAncestorOfType(org.eclipse.sirius.viewpoint.description.validation.ValidationPackage.eINSTANCE.getValidationRule()); if (!found.some()) { - if (this.target instanceof OperationAction || this.target instanceof RepresentationNavigationDescription) { + if (this.target instanceof OperationAction || this.target instanceof RepresentationNavigationDescription || this.target instanceof RepresentationCreationDescription) { /* * OperationAction and RepresentationNavigationDescription are * representing their own context for their interpreted |