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 @@ -73,6 +73,7 @@ It leverages the selection dialog to either create an _occurrence timeslice/snap
- https://github.com/eclipse-syson/syson/issues/2254[#2254] [diagrams] Add the support for _assume_ and _require_ graphical edges.
- https://github.com/eclipse-syson/syson/issues/2260[#2260] [diagrams] Add the _New Assume Constraint_ or _New Require Constraint_ edge tools to create _assume_ and _require_ graphical edges.
- https://github.com/eclipse-syson/syson/issues/2113[#2113] [diagrams] Handle start/end/merge/decision... graphical nodes on Action Flow View diagram background
- https://github.com/eclipse-syson/syson/issues/2303[#2303] [diagrams] Add support for list item inheritance in _states_ and _exhibit states_ compartments

== v2026.5.0

Expand Down

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,8 @@ public static class GraphicalIds {

public static final String REQUIREMENT_USAGE_ID = "3eea9d01-7033-3f31-b7ef-561b5bc86d10";

public static final String STATE_DEFINITION_ID = "dbf7eccb-35e6-3ff1-b7b8-fc71f1a4094a";

public static final String STATE_USAGE_ID = "1541c013-2cc7-3dd7-a39f-6e33d07b411e";
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,10 @@ public class GeneralPurposeTests {
"/org/eclipse/syson/direct/edit/grammars"
);

private static final List<String> CHECKSTYLE_HIDDEN_FIELD_WHITELIST_CLASSNAME = List.of(
"ElementSpecializationInheritanceTestRunner"
);

/**
* Finds the folder containing the Git repository.
*
Expand Down Expand Up @@ -216,7 +220,7 @@ private void testNoSuppressWarnings(int index, String line, Path javaFilePath, L
if (line.contains(CHECKSTYLE_HIDDEN_FIELD)) {
isValidUsage = true;
isValidUsage = isValidUsage && lines.size() > index;
isValidUsage = isValidUsage && lines.get(index + 1).contains(BUILDER);
isValidUsage = isValidUsage && (lines.get(index + 1).contains(BUILDER) || CHECKSTYLE_HIDDEN_FIELD_WHITELIST_CLASSNAME.stream().anyMatch(whiteListClassName -> lines.get(index + 1).contains(whiteListClassName)));
} else if (line.contains(CHECKSTYLE_ILLEGAL_CATCH)) {
isValidUsage = true;
} else if (line.contains(CHECKSTYLE_MULTIPLE_STRING_LITERALS)) {
Expand All @@ -237,8 +241,7 @@ private void testNoSuppressWarnings(int index, String line, Path javaFilePath, L
private void testNoCheckstyleOff(int index, String line, Path javaFilePath) {
var whitelist = Stream.of(
Path.of("ServiceMethod.java"),
Path.of("GVTopNodeCreationTests.java"),
Path.of("GVCompartmentItemInheritanceTests.java")
Path.of("GVTopNodeCreationTests.java")
);
if (whitelist.filter(javaFilePath::endsWith).findFirst().isEmpty()) {
if (line.contains(CHECKSTYLE_OFF)) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
/*******************************************************************************
* Copyright (c) 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
* 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.common.view.nodes;

import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.sirius.components.view.builder.providers.IColorProvider;
import org.eclipse.sirius.components.view.diagram.NodeDescription;
import org.eclipse.syson.sysml.SysmlPackage;
import org.eclipse.syson.util.AQLConstants;
import org.eclipse.syson.util.IDescriptionNameGenerator;
import org.eclipse.syson.util.SysMLMetamodelHelper;

/**
* The inherited exhibit state compartment list item node description provider.
*
* @author gcoutable
*/
public class ExhibitStateInheritedCompartmentItemNodeDescriptionProvider extends InheritedCompartmentItemNodeDescriptionProvider {

public ExhibitStateInheritedCompartmentItemNodeDescriptionProvider(EClass eClass, EReference eReference, IColorProvider colorProvider, IDescriptionNameGenerator descriptionNameGenerator) {
super(eClass, eReference, colorProvider, descriptionNameGenerator);
}

@Override
public NodeDescription create() {
NodeDescription nd = super.create();
var qualifiedName = SysMLMetamodelHelper.buildQualifiedName(SysmlPackage.eINSTANCE.getExhibitStateUsage());
nd.setName(this.descriptionNameGenerator.getInheritedCompartmentItemName(this.eClass, this.eReference) + StatesCompartmentNodeDescriptionProvider.EXHIBIT_STATES_NAME);
nd.setDomainType(qualifiedName);
nd.setPreconditionExpression(AQLConstants.AQL_SELF + ".oclIsTypeOf(" + qualifiedName + ")");
return nd;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -45,11 +45,11 @@
*/
public class InheritedCompartmentItemNodeDescriptionProvider extends AbstractNodeDescriptionProvider {

private final EClass eClass;
protected final EClass eClass;

private final EReference eReference;
protected final EReference eReference;

private final IDescriptionNameGenerator descriptionNameGenerator;
protected final IDescriptionNameGenerator descriptionNameGenerator;

public InheritedCompartmentItemNodeDescriptionProvider(EClass eClass, EReference eReference, IColorProvider colorProvider, IDescriptionNameGenerator descriptionNameGenerator) {
super(colorProvider);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,11 +82,13 @@ public void link(DiagramDescription diagramDescription, IViewDiagramElementFinde
if (this.showsExhibitOnly) {
cache.getNodeDescription(this.getDescriptionNameGenerator().getCompartmentName(this.eClass, this.eReference) + EXHIBIT_STATES_NAME).ifPresent(nd -> {
cache.getNodeDescription(this.getDescriptionNameGenerator().getCompartmentItemName(this.eClass, this.eReference) + EXHIBIT_STATES_NAME).ifPresent(nd.getChildrenDescriptions()::add);
cache.getNodeDescription(this.getDescriptionNameGenerator().getInheritedCompartmentItemName(this.eClass, eReference) + EXHIBIT_STATES_NAME).ifPresent(nd.getChildrenDescriptions()::add);
nd.setPalette(this.createCompartmentPalette(cache));
});
} else {
cache.getNodeDescription(this.getDescriptionNameGenerator().getCompartmentName(this.eClass, this.eReference) + STATES_NAME).ifPresent(nd -> {
cache.getNodeDescription(this.getDescriptionNameGenerator().getCompartmentItemName(this.eClass, this.eReference) + STATES_NAME).ifPresent(nd.getChildrenDescriptions()::add);
cache.getNodeDescription(this.getDescriptionNameGenerator().getInheritedCompartmentItemName(this.eClass, eReference)).ifPresent(nd.getChildrenDescriptions()::add);
nd.setPalette(this.createCompartmentPalette(cache));
});
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,15 +21,19 @@
import org.eclipse.emf.ecore.EReference;
import org.eclipse.syson.sysml.Behavior;
import org.eclipse.syson.sysml.ConstraintUsage;
import org.eclipse.syson.sysml.Definition;
import org.eclipse.syson.sysml.ExhibitStateUsage;
import org.eclipse.syson.sysml.Feature;
import org.eclipse.syson.sysml.OwningMembership;
import org.eclipse.syson.sysml.PartUsage;
import org.eclipse.syson.sysml.ReferenceUsage;
import org.eclipse.syson.sysml.RequirementConstraintKind;
import org.eclipse.syson.sysml.RequirementConstraintMembership;
import org.eclipse.syson.sysml.StateUsage;
import org.eclipse.syson.sysml.Step;
import org.eclipse.syson.sysml.SysmlPackage;
import org.eclipse.syson.sysml.Type;
import org.eclipse.syson.sysml.Usage;
import org.eclipse.syson.sysml.util.SysmlSwitch;

/**
Expand All @@ -50,17 +54,6 @@ public Boolean defaultCase(EObject object) {
return false;
}

@Override
public Boolean caseFeature(Feature object) {
// Add this behavior parameter check for each caseXXXUsage.
// In this case, we want to display inherited parameters (directed feature) but not all features with the same
// type.
if (this.shouldConsiderParameter(object)) {
return this.isInheritedParameter(object);
}
return this.eReference.getEType().equals(object.eClass());
}

@Override
public Boolean caseConstraintUsage(ConstraintUsage object) {
boolean keep = true;
Expand All @@ -80,6 +73,35 @@ public Boolean caseConstraintUsage(ConstraintUsage object) {
return keep && this.caseFeature(object);
}

@Override
public Boolean caseExhibitStateUsage(ExhibitStateUsage object) {
Boolean shouldKeep = Boolean.FALSE;
// Add this behavior parameter check for each caseXXXUsage.
// In this case, we want to display inherited parameters (directed feature) but not all features with the same
// type.
if (!shouldKeep && this.shouldConsiderParameter(object)) {
shouldKeep = this.isInheritedParameter(object);
}
if (!shouldKeep && this.shouldConsiderExhibitState(object)) {
shouldKeep = this.isInheritedState(object);
}
if (!shouldKeep) {
shouldKeep = super.caseExhibitStateUsage(object);
}
return shouldKeep;
}

@Override
public Boolean caseFeature(Feature object) {
// Add this behavior parameter check for each caseXXXUsage.
// In this case, we want to display inherited parameters (directed feature) but not all features with the same
// type.
if (this.shouldConsiderParameter(object)) {
return this.isInheritedParameter(object);
}
return this.eReference.getEType().equals(object.eClass());
}

@Override
public Boolean casePartUsage(PartUsage object) {
// Add this behavior parameter check for each caseXXXUsage.
Expand Down Expand Up @@ -121,4 +143,23 @@ private boolean isInheritedParameter(Feature feature) {
};
return featureParameter.contains(feature);
}

private boolean shouldConsiderExhibitState(Feature feature) {
if (!(feature instanceof ExhibitStateUsage)) {
return false;
}

EClassifier eType = this.eReference.getEType();
EClass eClass = feature.eClass();
return eType.equals(eClass) || (eType instanceof EClass eTypeEClass && eTypeEClass.isSuperTypeOf(eClass));
}

private boolean isInheritedState(Feature feature) {
List<StateUsage> featureState = switch (feature.getOwner()) {
case Definition definition -> definition.getOwnedState();
case Usage usage -> usage.getNestedState();
default -> List.of();
};
return featureState.contains(feature);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@
import org.eclipse.syson.diagram.common.view.nodes.DecisionActionNodeDescriptionProvider;
import org.eclipse.syson.diagram.common.view.nodes.DoneActionNodeDescriptionProvider;
import org.eclipse.syson.diagram.common.view.nodes.DoneStateNodeDescriptionProvider;
import org.eclipse.syson.diagram.common.view.nodes.ExhibitStateInheritedCompartmentItemNodeDescriptionProvider;
import org.eclipse.syson.diagram.common.view.nodes.ForkActionNodeDescriptionProvider;
import org.eclipse.syson.diagram.common.view.nodes.FramedConcernCompartmentItemNodeDescription;
import org.eclipse.syson.diagram.common.view.nodes.FramedConcernCompartmentNodeDescription;
Expand Down Expand Up @@ -617,16 +618,22 @@ private List<IDiagramElementDescriptionProvider<?>> createCompartmentsForListIte
compartmentNodeDescriptionProviders.add(new StatesCompartmentItemNodeDescriptionProvider(eClass, eReference, colorProvider, this.getDescriptionNameGenerator(), true));
compartmentNodeDescriptionProviders.add(new StatesCompartmentNodeDescriptionProvider(eClass, eReference, colorProvider, this.getDescriptionNameGenerator(), false));
compartmentNodeDescriptionProviders.add(new StatesCompartmentItemNodeDescriptionProvider(eClass, eReference, colorProvider, this.getDescriptionNameGenerator(), false));
compartmentNodeDescriptionProviders.add(new InheritedCompartmentItemNodeDescriptionProvider(eClass, eReference, colorProvider, this.getDescriptionNameGenerator()));
compartmentNodeDescriptionProviders.add(new ExhibitStateInheritedCompartmentItemNodeDescriptionProvider(eClass, eReference, colorProvider, this.getDescriptionNameGenerator()));
} else if (SysmlPackage.eINSTANCE.getStateUsage().equals(eClass) && SysmlPackage.eINSTANCE.getUsage_NestedState().equals(eReference)) {
compartmentNodeDescriptionProviders.add(new StatesCompartmentNodeDescriptionProvider(eClass, eReference, colorProvider, this.getDescriptionNameGenerator(), true));
compartmentNodeDescriptionProviders.add(new StatesCompartmentItemNodeDescriptionProvider(eClass, eReference, colorProvider, this.getDescriptionNameGenerator(), true));
compartmentNodeDescriptionProviders.add(new StatesCompartmentNodeDescriptionProvider(eClass, eReference, colorProvider, this.getDescriptionNameGenerator(), false));
compartmentNodeDescriptionProviders.add(new StatesCompartmentItemNodeDescriptionProvider(eClass, eReference, colorProvider, this.getDescriptionNameGenerator(), false));
compartmentNodeDescriptionProviders.add(new InheritedCompartmentItemNodeDescriptionProvider(eClass, eReference, colorProvider, this.getDescriptionNameGenerator()));
compartmentNodeDescriptionProviders.add(new ExhibitStateInheritedCompartmentItemNodeDescriptionProvider(eClass, eReference, colorProvider, this.getDescriptionNameGenerator()));
} else if (SysmlPackage.eINSTANCE.getStateDefinition().equals(eClass) && SysmlPackage.eINSTANCE.getDefinition_OwnedState().equals(eReference)) {
compartmentNodeDescriptionProviders.add(new StatesCompartmentNodeDescriptionProvider(eClass, eReference, colorProvider, this.getDescriptionNameGenerator(), true));
compartmentNodeDescriptionProviders.add(new StatesCompartmentItemNodeDescriptionProvider(eClass, eReference, colorProvider, this.getDescriptionNameGenerator(), true));
compartmentNodeDescriptionProviders.add(new StatesCompartmentNodeDescriptionProvider(eClass, eReference, colorProvider, this.getDescriptionNameGenerator(), false));
compartmentNodeDescriptionProviders.add(new StatesCompartmentItemNodeDescriptionProvider(eClass, eReference, colorProvider, this.getDescriptionNameGenerator(), false));
compartmentNodeDescriptionProviders.add(new InheritedCompartmentItemNodeDescriptionProvider(eClass, eReference, colorProvider, this.getDescriptionNameGenerator()));
compartmentNodeDescriptionProviders.add(new ExhibitStateInheritedCompartmentItemNodeDescriptionProvider(eClass, eReference, colorProvider, this.getDescriptionNameGenerator()));
} else if ((SysmlPackage.eINSTANCE.getStateUsage().equals(eClass) && SysmlPackage.eINSTANCE.getUsage_NestedAction().equals(eReference))
|| (SysmlPackage.eINSTANCE.getStateDefinition().equals(eClass) && SysmlPackage.eINSTANCE.getDefinition_OwnedAction().equals(eReference))) {
compartmentNodeDescriptionProviders.add(new CompartmentItemNodeDescriptionProvider(eClass, eReference, colorProvider, this.getDescriptionNameGenerator()));
Expand All @@ -647,6 +654,8 @@ private List<IDiagramElementDescriptionProvider<?>> createCompartmentsForListIte
compartmentNodeDescriptionProviders.add(new StatesCompartmentItemNodeDescriptionProvider(eClass, eReference, colorProvider, this.getDescriptionNameGenerator(), true));
compartmentNodeDescriptionProviders.add(new StatesCompartmentNodeDescriptionProvider(eClass, eReference, colorProvider, this.getDescriptionNameGenerator(), false));
compartmentNodeDescriptionProviders.add(new StatesCompartmentItemNodeDescriptionProvider(eClass, eReference, colorProvider, this.getDescriptionNameGenerator(), false));
compartmentNodeDescriptionProviders.add(new InheritedCompartmentItemNodeDescriptionProvider(eClass, eReference, colorProvider, this.getDescriptionNameGenerator()));
compartmentNodeDescriptionProviders.add(new ExhibitStateInheritedCompartmentItemNodeDescriptionProvider(eClass, eReference, colorProvider, this.getDescriptionNameGenerator()));
} else if ((SysmlPackage.eINSTANCE.getActionUsage().equals(eClass) && SysmlPackage.eINSTANCE.getUsage_NestedAction().equals(eReference))
|| (SysmlPackage.eINSTANCE.getActionDefinition().equals(eClass) && SysmlPackage.eINSTANCE.getDefinition_OwnedAction().equals(eReference))) {
compartmentNodeDescriptionProviders.add(new CompartmentItemNodeDescriptionProvider(eClass, eReference, colorProvider, this.getDescriptionNameGenerator()));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ image::release-notes-assume-and-require-edge-tools.png[list available edge tools

** When using direct edit on feature elements that have a value expression (e.g., an `Attribute` with a default value defined), the expression part (after the `=` sign) is no longer part of the initial direct edit value and will be ignored if supplied in the new text value.
Users should use the dedicated tools to edit expressions instead, as they ensure only valid expressions (with all names resolving) are accepted.

** Add support for list item inheritance in _states_ and _exhibit states_ compartments.
** Add support for creating _Start_, _Done_, _Decision_, _Fork_, _Join_, and _Merge_ actions directly on the background of an `Action Flow View` diagram if its root element is an `ActionUsage` or `ActionDefinition`.

* In the _Explorer_ view:
Expand Down
Loading