Skip to content

Commit

Permalink
[272] Add state transition compartment and fix action creation in states
Browse files Browse the repository at this point in the history
Bug: #272
Signed-off-by: Gwendal Daniel <gwendal.daniel@obeosoft.com>
  • Loading branch information
gdaniel authored and AxelRICHARD committed May 21, 2024
1 parent 69960a0 commit b328cba
Show file tree
Hide file tree
Showing 11 changed files with 411 additions and 239 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
- https://github.com/eclipse-syson/syson/issues/271[#271] [diagrams] Remove non end Usages from AllocationDefinition ends compartment
- https://github.com/eclipse-syson/syson/issues/229[#229] [diagrams] Prevent circular containment of nested parts including self containment
- https://github.com/eclipse-syson/syson/issues/305[#305] [diagrams] Fix performance issue when using EcoreUtil.delete
- https://github.com/eclipse-syson/syson/issues/272[#272] [statetransition-view] Add "state transition" compartment and fix the graphical creation of actions in StateDefinition and StateUsage

=== Improvements

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@
import org.eclipse.syson.sysml.ConstraintUsage;
import org.eclipse.syson.sysml.Definition;
import org.eclipse.syson.sysml.Element;
import org.eclipse.syson.sysml.EndFeatureMembership;
import org.eclipse.syson.sysml.Feature;
import org.eclipse.syson.sysml.FeatureMembership;
import org.eclipse.syson.sysml.Namespace;
import org.eclipse.syson.sysml.ObjectiveMembership;
Expand All @@ -52,9 +54,12 @@
import org.eclipse.syson.sysml.RequirementConstraintKind;
import org.eclipse.syson.sysml.RequirementDefinition;
import org.eclipse.syson.sysml.RequirementUsage;
import org.eclipse.syson.sysml.StateUsage;
import org.eclipse.syson.sysml.SubjectMembership;
import org.eclipse.syson.sysml.Succession;
import org.eclipse.syson.sysml.SysmlFactory;
import org.eclipse.syson.sysml.SysmlPackage;
import org.eclipse.syson.sysml.TransitionUsage;
import org.eclipse.syson.sysml.Usage;
import org.eclipse.syson.sysml.UseCaseDefinition;
import org.eclipse.syson.sysml.UseCaseUsage;
Expand All @@ -71,7 +76,7 @@ public class ViewToolService extends ToolService {

protected final IViewRepresentationDescriptionSearchService viewRepresentationDescriptionSearchService;

private final ElementInitializerSwitch elementInitializerSwitch;
protected final ElementInitializerSwitch elementInitializerSwitch;

private final Logger logger = LoggerFactory.getLogger(ViewToolService.class);

Expand Down Expand Up @@ -566,4 +571,75 @@ public ActionUsage createSubActionUsageAndView(Element actionUsage, String nodeN
}
return childAction;
}

/**
* Create a new TransitionUsage and set it as the child of the parent of the sourceAction element. Sets its source
* and target.
*
* @param sourceAction
* the ActionUsage used as a source for the transition
* @param targetAction
* the ActionUsage used as a target for the transition
* @return the given source {@link ActionUsage}.
*/
public ActionUsage createTransitionUsage(ActionUsage sourceAction, ActionUsage targetAction) {
// Check source and target have the same parent
Element sourceParentElement = sourceAction.getOwner();
Element targetParentElement = targetAction.getOwner();
if (sourceParentElement != targetParentElement
// Handle the case where source state or target state is a Parallel state
|| this.isParallelState(sourceAction) || this.isParallelState(targetAction)) {
// Should probably not be here as the transition creation should not be allowed.
return sourceAction;
}
// Create transition usage and add it to the parent element
// sourceParentElement <>-> FeatureMembership -> RelatedElement = TransitionUsage
TransitionUsage newTransitionUsage = SysmlFactory.eINSTANCE.createTransitionUsage();
this.elementInitializerSwitch.doSwitch(newTransitionUsage);
var featureMembership = SysmlFactory.eINSTANCE.createFeatureMembership();
featureMembership.getOwnedRelatedElement().add(newTransitionUsage);
sourceParentElement.getOwnedRelationship().add(featureMembership);

// Create EndFeature
// TransitionUsage <>-> Membership -> MemberElement = sourceAction
var sourceMembership = SysmlFactory.eINSTANCE.createMembership();
newTransitionUsage.getOwnedRelationship().add(sourceMembership);
sourceMembership.setMemberElement(sourceAction);

// Create Succession
// TransitionUsage <>-> FeatureMembership -> RelatedElement = succession
Succession succession = SysmlFactory.eINSTANCE.createSuccession();
this.elementInitializerSwitch.doSwitch(succession);
var successionFeatureMembership = SysmlFactory.eINSTANCE.createFeatureMembership();
successionFeatureMembership.getOwnedRelatedElement().add(succession);
newTransitionUsage.getOwnedRelationship().add(successionFeatureMembership);

// Set Succession Source and Target Features
succession.getOwnedRelationship().add(this.createConnectorEndFeatureMembership(sourceAction));
succession.getOwnedRelationship().add(this.createConnectorEndFeatureMembership(targetAction));

return sourceAction;
}

