Skip to content

Commit 1fbc6a1

Browse files
gcoutableAxelRICHARD
authored andcommitted
[2247] Allow creating timeslices & snapshots from Definition graphical nodes
Bug: #2247 Signed-off-by: Guillaume Coutable <guillaume.coutable@obeo.fr>
1 parent 0fac693 commit 1fbc6a1

10 files changed

Lines changed: 64 additions & 33 deletions

File tree

CHANGELOG.adoc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ Disabling the _Hide expression internals_ filter in the _Explorer_ view allows t
4545
One creates a `ConcernUsage` and another one creates `FramedConcernMembership`.
4646
- https://github.com/eclipse-syson/syson/issues/2097[#2097] [explorer] Add support for creating and editing exressions through their textual representation.
4747
This is currently supported on `Features` (e.g. `Attribute`), `Constraints` and `Transitions` (guard conditions) view new context menu actions (_Create expression_ and _Edit expression_) on the corresponding elements in the _Explorer_.
48+
- https://github.com/eclipse-syson/syson/issues/2247[#2247] [diagrams] Add the support for creating _timeslices/snapshots_ from the different kind of `OccurrenceDefiniton` graphical nodes.
49+
It leverages the selection dialog to either create an _occurrence timeslice/snapshot_, or the _usage timeslice/snapshot_ matching the `OccurrenceDefinition` on which the tool is applied.
4850

4951
== v2026.5.0
5052

backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVTimesliceSnapshotNodeCreationTests.java

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -152,11 +152,15 @@ private static Stream<Arguments> portionKingNodeParameters() {
152152

153153
private static Stream<Arguments> portionKindSelectionDialogTreeParameters() {
154154
return Stream.of(
155-
Arguments.of(SysmlPackage.eINSTANCE.getAllocationUsage(), GeneralViewWithTopNodesTestProjectData.GraphicalIds.ALLOCATION_USAGE_ID, GeneralViewWithTopNodesTestProjectData.SemanticIds.ALLOCATION_USAGE_ID),
156-
Arguments.of(SysmlPackage.eINSTANCE.getInterfaceUsage(), GeneralViewWithTopNodesTestProjectData.GraphicalIds.INTERFACE_USAGE_ID, GeneralViewWithTopNodesTestProjectData.SemanticIds.INTERFACE_USAGE_ID),
157-
Arguments.of(SysmlPackage.eINSTANCE.getItemUsage(), GeneralViewWithTopNodesTestProjectData.GraphicalIds.ITEM_USAGE_ID, GeneralViewWithTopNodesTestProjectData.SemanticIds.ITEM_USAGE_ID),
158-
Arguments.of(SysmlPackage.eINSTANCE.getOccurrenceUsage(), GeneralViewWithTopNodesTestProjectData.GraphicalIds.OCCURRENCE_USAGE_ID, GeneralViewWithTopNodesTestProjectData.SemanticIds.OCCURRENCE_USAGE_ID),
159-
Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), GeneralViewWithTopNodesTestProjectData.GraphicalIds.PART_USAGE_ID, GeneralViewWithTopNodesTestProjectData.SemanticIds.PART_USAGE_ID)
155+
Arguments.of(SysmlPackage.eINSTANCE.getAllocationDefinition(), SysmlPackage.eINSTANCE.getAllocationUsage(), GeneralViewWithTopNodesTestProjectData.GraphicalIds.ALLOCATION_DEFINITION_ID, GeneralViewWithTopNodesTestProjectData.SemanticIds.ALLOCATION_DEFINITION_ID),
156+
Arguments.of(SysmlPackage.eINSTANCE.getAllocationUsage(), SysmlPackage.eINSTANCE.getAllocationUsage(), GeneralViewWithTopNodesTestProjectData.GraphicalIds.ALLOCATION_USAGE_ID, GeneralViewWithTopNodesTestProjectData.SemanticIds.ALLOCATION_USAGE_ID),
157+
Arguments.of(SysmlPackage.eINSTANCE.getInterfaceUsage(), SysmlPackage.eINSTANCE.getInterfaceUsage(), GeneralViewWithTopNodesTestProjectData.GraphicalIds.INTERFACE_USAGE_ID, GeneralViewWithTopNodesTestProjectData.SemanticIds.INTERFACE_USAGE_ID),
158+
Arguments.of(SysmlPackage.eINSTANCE.getItemDefinition(), SysmlPackage.eINSTANCE.getItemUsage(), GeneralViewWithTopNodesTestProjectData.GraphicalIds.ITEM_DEFINITION_ID, GeneralViewWithTopNodesTestProjectData.SemanticIds.ITEM_DEFINITION_ID),
159+
Arguments.of(SysmlPackage.eINSTANCE.getItemUsage(), SysmlPackage.eINSTANCE.getItemUsage(), GeneralViewWithTopNodesTestProjectData.GraphicalIds.ITEM_USAGE_ID, GeneralViewWithTopNodesTestProjectData.SemanticIds.ITEM_USAGE_ID),
160+
Arguments.of(SysmlPackage.eINSTANCE.getOccurrenceDefinition(), SysmlPackage.eINSTANCE.getOccurrenceUsage(), GeneralViewWithTopNodesTestProjectData.GraphicalIds.OCCURRENCE_DEFINITION_ID, GeneralViewWithTopNodesTestProjectData.SemanticIds.OCCURRENCE_DEFINITION_ID),
161+
Arguments.of(SysmlPackage.eINSTANCE.getOccurrenceUsage(), SysmlPackage.eINSTANCE.getOccurrenceUsage(), GeneralViewWithTopNodesTestProjectData.GraphicalIds.OCCURRENCE_USAGE_ID, GeneralViewWithTopNodesTestProjectData.SemanticIds.OCCURRENCE_USAGE_ID),
162+
Arguments.of(SysmlPackage.eINSTANCE.getPartDefinition(), SysmlPackage.eINSTANCE.getPartUsage(), GeneralViewWithTopNodesTestProjectData.GraphicalIds.PART_DEFINITION_ID, GeneralViewWithTopNodesTestProjectData.SemanticIds.PART_DEFINITION_ID),
163+
Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), SysmlPackage.eINSTANCE.getPartUsage(), GeneralViewWithTopNodesTestProjectData.GraphicalIds.PART_USAGE_ID, GeneralViewWithTopNodesTestProjectData.SemanticIds.PART_USAGE_ID)
160164
).map(TestNameGenerator::namedArguments);
161165
};
162166

