Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ Disabling the _Hide expression internals_ filter in the _Explorer_ view allows t
- https://github.com/eclipse-syson/syson/issues/2231[#2231] [diagrams] Add a new tool to create a _frame_ `ConcernUsage` from `RequirementUsage` and `RequirementDefinition` graphical nodes.
- https://github.com/eclipse-syson/syson/issues/2231[#2231] [diagrams] Add the support for the _frames_ compartment graphical node in `RequirementUsage` and `RequirementDefinition` graphical nodes.
- https://github.com/eclipse-syson/syson/issues/2235[#2235] [diagrams] Leverage the selection dialog to improve the graphical node tool creating a _frame_ `ConcernUsage` from `RequirementUsage` and `RequirementDefinition` graphical nodes.
- https://github.com/eclipse-syson/syson/issues/2247[#2247] [diagrams] Add the support for creating _timeslices/snapshots_ from the different kind of `OccurrenceDefiniton` graphical nodes.
It leverages the selection dialog to either create an _occurrence timeslice/snapshot_, or the _usage timeslice/snapshot_ matching the `OccurrenceDefinition` on which the tool is applied.

== v2026.5.0

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -152,11 +152,15 @@ private static Stream<Arguments> portionKingNodeParameters() {

private static Stream<Arguments> portionKindSelectionDialogTreeParameters() {
return Stream.of(
Arguments.of(SysmlPackage.eINSTANCE.getAllocationUsage(), GeneralViewWithTopNodesTestProjectData.GraphicalIds.ALLOCATION_USAGE_ID, GeneralViewWithTopNodesTestProjectData.SemanticIds.ALLOCATION_USAGE_ID),
Arguments.of(SysmlPackage.eINSTANCE.getInterfaceUsage(), GeneralViewWithTopNodesTestProjectData.GraphicalIds.INTERFACE_USAGE_ID, GeneralViewWithTopNodesTestProjectData.SemanticIds.INTERFACE_USAGE_ID),
Arguments.of(SysmlPackage.eINSTANCE.getItemUsage(), GeneralViewWithTopNodesTestProjectData.GraphicalIds.ITEM_USAGE_ID, GeneralViewWithTopNodesTestProjectData.SemanticIds.ITEM_USAGE_ID),
Arguments.of(SysmlPackage.eINSTANCE.getOccurrenceUsage(), GeneralViewWithTopNodesTestProjectData.GraphicalIds.OCCURRENCE_USAGE_ID, GeneralViewWithTopNodesTestProjectData.SemanticIds.OCCURRENCE_USAGE_ID),
Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), GeneralViewWithTopNodesTestProjectData.GraphicalIds.PART_USAGE_ID, GeneralViewWithTopNodesTestProjectData.SemanticIds.PART_USAGE_ID)
Arguments.of(SysmlPackage.eINSTANCE.getAllocationDefinition(), SysmlPackage.eINSTANCE.getAllocationUsage(), GeneralViewWithTopNodesTestProjectData.GraphicalIds.ALLOCATION_DEFINITION_ID, GeneralViewWithTopNodesTestProjectData.SemanticIds.ALLOCATION_DEFINITION_ID),
Arguments.of(SysmlPackage.eINSTANCE.getAllocationUsage(), SysmlPackage.eINSTANCE.getAllocationUsage(), GeneralViewWithTopNodesTestProjectData.GraphicalIds.ALLOCATION_USAGE_ID, GeneralViewWithTopNodesTestProjectData.SemanticIds.ALLOCATION_USAGE_ID),
Arguments.of(SysmlPackage.eINSTANCE.getInterfaceUsage(), SysmlPackage.eINSTANCE.getInterfaceUsage(), GeneralViewWithTopNodesTestProjectData.GraphicalIds.INTERFACE_USAGE_ID, GeneralViewWithTopNodesTestProjectData.SemanticIds.INTERFACE_USAGE_ID),
Arguments.of(SysmlPackage.eINSTANCE.getItemDefinition(), SysmlPackage.eINSTANCE.getItemUsage(), GeneralViewWithTopNodesTestProjectData.GraphicalIds.ITEM_DEFINITION_ID, GeneralViewWithTopNodesTestProjectData.SemanticIds.ITEM_DEFINITION_ID),
Arguments.of(SysmlPackage.eINSTANCE.getItemUsage(), SysmlPackage.eINSTANCE.getItemUsage(), GeneralViewWithTopNodesTestProjectData.GraphicalIds.ITEM_USAGE_ID, GeneralViewWithTopNodesTestProjectData.SemanticIds.ITEM_USAGE_ID),
Arguments.of(SysmlPackage.eINSTANCE.getOccurrenceDefinition(), SysmlPackage.eINSTANCE.getOccurrenceUsage(), GeneralViewWithTopNodesTestProjectData.GraphicalIds.OCCURRENCE_DEFINITION_ID, GeneralViewWithTopNodesTestProjectData.SemanticIds.OCCURRENCE_DEFINITION_ID),
Arguments.of(SysmlPackage.eINSTANCE.getOccurrenceUsage(), SysmlPackage.eINSTANCE.getOccurrenceUsage(), GeneralViewWithTopNodesTestProjectData.GraphicalIds.OCCURRENCE_USAGE_ID, GeneralViewWithTopNodesTestProjectData.SemanticIds.OCCURRENCE_USAGE_ID),
Arguments.of(SysmlPackage.eINSTANCE.getPartDefinition(), SysmlPackage.eINSTANCE.getPartUsage(), GeneralViewWithTopNodesTestProjectData.GraphicalIds.PART_DEFINITION_ID, GeneralViewWithTopNodesTestProjectData.SemanticIds.PART_DEFINITION_ID),
Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), SysmlPackage.eINSTANCE.getPartUsage(), GeneralViewWithTopNodesTestProjectData.GraphicalIds.PART_USAGE_ID, GeneralViewWithTopNodesTestProjectData.SemanticIds.PART_USAGE_ID)
).map(TestNameGenerator::namedArguments);
};