private boolean isParallelState(ActionUsage action) {
return action instanceof StateUsage su && su.isIsParallel();
}

/**
* <>-> EndFeatureMembership -> RelatedElement = Feature <>-> ReferenceSubsetting -> ReferencedFeature = feature
*
* @param feature
* The feature to reference subset
* @return
*/
private EndFeatureMembership createConnectorEndFeatureMembership(Feature feature) {
var successionSourceEndFeatureMembership = SysmlFactory.eINSTANCE.createEndFeatureMembership();
var successionSourceEndFeatureFeature = SysmlFactory.eINSTANCE.createFeature();
successionSourceEndFeatureMembership.getOwnedRelatedElement().add(successionSourceEndFeatureFeature);

var successionSourceRefSubsetting = SysmlFactory.eINSTANCE.createReferenceSubsetting();
successionSourceRefSubsetting.setReferencedFeature(feature);
successionSourceEndFeatureFeature.getOwnedRelationship().add(successionSourceRefSubsetting);
return successionSourceEndFeatureMembership;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,10 @@
import org.eclipse.syson.diagram.common.view.tools.ToolSectionDescription;
import org.eclipse.syson.diagram.statetransition.view.edges.TransitionEdgeDescriptionProvider;
import org.eclipse.syson.diagram.statetransition.view.nodes.CompartmentNodeDescriptionProvider;
import org.eclipse.syson.diagram.statetransition.view.nodes.CompositeStateDefinitionNodeDescriptionProvider;
import org.eclipse.syson.diagram.statetransition.view.nodes.DefinitionNodeDescriptionProvider;
import org.eclipse.syson.diagram.statetransition.view.nodes.FakeNodeDescriptionProvider;
import org.eclipse.syson.diagram.statetransition.view.nodes.PackageNodeDescriptionProvider;
import org.eclipse.syson.diagram.statetransition.view.nodes.StateTransitionCompartmentNodeDescriptionProvider;
import org.eclipse.syson.diagram.statetransition.view.nodes.StateTransitionViewEmptyDiagramNodeDescriptionProvider;
import org.eclipse.syson.diagram.statetransition.view.nodes.UsageNodeDescriptionProvider;
import org.eclipse.syson.sysml.SysmlPackage;
Expand Down Expand Up @@ -95,9 +96,13 @@ public RepresentationDescription create(IColorProvider colorProvider) {
diagramElementDescriptionProviders.add(new StateTransitionViewEmptyDiagramNodeDescriptionProvider(colorProvider));
diagramElementDescriptionProviders.add(new PackageNodeDescriptionProvider(colorProvider));
diagramElementDescriptionProviders.add(new TransitionEdgeDescriptionProvider(colorProvider));
diagramElementDescriptionProviders
.add(new StateTransitionCompartmentNodeDescriptionProvider(SysmlPackage.eINSTANCE.getStateDefinition(), SysmlPackage.eINSTANCE.getDefinition_OwnedState(), colorProvider, this.nameGenerator));
diagramElementDescriptionProviders
.add(new StateTransitionCompartmentNodeDescriptionProvider(SysmlPackage.eINSTANCE.getStateUsage(), SysmlPackage.eINSTANCE.getUsage_NestedState(), colorProvider, this.nameGenerator));

DEFINITIONS.forEach(definition -> {
diagramElementDescriptionProviders.add(new CompositeStateDefinitionNodeDescriptionProvider(definition, colorProvider));
diagramElementDescriptionProviders.add(new DefinitionNodeDescriptionProvider(definition, colorProvider));
});

USAGES.forEach(usage -> {
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
/*******************************************************************************
* Copyright (c) 2024 Obeo.
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Obeo - initial API and implementation
*******************************************************************************/
package org.eclipse.syson.diagram.statetransition.view.nodes;

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

import org.eclipse.emf.ecore.EClass;
import org.eclipse.sirius.components.view.builder.IViewDiagramElementFinder;
import org.eclipse.sirius.components.view.builder.providers.IColorProvider;
import org.eclipse.sirius.components.view.diagram.NodeDescription;
import org.eclipse.sirius.components.view.diagram.NodeToolSection;
import org.eclipse.syson.diagram.common.view.nodes.AbstractDefinitionNodeDescriptionProvider;
import org.eclipse.syson.diagram.statetransition.view.STVDescriptionNameGenerator;
import org.eclipse.syson.diagram.statetransition.view.StateTransitionViewDiagramDescriptionProvider;
import org.eclipse.syson.diagram.statetransition.view.services.StateTransitionViewNodeToolSectionSwitch;
import org.eclipse.syson.sysml.SysmlPackage;

/**
* Node description provider for all SysMLv2 Definitions elements in the State Transition View diagram.
*
* @author gdaniel
*/
public class DefinitionNodeDescriptionProvider extends AbstractDefinitionNodeDescriptionProvider {

public DefinitionNodeDescriptionProvider(EClass eClass, IColorProvider colorProvider) {
super(eClass, colorProvider, new STVDescriptionNameGenerator());
}

@Override
protected List<NodeDescription> getReusedChildren(IViewDiagramElementFinder cache) {
var reusedChildren = new ArrayList<NodeDescription>();

StateTransitionViewDiagramDescriptionProvider.COMPARTMENTS_WITH_LIST_ITEMS.forEach((type, listItems) -> {
if (type.equals(this.eClass)) {
listItems.forEach(eReference -> {
cache.getNodeDescription(this.nameGenerator.getCompartmentName(type, eReference)).ifPresent(reusedChildren::add);
});
}
});
if (this.eClass.equals(SysmlPackage.eINSTANCE.getStateDefinition())) {
cache.getNodeDescription(this.nameGenerator.getFreeFormCompartmentName(this.eClass, SysmlPackage.eINSTANCE.getDefinition_OwnedState())).ifPresent(reusedChildren::add);
}
return reusedChildren;
}

@Override
protected List<NodeDescription> getAllNodeDescriptions(IViewDiagramElementFinder cache) {
var allNodes = new ArrayList<NodeDescription>();

StateTransitionViewDiagramDescriptionProvider.DEFINITIONS.forEach(definition -> cache.getNodeDescription(this.nameGenerator.getNodeName(definition)).ifPresent(allNodes::add));
StateTransitionViewDiagramDescriptionProvider.USAGES.forEach(usage -> cache.getNodeDescription(this.nameGenerator.getNodeName(usage)).ifPresent(allNodes::add));
cache.getNodeDescription(this.nameGenerator.getNodeName(SysmlPackage.eINSTANCE.getPackage())).ifPresent(allNodes::add);
return allNodes;
}

@Override
protected List<NodeToolSection> getToolSections(NodeDescription nodeDescription, IViewDiagramElementFinder cache) {
StateTransitionViewNodeToolSectionSwitch toolSectionSwitch = new StateTransitionViewNodeToolSectionSwitch();
toolSectionSwitch.doSwitch(this.eClass);
return toolSectionSwitch.getNodeToolSections();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import org.eclipse.syson.diagram.common.view.nodes.AbstractFakeNodeDescriptionProvider;
import org.eclipse.syson.diagram.statetransition.view.STVDescriptionNameGenerator;
import org.eclipse.syson.diagram.statetransition.view.StateTransitionViewDiagramDescriptionProvider;
import org.eclipse.syson.sysml.SysmlPackage;

/**
* Fake Node Description allowing to store other Node Descriptions that will be reused by other Node Descriptions.
Expand All @@ -47,6 +48,11 @@ protected List<NodeDescription> getChildrenDescription(IViewDiagramElementFinder
StateTransitionViewDiagramDescriptionProvider.COMPARTMENTS_WITH_LIST_ITEMS.forEach((type, listItems) -> {
listItems.forEach(eReference -> cache.getNodeDescription(nameGenerator.getCompartmentName(type, eReference)).ifPresent(childrenNodes::add));
});

// don't forget to add custom compartments
cache.getNodeDescription(nameGenerator.getFreeFormCompartmentName(SysmlPackage.eINSTANCE.getStateDefinition(), SysmlPackage.eINSTANCE.getDefinition_OwnedState()))
.ifPresent(childrenNodes::add);
cache.getNodeDescription(nameGenerator.getFreeFormCompartmentName(SysmlPackage.eINSTANCE.getStateUsage(), SysmlPackage.eINSTANCE.getUsage_NestedState())).ifPresent(childrenNodes::add);
return childrenNodes;
}
}
Loading

0 comments on commit b328cba

Please sign in to comment.