Skip to content

Commit e2a7e7f

Browse files
committed
[2043] Ensure user libraries stays under User library folder
Bug: #2043 Signed-off-by: Guillaume Coutable <guillaume.coutable@obeo.fr> # Conflicts: # CHANGELOG.adoc
1 parent c80f960 commit e2a7e7f

File tree

10 files changed

+259
-111
lines changed

10 files changed

+259
-111
lines changed

CHANGELOG.adoc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ Now the _end_ keyword is not displayed anymore in the label of these graphical n
101101
- 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
102102
- 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.
103103
- 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.
104+
- 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.
104105

105106
=== Improvements
106107

backend/application/syson-application-configuration/src/main/java/org/eclipse/syson/application/services/SysMLv2EditService.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@
5353
import org.eclipse.syson.sysml.SysmlPackage;
5454
import org.eclipse.syson.sysml.ViewUsage;
5555
import org.eclipse.syson.sysml.metamodel.services.ElementInitializerSwitch;
56-
import org.eclipse.syson.sysml.util.ElementUtil;
5756
import org.eclipse.syson.util.GetIntermediateContainerCreationSwitch;
5857
import org.eclipse.syson.util.SysMLMetamodelHelper;
5958
import org.eclipse.syson.util.SysONRepresentationDescriptionIdentifiers;
@@ -199,9 +198,6 @@ public Optional<Object> createChild(IEditingContext editingContext, Object objec
199198
} else if (container instanceof Membership membership && eObject instanceof Element newElement) {
200199
membership.getOwnedRelatedElement().add(newElement);
201200
}
202-
// Updating an element in an imported model removes its imported flag. This ensures that creating a library
203-
// model from an imported SysML file does not make it an imported user library.
204-
ElementUtil.setIsImported(eObject.eResource(), false);
205201
new ElementInitializerSwitch().doSwitch(eObject);
206202
if (eObject instanceof ViewUsage viewUsage) {
207203
this.createDiagram(editingContext, viewUsage);

backend/application/syson-application-configuration/src/main/java/org/eclipse/syson/application/services/SysONReadOnlyObjectPredicateDelegate.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*******************************************************************************
2-
* Copyright (c) 2025 Obeo.
2+
* Copyright (c) 2025, 2026 Obeo.
33
* This program and the accompanying materials
44
* are made available under the terms of the Eclipse Public License v2.0
55
* which accompanies this distribution, and is available at
@@ -14,6 +14,7 @@
1414

1515
import org.eclipse.emf.ecore.EAnnotation;
1616
import org.eclipse.emf.ecore.resource.Resource;
17+
import org.eclipse.sirius.components.core.api.IEditingContext;
1718
import org.eclipse.sirius.components.core.api.IReadOnlyObjectPredicate;
1819
import org.eclipse.sirius.components.core.api.IReadOnlyObjectPredicateDelegate;
1920
import org.eclipse.sirius.components.emf.ResourceMetadataAdapter;
@@ -26,10 +27,10 @@
2627
* <p>
2728
* It ensures that a {@link Resource}, an {@link EAnnotation} or a {@link Element SysML element} is considered read-only
2829
* by the {@link IReadOnlyObjectPredicate} implementation (used for the <i>Explorer</i> and <i>Details</i> views) when
29-
* it is (or belongs to) a {@link Resource} matching at least one of the following criterias:
30+
* it is (or belongs to) a {@link Resource} matching at least one of the following criteria:
3031
* <ul>
3132
* <li>From the SysML and KerML standard libraries</li>
32-
* <li>From an {@link org.eclipse.syson.services.api.ISysONResourceService#isImported(Resource) imported resource}
33+
* <li>From an {@link org.eclipse.syson.services.api.ISysONResourceService#isImported(IEditingContext, Resource) read-only imported resource}
3334
* containing {@link org.eclipse.syson.sysml.LibraryPackage libraries}.</li>
3435
* </ul>
3536
*

backend/application/syson-application/src/test/java/org/eclipse/syson/application/controller/objects/ObjectCreationTests.java

Lines changed: 4 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -19,37 +19,22 @@
1919
import java.util.Optional;
2020
import java.util.UUID;
2121

22-
import org.eclipse.emf.common.util.URI;
23-
import org.eclipse.emf.ecore.resource.Resource;
24-
import org.eclipse.emf.ecore.resource.ResourceSet;
2522
import org.eclipse.sirius.components.collaborative.dto.CreateChildInput;
2623
import org.eclipse.sirius.components.collaborative.dto.CreateChildSuccessPayload;
27-
import org.eclipse.sirius.components.collaborative.dto.CreateRootObjectInput;
28-
import org.eclipse.sirius.components.collaborative.dto.CreateRootObjectSuccessPayload;
29-
import org.eclipse.sirius.components.core.api.IEditingContext;
30-
import org.eclipse.sirius.components.emf.services.JSONResourceFactory;
31-
import org.eclipse.sirius.components.emf.services.api.IEMFEditingContext;
32-
import org.eclipse.sirius.components.graphql.tests.ExecuteEditingContextFunctionSuccessPayload;
3324
import org.eclipse.sirius.web.application.UUIDParser;
3425
import org.eclipse.sirius.web.domain.boundedcontexts.representationdata.services.api.IRepresentationMetadataSearchService;
3526
import org.eclipse.sirius.web.tests.graphql.CreateChildMutationRunner;
36-
import org.eclipse.sirius.web.tests.graphql.CreateRootObjectMutationRunner;
3727
import org.eclipse.sirius.web.tests.services.api.IGivenInitialServerState;
3828
import org.eclipse.syson.AbstractIntegrationTests;
29+
import org.eclipse.syson.GivenSysONServer;
3930
import org.eclipse.syson.application.data.GeneralViewEmptyTestProjectData;
4031
import org.eclipse.syson.application.services.SysMLv2EditService;
41-
import org.eclipse.syson.services.SemanticRunnableFactory;
42-
import org.eclipse.syson.services.api.ISysONResourceService;
43-
import org.eclipse.syson.sysml.SysmlPackage;
44-
import org.eclipse.syson.sysml.util.ElementUtil;
4532
import org.junit.jupiter.api.BeforeEach;
4633
import org.junit.jupiter.api.DisplayName;
4734
import org.junit.jupiter.api.Test;
4835
import org.springframework.beans.factory.annotation.Autowired;
4936
import org.springframework.boot.test.context.SpringBootTest;
5037
import org.springframework.data.jdbc.core.mapping.AggregateReference;
51-
import org.springframework.test.context.jdbc.Sql;
52-
import org.springframework.test.context.jdbc.SqlConfig;
5338
import org.springframework.test.context.transaction.TestTransaction;
5439
import org.springframework.transaction.annotation.Transactional;
5540

@@ -65,18 +50,9 @@ public class ObjectCreationTests extends AbstractIntegrationTests {
6550
@Autowired
6651
private IGivenInitialServerState givenInitialServerState;
6752

68-
@Autowired
69-
private CreateRootObjectMutationRunner createRootObjectMutationRunner;
70-
7153
@Autowired
7254
private CreateChildMutationRunner createChildMutationRunner;
7355

74-
@Autowired
75-
private SemanticRunnableFactory semanticRunnableFactory;
76-
77-
@Autowired
78-
private ISysONResourceService sysONResourceService;
79-
8056
@Autowired
8157
private IRepresentationMetadataSearchService representationMetadataSearchService;
8258

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

88-
@Test
89-
@DisplayName("GIVEN an imported document, WHEN a root object is created, THEN it is created properly and the document is not imported anymore")
90-
@Sql(scripts = { GeneralViewEmptyTestProjectData.SCRIPT_PATH }, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED))
91-
@Sql(scripts = { "/scripts/cleanup.sql" }, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD, config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED))
92-
public void givenImportedDocumentWhenRootObjectIsCreatedThenItIsCreatedProperlyAndDocumentIsNotImported() {
93-
this.semanticRunnableFactory.createRunnable(GeneralViewEmptyTestProjectData.EDITING_CONTEXT,
94-
(editingContext, executeEditingContextFunctionInput) -> {
95-
Optional<Resource> optResource = this.getResource(editingContext, GeneralViewEmptyTestProjectData.SemanticIds.MODEL_ID);
96-
assertThat(optResource).isPresent();
97-
Resource resource = optResource.get();
98-
ElementUtil.setIsImported(resource, true);
99-
return new ExecuteEditingContextFunctionSuccessPayload(executeEditingContextFunctionInput.id(), true);
100-
}).run();
101-
102-
var input = new CreateRootObjectInput(
103-
UUID.randomUUID(),
104-
GeneralViewEmptyTestProjectData.EDITING_CONTEXT,
105-
UUID.fromString(GeneralViewEmptyTestProjectData.SemanticIds.MODEL_ID),
106-
SysmlPackage.eNS_URI,
107-
"SysMLv2EditService-Package");
108-
109-
var result = this.createRootObjectMutationRunner.run(input);
110-
TestTransaction.flagForCommit();
111-
TestTransaction.end();
112-
113-
String typename = JsonPath.read(result.data(), "$.data.createRootObject.__typename");
114-
assertThat(typename).isEqualTo(CreateRootObjectSuccessPayload.class.getSimpleName());
115-
116-
String objectId = JsonPath.read(result.data(), "$.data.createRootObject.object.id");
117-
assertThat(objectId).isNotBlank();
118-
119-
String objectLabel = JsonPath.read(result.data(), "$.data.createRootObject.object.label");
120-
assertThat(objectLabel).isNotBlank();
121-
122-
String objectKind = JsonPath.read(result.data(), "$.data.createRootObject.object.kind");
123-
assertThat(objectKind).isEqualTo("siriusComponents://semantic?domain=sysml&entity=Package");
124-
125-
this.semanticRunnableFactory.createRunnable(GeneralViewEmptyTestProjectData.EDITING_CONTEXT,
126-
(editingContext, executeEditingContextFunctionInput) -> {
127-
Optional<Resource> optResource = this.getResource(editingContext, GeneralViewEmptyTestProjectData.SemanticIds.MODEL_ID);
128-
assertThat(optResource).isPresent();
129-
Resource resource = optResource.get();
130-
assertThat(this.sysONResourceService.isImported(editingContext, resource)).isFalse();
131-
return new ExecuteEditingContextFunctionSuccessPayload(executeEditingContextFunctionInput.id(), true);
132-
}).run();
133-
}
134-
13564
@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")
136-
@Sql(scripts = { GeneralViewEmptyTestProjectData.SCRIPT_PATH }, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED))
137-
@Sql(scripts = { "/scripts/cleanup.sql" }, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD, config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED))
65+
@GivenSysONServer({GeneralViewEmptyTestProjectData.SCRIPT_PATH})
13866
@Test
13967
public void createGeneralViewDiagramAtTheSameTimeAsViewUsage() {
14068
Optional<UUID> optionalSemanticData = new UUIDParser().parse(GeneralViewEmptyTestProjectData.EDITING_CONTEXT);
@@ -167,27 +95,8 @@ public void createGeneralViewDiagramAtTheSameTimeAsViewUsage() {
16795

16896
representationMetadatas = this.representationMetadataSearchService.findAllRepresentationMetadataBySemanticData(AggregateReference.to(optionalSemanticData.get()));
16997
assertThat(representationMetadatas).hasSize(2)
170-
.anySatisfy(mdt -> mdt.getLabel().equals("General View"))
171-
.anySatisfy(mdt -> mdt.getLabel().equals("view2"));
172-
173-
}
174-
175-
private Optional<Resource> getResource(IEditingContext editingContext, String resourceId) {
176-
Optional<Resource> result = Optional.empty();
177-
var optionalEditingDomain = Optional.of(editingContext)
178-
.filter(IEMFEditingContext.class::isInstance)
179-
.map(IEMFEditingContext.class::cast)
180-
.map(IEMFEditingContext::getDomain);
181-
182-
if (optionalEditingDomain.isPresent()) {
183-
var editingDomain = optionalEditingDomain.get();
184-
ResourceSet resourceSet = editingDomain.getResourceSet();
185-
URI uri = new JSONResourceFactory().createResourceURI(GeneralViewEmptyTestProjectData.SemanticIds.MODEL_ID);
186-
result = resourceSet.getResources().stream()
187-
.filter(r -> r.getURI().equals(uri))
188-
.findFirst();
189-
}
190-
return result;
98+
.anySatisfy(mdt -> assertThat(mdt.getLabel()).isEqualTo("General View"))
99+
.anySatisfy(mdt -> assertThat(mdt.getLabel()).isEqualTo("view2"));
191100

192101
}
193102
}

0 commit comments

Comments
 (0)