Skip to content
Merged
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
1 change: 1 addition & 0 deletions CHANGELOG.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ Integration tests that require Elasticsearch now need to extend `AbstractIntegra

=== New features

- https://github.com/eclipse-syson/syson/issues/1977[#1977] [diagram] Display the _timeslice_ and _snapshot_ prefixes in the label of `OccurrenceUsage` graphical nodes and some of the graphical nodes representing subclasses of `OccurrenceUsage`.

== v2026.1.0

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ public String caseElement(Element object) {
public String caseAcceptActionUsage(AcceptActionUsage object) {
StringBuilder label = new StringBuilder();
label
.append(this.getBasicNamePrefix(object))
.append(this.getOccurrenceUsagePrefix(object))
.append(LabelConstants.OPEN_QUOTE)
.append(this.reference(object))
.append("accept action")
Expand Down Expand Up @@ -139,7 +139,7 @@ public String caseActionDefinition(ActionDefinition object) {
public String caseActionUsage(ActionUsage object) {
StringBuilder label = new StringBuilder();
label
.append(this.getBasicNamePrefix(object))
.append(this.getOccurrenceUsagePrefix(object))
.append(LabelConstants.OPEN_QUOTE)
.append(this.reference(object))
.append("action")
Expand Down Expand Up @@ -173,7 +173,7 @@ public String caseAllocationDefinition(AllocationDefinition object) {
public String caseAllocationUsage(AllocationUsage object) {
StringBuilder label = new StringBuilder();
label
.append(this.getBasicNamePrefix(object))
.append(this.getOccurrenceUsagePrefix(object))
.append(LabelConstants.OPEN_QUOTE)
.append(this.reference(object))
.append("allocation")
Expand Down Expand Up @@ -226,7 +226,7 @@ public String caseAttributeUsage(AttributeUsage object) {
public String caseAssignmentActionUsage(AssignmentActionUsage object) {
StringBuilder label = new StringBuilder();
label
.append(this.getBasicNamePrefix(object))
.append(this.getOccurrenceUsagePrefix(object))
.append(LabelConstants.OPEN_QUOTE)
.append(this.reference(object))
.append("assign")
Expand Down Expand Up @@ -254,7 +254,7 @@ public String caseCaseDefinition(CaseDefinition object) {
public String caseCaseUsage(CaseUsage object) {
StringBuilder label = new StringBuilder();
label
.append(this.getBasicNamePrefix(object))
.append(this.getOccurrenceUsagePrefix(object))
.append(LabelConstants.OPEN_QUOTE)
.append(this.reference(object))
.append("case")
Expand Down Expand Up @@ -311,7 +311,7 @@ public String caseConcernDefinition(ConcernDefinition object) {
public String caseConcernUsage(ConcernUsage object) {
StringBuilder label = new StringBuilder();
label
.append(this.getBasicNamePrefix(object))
.append(this.getOccurrenceUsagePrefix(object))
.append(LabelConstants.OPEN_QUOTE)
.append(this.reference(object))
.append("concern")
Expand Down Expand Up @@ -345,7 +345,7 @@ public String caseConstraintDefinition(ConstraintDefinition object) {
public String caseConstraintUsage(ConstraintUsage object) {
StringBuilder label = new StringBuilder();
label
.append(this.getBasicNamePrefix(object))
.append(this.getOccurrenceUsagePrefix(object))
.append(LabelConstants.OPEN_QUOTE)
.append(this.reference(object))
.append("constraint")
Expand Down Expand Up @@ -434,7 +434,7 @@ public String caseEnumerationDefinition(EnumerationDefinition object) {
public String caseExhibitStateUsage(ExhibitStateUsage object) {
StringBuilder label = new StringBuilder();
label
.append(this.getBasicNamePrefix(object))
.append(this.getOccurrenceUsagePrefix(object))
.append(this.getIsParallel(object.isIsParallel()))
.append(LabelConstants.OPEN_QUOTE)
.append(this.reference(object))
Expand Down Expand Up @@ -469,7 +469,7 @@ public String caseInterfaceDefinition(InterfaceDefinition object) {
public String caseInterfaceUsage(InterfaceUsage object) {
StringBuilder label = new StringBuilder();
label
.append(this.getBasicNamePrefix(object))
.append(this.getOccurrenceUsagePrefix(object))
.append(LabelConstants.OPEN_QUOTE)
.append(this.reference(object))
.append("interface")
Expand Down Expand Up @@ -519,7 +519,7 @@ public String caseNamespaceImport(NamespaceImport object) {
public String caseItemUsage(ItemUsage object) {
StringBuilder label = new StringBuilder();
label
.append(this.getBasicNamePrefix(object))
.append(this.getOccurrenceUsagePrefix(object))
.append(LabelConstants.OPEN_QUOTE)
.append(this.reference(object))
.append("item")
Expand Down Expand Up @@ -568,8 +568,7 @@ public String caseOccurrenceDefinition(OccurrenceDefinition object) {
public String caseOccurrenceUsage(OccurrenceUsage object) {
StringBuilder label = new StringBuilder();
label
.append(this.getBasicNamePrefix(object))
.append(this.individual(object))
.append(this.getOccurrenceUsagePrefix(object))
.append(LabelConstants.OPEN_QUOTE)
.append(this.reference(object))
.append("occurrence")
Expand Down Expand Up @@ -612,7 +611,7 @@ public String casePartUsage(PartUsage object) {
if (!(object.getOwningMembership() instanceof ActorMembership)) {
// The label shouldn't contain abstract, ref, or part if the part represents an actor.
label
.append(this.getBasicNamePrefix(object))
.append(this.getOccurrenceUsagePrefix(object))
.append(LabelConstants.OPEN_QUOTE)
.append(this.reference(object))
.append("part")
Expand All @@ -634,7 +633,7 @@ public String casePartUsage(PartUsage object) {
public String casePerformActionUsage(PerformActionUsage object) {
StringBuilder label = new StringBuilder();
label
.append(this.getBasicNamePrefix(object))
.append(this.getOccurrenceUsagePrefix(object))
.append(LabelConstants.OPEN_QUOTE)
.append(this.reference(object))
.append(this.getPerformActionUsageTag(object))
Expand Down Expand Up @@ -666,7 +665,7 @@ public String casePortDefinition(PortDefinition object) {
public String casePortUsage(PortUsage object) {
StringBuilder label = new StringBuilder();
label
.append(this.getBasicNamePrefix(object))
.append(this.getOccurrenceUsagePrefix(object))
.append(LabelConstants.OPEN_QUOTE)
.append(this.reference(object))
.append("port")
Expand Down Expand Up @@ -732,7 +731,7 @@ public String caseRequirementDefinition(RequirementDefinition object) {
public String caseRequirementUsage(RequirementUsage object) {
StringBuilder label = new StringBuilder();
label
.append(this.getBasicNamePrefix(object))
.append(this.getOccurrenceUsagePrefix(object))
.append(LabelConstants.OPEN_QUOTE)
.append(this.reference(object))
.append("requirement")
Expand All @@ -752,7 +751,7 @@ public String caseRequirementUsage(RequirementUsage object) {
public String caseSatisfyRequirementUsage(SatisfyRequirementUsage object) {
StringBuilder label = new StringBuilder();
label
.append(this.getBasicNamePrefix(object))
.append(this.getOccurrenceUsagePrefix(object))
.append(LabelConstants.OPEN_QUOTE)
.append(this.reference(object))
.append("satisfy requirement")
Expand Down Expand Up @@ -786,7 +785,7 @@ public String caseUseCaseDefinition(UseCaseDefinition object) {
public String caseUseCaseUsage(UseCaseUsage object) {
StringBuilder label = new StringBuilder();
label
.append(this.getBasicNamePrefix(object))
.append(this.getOccurrenceUsagePrefix(object))
.append(LabelConstants.OPEN_QUOTE)
.append(this.reference(object))
.append("use case")
Expand Down Expand Up @@ -821,7 +820,7 @@ public String caseStateDefinition(StateDefinition object) {
public String caseStateUsage(StateUsage object) {
StringBuilder label = new StringBuilder();
label
.append(this.getBasicNamePrefix(object))
.append(this.getOccurrenceUsagePrefix(object))
.append(this.getIsParallel(object.isIsParallel()))
.append(LabelConstants.OPEN_QUOTE)
.append(this.reference(object))
Expand All @@ -842,7 +841,7 @@ public String caseStateUsage(StateUsage object) {
public String caseViewUsage(ViewUsage object) {
StringBuilder label = new StringBuilder();
label
.append(this.getBasicNamePrefix(object))
.append(this.getOccurrenceUsagePrefix(object))
.append(LabelConstants.OPEN_QUOTE)
.append(this.reference(object))
.append("view")
Expand Down Expand Up @@ -871,6 +870,14 @@ private StringBuilder getIsParallel(boolean isParallel) {
return parallel;
}

private String getOccurrenceUsagePrefix(OccurrenceUsage occurrenceUsage) {
return new StringBuilder()
.append(this.getBasicNamePrefix(occurrenceUsage))
.append(this.individual(occurrenceUsage))
.append(this.portionKind(occurrenceUsage))
.toString();
}

private String getBasicNamePrefix(Type object) {
StringBuilder label = new StringBuilder();
if (object instanceof Usage usage) {
Expand Down Expand Up @@ -1004,6 +1011,18 @@ private String individual(boolean isIndividual) {
return label.toString();
}

private String portionKind(OccurrenceUsage occurrenceUsage) {
StringBuilder label = new StringBuilder();
if (occurrenceUsage.isSetPortionKind()) {
label
.append(LabelConstants.OPEN_QUOTE)
.append(occurrenceUsage.getPortionKind().getName())
.append(LabelConstants.CLOSE_QUOTE)
.append(LabelConstants.CR);
}
return label.toString();
}

private String assignmentActionUsageDetails(AssignmentActionUsage aau) {
StringBuilder label = new StringBuilder();
if (aau.getReferent() != null) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2024, 2025 Obeo.
* Copyright (c) 2024, 2026 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
Expand All @@ -26,6 +26,8 @@
import org.eclipse.syson.sysml.Definition;
import org.eclipse.syson.sysml.Element;
import org.eclipse.syson.sysml.FeatureMembership;
import org.eclipse.syson.sysml.OccurrenceUsage;
import org.eclipse.syson.sysml.PortionKind;
import org.eclipse.syson.sysml.SysmlFactory;
import org.eclipse.syson.sysml.SysmlPackage;
import org.eclipse.syson.sysml.Type;
Expand Down Expand Up @@ -63,6 +65,8 @@ public class MultilineLabelSwitchTest {

private static final String DEFAULT_ASSIGNMENT_ACTION_USAGE_LABEL = LabelConstants.OPEN_QUOTE + REF_ATTRIBUTE_LABEL + "assign" + LabelConstants.CLOSE_QUOTE + LabelConstants.CR;

private static final String DEFAULT_CASE_USAGE_LABEL = LabelConstants.OPEN_QUOTE + REF_ATTRIBUTE_LABEL + "case" + LabelConstants.CLOSE_QUOTE + LabelConstants.CR;

private static final String DEFAULT_COMMENT_LABEL = LabelConstants.OPEN_QUOTE + "comment" + LabelConstants.CLOSE_QUOTE + LabelConstants.CR;

private static final String DEFAULT_CONCERN_DEFINITION_LABEL = LabelConstants.OPEN_QUOTE + "concern def" + LabelConstants.CLOSE_QUOTE + LabelConstants.CR;
Expand Down Expand Up @@ -113,6 +117,8 @@ public class MultilineLabelSwitchTest {

private static final String DEFAULT_USE_CASE_USAGE_LABEL = LabelConstants.OPEN_QUOTE + REF_ATTRIBUTE_LABEL + "use case" + LabelConstants.CLOSE_QUOTE + LabelConstants.CR;

private static final String DEFAULT_VIEW_USAGE_LABEL = LabelConstants.OPEN_QUOTE + REF_ATTRIBUTE_LABEL + "view" + LabelConstants.CLOSE_QUOTE + LabelConstants.SPACE;

private static final String DEFAULT_STATE_DEFINITION_LABEL = LabelConstants.OPEN_QUOTE + "state def" + LabelConstants.CLOSE_QUOTE + LabelConstants.CR;

private static final String DEFAULT_STATE_USAGE_LABEL = LabelConstants.OPEN_QUOTE + REF_ATTRIBUTE_LABEL + "state" + LabelConstants.CLOSE_QUOTE + LabelConstants.CR;
Expand Down Expand Up @@ -203,6 +209,28 @@ private static Stream<Arguments> prefixParameterProvider() {
);
}

private static Stream<Arguments> timesliceSnapshotPrefixParameterProvider() {
return Stream.of(
Arguments.of(SYSML.getOccurrenceUsage(), DEFAULT_OCCURRENCE_USAGE_LABEL),
Arguments.of(SYSML.getActionUsage(), DEFAULT_ACTION_LABEL),
Arguments.of(SYSML.getAcceptActionUsage(), DEFAULT_ACCEPT_ACTION_LABEL),
Arguments.of(SYSML.getAssignmentActionUsage(), DEFAULT_ASSIGNMENT_ACTION_USAGE_LABEL),
Arguments.of(SYSML.getCaseUsage(), DEFAULT_CASE_USAGE_LABEL),
Arguments.of(SYSML.getUseCaseUsage(), DEFAULT_USE_CASE_USAGE_LABEL),
Arguments.of(SYSML.getPerformActionUsage(), DEFAULT_PERFORM_ACTION_USAGE_LABEL),
Arguments.of(SYSML.getExhibitStateUsage(), DEFAULT_EXHIBIT_STATE_USAGE_LABEL),
Arguments.of(SYSML.getStateUsage(), DEFAULT_STATE_USAGE_LABEL),
Arguments.of(SYSML.getConstraintUsage(), DEFAULT_CONSTRAINT_USAGE_LABEL),
Arguments.of(SYSML.getSatisfyRequirementUsage(), DEFAULT_SATISFY_REQUIREMENT_USAGE_LABEL),
Arguments.of(SYSML.getItemUsage(), DEFAULT_ITEM_USAGE_LABEL),
Arguments.of(SYSML.getPartUsage(), DEFAULT_PART_USAGE_LABEL),
Arguments.of(SYSML.getAllocationUsage(), DEFAULT_ALLOCATION_USAGE_LABEL),
Arguments.of(SYSML.getInterfaceUsage(), DEFAULT_INTERFACE_USAGE_LABEL),
Arguments.of(SYSML.getViewUsage(), DEFAULT_VIEW_USAGE_LABEL),
Arguments.of(SYSML.getPortUsage(), DEFAULT_PORT_USAGE_LABEL)
);
}

@ParameterizedTest(name = "[{index}] Check default prefix in {0} element label")
@MethodSource("defaultParameterProvider")
public void testDefaultLabel(EClass elementType, String defaultLabel) {
Expand Down Expand Up @@ -294,6 +322,40 @@ public void testPrefixLabelWithVariantProperty(EClass elementType, String defaul
}
}

@ParameterizedTest(name = "[{index}] Check timeslice prefix in {0} element label")
@MethodSource("timesliceSnapshotPrefixParameterProvider")
public void testPrefixLabelWithTimesliceProperty(EClass elementType, String defaultLabel) {
Element element = (Element) SysmlFactory.eINSTANCE.create(elementType);
if (element instanceof OccurrenceUsage occurrenceUsage) {
occurrenceUsage.setPortionKind(PortionKind.TIMESLICE);
String timeslicePrefix = LabelConstants.OPEN_QUOTE + PortionKind.TIMESLICE.getName() + LabelConstants.CLOSE_QUOTE + LabelConstants.CR;
if (element instanceof AcceptActionUsage) {
assertEquals(timeslicePrefix + defaultLabel + LabelConstants.CR,
this.multiLineLabelSwitch.doSwitch(element));
} else {
assertEquals(timeslicePrefix + defaultLabel,
this.multiLineLabelSwitch.doSwitch(element));
}
}
}

@ParameterizedTest(name = "[{index}] Check snapshot prefix in {0} element label")
@MethodSource("timesliceSnapshotPrefixParameterProvider")
public void testPrefixLabelWithSnapshotProperty(EClass elementType, String defaultLabel) {
Element element = (Element) SysmlFactory.eINSTANCE.create(elementType);
if (element instanceof OccurrenceUsage occurrenceUsage) {
occurrenceUsage.setPortionKind(PortionKind.SNAPSHOT);
String snapshotPrefix = LabelConstants.OPEN_QUOTE + PortionKind.SNAPSHOT.getName() + LabelConstants.CLOSE_QUOTE + LabelConstants.CR;
if (element instanceof AcceptActionUsage) {
assertEquals(snapshotPrefix + defaultLabel + LabelConstants.CR,
this.multiLineLabelSwitch.doSwitch(element));
} else {
assertEquals(snapshotPrefix + defaultLabel,
this.multiLineLabelSwitch.doSwitch(element));
}
}
}

private Element createNestedElementIn(Element parentElement, EClass elementType) {
Element newElement = (Element) SysmlFactory.eINSTANCE.create(elementType);
FeatureMembership membership = SysmlFactory.eINSTANCE.createFeatureMembership();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ part system {
This tool allows to create a `SatisfyRequirementUsage` based on the `RequirementUsage` selected during the tool creation.
** Add _New Satisfy Requirement_ graphical edge tool between `Feature` graphical nodes and `RequirementUsage` graphical nodes.
This tool allows to create a `SatisfyRequirementUsage` between the `Feature` and `RequirementUsage` selected during the tool creation.
** Add the _timeslice_ and _snapshot_ prefixes in the label of `OccurrenceUsage` graphical nodes and some of the graphical nodes representing subclasses of `OccurrenceUsage`.

* In textual import/export:

Expand Down
Loading