@@ -251,7 +255,7 @@ public void createSnapshotNodeOn(EClass parentEClass, String parentTargetObjectI
251255

252256
@ParameterizedTest
253257
@MethodSource("portionKindSelectionDialogTreeParameters")
254-
public void testCheckAvailableElementsInTimesliceSelectionDialog(EClass elementClass, String graphicalId, String semanticId) {
258+
public void testCheckAvailableElementsInTimesliceSelectionDialog(EClass elementClass, EClass expectedTimesliceEClass, String graphicalId, String semanticId) {
255259
var diagramDescription = this.givenDiagramDescription.getDiagramDescription(GeneralViewWithTopNodesTestProjectData.EDITING_CONTEXT_ID,
256260
SysONRepresentationDescriptionIdentifiers.GENERAL_VIEW_DIAGRAM_DESCRIPTION_ID);
257261
var diagramDescriptionIdProvider = new DiagramDescriptionIdProvider(diagramDescription, this.diagramIdProvider);
@@ -264,7 +268,7 @@ public void testCheckAvailableElementsInTimesliceSelectionDialog(EClass elementC
264268
Consumer<Object> initialTreeContentConsumer = assertRefreshedTreeThat(tree -> {
265269
assertThat(tree).isNotNull();
266270
assertThat(tree.getChildren()).size().isEqualTo(1);
267-
assertThat(tree.getChildren().getFirst().getId()).isEqualTo(identityService.getId(elementClass));
271+
assertThat(tree.getChildren().getFirst().getId()).isEqualTo(identityService.getId(expectedTimesliceEClass));
268272
});
269273

270274
StepVerifier.create(flux)
@@ -275,7 +279,7 @@ public void testCheckAvailableElementsInTimesliceSelectionDialog(EClass elementC
275279

276280
@ParameterizedTest
277281
@MethodSource("portionKindSelectionDialogTreeParameters")
278-
public void testCheckAvailableElementsInSnapshotSelectionDialog(EClass elementClass, String graphicalId, String semanticId) {
282+
public void testCheckAvailableElementsInSnapshotSelectionDialog(EClass elementClass, EClass expectedSnapshotEClass, String graphicalId, String semanticId) {
279283
var diagramDescription = this.givenDiagramDescription.getDiagramDescription(GeneralViewWithTopNodesTestProjectData.EDITING_CONTEXT_ID,
280284
SysONRepresentationDescriptionIdentifiers.GENERAL_VIEW_DIAGRAM_DESCRIPTION_ID);
281285
var diagramDescriptionIdProvider = new DiagramDescriptionIdProvider(diagramDescription, this.diagramIdProvider);
@@ -288,7 +292,7 @@ public void testCheckAvailableElementsInSnapshotSelectionDialog(EClass elementCl
288292
Consumer<Object> initialTreeContentConsumer = assertRefreshedTreeThat(tree -> {
289293
assertThat(tree).isNotNull();
290294
assertThat(tree.getChildren()).size().isEqualTo(1);
291-
assertThat(tree.getChildren().getFirst().getId()).isEqualTo(identityService.getId(elementClass));
295+
assertThat(tree.getChildren().getFirst().getId()).isEqualTo(identityService.getId(expectedSnapshotEClass));
292296
});
293297

294298
StepVerifier.create(flux)

backend/application/syson-application/src/test/java/org/eclipse/syson/application/data/GeneralViewWithTopNodesTestProjectData.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ public static class GraphicalIds {
3030

3131
public static final String ACTION_USAGE_ID = "61aaf64a-4fbc-356e-ba73-4bd47b386989";
3232

33+
public static final String ALLOCATION_DEFINITION_ID = "304ed5e0-b3e2-3399-b110-8836d4b27127";
34+
3335
public static final String ALLOCATION_USAGE_ID = "361506fb-2a1d-3edc-be2d-8cd60a235f53";
3436

3537
public static final String ATTRIBUTE_USAGE_ID = "7b8e6835-c563-35cd-8991-e2f894fc2139";
@@ -50,6 +52,8 @@ public static class GraphicalIds {
5052

5153
public static final String PART_USAGE_ID = "4c4fe0d5-4974-377e-9113-9ab022c75f8c";
5254

55+
public static final String OCCURRENCE_DEFINITION_ID = "af3a9437-85c6-3bce-a62e-20aa80f277f4";
56+
5357
public static final String OCCURRENCE_USAGE_ID = "47653014-87d1-3dc6-856b-72454aa93154";
5458

5559
public static final String REQUIREMENT_DEFINITION_ID = "b83f2b54-1602-382d-beb1-c500e08a8684";

backend/services/syson-model-services/src/main/java/org/eclipse/syson/model/services/aql/ModelMutationAQLService.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
import org.eclipse.syson.sysml.Documentation;
2222
import org.eclipse.syson.sysml.Element;
2323
import org.eclipse.syson.sysml.Membership;
24-
import org.eclipse.syson.sysml.OccurrenceUsage;
2524
import org.eclipse.syson.sysml.PartUsage;
2625
import org.eclipse.syson.sysml.RequirementUsage;
2726
import org.eclipse.syson.sysml.Type;
@@ -95,9 +94,9 @@ public Element createSatisfyRequirement(Element self, Element selectedObject) {
9594
}
9695

9796
/**
98-
* {@link MetamodelMutationElementService#createOccurrenceInOccurrence(OccurrenceUsage, EClass)}.
97+
* {@link MetamodelMutationElementService#createOccurrenceInOccurrence(Type, EClass)}.
9998
*/
100-
public EObject createOccurrenceInOccurrence(OccurrenceUsage container, EClass eClass) {
99+
public EObject createOccurrenceInOccurrence(Type container, EClass eClass) {
101100
return this.metamodelElementMutationService.createOccurrenceInOccurrence(container, eClass);
102101
}
103102

backend/services/syson-sysml-metamodel-services/src/main/java/org/eclipse/syson/sysml/metamodel/services/MetamodelMutationElementService.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import org.eclipse.syson.sysml.InterfaceUsage;
3333
import org.eclipse.syson.sysml.Membership;
3434
import org.eclipse.syson.sysml.Namespace;
35+
import org.eclipse.syson.sysml.OccurrenceDefinition;
3536
import org.eclipse.syson.sysml.OccurrenceUsage;
3637
import org.eclipse.syson.sysml.Package;
3738
import org.eclipse.syson.sysml.PortUsage;
@@ -212,17 +213,17 @@ public InterfaceUsage createInterfaceUsage(PortUsage source, PortUsage target, E
212213
}
213214

214215
/**
215-
* Creates an instance of {@code eClass} in the given {@link OccurrenceUsage} container.
216-
* <p>It returns {@code null} if the {@code eClass} is not assignable to {@link OccurrenceUsage}</p>
216+
* Creates an instance of {@code eClass} in the given {@link Type} container if it is an {@link OccurrenceUsage} or an {@link OccurrenceDefinition}.
217+
* <p>It returns {@code null} if the {@code eClass} is not assignable to {@link OccurrenceUsage} or the {@code container} is not assignable to either @link OccurrenceUsage} or {@link OccurrenceDefinition}</p>
217218
*
218219
* @param container
219-
* the {@link OccurrenceUsage} container
220+
* the {@link Type} container
220221
* @param eClass
221222
* the {@link EClass} assignable to {@link OccurrenceUsage} to instantiate
222-
* @return a new {@link EClass} instantiated {@link EObject}, {@code null} if the {@code eClass} is not assignable to {@link OccurrenceUsage}
223+
* @return a new {@link EClass} instantiated {@link EObject}, {@code null} if the {@code eClass} is not assignable to {@link OccurrenceUsage} and the {@code container} is not assignable to either {@link OccurrenceUsage} or {@link OccurrenceDefinition}
223224
*/
224-
public EObject createOccurrenceInOccurrence(OccurrenceUsage container, EClass eClass) {
225-
if (SysmlPackage.eINSTANCE.getOccurrenceUsage().isSuperTypeOf(eClass)) {
225+
public EObject createOccurrenceInOccurrence(Type container, EClass eClass) {
226+
if ((container instanceof OccurrenceUsage || container instanceof OccurrenceDefinition) && SysmlPackage.eINSTANCE.getOccurrenceUsage().isSuperTypeOf(eClass)) {
226227
var membership = SysmlFactory.eINSTANCE.createFeatureMembership();
227228
var timeSlice = (OccurrenceUsage) SysmlFactory.eINSTANCE.create(eClass);
228229
membership.getOwnedRelatedElement().add(timeSlice);

backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/services/ViewToolService.java

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,17 @@
4141
import org.eclipse.syson.sysml.ActionDefinition;
4242
import org.eclipse.syson.sysml.ActionUsage;
4343
import org.eclipse.syson.sysml.ActorMembership;
44+
import org.eclipse.syson.sysml.AllocationDefinition;
4445
import org.eclipse.syson.sysml.CaseDefinition;
4546
import org.eclipse.syson.sysml.CaseUsage;
4647
import org.eclipse.syson.sysml.Comment;
48+
import org.eclipse.syson.sysml.ConnectionDefinition;
49+
import org.eclipse.syson.sysml.ConstraintDefinition;
4750
import org.eclipse.syson.sysml.Definition;
4851
import org.eclipse.syson.sysml.Documentation;
4952
import org.eclipse.syson.sysml.Element;
5053
import org.eclipse.syson.sysml.FeatureMembership;
54+
import org.eclipse.syson.sysml.ItemDefinition;
5155
import org.eclipse.syson.sysml.Membership;
5256
import org.eclipse.syson.sysml.ObjectiveMembership;
5357
import org.eclipse.syson.sysml.OwningMembership;
@@ -425,19 +429,6 @@ public List<Object> getNamespaceImportSelectionDialogElements(IEditingContext ed
425429
* {@link Package}.
426430
*/
427431
public List<? extends Object> getNamespaceImportSelectionDialogChildren(Object selectionDialogTreeElement, IEditingContext editingContext, List<String> expandedIds) {
428-
// List<Package> result = new ArrayList<>();
429-
// if (self instanceof Resource resource) {
430-
// resource.getContents().stream()
431-
// .filter(Element.class::isInstance)
432-
// .map(Element.class::cast)
433-
// .forEach(element -> result.addAll(this.findClosestPackageInChildren(element)));
434-
// } else if (self instanceof Package packageElement) {
435-
// packageElement.getOwnedRelationship().stream()
436-
// .filter(Membership.class::isInstance)
437-
// .map(Membership.class::cast)
438-
// .forEach(membership -> result.addAll(this.findClosestPackageInChildren(membership)));
439-
// }
440-
// return result;
441432
return this.getChildrenWithInstancesOf(selectionDialogTreeElement, editingContext, expandedIds, List.of(SysmlPackage.eINSTANCE.getPackage()));
442433

443434
}
@@ -667,6 +658,25 @@ public List<? extends Object> getSelectionDialogChildren(Object selectionDialogT
667658
return this.getChildrenWithInstancesOf(selectionDialogTreeElement, editingContext, expandedIds, candidates);
668659
}
669660

661+
/**
662+
* Return the {@code Usage} {@link EClass} corresponding to the given {@link Type}.
663+
*
664+
* @param type
665+
* the type we want the {@code Usage} {@link EClass}
666+
* @return the {@code Usage} {@link EClass} corresponding to the given {@link Type}
667+
*/
668+
public EClass getPortionKindSelectionDialogElement(Type type) {
669+
return switch (type) {
670+
case AllocationDefinition a -> SysmlPackage.eINSTANCE.getAllocationUsage();
671+
case ConnectionDefinition c -> SysmlPackage.eINSTANCE.getConnectionUsage();
672+
case PartDefinition p -> SysmlPackage.eINSTANCE.getPartUsage();
673+
case ConstraintDefinition c -> SysmlPackage.eINSTANCE.getConstraintUsage();
674+
case ItemDefinition i -> SysmlPackage.eINSTANCE.getItemUsage();
675+
case Usage u -> u.eClass();
676+
default -> SysmlPackage.eINSTANCE.getOccurrenceUsage();
677+
};
678+
}
679+
670680
protected List<Object> getAllResourcesWithInstancesOf(IEditingContext editingContext, List<EClassifier> eClassifiers) {
671681
var elementsContainingClassifiers = new ArrayList<>();
672682
List<Object> elements = this.sysONExplorerService.getElements(editingContext, List.of());

backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/tools/OccurrenceUsageSnapshotNodeToolProvider.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.eclipse.sirius.components.view.diagram.SelectionDialogTreeDescription;
2525
import org.eclipse.sirius.components.view.emf.diagram.ViewDiagramDescriptionConverter;
2626
import org.eclipse.syson.diagram.common.view.services.ViewCreateService;
27+
import org.eclipse.syson.diagram.common.view.services.ViewToolService;
2728
import org.eclipse.syson.diagram.services.aql.DiagramMutationAQLService;
2829
import org.eclipse.syson.sysml.PortionKind;
2930
import org.eclipse.syson.sysml.SysmlPackage;
@@ -104,7 +105,7 @@ private DialogDescription getDescriptionDialog() {
104105

105106
private SelectionDialogTreeDescription getDialogTreeDescriptionDialog() {
106107
return this.diagramBuilderHelper.newSelectionDialogTreeDescription()
107-
.elementsExpression(AQLConstants.AQL_SELF + ".eClass()")
108+
.elementsExpression(ServiceMethod.of0(ViewToolService::getPortionKindSelectionDialogElement).aqlSelf())
108109
.isSelectableExpression(AQLConstants.AQL_TRUE)
109110
.build();
110111
}

backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/tools/OccurrenceUsageTimesliceNodeToolProvider.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.eclipse.sirius.components.view.diagram.SelectionDialogTreeDescription;
2525
import org.eclipse.sirius.components.view.emf.diagram.ViewDiagramDescriptionConverter;
2626
import org.eclipse.syson.diagram.common.view.services.ViewCreateService;
27+
import org.eclipse.syson.diagram.common.view.services.ViewToolService;
2728
import org.eclipse.syson.diagram.services.aql.DiagramMutationAQLService;
2829
import org.eclipse.syson.model.services.aql.ModelMutationAQLService;
2930
import org.eclipse.syson.sysml.PortionKind;
@@ -105,7 +106,7 @@ private DialogDescription getDescriptionDialog() {
105106

106107
private SelectionDialogTreeDescription getDialogTreeDescriptionDialog() {
107108
return this.diagramBuilderHelper.newSelectionDialogTreeDescription()
108-
.elementsExpression(AQLConstants.AQL_SELF + ".eClass()")
109+
.elementsExpression(ServiceMethod.of0(ViewToolService::getPortionKindSelectionDialogElement).aqlSelf())
109110
.isSelectableExpression(AQLConstants.AQL_TRUE)
110111
.build();
111112
}

backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/services/SDVNodeToolSectionSwitch.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -402,6 +402,8 @@ public List<NodeToolSection> caseInterfaceDefinition(InterfaceDefinition object)
402402
@Override
403403
public List<NodeToolSection> caseItemDefinition(ItemDefinition object) {
404404
var sections = this.toolDescriptionService.createDefaultNodeToolSections();
405+
this.toolDescriptionService.addNodeTool(sections, ToolConstants.BEHAVIOR, new OccurrenceUsageTimesliceNodeToolProvider().create(cache));
406+
this.toolDescriptionService.addNodeTool(sections, ToolConstants.BEHAVIOR, new OccurrenceUsageSnapshotNodeToolProvider().create(cache));
405407
this.toolDescriptionService.addNodeTool(sections, ToolConstants.STRUCTURE,
406408
this.toolDescriptionService.createNodeTool(this.getNodeDescription(SysmlPackage.eINSTANCE.getItemUsage()), SysmlPackage.eINSTANCE.getItemUsage()));
407409
this.toolDescriptionService.addNodeTool(sections, ToolConstants.STRUCTURE, this.toolDescriptionService
@@ -456,6 +458,8 @@ public List<NodeToolSection> caseOccurrenceDefinition(OccurrenceDefinition objec
456458
var sections = this.toolDescriptionService.createDefaultNodeToolSections();
457459
this.toolDescriptionService.addNodeTool(sections, ToolConstants.STRUCTURE,
458460
this.toolDescriptionService.createNodeTool(this.getNodeDescription(SysmlPackage.eINSTANCE.getPartUsage()), SysmlPackage.eINSTANCE.getPartUsage()));
461+
this.toolDescriptionService.addNodeTool(sections, ToolConstants.BEHAVIOR, new OccurrenceUsageTimesliceNodeToolProvider().create(cache));
462+
this.toolDescriptionService.addNodeTool(sections, ToolConstants.BEHAVIOR, new OccurrenceUsageSnapshotNodeToolProvider().create(cache));
459463

460464
this.toolDescriptionService.addNodeTool(sections, ToolConstants.VIEW_AS,
461465
new ViewNodeAsToolProvider(AQLUtils.aqlString(StandardDiagramsConstants.GV_QN), StandardDiagramsConstants.GV).create(this.cache));
@@ -528,6 +532,8 @@ public List<NodeToolSection> casePartDefinition(PartDefinition object) {
528532
new ExhibitStateNodeToolProvider(false).create(this.cache));
529533
this.toolDescriptionService.addNodeTool(sections, ToolConstants.BEHAVIOR,
530534
new ExhibitStateNodeToolProvider(true).create(this.cache));
535+
this.toolDescriptionService.addNodeTool(sections, ToolConstants.BEHAVIOR, new OccurrenceUsageTimesliceNodeToolProvider().create(cache));
536+
this.toolDescriptionService.addNodeTool(sections, ToolConstants.BEHAVIOR, new OccurrenceUsageSnapshotNodeToolProvider().create(cache));
531537

532538
this.createToolsForCompartmentItems(object, sections, this.cache);
533539

0 commit comments

Comments
 (0)