From d96e16d3b0e0907074377b671e4a0bb0d8daf5dc Mon Sep 17 00:00:00 2001
From: Lars Johansson <lars.johansson@ess.eu>
Date: Wed, 14 Dec 2022 11:16:22 +0100
Subject: [PATCH] Update handling of mnemonic path

Mnemonic path is ambiguous if considered in past.
Therefore not show mnemonic path for history of structure.
Show mnemonic path if latest and approved status.
---
 .../names/service/StructuresService.java      |  81 ++++----
 .../names/util/StructureElementUtil.java      | 192 ++++++++++++------
 2 files changed, 162 insertions(+), 111 deletions(-)

diff --git a/src/main/java/org/openepics/names/service/StructuresService.java b/src/main/java/org/openepics/names/service/StructuresService.java
index e94bbf06..96497f68 100644
--- a/src/main/java/org/openepics/names/service/StructuresService.java
+++ b/src/main/java/org/openepics/names/service/StructuresService.java
@@ -151,9 +151,6 @@ public class StructuresService {
 
         LOGGER.log(Level.FINE, "createStructures, structureElements.size:        {0}", Utilities.getSize(structureElements));
 
-        // initiate holder of containers for system and device structure content, for performance reasons
-        HolderSystemDeviceStructure holder = new HolderSystemDeviceStructure(holderIRepositories);
-
         // do
         Date requested = new Date();
         String requestedBy = TextUtil.TEST_WHO;
@@ -181,7 +178,7 @@ public class StructuresService {
                 holderRepositories.getSystemGroupRepository().createSystemGroup(systemGroup);
 
                 // add
-                createdStructureElements.add(StructureElementUtil.getStructureElementRequested(systemGroup, holder));
+                createdStructureElements.add(StructureElementUtil.getStructureElementRequested(systemGroup));
             } else if (Type.SYSTEM.equals(structureElement.getType())) {
                 // create
                 System system = new System(uuid, structureElement.getParent(),
@@ -191,7 +188,7 @@ public class StructuresService {
                 holderRepositories.getSystemRepository().createSystem(system);
 
                 // add
-                createdStructureElements.add(StructureElementUtil.getStructureElementRequested(system, holder));
+                createdStructureElements.add(StructureElementUtil.getStructureElementRequested(system));
             } else if (Type.SUBSYSTEM.equals(structureElement.getType())) {
                 // create
                 Subsystem subsystem = new Subsystem(uuid, structureElement.getParent(),
@@ -201,7 +198,7 @@ public class StructuresService {
                 holderRepositories.getSubsystemRepository().createSubsystem(subsystem);
 
                 // add
-                createdStructureElements.add(StructureElementUtil.getStructureElementRequested(subsystem, holder));
+                createdStructureElements.add(StructureElementUtil.getStructureElementRequested(subsystem));
             } else if (Type.DISCIPLINE.equals(structureElement.getType())) {
                 // create
                 Discipline discipline = new Discipline(uuid,
@@ -211,7 +208,7 @@ public class StructuresService {
                 holderRepositories.getDisciplineRepository().createDiscipline(discipline);
 
                 // add
-                createdStructureElements.add(StructureElementUtil.getStructureElementRequested(discipline, holder));
+                createdStructureElements.add(StructureElementUtil.getStructureElementRequested(discipline));
             } else if (Type.DEVICEGROUP.equals(structureElement.getType())) {
                 // note rules for mnemonic for device group
 
@@ -223,7 +220,7 @@ public class StructuresService {
                 holderRepositories.getDeviceGroupRepository().createDeviceGroup(deviceGroup);
 
                 // add
-                createdStructureElements.add(StructureElementUtil.getStructureElementRequested(deviceGroup, holder));
+                createdStructureElements.add(StructureElementUtil.getStructureElementRequested(deviceGroup));
             } else if (Type.DEVICETYPE.equals(structureElement.getType())) {
                 // create
                 DeviceType deviceType = new DeviceType(uuid, structureElement.getParent(),
@@ -233,7 +230,7 @@ public class StructuresService {
                 holderRepositories.getDeviceTypeRepository().createDeviceType(deviceType);
 
                 // add
-                createdStructureElements.add(StructureElementUtil.getStructureElementRequested(deviceType, holder));
+                createdStructureElements.add(StructureElementUtil.getStructureElementRequested(deviceType));
             }
         }
 
@@ -811,9 +808,6 @@ public class StructuresService {
 
         LOGGER.log(Level.FINE, "updateStructures, structureElements.size:        {0}", Utilities.getSize(structureElements));
 
-        // initiate holder of containers for system and device structure content, for performance reasons
-        HolderSystemDeviceStructure holder = new HolderSystemDeviceStructure(holderIRepositories);
-
         // do
         Date requested = new Date();
         String requestedBy = TextUtil.TEST_WHO;
@@ -841,7 +835,7 @@ public class StructuresService {
                 holderRepositories.getSystemGroupRepository().createSystemGroup(systemGroup);
 
                 // add
-                updatedStructureElements.add(StructureElementUtil.getStructureElementRequested(systemGroup, holder));
+                updatedStructureElements.add(StructureElementUtil.getStructureElementRequested(systemGroup));
             } else if (Type.SYSTEM.equals(structureElement.getType())) {
                 // create
                 System system = new System(uuid, structureElement.getParent(),
@@ -851,7 +845,7 @@ public class StructuresService {
                 holderRepositories.getSystemRepository().createSystem(system);
 
                 // add
-                updatedStructureElements.add(StructureElementUtil.getStructureElementRequested(system, holder));
+                updatedStructureElements.add(StructureElementUtil.getStructureElementRequested(system));
             } else if (Type.SUBSYSTEM.equals(structureElement.getType())) {
                 // create
                 Subsystem subsystem = new Subsystem(uuid, structureElement.getParent(),
@@ -861,7 +855,7 @@ public class StructuresService {
                 holderRepositories.getSubsystemRepository().createSubsystem(subsystem);
 
                 // add
-                updatedStructureElements.add(StructureElementUtil.getStructureElementRequested(subsystem, holder));
+                updatedStructureElements.add(StructureElementUtil.getStructureElementRequested(subsystem));
             } else if (Type.DISCIPLINE.equals(structureElement.getType())) {
                 // create
                 Discipline discipline = new Discipline(uuid,
@@ -871,7 +865,7 @@ public class StructuresService {
                 holderRepositories.getDisciplineRepository().createDiscipline(discipline);
 
                 // add
-                updatedStructureElements.add(StructureElementUtil.getStructureElementRequested(discipline, holder));
+                updatedStructureElements.add(StructureElementUtil.getStructureElementRequested(discipline));
             } else if (Type.DEVICEGROUP.equals(structureElement.getType())) {
                 // note rules for mnemonic for device group
 
@@ -883,7 +877,7 @@ public class StructuresService {
                 holderRepositories.getDeviceGroupRepository().createDeviceGroup(deviceGroup);
 
                 // add
-                updatedStructureElements.add(StructureElementUtil.getStructureElementRequested(deviceGroup, holder));
+                updatedStructureElements.add(StructureElementUtil.getStructureElementRequested(deviceGroup));
             } else if (Type.DEVICETYPE.equals(structureElement.getType())) {
                 // create
                 DeviceType deviceType = new DeviceType(uuid, structureElement.getParent(),
@@ -893,7 +887,7 @@ public class StructuresService {
                 holderRepositories.getDeviceTypeRepository().createDeviceType(deviceType);
 
                 // add
-                updatedStructureElements.add(StructureElementUtil.getStructureElementRequested(deviceType, holder));
+                updatedStructureElements.add(StructureElementUtil.getStructureElementRequested(deviceType));
             }
         }
 
@@ -918,9 +912,6 @@ public class StructuresService {
 
         LOGGER.log(Level.FINE, "deleteStructures, structureElements.size:        {0}", Utilities.getSize(structureElements));
 
-        // initiate holder of containers for system and device structure content, for performance reasons
-        HolderSystemDeviceStructure holder = new HolderSystemDeviceStructure(holderIRepositories);
-
         // do
         Date requested = new Date();
         String requestedBy = TextUtil.TEST_WHO;
@@ -944,7 +935,7 @@ public class StructuresService {
                 holderRepositories.getSystemGroupRepository().createSystemGroup(systemGroup);
 
                 // add
-                deletedStructureElements.add(StructureElementUtil.getStructureElementRequested(systemGroup, holder));
+                deletedStructureElements.add(StructureElementUtil.getStructureElementRequested(systemGroup));
             } else if (Type.SYSTEM.equals(structureElement.getType())) {
                 // find
                 List<System> systems = holderRepositories.getSystemRepository().readSystems(Status.APPROVED, Boolean.FALSE, queryValue, null, null, null, null, null, null);
@@ -961,7 +952,7 @@ public class StructuresService {
                 holderRepositories.getSystemRepository().createSystem(system);
 
                 // add
-                deletedStructureElements.add(StructureElementUtil.getStructureElementRequested(system, holder));
+                deletedStructureElements.add(StructureElementUtil.getStructureElementRequested(system));
             } else if (Type.SUBSYSTEM.equals(structureElement.getType())) {
                 // find
                 List<Subsystem> subsystems = holderRepositories.getSubsystemRepository().readSubsystems(Status.APPROVED, Boolean.FALSE, queryValue, null, null, null, null, null, null);
@@ -978,7 +969,7 @@ public class StructuresService {
                 holderRepositories.getSubsystemRepository().createSubsystem(subsystem);
 
                 // add
-                deletedStructureElements.add(StructureElementUtil.getStructureElementRequested(subsystem, holder));
+                deletedStructureElements.add(StructureElementUtil.getStructureElementRequested(subsystem));
             } else if (Type.DISCIPLINE.equals(structureElement.getType())) {
                 // find
                 List<Discipline> disciplines = holderRepositories.getDisciplineRepository().readDisciplines(Status.APPROVED, Boolean.FALSE, queryValue, null, null, null, null, null);
@@ -995,7 +986,7 @@ public class StructuresService {
                 holderRepositories.getDisciplineRepository().createDiscipline(discipline);
 
                 // add
-                deletedStructureElements.add(StructureElementUtil.getStructureElementRequested(discipline, holder));
+                deletedStructureElements.add(StructureElementUtil.getStructureElementRequested(discipline));
             } else if (Type.DEVICEGROUP.equals(structureElement.getType())) {
                 // find
                 List<DeviceGroup> deviceGroups = holderRepositories.getDeviceGroupRepository().readDeviceGroups(Status.APPROVED, Boolean.FALSE, queryValue, null, null, null, null, null, null);
@@ -1012,7 +1003,7 @@ public class StructuresService {
                 holderRepositories.getDeviceGroupRepository().createDeviceGroup(deviceGroup);
 
                 // add
-                deletedStructureElements.add(StructureElementUtil.getStructureElementRequested(deviceGroup, holder));
+                deletedStructureElements.add(StructureElementUtil.getStructureElementRequested(deviceGroup));
             } else if (Type.DEVICETYPE.equals(structureElement.getType())) {
                 // find
                 List<DeviceType> deviceTypes = holderRepositories.getDeviceTypeRepository().readDeviceTypes(Status.APPROVED, Boolean.FALSE, queryValue, null, null, null, null, null, null);
@@ -1029,7 +1020,7 @@ public class StructuresService {
                 holderRepositories.getDeviceTypeRepository().createDeviceType(deviceType);
 
                 // add
-                deletedStructureElements.add(StructureElementUtil.getStructureElementRequested(deviceType, holder));
+                deletedStructureElements.add(StructureElementUtil.getStructureElementRequested(deviceType));
             }
         }
 
@@ -1117,7 +1108,7 @@ public class StructuresService {
                 }
 
                 // add
-                approvedStructureElements.add(StructureElementUtil.getStructureElementProcessed(systemGroup, holder));
+                approvedStructureElements.add(StructureElementUtil.getStructureElementProcessed(systemGroup, holder, StructureChoice.STRUCTURE));
             } else if (Type.SYSTEM.equals(structureElement.getType())) {
                 // find
                 List<System> systems = holderRepositories.getSystemRepository().readSystems(Status.APPROVED, Boolean.FALSE, queryValue, null, null, null, null, null, null);
@@ -1156,7 +1147,7 @@ public class StructuresService {
                 }
 
                 // add
-                approvedStructureElements.add(StructureElementUtil.getStructureElementProcessed(system, holder));
+                approvedStructureElements.add(StructureElementUtil.getStructureElementProcessed(system, holder, StructureChoice.STRUCTURE));
             } else if (Type.SUBSYSTEM.equals(structureElement.getType())) {
                 // find
                 List<Subsystem> subsystems = holderRepositories.getSubsystemRepository().readSubsystems(Status.APPROVED, Boolean.FALSE, queryValue, null, null, null, null, null, null);
@@ -1195,7 +1186,7 @@ public class StructuresService {
                 }
 
                 // add
-                approvedStructureElements.add(StructureElementUtil.getStructureElementProcessed(subsystem, holder));
+                approvedStructureElements.add(StructureElementUtil.getStructureElementProcessed(subsystem, holder, StructureChoice.STRUCTURE));
             } else if (Type.DISCIPLINE.equals(structureElement.getType())) {
                 List<Discipline> disciplines = holderRepositories.getDisciplineRepository().readDisciplines(Status.APPROVED, Boolean.FALSE, queryValue, null, null, null, null, null);
                 Discipline discipline = null;
@@ -1220,7 +1211,7 @@ public class StructuresService {
                 holderRepositories.getDisciplineRepository().updateDiscipline(discipline);
 
                 // add
-                approvedStructureElements.add(StructureElementUtil.getStructureElementProcessed(discipline, holder));
+                approvedStructureElements.add(StructureElementUtil.getStructureElementProcessed(discipline, holder, StructureChoice.STRUCTURE));
             } else if (Type.DEVICEGROUP.equals(structureElement.getType())) {
                 // find
                 List<DeviceGroup> deviceGroups = holderRepositories.getDeviceGroupRepository().readDeviceGroups(Status.APPROVED, Boolean.FALSE, queryValue, null, null, null, null, null, null);
@@ -1246,7 +1237,7 @@ public class StructuresService {
                 holderRepositories.getDeviceGroupRepository().updateDeviceGroup(deviceGroup);
 
                 // add
-                approvedStructureElements.add(StructureElementUtil.getStructureElementProcessed(deviceGroup, holder));
+                approvedStructureElements.add(StructureElementUtil.getStructureElementProcessed(deviceGroup, holder, StructureChoice.STRUCTURE));
             } else if (Type.DEVICETYPE.equals(structureElement.getType())) {
                 // find
                 List<DeviceType> deviceTypes = holderRepositories.getDeviceTypeRepository().readDeviceTypes(Status.APPROVED, Boolean.FALSE, queryValue, null, null, null, null, null, null);
@@ -1272,7 +1263,7 @@ public class StructuresService {
                 holderRepositories.getDeviceTypeRepository().updateDeviceType(deviceType);
 
                 // add
-                approvedStructureElements.add(StructureElementUtil.getStructureElementProcessed(deviceType, holder));
+                approvedStructureElements.add(StructureElementUtil.getStructureElementProcessed(deviceType, holder, StructureChoice.STRUCTURE));
             }
         }
 
@@ -1319,7 +1310,7 @@ public class StructuresService {
                 holderRepositories.getSystemGroupRepository().updateSystemGroup(systemGroup);
 
                 // add
-                cancelledStructureElements.add(StructureElementUtil.getStructureElementProcessed(systemGroup, holder));
+                cancelledStructureElements.add(StructureElementUtil.getStructureElementProcessed(systemGroup, holder, StructureChoice.STRUCTURE));
             } else if (Type.SYSTEM.equals(structureElement.getType())) {
                 // find
                 List<System> systems = holderRepositories.getSystemRepository().readSystems(Status.PENDING, null, queryValue, null, null, null, null, null, null);
@@ -1333,7 +1324,7 @@ public class StructuresService {
                 holderRepositories.getSystemRepository().updateSystem(system);
 
                 // add
-                cancelledStructureElements.add(StructureElementUtil.getStructureElementProcessed(system, holder));
+                cancelledStructureElements.add(StructureElementUtil.getStructureElementProcessed(system, holder, StructureChoice.STRUCTURE));
             } else if (Type.SUBSYSTEM.equals(structureElement.getType())) {
                 // find
                 List<Subsystem> subsystems = holderRepositories.getSubsystemRepository().readSubsystems(Status.PENDING, null, queryValue, null, null, null, null, null, null);
@@ -1347,7 +1338,7 @@ public class StructuresService {
                 holderRepositories.getSubsystemRepository().updateSubsystem(subsystem);
 
                 // add
-                cancelledStructureElements.add(StructureElementUtil.getStructureElementProcessed(subsystem, holder));
+                cancelledStructureElements.add(StructureElementUtil.getStructureElementProcessed(subsystem, holder, StructureChoice.STRUCTURE));
             } else if (Type.DISCIPLINE.equals(structureElement.getType())) {
                 // find
                 List<Discipline> disciplines = holderRepositories.getDisciplineRepository().readDisciplines(Status.PENDING, null, queryValue, null, null, null, null, null);
@@ -1361,7 +1352,7 @@ public class StructuresService {
                 holderRepositories.getDisciplineRepository().updateDiscipline(discipline);
 
                 // add
-                cancelledStructureElements.add(StructureElementUtil.getStructureElementProcessed(discipline, holder));
+                cancelledStructureElements.add(StructureElementUtil.getStructureElementProcessed(discipline, holder, StructureChoice.STRUCTURE));
             } else if (Type.DEVICEGROUP.equals(structureElement.getType())) {
                 // find
                 List<DeviceGroup> deviceGroups = holderRepositories.getDeviceGroupRepository().readDeviceGroups(Status.PENDING, null, queryValue, null, null, null, null, null, null);
@@ -1375,7 +1366,7 @@ public class StructuresService {
                 holderRepositories.getDeviceGroupRepository().updateDeviceGroup(deviceGroup);
 
                 // add
-                cancelledStructureElements.add(StructureElementUtil.getStructureElementProcessed(deviceGroup, holder));
+                cancelledStructureElements.add(StructureElementUtil.getStructureElementProcessed(deviceGroup, holder, StructureChoice.STRUCTURE));
             } else if (Type.DEVICETYPE.equals(structureElement.getType())) {
                 List<DeviceType> deviceTypes = holderRepositories.getDeviceTypeRepository().readDeviceTypes(Status.PENDING, null, queryValue, null, null, null, null, null, null);
                 if (ValidateUtil.isNullOrNotSize(deviceTypes, 1)) {
@@ -1388,7 +1379,7 @@ public class StructuresService {
                 holderRepositories.getDeviceTypeRepository().updateDeviceType(deviceType);
 
                 // add
-                cancelledStructureElements.add(StructureElementUtil.getStructureElementProcessed(deviceType, holder));
+                cancelledStructureElements.add(StructureElementUtil.getStructureElementProcessed(deviceType, holder, StructureChoice.STRUCTURE));
             }
         }
 
@@ -1435,7 +1426,7 @@ public class StructuresService {
                 holderRepositories.getSystemGroupRepository().updateSystemGroup(systemGroup);
 
                 // add
-                rejectedStructureElements.add(StructureElementUtil.getStructureElementProcessed(systemGroup, holder));
+                rejectedStructureElements.add(StructureElementUtil.getStructureElementProcessed(systemGroup, holder, StructureChoice.STRUCTURE));
             } else if (Type.SYSTEM.equals(structureElement.getType())) {
                 // find
                 List<System> systems = holderRepositories.getSystemRepository().readSystems(Status.PENDING, null, queryValue, null, null, null, null, null, null);
@@ -1449,7 +1440,7 @@ public class StructuresService {
                 holderRepositories.getSystemRepository().updateSystem(system);
 
                 // add
-                rejectedStructureElements.add(StructureElementUtil.getStructureElementProcessed(system, holder));
+                rejectedStructureElements.add(StructureElementUtil.getStructureElementProcessed(system, holder, StructureChoice.STRUCTURE));
             } else if (Type.SUBSYSTEM.equals(structureElement.getType())) {
                 // find
                 List<Subsystem> subsystems = holderRepositories.getSubsystemRepository().readSubsystems(Status.PENDING, null, queryValue, null, null, null, null, null, null);
@@ -1463,7 +1454,7 @@ public class StructuresService {
                 holderRepositories.getSubsystemRepository().updateSubsystem(subsystem);
 
                 // add
-                rejectedStructureElements.add(StructureElementUtil.getStructureElementProcessed(subsystem, holder));
+                rejectedStructureElements.add(StructureElementUtil.getStructureElementProcessed(subsystem, holder, StructureChoice.STRUCTURE));
             } else if (Type.DISCIPLINE.equals(structureElement.getType())) {
                 // find
                 List<Discipline> disciplines = holderRepositories.getDisciplineRepository().readDisciplines(Status.PENDING, null, queryValue, null, null, null, null, null);
@@ -1477,7 +1468,7 @@ public class StructuresService {
                 holderRepositories.getDisciplineRepository().updateDiscipline(discipline);
 
                 // add
-                rejectedStructureElements.add(StructureElementUtil.getStructureElementProcessed(discipline, holder));
+                rejectedStructureElements.add(StructureElementUtil.getStructureElementProcessed(discipline, holder, StructureChoice.STRUCTURE));
             } else if (Type.DEVICEGROUP.equals(structureElement.getType())) {
                 // find
                 List<DeviceGroup> deviceGroups = holderRepositories.getDeviceGroupRepository().readDeviceGroups(Status.PENDING, null, queryValue, null, null, null, null, null, null);
@@ -1491,7 +1482,7 @@ public class StructuresService {
                 holderRepositories.getDeviceGroupRepository().updateDeviceGroup(deviceGroup);
 
                 // add
-                rejectedStructureElements.add(StructureElementUtil.getStructureElementProcessed(deviceGroup, holder));
+                rejectedStructureElements.add(StructureElementUtil.getStructureElementProcessed(deviceGroup, holder, StructureChoice.STRUCTURE));
             } else if (Type.DEVICETYPE.equals(structureElement.getType())) {
                 // find
                 List<DeviceType> deviceTypes = holderRepositories.getDeviceTypeRepository().readDeviceTypes(Status.PENDING, null, queryValue, null, null, null, null, null, null);
@@ -1505,7 +1496,7 @@ public class StructuresService {
                 holderRepositories.getDeviceTypeRepository().updateDeviceType(deviceType);
 
                 // add
-                rejectedStructureElements.add(StructureElementUtil.getStructureElementProcessed(deviceType, holder));
+                rejectedStructureElements.add(StructureElementUtil.getStructureElementProcessed(deviceType, holder, StructureChoice.STRUCTURE));
             }
         }
 
diff --git a/src/main/java/org/openepics/names/util/StructureElementUtil.java b/src/main/java/org/openepics/names/util/StructureElementUtil.java
index d18a09fc..e98422b3 100644
--- a/src/main/java/org/openepics/names/util/StructureElementUtil.java
+++ b/src/main/java/org/openepics/names/util/StructureElementUtil.java
@@ -74,18 +74,18 @@ public class StructureElementUtil {
 
             if (StructureChoice.HISTORY.equals(structureChoice)) {
                 if (systemGroup.getProcessed() != null && ((systemGroup.getProcessed().getTime() - systemGroup.getRequested().getTime()) > THOUSAND_MILLISECONDS)) {
-                    structureElements.add(getStructureElementRequested(systemGroup, holderSystemDeviceStructure));
-                    structureElements.add(getStructureElementProcessed(systemGroup, holderSystemDeviceStructure));
+                    structureElements.add(getStructureElementRequested(systemGroup));
+                    structureElements.add(getStructureElementProcessed(systemGroup, holderSystemDeviceStructure, structureChoice));
                 } else if (systemGroup.getProcessed() != null && ((systemGroup.getProcessed().getTime() - systemGroup.getRequested().getTime()) <= THOUSAND_MILLISECONDS)) {
-                    structureElements.add(getStructureElementProcessed(systemGroup, holderSystemDeviceStructure));
+                    structureElements.add(getStructureElementProcessed(systemGroup, holderSystemDeviceStructure, structureChoice));
                 } else {
-                    structureElements.add(getStructureElementRequested(systemGroup, holderSystemDeviceStructure));
+                    structureElements.add(getStructureElementRequested(systemGroup));
                 }
             } else {
                 if (Status.PENDING.equals(systemGroup.getStatus())) {
-                    structureElements.add(getStructureElementRequested(systemGroup, holderSystemDeviceStructure));
+                    structureElements.add(getStructureElementRequested(systemGroup));
                 } else {
-                    structureElements.add(getStructureElementProcessed(systemGroup, holderSystemDeviceStructure));
+                    structureElements.add(getStructureElementProcessed(systemGroup, holderSystemDeviceStructure, structureChoice));
                 }
             }
         }
@@ -112,18 +112,18 @@ public class StructureElementUtil {
 
             if (StructureChoice.HISTORY.equals(structureChoice)) {
                 if (system.getProcessed() != null && ((system.getProcessed().getTime() - system.getRequested().getTime()) > THOUSAND_MILLISECONDS)) {
-                    structureElements.add(getStructureElementRequested(system, holderSystemDeviceStructure));
-                    structureElements.add(getStructureElementProcessed(system, holderSystemDeviceStructure));
+                    structureElements.add(getStructureElementRequested(system));
+                    structureElements.add(getStructureElementProcessed(system, holderSystemDeviceStructure, structureChoice));
                 } else if (system.getProcessed() != null && ((system.getProcessed().getTime() - system.getRequested().getTime()) <= THOUSAND_MILLISECONDS)) {
-                    structureElements.add(getStructureElementProcessed(system, holderSystemDeviceStructure));
+                    structureElements.add(getStructureElementProcessed(system, holderSystemDeviceStructure, structureChoice));
                 } else {
-                    structureElements.add(getStructureElementRequested(system, holderSystemDeviceStructure));
+                    structureElements.add(getStructureElementRequested(system));
                 }
             } else {
                 if (Status.PENDING.equals(system.getStatus())) {
-                    structureElements.add(getStructureElementRequested(system, holderSystemDeviceStructure));
+                    structureElements.add(getStructureElementRequested(system));
                 } else {
-                    structureElements.add(getStructureElementProcessed(system, holderSystemDeviceStructure));
+                    structureElements.add(getStructureElementProcessed(system, holderSystemDeviceStructure, structureChoice));
                 }
             }
         }
@@ -150,18 +150,18 @@ public class StructureElementUtil {
 
             if (StructureChoice.HISTORY.equals(structureChoice)) {
                 if (subsystem.getProcessed() != null && ((subsystem.getProcessed().getTime() - subsystem.getRequested().getTime()) > THOUSAND_MILLISECONDS)) {
-                    structureElements.add(getStructureElementRequested(subsystem, holderSystemDeviceStructure));
-                    structureElements.add(getStructureElementProcessed(subsystem, holderSystemDeviceStructure));
+                    structureElements.add(getStructureElementRequested(subsystem));
+                    structureElements.add(getStructureElementProcessed(subsystem, holderSystemDeviceStructure, structureChoice));
                 } else if (subsystem.getProcessed() != null && ((subsystem.getProcessed().getTime() - subsystem.getRequested().getTime()) <= THOUSAND_MILLISECONDS)) {
-                    structureElements.add(getStructureElementProcessed(subsystem, holderSystemDeviceStructure));
+                    structureElements.add(getStructureElementProcessed(subsystem, holderSystemDeviceStructure, structureChoice));
                 } else {
-                    structureElements.add(getStructureElementRequested(subsystem, holderSystemDeviceStructure));
+                    structureElements.add(getStructureElementRequested(subsystem));
                 }
             } else {
                 if (Status.PENDING.equals(subsystem.getStatus())) {
-                    structureElements.add(getStructureElementRequested(subsystem, holderSystemDeviceStructure));
+                    structureElements.add(getStructureElementRequested(subsystem));
                 } else {
-                    structureElements.add(getStructureElementProcessed(subsystem, holderSystemDeviceStructure));
+                    structureElements.add(getStructureElementProcessed(subsystem, holderSystemDeviceStructure, structureChoice));
                 }
             }
         }
@@ -189,18 +189,18 @@ public class StructureElementUtil {
 
             if (StructureChoice.HISTORY.equals(structureChoice)) {
                 if (discipline.getProcessed() != null && ((discipline.getProcessed().getTime() - discipline.getRequested().getTime()) > THOUSAND_MILLISECONDS)) {
-                    structureElements.add(getStructureElementRequested(discipline, holderSystemDeviceStructure));
-                    structureElements.add(getStructureElementProcessed(discipline, holderSystemDeviceStructure));
+                    structureElements.add(getStructureElementRequested(discipline));
+                    structureElements.add(getStructureElementProcessed(discipline, holderSystemDeviceStructure, structureChoice));
                 } else if (discipline.getProcessed() != null && ((discipline.getProcessed().getTime() - discipline.getRequested().getTime()) <= THOUSAND_MILLISECONDS)) {
-                    structureElements.add(getStructureElementProcessed(discipline, holderSystemDeviceStructure));
+                    structureElements.add(getStructureElementProcessed(discipline, holderSystemDeviceStructure, structureChoice));
                 } else {
-                    structureElements.add(getStructureElementRequested(discipline, holderSystemDeviceStructure));
+                    structureElements.add(getStructureElementRequested(discipline));
                 }
             } else {
                 if (Status.PENDING.equals(discipline.getStatus())) {
-                    structureElements.add(getStructureElementRequested(discipline, holderSystemDeviceStructure));
+                    structureElements.add(getStructureElementRequested(discipline));
                 } else {
-                    structureElements.add(getStructureElementProcessed(discipline, holderSystemDeviceStructure));
+                    structureElements.add(getStructureElementProcessed(discipline, holderSystemDeviceStructure, structureChoice));
                 }
             }
         }
@@ -227,18 +227,18 @@ public class StructureElementUtil {
 
             if (StructureChoice.HISTORY.equals(structureChoice)) {
                 if (deviceGroup.getProcessed() != null && ((deviceGroup.getProcessed().getTime() - deviceGroup.getRequested().getTime()) > THOUSAND_MILLISECONDS)) {
-                    structureElements.add(getStructureElementRequested(deviceGroup, holderSystemDeviceStructure));
-                    structureElements.add(getStructureElementProcessed(deviceGroup, holderSystemDeviceStructure));
+                    structureElements.add(getStructureElementRequested(deviceGroup));
+                    structureElements.add(getStructureElementProcessed(deviceGroup, holderSystemDeviceStructure, structureChoice));
                 } else if (deviceGroup.getProcessed() != null && ((deviceGroup.getProcessed().getTime() - deviceGroup.getRequested().getTime()) <= THOUSAND_MILLISECONDS)) {
-                    structureElements.add(getStructureElementProcessed(deviceGroup, holderSystemDeviceStructure));
+                    structureElements.add(getStructureElementProcessed(deviceGroup, holderSystemDeviceStructure, structureChoice));
                 } else {
-                    structureElements.add(getStructureElementRequested(deviceGroup, holderSystemDeviceStructure));
+                    structureElements.add(getStructureElementRequested(deviceGroup));
                 }
             } else {
                 if (Status.PENDING.equals(deviceGroup.getStatus())) {
-                    structureElements.add(getStructureElementRequested(deviceGroup, holderSystemDeviceStructure));
+                    structureElements.add(getStructureElementRequested(deviceGroup));
                 } else {
-                    structureElements.add(getStructureElementProcessed(deviceGroup, holderSystemDeviceStructure));
+                    structureElements.add(getStructureElementProcessed(deviceGroup, holderSystemDeviceStructure, structureChoice));
                 }
             }
         }
@@ -265,18 +265,18 @@ public class StructureElementUtil {
 
             if (StructureChoice.HISTORY.equals(structureChoice)) {
                 if (deviceType.getProcessed() != null && ((deviceType.getProcessed().getTime() - deviceType.getRequested().getTime()) > THOUSAND_MILLISECONDS)) {
-                    structureElements.add(getStructureElementRequested(deviceType, holderSystemDeviceStructure));
-                    structureElements.add(getStructureElementProcessed(deviceType, holderSystemDeviceStructure));
+                    structureElements.add(getStructureElementRequested(deviceType));
+                    structureElements.add(getStructureElementProcessed(deviceType, holderSystemDeviceStructure, structureChoice));
                 } else if (deviceType.getProcessed() != null && ((deviceType.getProcessed().getTime() - deviceType.getRequested().getTime()) <= THOUSAND_MILLISECONDS)) {
-                    structureElements.add(getStructureElementProcessed(deviceType, holderSystemDeviceStructure));
+                    structureElements.add(getStructureElementProcessed(deviceType, holderSystemDeviceStructure, structureChoice));
                 } else {
-                    structureElements.add(getStructureElementRequested(deviceType, holderSystemDeviceStructure));
+                    structureElements.add(getStructureElementRequested(deviceType));
                 }
             } else {
                 if (Status.PENDING.equals(deviceType.getStatus())) {
-                    structureElements.add(getStructureElementRequested(deviceType, holderSystemDeviceStructure));
+                    structureElements.add(getStructureElementRequested(deviceType));
                 } else {
-                    structureElements.add(getStructureElementProcessed(deviceType, holderSystemDeviceStructure));
+                    structureElements.add(getStructureElementProcessed(deviceType, holderSystemDeviceStructure, structureChoice));
                 }
             }
         }
@@ -287,15 +287,18 @@ public class StructureElementUtil {
      * Populate and return structure element for system group with focus on requested.
      *
      * @param systemGroup system group
-     * @param holderSystemDeviceStructure holder of containers for system and device structure content
      * @return structure element
      */
-    public static StructureElement getStructureElementRequested(SystemGroup systemGroup, HolderSystemDeviceStructure holderSystemDeviceStructure) {
+    public static StructureElement getStructureElementRequested(SystemGroup systemGroup) {
         if (systemGroup == null) {
             return null;
         }
 
-        String mnemonicpath = StructureUtil.getMnemonicPath(systemGroup, holderSystemDeviceStructure);
+        // mnemonic path
+        //     ambiguous if considered in past (requested, processed)
+        //     not for history of structure
+        //     for latest & approved status
+        String mnemonicpath = null;
 
         return getStructureElement(
                 Type.SYSTEMGROUP,
@@ -310,14 +313,21 @@ public class StructureElementUtil {
      *
      * @param systemGroup system group
      * @param holderSystemDeviceStructure holder of containers for system and device structure content
+     * @param structureChoice whether to consider content from structure perspective or history perspective
      * @return structure element
      */
-    public static StructureElement getStructureElementProcessed(SystemGroup systemGroup, HolderSystemDeviceStructure holderSystemDeviceStructure) {
+    public static StructureElement getStructureElementProcessed(SystemGroup systemGroup, HolderSystemDeviceStructure holderSystemDeviceStructure, StructureChoice structureChoice) {
         if (systemGroup == null) {
             return null;
         }
 
-        String mnemonicpath = StructureUtil.getMnemonicPath(systemGroup, holderSystemDeviceStructure);
+        // mnemonic path
+        //     ambiguous if considered in past (requested, processed)
+        //     not history of structure
+        //     latest & approved status
+        String mnemonicpath = StructureChoice.HISTORY.equals(structureChoice) || !(systemGroup.isLatest() && Status.APPROVED.equals(systemGroup.getStatus()))
+                ? null
+                : StructureUtil.getMnemonicPath(systemGroup, holderSystemDeviceStructure);
 
         return getStructureElement(
                 Type.SYSTEMGROUP,
@@ -331,15 +341,18 @@ public class StructureElementUtil {
      * Populate and return structure element for system group with focus on requested.
      *
      * @param system system
-     * @param holderSystemDeviceStructure holder of containers for system and device structure content
      * @return structure element
      */
-    public static StructureElement getStructureElementRequested(System system, HolderSystemDeviceStructure holderSystemDeviceStructure) {
+    public static StructureElement getStructureElementRequested(System system) {
         if (system == null) {
             return null;
         }
 
-        String mnemonicpath = StructureUtil.getMnemonicPath(system, holderSystemDeviceStructure);
+        // mnemonic path
+        //     ambiguous if considered in past (requested, processed)
+        //     not history of structure
+        //     latest & approved status
+        String mnemonicpath = null;
 
         return getStructureElement(
                 Type.SYSTEM,
@@ -354,14 +367,21 @@ public class StructureElementUtil {
      *
      * @param system system
      * @param holderSystemDeviceStructure holder of containers for system and device structure content
+     * @param structureChoice whether to consider content from structure perspective or history perspective
      * @return structure element
      */
-    public static StructureElement getStructureElementProcessed(System system, HolderSystemDeviceStructure holderSystemDeviceStructure) {
+    public static StructureElement getStructureElementProcessed(System system, HolderSystemDeviceStructure holderSystemDeviceStructure, StructureChoice structureChoice) {
         if (system == null) {
             return null;
         }
 
-        String mnemonicpath = StructureUtil.getMnemonicPath(system, holderSystemDeviceStructure);
+        // mnemonic path
+        //     ambiguous if considered in past (requested, processed)
+        //     not history of structure
+        //     latest & approved status
+        String mnemonicpath = StructureChoice.HISTORY.equals(structureChoice) || !(system.isLatest() && Status.APPROVED.equals(system.getStatus()))
+                ? null
+                : StructureUtil.getMnemonicPath(system, holderSystemDeviceStructure);
 
         return getStructureElement(
                 Type.SYSTEM,
@@ -375,15 +395,18 @@ public class StructureElementUtil {
      * Populate and return structure element for subsystem with focus on requested.
      *
      * @param subsystem subsystem
-     * @param holderSystemDeviceStructure holder of containers for system and device structure content
      * @return structure element
      */
-    public static StructureElement getStructureElementRequested(Subsystem subsystem, HolderSystemDeviceStructure holderSystemDeviceStructure) {
+    public static StructureElement getStructureElementRequested(Subsystem subsystem) {
         if (subsystem == null) {
             return null;
         }
 
-        String mnemonicpath = StructureUtil.getMnemonicPath(subsystem, holderSystemDeviceStructure);
+        // mnemonic path
+        //     ambiguous if considered in past (requested, processed)
+        //     not history of structure
+        //     latest & approved status
+        String mnemonicpath = null;
 
         return getStructureElement(
                 Type.SUBSYSTEM,
@@ -398,14 +421,21 @@ public class StructureElementUtil {
      *
      * @param subsystem subsystem
      * @param holderSystemDeviceStructure holder of containers for system and device structure content
+     * @param structureChoice whether to consider content from structure perspective or history perspective
      * @return structure element
      */
-    public static StructureElement getStructureElementProcessed(Subsystem subsystem, HolderSystemDeviceStructure holderSystemDeviceStructure) {
+    public static StructureElement getStructureElementProcessed(Subsystem subsystem, HolderSystemDeviceStructure holderSystemDeviceStructure, StructureChoice structureChoice) {
         if (subsystem == null) {
             return null;
         }
 
-        String mnemonicpath = StructureUtil.getMnemonicPath(subsystem, holderSystemDeviceStructure);
+        // mnemonic path
+        //     ambiguous if considered in past (requested, processed)
+        //     not history of structure
+        //     latest & approved status
+        String mnemonicpath = StructureChoice.HISTORY.equals(structureChoice) || !(subsystem.isLatest() && Status.APPROVED.equals(subsystem.getStatus()))
+                ? null
+                : StructureUtil.getMnemonicPath(subsystem, holderSystemDeviceStructure);
 
         return getStructureElement(
                 Type.SUBSYSTEM,
@@ -420,15 +450,18 @@ public class StructureElementUtil {
      * Populate and return structure element for discipline with focus on requested.
      *
      * @param discipline discipline
-     * @param holderSystemDeviceStructure holder of containers for system and device structure content
      * @return structure element
      */
-    public static StructureElement getStructureElementRequested(Discipline discipline, HolderSystemDeviceStructure holderSystemDeviceStructure) {
+    public static StructureElement getStructureElementRequested(Discipline discipline) {
         if (discipline == null) {
             return null;
         }
 
-        String mnemonicpath = StructureUtil.getMnemonicPath(discipline, holderSystemDeviceStructure);
+        // mnemonic path
+        //     ambiguous if considered in past (requested, processed)
+        //     not history of structure
+        //     latest & approved status
+        String mnemonicpath = null;
 
         return getStructureElement(
                 Type.DISCIPLINE,
@@ -443,14 +476,21 @@ public class StructureElementUtil {
      *
      * @param discipline discipline
      * @param holderSystemDeviceStructure holder of containers for system and device structure content
+     * @param structureChoice whether to consider content from structure perspective or history perspective
      * @return structure element
      */
-    public static StructureElement getStructureElementProcessed(Discipline discipline, HolderSystemDeviceStructure holderSystemDeviceStructure) {
+    public static StructureElement getStructureElementProcessed(Discipline discipline, HolderSystemDeviceStructure holderSystemDeviceStructure, StructureChoice structureChoice) {
         if (discipline == null) {
             return null;
         }
 
-        String mnemonicpath = StructureUtil.getMnemonicPath(discipline, holderSystemDeviceStructure);
+        // mnemonic path
+        //     ambiguous if considered in past (requested, processed)
+        //     not history of structure
+        //     latest & approved status
+        String mnemonicpath = StructureChoice.HISTORY.equals(structureChoice) || !(discipline.isLatest() && Status.APPROVED.equals(discipline.getStatus()))
+                ? null
+                : StructureUtil.getMnemonicPath(discipline, holderSystemDeviceStructure);
 
         return getStructureElement(
                 Type.DISCIPLINE,
@@ -464,15 +504,18 @@ public class StructureElementUtil {
      * Populate and return structure element for device group with focus on requested.
      *
      * @param deviceGroup device group
-     * @param holderSystemDeviceStructure holder of containers for system and device structure content
      * @return structure element
      */
-    public static StructureElement getStructureElementRequested(DeviceGroup deviceGroup, HolderSystemDeviceStructure holderSystemDeviceStructure) {
+    public static StructureElement getStructureElementRequested(DeviceGroup deviceGroup) {
         if (deviceGroup == null) {
             return null;
         }
 
-        String mnemonicpath = StructureUtil.getMnemonicPath(deviceGroup, holderSystemDeviceStructure);
+        // mnemonic path
+        //     ambiguous if considered in past (requested, processed)
+        //     not history of structure
+        //     latest & approved status
+        String mnemonicpath = null;
 
         return getStructureElement(
                 Type.DEVICEGROUP,
@@ -487,14 +530,21 @@ public class StructureElementUtil {
      *
      * @param deviceGroup device group
      * @param holderSystemDeviceStructure holder of containers for system and device structure content
+     * @param structureChoice whether to consider content from structure perspective or history perspective
      * @return structure element
      */
-    public static StructureElement getStructureElementProcessed(DeviceGroup deviceGroup, HolderSystemDeviceStructure holderSystemDeviceStructure) {
+    public static StructureElement getStructureElementProcessed(DeviceGroup deviceGroup, HolderSystemDeviceStructure holderSystemDeviceStructure, StructureChoice structureChoice) {
         if (deviceGroup == null) {
             return null;
         }
 
-        String mnemonicpath = StructureUtil.getMnemonicPath(deviceGroup, holderSystemDeviceStructure);
+        // mnemonic path
+        //     ambiguous if considered in past (requested, processed)
+        //     not history of structure
+        //     latest & approved status
+        String mnemonicpath = StructureChoice.HISTORY.equals(structureChoice) || !(deviceGroup.isLatest() && Status.APPROVED.equals(deviceGroup.getStatus()))
+                ? null
+                : StructureUtil.getMnemonicPath(deviceGroup, holderSystemDeviceStructure);
 
         return getStructureElement(
                 Type.DEVICEGROUP,
@@ -508,15 +558,18 @@ public class StructureElementUtil {
      * Populate and return structure element for device type with focus on requested.
      *
      * @param deviceType device type
-     * @param holderSystemDeviceStructure holder of containers for system and device structure content
      * @return  structure element
      */
-    public static StructureElement getStructureElementRequested(DeviceType deviceType, HolderSystemDeviceStructure holderSystemDeviceStructure) {
+    public static StructureElement getStructureElementRequested(DeviceType deviceType) {
         if (deviceType == null) {
             return null;
         }
 
-        String mnemonicpath = StructureUtil.getMnemonicPath(deviceType, holderSystemDeviceStructure);
+        // mnemonic path
+        //     ambiguous if considered in past (requested, processed)
+        //     not history of structure
+        //     latest & approved status
+        String mnemonicpath = null;
 
         return getStructureElement(
                 Type.DEVICETYPE,
@@ -531,14 +584,21 @@ public class StructureElementUtil {
      *
      * @param deviceType device type
      * @param holderSystemDeviceStructure holder of containers for system and device structure content
+     * @param structureChoice whether to consider content from structure perspective or history perspective
      * @return structure element
      */
-    public static StructureElement getStructureElementProcessed(DeviceType deviceType, HolderSystemDeviceStructure holderSystemDeviceStructure) {
+    public static StructureElement getStructureElementProcessed(DeviceType deviceType, HolderSystemDeviceStructure holderSystemDeviceStructure, StructureChoice structureChoice) {
         if (deviceType == null) {
             return null;
         }
 
-        String mnemonicpath = StructureUtil.getMnemonicPath(deviceType, holderSystemDeviceStructure);
+        // mnemonic path
+        //     ambiguous if considered in past (requested, processed)
+        //     not history of structure
+        //     latest & approved status
+        String mnemonicpath = StructureChoice.HISTORY.equals(structureChoice) || !(deviceType.isLatest() && Status.APPROVED.equals(deviceType.getStatus()))
+                ? null
+                : StructureUtil.getMnemonicPath(deviceType, holderSystemDeviceStructure);
 
         return getStructureElement(
                 Type.DEVICETYPE,
-- 
GitLab