Expand Down Expand Up @@ -251,7 +255,7 @@ public void createSnapshotNodeOn(EClass parentEClass, String parentTargetObjectI

@ParameterizedTest
@MethodSource("portionKindSelectionDialogTreeParameters")
public void testCheckAvailableElementsInTimesliceSelectionDialog(EClass elementClass, String graphicalId, String semanticId) {
public void testCheckAvailableElementsInTimesliceSelectionDialog(EClass elementClass, EClass expectedTimesliceEClass, String graphicalId, String semanticId) {
var diagramDescription = this.givenDiagramDescription.getDiagramDescription(GeneralViewWithTopNodesTestProjectData.EDITING_CONTEXT_ID,
SysONRepresentationDescriptionIdentifiers.GENERAL_VIEW_DIAGRAM_DESCRIPTION_ID);
var diagramDescriptionIdProvider = new DiagramDescriptionIdProvider(diagramDescription, this.diagramIdProvider);
Expand All @@ -264,7 +268,7 @@ public void testCheckAvailableElementsInTimesliceSelectionDialog(EClass elementC
Consumer<Object> initialTreeContentConsumer = assertRefreshedTreeThat(tree -> {
assertThat(tree).isNotNull();
assertThat(tree.getChildren()).size().isEqualTo(1);
assertThat(tree.getChildren().getFirst().getId()).isEqualTo(identityService.getId(elementClass));
assertThat(tree.getChildren().getFirst().getId()).isEqualTo(identityService.getId(expectedTimesliceEClass));
});

StepVerifier.create(flux)
Expand All @@ -275,7 +279,7 @@ public void testCheckAvailableElementsInTimesliceSelectionDialog(EClass elementC

@ParameterizedTest
@MethodSource("portionKindSelectionDialogTreeParameters")
public void testCheckAvailableElementsInSnapshotSelectionDialog(EClass elementClass, String graphicalId, String semanticId) {
public void testCheckAvailableElementsInSnapshotSelectionDialog(EClass elementClass, EClass expectedSnapshotEClass, String graphicalId, String semanticId) {
var diagramDescription = this.givenDiagramDescription.getDiagramDescription(GeneralViewWithTopNodesTestProjectData.EDITING_CONTEXT_ID,
SysONRepresentationDescriptionIdentifiers.GENERAL_VIEW_DIAGRAM_DESCRIPTION_ID);
var diagramDescriptionIdProvider = new DiagramDescriptionIdProvider(diagramDescription, this.diagramIdProvider);
Expand All @@ -288,7 +292,7 @@ public void testCheckAvailableElementsInSnapshotSelectionDialog(EClass elementCl
Consumer<Object> initialTreeContentConsumer = assertRefreshedTreeThat(tree -> {
assertThat(tree).isNotNull();
assertThat(tree.getChildren()).size().isEqualTo(1);
assertThat(tree.getChildren().getFirst().getId()).isEqualTo(identityService.getId(elementClass));
assertThat(tree.getChildren().getFirst().getId()).isEqualTo(identityService.getId(expectedSnapshotEClass));
});

StepVerifier.create(flux)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ public static class GraphicalIds {

public static final String ACTION_USAGE_ID = "61aaf64a-4fbc-356e-ba73-4bd47b386989";

public static final String ALLOCATION_DEFINITION_ID = "304ed5e0-b3e2-3399-b110-8836d4b27127";

public static final String ALLOCATION_USAGE_ID = "361506fb-2a1d-3edc-be2d-8cd60a235f53";

public static final String ATTRIBUTE_USAGE_ID = "7b8e6835-c563-35cd-8991-e2f894fc2139";
Expand All @@ -50,6 +52,8 @@ public static class GraphicalIds {

public static final String PART_USAGE_ID = "4c4fe0d5-4974-377e-9113-9ab022c75f8c";

public static final String OCCURRENCE_DEFINITION_ID = "af3a9437-85c6-3bce-a62e-20aa80f277f4";

public static final String OCCURRENCE_USAGE_ID = "47653014-87d1-3dc6-856b-72454aa93154";

public static final String REQUIREMENT_DEFINITION_ID = "b83f2b54-1602-382d-beb1-c500e08a8684";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
import org.eclipse.syson.sysml.Documentation;
import org.eclipse.syson.sysml.Element;
import org.eclipse.syson.sysml.Membership;
import org.eclipse.syson.sysml.OccurrenceUsage;
import org.eclipse.syson.sysml.PartUsage;
import org.eclipse.syson.sysml.RequirementUsage;
import org.eclipse.syson.sysml.Type;
Expand Down Expand Up @@ -95,9 +94,9 @@ public Element createSatisfyRequirement(Element self, Element selectedObject) {
}

/**
* {@link MetamodelMutationElementService#createOccurrenceInOccurrence(OccurrenceUsage, EClass)}.
* {@link MetamodelMutationElementService#createOccurrenceInOccurrence(Type, EClass)}.
*/
public EObject createOccurrenceInOccurrence(OccurrenceUsage container, EClass eClass) {
public EObject createOccurrenceInOccurrence(Type container, EClass eClass) {
return this.metamodelElementMutationService.createOccurrenceInOccurrence(container, eClass);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,35 +35,49 @@
import org.eclipse.syson.sysml.AcceptActionUsage;
import org.eclipse.syson.sysml.ActionDefinition;
import org.eclipse.syson.sysml.ActionUsage;
import org.eclipse.syson.sysml.AllocationDefinition;
import org.eclipse.syson.sysml.AllocationUsage;
import org.eclipse.syson.sysml.AnalysisCaseDefinition;
import org.eclipse.syson.sysml.AnnotatingElement;
import org.eclipse.syson.sysml.CalculationDefinition;
import org.eclipse.syson.sysml.CaseDefinition;
import org.eclipse.syson.sysml.Classifier;
import org.eclipse.syson.sysml.ConcernDefinition;
import org.eclipse.syson.sysml.ConjugatedPortTyping;
import org.eclipse.syson.sysml.ConnectionDefinition;
import org.eclipse.syson.sysml.ConnectionUsage;
import org.eclipse.syson.sysml.ConstraintDefinition;
import org.eclipse.syson.sysml.Definition;
import org.eclipse.syson.sysml.Element;
import org.eclipse.syson.sysml.ExhibitStateUsage;
import org.eclipse.syson.sysml.Feature;
import org.eclipse.syson.sysml.FeatureDirectionKind;
import org.eclipse.syson.sysml.FeatureTyping;
import org.eclipse.syson.sysml.FeatureValue;
import org.eclipse.syson.sysml.FlowDefinition;
import org.eclipse.syson.sysml.FlowUsage;
import org.eclipse.syson.sysml.InterfaceDefinition;
import org.eclipse.syson.sysml.InterfaceUsage;
import org.eclipse.syson.sysml.ItemDefinition;
import org.eclipse.syson.sysml.LibraryPackage;
import org.eclipse.syson.sysml.Membership;
import org.eclipse.syson.sysml.Namespace;
import org.eclipse.syson.sysml.NamespaceImport;
import org.eclipse.syson.sysml.ObjectiveMembership;
import org.eclipse.syson.sysml.OccurrenceDefinition;
import org.eclipse.syson.sysml.Package;
import org.eclipse.syson.sysml.PartDefinition;
import org.eclipse.syson.sysml.PartUsage;
import org.eclipse.syson.sysml.PerformActionUsage;
import org.eclipse.syson.sysml.PortDefinition;
import org.eclipse.syson.sysml.PortUsage;
import org.eclipse.syson.sysml.Redefinition;
import org.eclipse.syson.sysml.ReferenceSubsetting;
import org.eclipse.syson.sysml.ReferenceUsage;
import org.eclipse.syson.sysml.Relationship;
import org.eclipse.syson.sysml.RenderingDefinition;
import org.eclipse.syson.sysml.RenderingUsage;
import org.eclipse.syson.sysml.RequirementDefinition;
import org.eclipse.syson.sysml.StateDefinition;
import org.eclipse.syson.sysml.StateSubactionKind;
import org.eclipse.syson.sysml.StateUsage;
Expand All @@ -79,8 +93,10 @@
import org.eclipse.syson.sysml.Usage;
import org.eclipse.syson.sysml.UseCaseDefinition;
import org.eclipse.syson.sysml.UseCaseUsage;
import org.eclipse.syson.sysml.VerificationCaseDefinition;
import org.eclipse.syson.sysml.ViewDefinition;
import org.eclipse.syson.sysml.ViewUsage;
import org.eclipse.syson.sysml.ViewpointDefinition;
import org.eclipse.syson.sysml.metamodel.helper.EMFUtils;
import org.eclipse.syson.sysml.metamodel.helper.NameHelper;
import org.eclipse.syson.sysml.metamodel.services.ElementInitializerSwitch;
Expand Down Expand Up @@ -872,6 +888,39 @@ public EClass getPartDefinitionEClassFrom(PartUsage partUsage) {
return result;
}

/**
* Return the {@code Usage} {@link EClass} corresponding to the given {@link OccurrenceDefinition}.
*
* @param occurrenceDefinition
* the occurrence definition
* @return the {@code Usage} {@link EClass} corresponding to the given {@link OccurrenceDefinition}
*/
public EClass getOccurrenceUsageFromOccurrenceDefinition(OccurrenceDefinition occurrenceDefinition) {
return switch (occurrenceDefinition) {
case VerificationCaseDefinition v -> SysmlPackage.eINSTANCE.getVerificationCaseUsage();
case UseCaseDefinition u -> SysmlPackage.eINSTANCE.getUseCaseUsage();
case AnalysisCaseDefinition a -> SysmlPackage.eINSTANCE.getAnalysisCaseUsage();
case CaseDefinition c -> SysmlPackage.eINSTANCE.getCaseUsage();
case CalculationDefinition c -> SysmlPackage.eINSTANCE.getCalculationUsage();
case FlowDefinition f -> SysmlPackage.eINSTANCE.getFlowUsage();
case StateDefinition s -> SysmlPackage.eINSTANCE.getStateUsage();
case ConcernDefinition c -> SysmlPackage.eINSTANCE.getConcernUsage();
case ViewpointDefinition v -> SysmlPackage.eINSTANCE.getViewpointUsage();
case RequirementDefinition r -> SysmlPackage.eINSTANCE.getRequirementUsage();
case AllocationDefinition a -> SysmlPackage.eINSTANCE.getAllocationUsage();
case InterfaceDefinition i -> SysmlPackage.eINSTANCE.getInterfaceUsage();
case ConnectionDefinition c -> SysmlPackage.eINSTANCE.getConnectionUsage();
case RenderingDefinition r -> SysmlPackage.eINSTANCE.getRenderingUsage();
case ViewDefinition v -> SysmlPackage.eINSTANCE.getViewUsage();
case PartDefinition p -> SysmlPackage.eINSTANCE.getPartUsage();
case ActionDefinition a -> SysmlPackage.eINSTANCE.getActionUsage();
case ConstraintDefinition c -> SysmlPackage.eINSTANCE.getConstraintUsage();
case ItemDefinition i -> SysmlPackage.eINSTANCE.getItemUsage();
case PortDefinition p -> SysmlPackage.eINSTANCE.getPortUsage();
default -> SysmlPackage.eINSTANCE.getOccurrenceUsage();
};
}

public boolean isInFeature(Feature feature) {
return FeatureDirectionKind.IN.equals(feature.getDirection());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
import org.eclipse.syson.sysml.InterfaceUsage;
import org.eclipse.syson.sysml.Membership;
import org.eclipse.syson.sysml.Namespace;
import org.eclipse.syson.sysml.OccurrenceDefinition;
import org.eclipse.syson.sysml.OccurrenceUsage;
import org.eclipse.syson.sysml.Package;
import org.eclipse.syson.sysml.PortUsage;
Expand Down Expand Up @@ -212,17 +213,17 @@ public InterfaceUsage createInterfaceUsage(PortUsage source, PortUsage target, E
}

/**
* Creates an instance of {@code eClass} in the given {@link OccurrenceUsage} container.
* <p>It returns {@code null} if the {@code eClass} is not assignable to {@link OccurrenceUsage}</p>
* Creates an instance of {@code eClass} in the given {@link Type} container if it is an {@link OccurrenceUsage} or an {@link OccurrenceDefinition}.
* <p>It returns {@code null} if the {@code eClass} is not assignable to {@link OccurrenceUsage} or the {@code container} is not assignable to either @link OccurrenceUsage} or {@link OccurrenceDefinition}</p>
*
* @param container
* the {@link OccurrenceUsage} container
* the {@link Type} container
* @param eClass
* the {@link EClass} assignable to {@link OccurrenceUsage} to instantiate
* @return a new {@link EClass} instantiated {@link EObject}, {@code null} if the {@code eClass} is not assignable to {@link OccurrenceUsage}
* @return a new {@link EClass} instantiated {@link EObject}, {@code null} if the {@code eClass} is not assignable to {@link OccurrenceUsage} and the {@code container} is not assignable to either {@link OccurrenceUsage} or {@link OccurrenceDefinition}
*/
public EObject createOccurrenceInOccurrence(OccurrenceUsage container, EClass eClass) {
if (SysmlPackage.eINSTANCE.getOccurrenceUsage().isSuperTypeOf(eClass)) {
public EObject createOccurrenceInOccurrence(Type container, EClass eClass) {
if ((container instanceof OccurrenceUsage || container instanceof OccurrenceDefinition) && SysmlPackage.eINSTANCE.getOccurrenceUsage().isSuperTypeOf(eClass)) {
var membership = SysmlFactory.eINSTANCE.createFeatureMembership();
var timeSlice = (OccurrenceUsage) SysmlFactory.eINSTANCE.create(eClass);
membership.getOwnedRelatedElement().add(timeSlice);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ private DialogDescription getDescriptionDialog() {

private SelectionDialogTreeDescription getDialogTreeDescriptionDialog() {
return this.diagramBuilderHelper.newSelectionDialogTreeDescription()
.elementsExpression(AQLConstants.AQL_SELF + ".eClass()")
.elementsExpression(AQLConstants.AQL + "if self.oclIsKindOf(sysml::OccurrenceUsage) then self.eClass() else self.getOccurrenceUsageFromOccurrenceDefinition() endif")
.isSelectableExpression(AQLConstants.AQL_TRUE)
.build();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ private DialogDescription getDescriptionDialog() {

private SelectionDialogTreeDescription getDialogTreeDescriptionDialog() {
return this.diagramBuilderHelper.newSelectionDialogTreeDescription()
.elementsExpression(AQLConstants.AQL_SELF + ".eClass()")
.elementsExpression(AQLConstants.AQL + "if self.oclIsKindOf(sysml::OccurrenceUsage) then self.eClass() else self.getOccurrenceUsageFromOccurrenceDefinition() endif")
.isSelectableExpression(AQLConstants.AQL_TRUE)
.build();
}
Expand Down
Loading
Loading