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 @@ -101,6 +101,7 @@ Now the _end_ keyword is not displayed anymore in the label of these graphical n
- https://github.com/eclipse-syson/syson/issues/2058[#2058] [diagrams] Fix error when importing SysML snippets referencing unknown units which could make the resulting model inconsistent
- https://github.com/eclipse-syson/syson/issues/2053[#2053] [diagrams] Prevent incoming and outgoing graphical edges of a graphical `ForkNode` or `JoinNode` to point empty space.
- https://github.com/eclipse-syson/syson/issues/2059[#2059] [diagrams] Fix an issue where the _Add existing elements_ tool was not working correctly on the _action flow_ compartment of `ActionUsage` graphical nodes.
- https://github.com/eclipse-syson/syson/issues/2043[#2043] [explorer] Prevent user libraries from being moved to the root of the project when a child is created in it.

=== Improvements

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,6 @@
import org.eclipse.syson.sysml.SysmlPackage;
import org.eclipse.syson.sysml.ViewUsage;
import org.eclipse.syson.sysml.metamodel.services.ElementInitializerSwitch;
import org.eclipse.syson.sysml.util.ElementUtil;
import org.eclipse.syson.util.GetIntermediateContainerCreationSwitch;
import org.eclipse.syson.util.SysMLMetamodelHelper;
import org.eclipse.syson.util.SysONRepresentationDescriptionIdentifiers;
Expand Down Expand Up @@ -199,9 +198,6 @@ public Optional<Object> createChild(IEditingContext editingContext, Object objec
} else if (container instanceof Membership membership && eObject instanceof Element newElement) {
membership.getOwnedRelatedElement().add(newElement);
}
// Updating an element in an imported model removes its imported flag. This ensures that creating a library
// model from an imported SysML file does not make it an imported user library.
ElementUtil.setIsImported(eObject.eResource(), false);
new ElementInitializerSwitch().doSwitch(eObject);
if (eObject instanceof ViewUsage viewUsage) {
this.createDiagram(editingContext, viewUsage);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2025 Obeo.
* Copyright (c) 2025, 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 @@ -14,6 +14,7 @@

import org.eclipse.emf.ecore.EAnnotation;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.sirius.components.core.api.IEditingContext;
import org.eclipse.sirius.components.core.api.IReadOnlyObjectPredicate;
import org.eclipse.sirius.components.core.api.IReadOnlyObjectPredicateDelegate;
import org.eclipse.sirius.components.emf.ResourceMetadataAdapter;
Expand All @@ -26,10 +27,10 @@
* <p>
* It ensures that a {@link Resource}, an {@link EAnnotation} or a {@link Element SysML element} is considered read-only
* by the {@link IReadOnlyObjectPredicate} implementation (used for the <i>Explorer</i> and <i>Details</i> views) when
* it is (or belongs to) a {@link Resource} matching at least one of the following criterias:
* it is (or belongs to) a {@link Resource} matching at least one of the following criteria:
* <ul>
* <li>From the SysML and KerML standard libraries</li>
* <li>From an {@link org.eclipse.syson.services.api.ISysONResourceService#isImported(Resource) imported resource}
* <li>From an {@link org.eclipse.syson.services.api.ISysONResourceService#isImported(IEditingContext, Resource) read-only imported resource}
* containing {@link org.eclipse.syson.sysml.LibraryPackage libraries}.</li>
* </ul>
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,37 +19,22 @@
import java.util.Optional;
import java.util.UUID;

import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.sirius.components.collaborative.dto.CreateChildInput;
import org.eclipse.sirius.components.collaborative.dto.CreateChildSuccessPayload;
import org.eclipse.sirius.components.collaborative.dto.CreateRootObjectInput;
import org.eclipse.sirius.components.collaborative.dto.CreateRootObjectSuccessPayload;
import org.eclipse.sirius.components.core.api.IEditingContext;
import org.eclipse.sirius.components.emf.services.JSONResourceFactory;
import org.eclipse.sirius.components.emf.services.api.IEMFEditingContext;
import org.eclipse.sirius.components.graphql.tests.ExecuteEditingContextFunctionSuccessPayload;
import org.eclipse.sirius.web.application.UUIDParser;
import org.eclipse.sirius.web.domain.boundedcontexts.representationdata.services.api.IRepresentationMetadataSearchService;
import org.eclipse.sirius.web.tests.graphql.CreateChildMutationRunner;
import org.eclipse.sirius.web.tests.graphql.CreateRootObjectMutationRunner;
import org.eclipse.sirius.web.tests.services.api.IGivenInitialServerState;
import org.eclipse.syson.AbstractIntegrationTests;
import org.eclipse.syson.GivenSysONServer;
import org.eclipse.syson.application.data.GeneralViewEmptyTestProjectData;
import org.eclipse.syson.application.services.SysMLv2EditService;
import org.eclipse.syson.services.SemanticRunnableFactory;
import org.eclipse.syson.services.api.ISysONResourceService;
import org.eclipse.syson.sysml.SysmlPackage;
import org.eclipse.syson.sysml.util.ElementUtil;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.jdbc.core.mapping.AggregateReference;
import org.springframework.test.context.jdbc.Sql;
import org.springframework.test.context.jdbc.SqlConfig;
import org.springframework.test.context.transaction.TestTransaction;
import org.springframework.transaction.annotation.Transactional;

Expand All @@ -65,18 +50,9 @@ public class ObjectCreationTests extends AbstractIntegrationTests {
@Autowired
private IGivenInitialServerState givenInitialServerState;

@Autowired
private CreateRootObjectMutationRunner createRootObjectMutationRunner;

@Autowired
private CreateChildMutationRunner createChildMutationRunner;

@Autowired
private SemanticRunnableFactory semanticRunnableFactory;

@Autowired
private ISysONResourceService sysONResourceService;

@Autowired
private IRepresentationMetadataSearchService representationMetadataSearchService;

Expand All @@ -85,56 +61,8 @@ public void setUp() {
this.givenInitialServerState.initialize();
}

@Test
@DisplayName("GIVEN an imported document, WHEN a root object is created, THEN it is created properly and the document is not imported anymore")
@Sql(scripts = { GeneralViewEmptyTestProjectData.SCRIPT_PATH }, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED))
@Sql(scripts = { "/scripts/cleanup.sql" }, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD, config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED))
public void givenImportedDocumentWhenRootObjectIsCreatedThenItIsCreatedProperlyAndDocumentIsNotImported() {
this.semanticRunnableFactory.createRunnable(GeneralViewEmptyTestProjectData.EDITING_CONTEXT,
(editingContext, executeEditingContextFunctionInput) -> {
Optional<Resource> optResource = this.getResource(editingContext, GeneralViewEmptyTestProjectData.SemanticIds.MODEL_ID);
assertThat(optResource).isPresent();
Resource resource = optResource.get();
ElementUtil.setIsImported(resource, true);
return new ExecuteEditingContextFunctionSuccessPayload(executeEditingContextFunctionInput.id(), true);
}).run();

var input = new CreateRootObjectInput(
UUID.randomUUID(),
GeneralViewEmptyTestProjectData.EDITING_CONTEXT,
UUID.fromString(GeneralViewEmptyTestProjectData.SemanticIds.MODEL_ID),
SysmlPackage.eNS_URI,
"SysMLv2EditService-Package");

var result = this.createRootObjectMutationRunner.run(input);
TestTransaction.flagForCommit();
TestTransaction.end();

String typename = JsonPath.read(result.data(), "$.data.createRootObject.__typename");
assertThat(typename).isEqualTo(CreateRootObjectSuccessPayload.class.getSimpleName());

String objectId = JsonPath.read(result.data(), "$.data.createRootObject.object.id");
assertThat(objectId).isNotBlank();

String objectLabel = JsonPath.read(result.data(), "$.data.createRootObject.object.label");
assertThat(objectLabel).isNotBlank();

String objectKind = JsonPath.read(result.data(), "$.data.createRootObject.object.kind");
assertThat(objectKind).isEqualTo("siriusComponents://semantic?domain=sysml&entity=Package");

this.semanticRunnableFactory.createRunnable(GeneralViewEmptyTestProjectData.EDITING_CONTEXT,
(editingContext, executeEditingContextFunctionInput) -> {
Optional<Resource> optResource = this.getResource(editingContext, GeneralViewEmptyTestProjectData.SemanticIds.MODEL_ID);
assertThat(optResource).isPresent();
Resource resource = optResource.get();
assertThat(this.sysONResourceService.isImported(editingContext, resource)).isFalse();
return new ExecuteEditingContextFunctionSuccessPayload(executeEditingContextFunctionInput.id(), true);
}).run();
}

@DisplayName("GIVEN an empty SysML Project, WHEN a ViewUsage is created under the root Package, THEN a General View diagram is also created on this ViewUsage")
@Sql(scripts = { GeneralViewEmptyTestProjectData.SCRIPT_PATH }, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED))
@Sql(scripts = { "/scripts/cleanup.sql" }, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD, config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED))
@GivenSysONServer({GeneralViewEmptyTestProjectData.SCRIPT_PATH})
@Test
public void createGeneralViewDiagramAtTheSameTimeAsViewUsage() {
Optional<UUID> optionalSemanticData = new UUIDParser().parse(GeneralViewEmptyTestProjectData.EDITING_CONTEXT);
Expand Down Expand Up @@ -167,27 +95,8 @@ public void createGeneralViewDiagramAtTheSameTimeAsViewUsage() {

representationMetadatas = this.representationMetadataSearchService.findAllRepresentationMetadataBySemanticData(AggregateReference.to(optionalSemanticData.get()));
assertThat(representationMetadatas).hasSize(2)
.anySatisfy(mdt -> mdt.getLabel().equals("General View"))
.anySatisfy(mdt -> mdt.getLabel().equals("view2"));

}

private Optional<Resource> getResource(IEditingContext editingContext, String resourceId) {
Optional<Resource> result = Optional.empty();
var optionalEditingDomain = Optional.of(editingContext)
.filter(IEMFEditingContext.class::isInstance)
.map(IEMFEditingContext.class::cast)
.map(IEMFEditingContext::getDomain);

if (optionalEditingDomain.isPresent()) {
var editingDomain = optionalEditingDomain.get();
ResourceSet resourceSet = editingDomain.getResourceSet();
URI uri = new JSONResourceFactory().createResourceURI(GeneralViewEmptyTestProjectData.SemanticIds.MODEL_ID);
result = resourceSet.getResources().stream()
.filter(r -> r.getURI().equals(uri))
.findFirst();
}
return result;
.anySatisfy(mdt -> assertThat(mdt.getLabel()).isEqualTo("General View"))
.anySatisfy(mdt -> assertThat(mdt.getLabel()).isEqualTo("view2"));

}
}
Loading
Loading