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
2 changes: 1 addition & 1 deletion CHANGELOG.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,9 @@ It has long been unused by Sirius Web itself (since the transition to MUI).
- https://github.com/eclipse-syson/syson/issues/2289[#2289] [details] Fix expression support for `TransitionUsage`.
- https://github.com/eclipse-syson/syson/issues/1808[#1808] [diagrams] Remove multiplicity displayed on feature membership edge between Part Definition and Part Usage.
- https://github.com/eclipse-syson/syson/issues/2194[#2194] [diagrams] Properly report feedback messages to user when using _ISysMLMoveElementService_.
- https://github.com/eclipse-syson/syson/issues/2306[#2306] [diagrams] Fixed an error when trying to rename a constraint displayed as a list item through direct edit.

=== Improvements

- https://github.com/eclipse-syson/syson/issues/2198[#2198] [diagrams] Improve diagram-to-diagram drag and drop to support dropping multiple graphical nodes at once, leveraging Sirius Web's `droppedNodes` and `droppedElements` variables.
- https://github.com/eclipse-syson/syson/issues/2182[#2182] [services] Provide a way for downstream applications to extend _ISysMLMoveElementService_.
- https://github.com/eclipse-syson/syson/issues/2240[#2240] [diagrams] Update the choice of _timeslice_ and _snapshot_ elements that can be created in the selection dialog of tools creating _timeslice_ and _snapshot_ elements.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -898,7 +898,7 @@ public void sysONExplorerHidesExpressionInternalsByDefault() {
var packageItem = documentItem.getChildren().get(0);
assertThat(packageItem.getLabel().toString()).isEqualTo("Expressions");

assertThat(packageItem.getChildren()).hasSize(6);
assertThat(packageItem.getChildren()).hasSize(7);

var tankItem = this.getChildByLabel(packageItem, "Tank");
assertThat(tankItem).isPresent();
Expand Down Expand Up @@ -952,7 +952,7 @@ public void sysONExplorerExpressionInternalsCanBeRevealed() {
var packageItem = documentItem.getChildren().get(0);
assertThat(packageItem.getLabel().toString()).isEqualTo("Expressions");

assertThat(packageItem.getChildren()).hasSize(6);
assertThat(packageItem.getChildren()).hasSize(7);

var tankItem = this.getChildByLabel(packageItem, "Tank");
assertThat(tankItem).isPresent();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@
import java.util.function.Consumer;
import java.util.function.Supplier;

import org.eclipse.sirius.components.collaborative.diagrams.dto.EditLabelInput;
import org.eclipse.sirius.components.collaborative.diagrams.dto.EditLabelSuccessPayload;
import org.eclipse.sirius.components.collaborative.dto.CreateRepresentationInput;
import org.eclipse.sirius.components.core.api.ErrorPayload;
import org.eclipse.sirius.components.core.api.IEditingContext;
Expand All @@ -37,6 +39,9 @@
import org.eclipse.sirius.components.core.api.IPayload;
import org.eclipse.sirius.components.core.api.SuccessPayload;
import org.eclipse.sirius.components.diagrams.Diagram;
import org.eclipse.sirius.components.diagrams.tests.graphql.EditLabelMutationRunner;
import org.eclipse.sirius.components.diagrams.tests.graphql.InitialDirectEditElementLabelQueryRunner;
import org.eclipse.sirius.components.diagrams.tests.navigation.DiagramNavigator;
import org.eclipse.sirius.components.graphql.tests.ExecuteEditingContextFunctionInput;
import org.eclipse.sirius.components.graphql.tests.ExecuteEditingContextFunctionSuccessPayload;
import org.eclipse.sirius.components.graphql.tests.api.IExecuteEditingContextFunctionRunner;
Expand All @@ -48,6 +53,7 @@
import org.eclipse.syson.AbstractIntegrationTests;
import org.eclipse.syson.GivenSysONServer;
import org.eclipse.syson.application.controllers.diagrams.checkers.CheckDiagramElementCount;
import org.eclipse.syson.application.controllers.diagrams.testers.DirectEditInitialLabelTester;
import org.eclipse.syson.application.controllers.diagrams.testers.DropFromExplorerTester;
import org.eclipse.syson.application.controllers.expressions.graphql.CreateExpressionMutationRunner;
import org.eclipse.syson.application.controllers.expressions.graphql.DeleteExpressionMutationRunner;
Expand All @@ -67,6 +73,7 @@
import org.eclipse.syson.sysml.dto.CreateExpressionSuccessPayload;
import org.eclipse.syson.sysml.dto.EditExpressionInput;
import org.eclipse.syson.sysml.dto.EditExpressionSuccessPayload;
import org.eclipse.syson.sysml.metamodel.helper.LabelConstants;
import org.eclipse.syson.sysml.metamodel.services.MetamodelQueryElementService;
import org.eclipse.syson.tree.explorer.view.SysONTreeViewDescriptionProvider;
import org.eclipse.syson.util.SysONRepresentationDescriptionIdentifiers;
Expand Down Expand Up @@ -135,15 +142,24 @@ public class ExpressionsControllersIntegrationTests extends AbstractIntegrationT
@Autowired
private DiagramComparator diagramComparator;

@Autowired
private InitialDirectEditElementLabelQueryRunner initialDirectEditElementLabelQueryRunner;

@Autowired
private EditLabelMutationRunner editLabelMutationRunner;

private String sysONExplorerTreeDescriptionId;

private MetamodelQueryElementService metamodelQueryElementService;

private DirectEditInitialLabelTester directEditInitialLabelTester;

@BeforeEach
public void beforeEach() {
this.sysONExplorerTreeDescriptionId = this.sysonTreeViewDescriptionProvider.getDescriptionId();
this.givenInitialServerState.initialize();
this.metamodelQueryElementService = new MetamodelQueryElementService();
this.directEditInitialLabelTester = new DirectEditInitialLabelTester(this.initialDirectEditElementLabelQueryRunner, ExpressionSamplesProjectData.EDITING_CONTEXT_ID);
}

@DisplayName("GIVEN a SysML attribute which does not have an initial or default value, WHEN creating a new expression on it THEN the new expression is created with proper name resolution")
Expand Down Expand Up @@ -613,8 +629,7 @@ private Flux<Object> givenSubscriptionToNewDiagram() {
return this.givenCreatedDiagramSubscription.createAndSubscribe(input).flux();
}


@DisplayName("GIVEN a SysML model with expressions, WHEN dropping a contraint with an associated expression on an empty diagram, THEN the node showing the constraint includes the text of the exression in its label")
@DisplayName("GIVEN a SysML model with expressions, WHEN dropping a constraint with an associated expression on an empty diagram, THEN the node showing the constraint includes the text of the exression in its label")
@GivenSysONServer({ ExpressionSamplesProjectData.SCRIPT_PATH })
@Test
public void topLevelConstraintNodeLabelIncludesExpressionInLabel() {
Expand All @@ -625,8 +640,6 @@ public void topLevelConstraintNodeLabelIncludesExpressionInLabel() {

Runnable dropFromExplorerRunnable = () -> {
assertThat(diagram.get().getNodes()).hasSize(0);
var background = diagram.get().getStyle().getBackground();
assertThat(background).isNotEqualTo("white");
this.dropFromExplorerTester.dropFromExplorerOnDiagram(ExpressionSamplesProjectData.EDITING_CONTEXT_ID, diagram, ExpressionSamplesProjectData.SemanticIds.TANK_PRESSURE_LIMIT_CONSTRAINT_ID);
};

Expand All @@ -647,7 +660,86 @@ public void topLevelConstraintNodeLabelIncludesExpressionInLabel() {
.consumeNextWith(updatedDiagramConsumer)
.thenCancel()
.verify(Duration.ofSeconds(10));
}

@DisplayName("GIVEN a SysML model an assumed constraint visible as a list item in a requirement node, WHEN using direct-edit on the constraint, THEN only its name is shown in the initial text and impacted by the edition")
@GivenSysONServer({ ExpressionSamplesProjectData.SCRIPT_PATH })
@Test
public void directEditNamedAssumedConstraintListItem() {
String initialConstraintName = "environmentalPrecondition";
String constraintExpression = "s.enabled == true & s.samplingRate > 0.0";
String newConstraintName = "newConstraintName";

var flux = this.givenSubscriptionToNewDiagram();

AtomicReference<Diagram> diagram = new AtomicReference<>();
Consumer<Object> initialDiagramContentConsumer = assertRefreshedDiagramThat(diagram::set);
AtomicReference<String> constraintNodeId = new AtomicReference<>();
AtomicReference<String> constraintNodeLabelId = new AtomicReference<>();

Runnable dropFromExplorerRunnable = () -> {
assertThat(diagram.get().getNodes()).hasSize(0);
this.dropFromExplorerTester.dropFromExplorerOnDiagram(ExpressionSamplesProjectData.EDITING_CONTEXT_ID, diagram, ExpressionSamplesProjectData.SemanticIds.SENSOR_OPERABILITY_REQUIREMENT_ID);
};

Consumer<Object> updatedDiagramConsumer = assertRefreshedDiagramThat(newDiagram -> {
new CheckDiagramElementCount(this.diagramComparator)
.hasNewEdgeCount(0)
.hasNewNodeCount(15)
.check(diagram.get(), newDiagram);

String nodeLabel = newDiagram.getNodes().get(0).getInsideLabel().getText();
assertThat(nodeLabel).isEqualTo(this.quoted("requirement def") + "\nSensorOperability");

var constraintNode = new DiagramNavigator(newDiagram).nodeWithTargetObjectId(ExpressionSamplesProjectData.SemanticIds.SENSOR_OPERABILITY_ENVIRONMENTAL_PRECONDITION_ASSUMED_CONSTRAINT_ID)
.getNode();
assertThat(constraintNode).isNotNull();
assertThat(constraintNode.getInsideLabel().getText()).isEqualTo(initialConstraintName + " { " + constraintExpression + " }");
constraintNodeId.set(constraintNode.getId());
constraintNodeLabelId.set(constraintNode.getInsideLabel().getId());
});

var checkDirectEditInitialTextShowsNameOnly = this.directEditInitialLabelTester.checkDirectEditInitialLabel(diagram, constraintNodeLabelId::get,
initialConstraintName);

Runnable editConstraintName = () -> {
String labelId = constraintNodeLabelId.get();
EditLabelInput input = new EditLabelInput(UUID.randomUUID(), ExpressionSamplesProjectData.EDITING_CONTEXT_ID, diagram.get().getId(), labelId, newConstraintName);
var result = this.editLabelMutationRunner.run(input);
String typename = JsonPath.read(result.data(), "$.data.editLabel.__typename");
assertThat(typename).isEqualTo(EditLabelSuccessPayload.class.getSimpleName());
};

Consumer<Object> updatedDiagramAfterDirectEditConsumer = assertRefreshedDiagramThat(newDiagram -> {
new CheckDiagramElementCount(this.diagramComparator)
.hasNewEdgeCount(0)
.hasNewNodeCount(15)
.check(diagram.get(), newDiagram);

String nodeLabel = newDiagram.getNodes().get(0).getInsideLabel().getText();
assertThat(nodeLabel).isEqualTo(this.quoted("requirement def") + "\nSensorOperability");

var constraintNode = new DiagramNavigator(newDiagram).nodeWithTargetObjectId(ExpressionSamplesProjectData.SemanticIds.SENSOR_OPERABILITY_ENVIRONMENTAL_PRECONDITION_ASSUMED_CONSTRAINT_ID)
.getNode();
assertThat(constraintNode).isNotNull();
assertThat(constraintNode.getInsideLabel().getText()).isEqualTo(newConstraintName + " { " + constraintExpression + " }");
constraintNodeId.set(constraintNode.getId());
constraintNodeLabelId.set(constraintNode.getInsideLabel().getId());
});

StepVerifier.create(flux)
.consumeNextWith(initialDiagramContentConsumer)
.then(dropFromExplorerRunnable)
.consumeNextWith(updatedDiagramConsumer)
.then(checkDirectEditInitialTextShowsNameOnly)
.then(editConstraintName)
.consumeNextWith(updatedDiagramAfterDirectEditConsumer)
.thenCancel()
.verify(Duration.ofSeconds(10));
}

private String quoted(String text) {
return LabelConstants.OPEN_QUOTE + text + LabelConstants.CLOSE_QUOTE;
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,12 @@ public static final class SemanticIds {

public static final String THERMAL_CONTROL_TO_COOLING_TRANSITION_GUARD_EXPRESSION_ID = "ec67ead5-7739-4dd3-a82e-f1bb5ef34268";

public static final String SENSOR_OPERABILITY_REQUIREMENT_ID = "96735823-f93e-4edd-948e-2db5df124d11";

public static final String SENSOR_OPERABILITY_ENVIRONMENTAL_PRECONDITION_ASSUMED_CONSTRAINT_ID = "baa1ff9e-5735-4393-ba94-324731366733";

public static final String SENSOR_OPERABILITY_ENVIRONMENTAL_PRECONDITION_ASSUMED_CONSTRAINT_EXPRESSION_ID = "97f03244-a4a5-47cd-988d-15119a3b2210";

public static final List<String> ALL_IDS = List.of(
EXPRESSIONS_DOCUMENT_ID,
EXPRESSIONS_PACKAGE_ID,
Expand Down

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,7 @@
import org.eclipse.syson.services.LabelService;
import org.eclipse.syson.services.api.DiagramDirectEditErrorListener;
import org.eclipse.syson.services.api.IDirectEditNamespaceProvider;
import org.eclipse.syson.sysml.ConstraintUsage;
import org.eclipse.syson.sysml.Element;
import org.eclipse.syson.sysml.RequirementConstraintMembership;
import org.springframework.stereotype.Service;

/**
Expand Down Expand Up @@ -98,11 +96,7 @@ public Element directEdit(Element element, String newLabel, boolean isCompartmen
DirectEditParser parser = new DirectEditParser(tokens);
parser.addErrorListener(new DiagramDirectEditErrorListener());
ParseTree tree;
if (element instanceof ConstraintUsage && element.getOwningMembership() instanceof RequirementConstraintMembership && isCompartmentItem) {
// Use the constraint expression parser only if the element is a constraint owned by a requirement, other
// constraints (including requirements) are parsed as regular elements.
tree = parser.constraintExpression();
} else if (isCompartmentItem) {
if (isCompartmentItem) {
tree = parser.listItemExpression();
} else {
tree = parser.nodeExpression();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,6 @@
import org.eclipse.syson.sysml.PortionKind;
import org.eclipse.syson.sysml.Redefinition;
import org.eclipse.syson.sysml.ReferenceSubsetting;
import org.eclipse.syson.sysml.RequirementConstraintMembership;
import org.eclipse.syson.sysml.ResultExpressionMembership;
import org.eclipse.syson.sysml.SatisfyRequirementUsage;
import org.eclipse.syson.sysml.StateSubactionMembership;
Expand Down Expand Up @@ -617,10 +616,12 @@ private String getCompartmentItemLabel(ConstraintUsage constraintUsage, boolean
label.append(this.getIdentificationLabel(constraintUsage));
label.append(this.getReferenceSubsettingLabel(constraintUsage));
}
String expressionPart = this.getConstraintExpression(constraintUsage);
if (!expressionPart.isEmpty()) {
label.append(LabelConstants.SPACE);
label.append(expressionPart);
if (!directEditInput) {
String expressionPart = this.getConstraintExpression(constraintUsage);
if (!expressionPart.isEmpty()) {
label.append(LabelConstants.SPACE);
label.append(expressionPart);
}
}
}
return label.toString();
Expand Down Expand Up @@ -675,25 +676,7 @@ public String getCompartmentItemLabel(Documentation documentation) {
* @return the value to display.
*/
public String getInitialDirectEditListItemLabel(Usage usage) {
String result;
if (usage instanceof ConstraintUsage constraintUsage &&
usage.getOwningMembership() instanceof RequirementConstraintMembership) {
result = this.getInitialDirectEditListItemLabel(constraintUsage, true);
} else {
result = this.getCompartmentItemStringRepresentation(usage, true);
}
return result;
}

private String getInitialDirectEditListItemLabel(ConstraintUsage constraintUsage, boolean directEditInput) {
String result;
if (!constraintUsage.getOwnedMember().isEmpty() && constraintUsage.getOwnedMember().get(0) instanceof Expression expression) {
result = this.getSysmlTextualRepresentation(expression, directEditInput);
} else {
// The constraint doesn't have an expression, we set an initial empty string for the direct edit.
result = "";
}
return result;
return this.getCompartmentItemStringRepresentation(usage, true);
}

/**
Expand Down
Loading