From 7a9609b7464c4c93b4fa95d4df5bb0a7c174fc18 Mon Sep 17 00:00:00 2001 From: Lars Johansson <lars.johansson@ess.eu> Date: Tue, 3 Jan 2023 16:44:47 +0100 Subject: [PATCH] Update approve structures for approve delete Update approve structures for approve delete and delete sub structures. Refactor delete structures. Add integration tests for approve delete. --- .../names/service/DeviceGroupService.java | 64 +- .../names/service/DeviceTypeService.java | 37 ++ .../names/service/DisciplineService.java | 62 +- .../openepics/names/service/NamesService.java | 4 +- .../names/service/StructuresService.java | 120 +--- .../names/service/SubsystemService.java | 37 ++ .../names/service/SystemGroupService.java | 63 +- .../names/service/SystemService.java | 62 +- .../docker/complex/StructuresCUDDeleteIT.java | 583 ++++++++++++++++++ ...amesIT.java => StructuresCUDUpdateIT.java} | 4 +- 10 files changed, 925 insertions(+), 111 deletions(-) create mode 100644 src/test/java/org/openepics/names/docker/complex/StructuresCUDDeleteIT.java rename src/test/java/org/openepics/names/docker/complex/{StructuresCUDNamesIT.java => StructuresCUDUpdateIT.java} (99%) diff --git a/src/main/java/org/openepics/names/service/DeviceGroupService.java b/src/main/java/org/openepics/names/service/DeviceGroupService.java index 1203b1fd..aae236b4 100644 --- a/src/main/java/org/openepics/names/service/DeviceGroupService.java +++ b/src/main/java/org/openepics/names/service/DeviceGroupService.java @@ -25,8 +25,11 @@ import java.util.logging.Logger; import org.openepics.names.repository.DeviceGroupRepository; import org.openepics.names.repository.IDeviceGroupRepository; +import org.openepics.names.repository.IDeviceTypeRepository; import org.openepics.names.repository.model.DeviceGroup; +import org.openepics.names.repository.model.DeviceType; import org.openepics.names.rest.beans.Status; +import org.openepics.names.rest.beans.Type; import org.openepics.names.rest.beans.element.StructureElement; import org.openepics.names.rest.beans.element.StructureElementCommand; import org.openepics.names.util.HolderSystemDeviceStructure; @@ -40,6 +43,8 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; +import com.google.common.collect.Lists; + /** * This class provides structures services for device group. * @@ -56,15 +61,51 @@ public class DeviceGroupService { private static final Logger LOGGER = Logger.getLogger(DeviceGroupService.class.getName()); private IDeviceGroupRepository iDeviceGroupRepository; + private IDeviceTypeRepository iDeviceTypeRepository; private DeviceGroupRepository deviceGroupRepository; + private DeviceTypeService deviceTypeService; @Autowired public DeviceGroupService( IDeviceGroupRepository iDeviceGroupRepository, + IDeviceTypeRepository iDeviceTypeRepository, DeviceGroupRepository deviceGroupRepository, - NamesService namesService) { + DeviceTypeService deviceTypeService) { this.iDeviceGroupRepository = iDeviceGroupRepository; + this.iDeviceTypeRepository = iDeviceTypeRepository; this.deviceGroupRepository = deviceGroupRepository; + this.deviceTypeService = deviceTypeService; + } + + @Transactional(propagation = Propagation.MANDATORY) + public StructureElement deleteStructure(StructureElementCommand structureElement, + Date requested, String requestedBy) { + // validation outside method + // transaction + // do + // find + // create structure to pending, not latest, deleted, with data + // possibly validate that deleted + // return + // structure element for deleted structure + + String uuid = structureElement.getUuid().toString(); + + // find + List<DeviceGroup> deviceGroups = deviceGroupRepository.readDeviceGroups(Status.APPROVED, Boolean.FALSE, uuid, null, null, null, null, null, null); + if (ValidateUtil.isNullOrNotSize(deviceGroups, 1)) { + return null; + } + DeviceGroup toBeDeleted = deviceGroups.get(0); + + // create + DeviceGroup deviceGroup = new DeviceGroup(toBeDeleted.getUuid(), toBeDeleted.getParentUuid(), + toBeDeleted.getName(), toBeDeleted.getMnemonic(), toBeDeleted.getMnemonicEquivalence(), + toBeDeleted.getDescription(), Status.PENDING, Boolean.FALSE, Boolean.TRUE, + requested, requestedBy, structureElement.getComment()); + deviceGroupRepository.createDeviceGroup(deviceGroup); + + return StructureElementUtil.getStructureElementRequested(deviceGroup); } @Transactional(propagation = Propagation.MANDATORY) @@ -91,6 +132,9 @@ public class DeviceGroupService { // update related names // for different mnemonic // not for device group + // approve delete + // keep related names - legacy names + // delete sub structures // return // structure element for approved structure @@ -124,9 +168,25 @@ public class DeviceGroupService { // find out previous List<DeviceGroup> previouses = iDeviceGroupRepository.findPreviousByUuidAndId(uuid, deviceGroup.getId()); StructureCommand structureCommandCUD = StructureUtil.getStructureCommandCUD(previouses, deviceGroup); - DeviceGroup previous = previouses != null && !previouses.isEmpty() ? previouses.get(0) : null; LOGGER.log(Level.FINE, "approveStructure, structureCommandCUD: {0}", structureCommandCUD); + // approve delete + if (StructureCommand.DELETE.equals(structureCommandCUD)) { + // not delete names - legacy names + // delete sub structures - delete, approve + List<StructureElementCommand> structureElementCommands = Lists.newArrayList(); + List<DeviceType> deviceTypes = iDeviceTypeRepository.findLatestNotDeletedByParent(uuid); + for (DeviceType deviceType : deviceTypes) { + structureElementCommands.add(new StructureElementCommand(deviceType.getUuid(), Type.DEVICETYPE, null, null, null, null, StructuresService.DELETE_AFTER_APPROVE_STRUCTURE_CHANGE)); + } + for (StructureElementCommand structureElementCommand : structureElementCommands) { + deviceTypeService.deleteStructure(structureElementCommand, processed, processedBy); + } + for (StructureElementCommand structureElementCommand : structureElementCommands) { + deviceTypeService.approveStructure(structureElementCommand, processed, processedBy, holder); + } + } + LOGGER.log(Level.FINE, "approveStructure, structureElement: {0}", structureElement); return StructureElementUtil.getStructureElementProcessed(deviceGroup, holder, StructureChoice.STRUCTURE); } diff --git a/src/main/java/org/openepics/names/service/DeviceTypeService.java b/src/main/java/org/openepics/names/service/DeviceTypeService.java index df0e34a1..10cab786 100644 --- a/src/main/java/org/openepics/names/service/DeviceTypeService.java +++ b/src/main/java/org/openepics/names/service/DeviceTypeService.java @@ -69,6 +69,37 @@ public class DeviceTypeService { this.namesService = namesService; } + @Transactional(propagation = Propagation.MANDATORY) + public StructureElement deleteStructure(StructureElementCommand structureElement, + Date requested, String requestedBy) { + // validation outside method + // transaction + // do + // find + // create structure to pending, not latest, deleted, with data + // possibly validate that deleted + // return + // structure element for deleted structure + + String uuid = structureElement.getUuid().toString(); + + // find + List<DeviceType> deviceTypes = deviceTypeRepository.readDeviceTypes(Status.APPROVED, Boolean.FALSE, uuid, null, null, null, null, null, null); + if (ValidateUtil.isNullOrNotSize(deviceTypes, 1)) { + return null; + } + DeviceType toBeDeleted = deviceTypes.get(0); + + // create + DeviceType deviceType = new DeviceType(toBeDeleted.getUuid(), toBeDeleted.getParentUuid(), + toBeDeleted.getName(), toBeDeleted.getMnemonic(), toBeDeleted.getMnemonicEquivalence(), + toBeDeleted.getDescription(), Status.PENDING, Boolean.FALSE, Boolean.TRUE, + requested, requestedBy, structureElement.getComment()); + deviceTypeRepository.createDeviceType(deviceType); + + return StructureElementUtil.getStructureElementRequested(deviceType); + } + @Transactional(propagation = Propagation.MANDATORY) public StructureElement approveStructure(StructureElementCommand structureElement, Date processed, String processedBy, @@ -93,6 +124,9 @@ public class DeviceTypeService { // update related names // for different mnemonic // not for device group + // approve delete + // keep related names - legacy names + // delete sub structures // return // structure element for approved structure @@ -130,8 +164,11 @@ public class DeviceTypeService { LOGGER.log(Level.FINE, "approveStructure, structureCommandCUD: {0}", structureCommandCUD); // approve update + // approve delete if (StructureCommand.UPDATE.equals(structureCommandCUD)) { namesService.updateNames(previous, deviceType); + } else if (StructureCommand.DELETE.equals(structureCommandCUD)) { + // not delete names - legacy names } LOGGER.log(Level.FINE, "approveStructure, structureElement: {0}", structureElement); diff --git a/src/main/java/org/openepics/names/service/DisciplineService.java b/src/main/java/org/openepics/names/service/DisciplineService.java index 31c84067..cccf5e88 100644 --- a/src/main/java/org/openepics/names/service/DisciplineService.java +++ b/src/main/java/org/openepics/names/service/DisciplineService.java @@ -24,9 +24,12 @@ import java.util.logging.Level; import java.util.logging.Logger; import org.openepics.names.repository.DisciplineRepository; +import org.openepics.names.repository.IDeviceGroupRepository; import org.openepics.names.repository.IDisciplineRepository; +import org.openepics.names.repository.model.DeviceGroup; import org.openepics.names.repository.model.Discipline; import org.openepics.names.rest.beans.Status; +import org.openepics.names.rest.beans.Type; import org.openepics.names.rest.beans.element.StructureElement; import org.openepics.names.rest.beans.element.StructureElementCommand; import org.openepics.names.util.HolderSystemDeviceStructure; @@ -40,6 +43,8 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; +import com.google.common.collect.Lists; + /** * This class provides structures services for discipline. * @@ -56,17 +61,54 @@ public class DisciplineService { private static final Logger LOGGER = Logger.getLogger(DisciplineService.class.getName()); private IDisciplineRepository iDisciplineRepository; + private IDeviceGroupRepository iDeviceGroupRepository; private DisciplineRepository disciplineRepository; private NamesService namesService; + private DeviceGroupService deviceGroupService; @Autowired public DisciplineService( IDisciplineRepository iDisciplineRepository, + IDeviceGroupRepository iDeviceGroupRepository, DisciplineRepository disciplineRepository, - NamesService namesService) { + NamesService namesService, + DeviceGroupService deviceGroupService) { this.iDisciplineRepository = iDisciplineRepository; + this.iDeviceGroupRepository = iDeviceGroupRepository; this.disciplineRepository = disciplineRepository; this.namesService = namesService; + this.deviceGroupService = deviceGroupService; + } + + @Transactional(propagation = Propagation.MANDATORY) + public StructureElement deleteStructure(StructureElementCommand structureElement, + Date requested, String requestedBy) { + // validation outside method + // transaction + // do + // find + // create structure to pending, not latest, deleted, with data + // possibly validate that deleted + // return + // structure element for deleted structure + + String uuid = structureElement.getUuid().toString(); + + // find + List<Discipline> disciplines = disciplineRepository.readDisciplines(Status.APPROVED, Boolean.FALSE, uuid, null, null, null, null, null); + if (ValidateUtil.isNullOrNotSize(disciplines, 1)) { + return null; + } + Discipline toBeDeleted = disciplines.get(0); + + // create + Discipline discipline = new Discipline(toBeDeleted.getUuid(), + toBeDeleted.getName(), toBeDeleted.getMnemonic(), toBeDeleted.getMnemonicEquivalence(), + toBeDeleted.getDescription(), Status.PENDING, Boolean.FALSE, Boolean.TRUE, + requested, requestedBy, structureElement.getComment()); + disciplineRepository.createDiscipline(discipline); + + return StructureElementUtil.getStructureElementRequested(discipline); } @Transactional(propagation = Propagation.MANDATORY) @@ -93,6 +135,9 @@ public class DisciplineService { // update related names // for different mnemonic // not for device group + // approve delete + // keep related names - legacy names + // delete sub structures // return // structure element for approved structure @@ -129,8 +174,23 @@ public class DisciplineService { LOGGER.log(Level.FINE, "approveStructure, structureCommandCUD: {0}", structureCommandCUD); // approve update + // approve delete if (StructureCommand.UPDATE.equals(structureCommandCUD)) { namesService.updateNames(previous, discipline); + } else if (StructureCommand.DELETE.equals(structureCommandCUD)) { + // not delete names - legacy names + // delete sub structures - delete, approve + List<StructureElementCommand> structureElementCommands = Lists.newArrayList(); + List<DeviceGroup> deviceGroups = iDeviceGroupRepository.findLatestNotDeletedByParent(uuid); + for (DeviceGroup deviceGroup : deviceGroups) { + structureElementCommands.add(new StructureElementCommand(deviceGroup.getUuid(), Type.DEVICEGROUP, null, null, null, null, StructuresService.DELETE_AFTER_APPROVE_STRUCTURE_CHANGE)); + } + for (StructureElementCommand structureElementCommand : structureElementCommands) { + deviceGroupService.deleteStructure(structureElementCommand, processed, processedBy); + } + for (StructureElementCommand structureElementCommand : structureElementCommands) { + deviceGroupService.approveStructure(structureElementCommand, processed, processedBy, holder); + } } LOGGER.log(Level.FINE, "approveStructure, structureElement: {0}", structureElement); diff --git a/src/main/java/org/openepics/names/service/NamesService.java b/src/main/java/org/openepics/names/service/NamesService.java index df34b773..0739f4d0 100644 --- a/src/main/java/org/openepics/names/service/NamesService.java +++ b/src/main/java/org/openepics/names/service/NamesService.java @@ -633,7 +633,7 @@ public class NamesService { public List<NameElement> updateNames(Structure previousStructure, Structure structure) { // validation outside method // transaction - // use active transaction or, if not available, create new + // use active transaction or, if not available, throw exception // do // find out names referenced by structure // not for device group @@ -727,7 +727,7 @@ public class NamesService { } // update names - // use active transaction or, if not available, create new + // use active transaction or, if not available, throw exception LOGGER.log(Level.FINE, "updateNames, structure change, nameElements.size: {0}", nameElements.size()); updatedNameElements = updateNames(nameElements); } diff --git a/src/main/java/org/openepics/names/service/StructuresService.java b/src/main/java/org/openepics/names/service/StructuresService.java index f5355904..6b070de3 100644 --- a/src/main/java/org/openepics/names/service/StructuresService.java +++ b/src/main/java/org/openepics/names/service/StructuresService.java @@ -88,7 +88,8 @@ public class StructuresService { private static final Logger LOGGER = Logger.getLogger(StructuresService.class.getName()); - protected static final String SYSTEM_STRUCTURE_ONLY = "System structure only"; + protected static final String SYSTEM_STRUCTURE_ONLY = "System structure only"; + protected static final String DELETE_AFTER_APPROVE_STRUCTURE_CHANGE = "Delete after APPROVE structure change"; private EssNamingConvention namingConvention; @@ -930,111 +931,26 @@ public class StructuresService { String requestedBy = TextUtil.TEST_WHO; final List<StructureElement> deletedStructureElements = Lists.newArrayList(); for (StructureElementCommand structureElement : structureElements) { - String uuid = structureElement.getUuid().toString(); Type type = structureElement.getType(); if (Type.SYSTEMGROUP.equals(type)) { - // find - List<SystemGroup> systemGroups = holderRepositories.getSystemGroupRepository().readSystemGroups(Status.APPROVED, Boolean.FALSE, uuid, null, null, null, null, null); - if (ValidateUtil.isNullOrNotSize(systemGroups, 1)) { - continue; - } - SystemGroup toBeDeleted = systemGroups.get(0); - - // create - SystemGroup systemGroup = new SystemGroup(toBeDeleted.getUuid(), - toBeDeleted.getName(), toBeDeleted.getMnemonic(), namingConvention.equivalenceClassRepresentative(toBeDeleted.getMnemonic()), - toBeDeleted.getDescription(), Status.PENDING, Boolean.FALSE, Boolean.TRUE, - requested, requestedBy, structureElement.getComment()); - holderRepositories.getSystemGroupRepository().createSystemGroup(systemGroup); - - // add - deletedStructureElements.add(StructureElementUtil.getStructureElementRequested(systemGroup)); + Utilities.addToCollection(deletedStructureElements, + systemGroupService.deleteStructure(structureElement, requested, requestedBy)); } else if (Type.SYSTEM.equals(type)) { - // find - List<System> systems = holderRepositories.getSystemRepository().readSystems(Status.APPROVED, Boolean.FALSE, uuid, null, null, null, null, null, null); - if (ValidateUtil.isNullOrNotSize(systems, 1)) { - continue; - } - System toBeDeleted = systems.get(0); - - // create - System system = new System(toBeDeleted.getUuid(), toBeDeleted.getParentUuid(), - toBeDeleted.getName(), toBeDeleted.getMnemonic(), namingConvention.equivalenceClassRepresentative(toBeDeleted.getMnemonic()), - toBeDeleted.getDescription(), Status.PENDING, Boolean.FALSE, Boolean.TRUE, - requested, requestedBy, structureElement.getComment()); - holderRepositories.getSystemRepository().createSystem(system); - - // add - deletedStructureElements.add(StructureElementUtil.getStructureElementRequested(system)); + Utilities.addToCollection(deletedStructureElements, + systemService.deleteStructure(structureElement, requested, requestedBy)); } else if (Type.SUBSYSTEM.equals(type)) { - // find - List<Subsystem> subsystems = holderRepositories.getSubsystemRepository().readSubsystems(Status.APPROVED, Boolean.FALSE, uuid, null, null, null, null, null, null); - if (ValidateUtil.isNullOrNotSize(subsystems, 1)) { - continue; - } - Subsystem toBeDeleted = subsystems.get(0); - - // create - Subsystem subsystem = new Subsystem(toBeDeleted.getUuid(), toBeDeleted.getParentUuid(), - toBeDeleted.getName(), toBeDeleted.getMnemonic(), namingConvention.equivalenceClassRepresentative(toBeDeleted.getMnemonic()), - toBeDeleted.getDescription(), Status.PENDING, Boolean.FALSE, Boolean.TRUE, - requested, requestedBy, structureElement.getComment()); - holderRepositories.getSubsystemRepository().createSubsystem(subsystem); - - // add - deletedStructureElements.add(StructureElementUtil.getStructureElementRequested(subsystem)); + Utilities.addToCollection(deletedStructureElements, + subsystemService.deleteStructure(structureElement, requested, requestedBy)); } else if (Type.DISCIPLINE.equals(type)) { - // find - List<Discipline> disciplines = holderRepositories.getDisciplineRepository().readDisciplines(Status.APPROVED, Boolean.FALSE, uuid, null, null, null, null, null); - if (ValidateUtil.isNullOrNotSize(disciplines, 1)) { - continue; - } - Discipline toBeDeleted = disciplines.get(0); - - // create - Discipline discipline = new Discipline(toBeDeleted.getUuid(), - toBeDeleted.getName(), toBeDeleted.getMnemonic(), namingConvention.equivalenceClassRepresentative(toBeDeleted.getMnemonic()), - toBeDeleted.getDescription(), Status.PENDING, Boolean.FALSE, Boolean.TRUE, - requested, requestedBy, structureElement.getComment()); - holderRepositories.getDisciplineRepository().createDiscipline(discipline); - - // add - deletedStructureElements.add(StructureElementUtil.getStructureElementRequested(discipline)); + Utilities.addToCollection(deletedStructureElements, + disciplineService.deleteStructure(structureElement, requested, requestedBy)); } else if (Type.DEVICEGROUP.equals(type)) { - // find - List<DeviceGroup> deviceGroups = holderRepositories.getDeviceGroupRepository().readDeviceGroups(Status.APPROVED, Boolean.FALSE, uuid, null, null, null, null, null, null); - if (ValidateUtil.isNullOrNotSize(deviceGroups, 1)) { - continue; - } - DeviceGroup toBeDeleted = deviceGroups.get(0); - - // create - DeviceGroup deviceGroup = new DeviceGroup(toBeDeleted.getUuid(), toBeDeleted.getParentUuid(), - toBeDeleted.getName(), toBeDeleted.getMnemonic(), namingConvention.equivalenceClassRepresentative(toBeDeleted.getMnemonic()), - toBeDeleted.getDescription(), Status.PENDING, Boolean.FALSE, Boolean.TRUE, - requested, requestedBy, structureElement.getComment()); - holderRepositories.getDeviceGroupRepository().createDeviceGroup(deviceGroup); - - // add - deletedStructureElements.add(StructureElementUtil.getStructureElementRequested(deviceGroup)); + Utilities.addToCollection(deletedStructureElements, + deviceGroupService.deleteStructure(structureElement, requested, requestedBy)); } else if (Type.DEVICETYPE.equals(type)) { - // find - List<DeviceType> deviceTypes = holderRepositories.getDeviceTypeRepository().readDeviceTypes(Status.APPROVED, Boolean.FALSE, uuid, null, null, null, null, null, null); - if (ValidateUtil.isNullOrNotSize(deviceTypes, 1)) { - continue; - } - DeviceType toBeDeleted = deviceTypes.get(0); - - // create - DeviceType deviceType = new DeviceType(toBeDeleted.getUuid(), toBeDeleted.getParentUuid(), - toBeDeleted.getName(), toBeDeleted.getMnemonic(), namingConvention.equivalenceClassRepresentative(toBeDeleted.getMnemonic()), - toBeDeleted.getDescription(), Status.PENDING, Boolean.FALSE, Boolean.TRUE, - requested, requestedBy, structureElement.getComment()); - holderRepositories.getDeviceTypeRepository().createDeviceType(deviceType); - - // add - deletedStructureElements.add(StructureElementUtil.getStructureElementRequested(deviceType)); + Utilities.addToCollection(deletedStructureElements, + deviceTypeService.deleteStructure(structureElement, requested, requestedBy)); } } @@ -1068,6 +984,9 @@ public class StructuresService { // update related names // for different mnemonic // not for device group + // approve delete + // keep related names - legacy names + // delete sub structures // return // structure elements for approved structures @@ -1079,10 +998,9 @@ public class StructuresService { // approve // set not latest for current latest // set approved, latest for pending - // possibly + // delete // if deleted, names that belong to structure may be deleted, otherwise they are alive but become legacy names - legacy way for now - // TODO if not deleted, rename names that belong to structure if different mnemonic - // if that way, then compare what's about to be approved with what is latest + // delete sub structures // do // update diff --git a/src/main/java/org/openepics/names/service/SubsystemService.java b/src/main/java/org/openepics/names/service/SubsystemService.java index 3252263d..77424b9b 100644 --- a/src/main/java/org/openepics/names/service/SubsystemService.java +++ b/src/main/java/org/openepics/names/service/SubsystemService.java @@ -72,6 +72,37 @@ public class SubsystemService { this.namesService = namesService; } + @Transactional(propagation = Propagation.MANDATORY) + public StructureElement deleteStructure(StructureElementCommand structureElement, + Date requested, String requestedBy) { + // validation outside method + // transaction + // do + // find + // create structure to pending, not latest, deleted, with data + // possibly validate that deleted + // return + // structure element for deleted structure + + String uuid = structureElement.getUuid().toString(); + + // find + List<Subsystem> subsystems = subsystemRepository.readSubsystems(Status.APPROVED, Boolean.FALSE, uuid, null, null, null, null, null, null); + if (ValidateUtil.isNullOrNotSize(subsystems, 1)) { + return null; + } + Subsystem toBeDeleted = subsystems.get(0); + + // create + Subsystem subsystem = new Subsystem(toBeDeleted.getUuid(), toBeDeleted.getParentUuid(), + toBeDeleted.getName(), toBeDeleted.getMnemonic(), toBeDeleted.getMnemonicEquivalence(), + toBeDeleted.getDescription(), Status.PENDING, Boolean.FALSE, Boolean.TRUE, + requested, requestedBy, structureElement.getComment()); + subsystemRepository.createSubsystem(subsystem); + + return StructureElementUtil.getStructureElementRequested(subsystem); + } + @Transactional(propagation = Propagation.MANDATORY) public StructureElement approveStructure(StructureElementCommand structureElement, Date processed, String processedBy, @@ -96,6 +127,9 @@ public class SubsystemService { // update related names // for different mnemonic // not for device group + // approve delete + // keep related names - legacy names + // delete sub structures // return // structure element for approved structure @@ -134,6 +168,7 @@ public class SubsystemService { // approve create // approve update + // approve delete if (StructureCommand.CREATE.equals(structureCommandCUD)) { boolean existsName = !StringUtils.isEmpty(subsystem.getMnemonic()) && namesService.existsName(StructureUtil.getMnemonicPath(subsystem, holder)); if (!existsName) { @@ -143,6 +178,8 @@ public class SubsystemService { } } else if (StructureCommand.UPDATE.equals(structureCommandCUD)) { namesService.updateNames(previous, subsystem); + } else if (StructureCommand.DELETE.equals(structureCommandCUD)) { + // not delete names - legacy names } LOGGER.log(Level.FINE, "approveStructure, structureElement: {0}", structureElement); diff --git a/src/main/java/org/openepics/names/service/SystemGroupService.java b/src/main/java/org/openepics/names/service/SystemGroupService.java index bf3e2eb8..6ebabd10 100644 --- a/src/main/java/org/openepics/names/service/SystemGroupService.java +++ b/src/main/java/org/openepics/names/service/SystemGroupService.java @@ -25,9 +25,12 @@ import java.util.logging.Logger; import org.apache.commons.lang3.StringUtils; import org.openepics.names.repository.ISystemGroupRepository; +import org.openepics.names.repository.ISystemRepository; import org.openepics.names.repository.SystemGroupRepository; +import org.openepics.names.repository.model.System; import org.openepics.names.repository.model.SystemGroup; import org.openepics.names.rest.beans.Status; +import org.openepics.names.rest.beans.Type; import org.openepics.names.rest.beans.element.NameElement; import org.openepics.names.rest.beans.element.NameElementCommand; import org.openepics.names.rest.beans.element.StructureElement; @@ -43,6 +46,8 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; +import com.google.common.collect.Lists; + /** * This class provides structures services for system group. * @@ -59,17 +64,54 @@ public class SystemGroupService { private static final Logger LOGGER = Logger.getLogger(SystemGroupService.class.getName()); private ISystemGroupRepository iSystemGroupRepository; + private ISystemRepository iSystemRepository; private SystemGroupRepository systemGroupRepository; private NamesService namesService; + private SystemService systemService; @Autowired public SystemGroupService( ISystemGroupRepository iSystemGroupRepository, + ISystemRepository iSystemRepository, SystemGroupRepository systemGroupRepository, - NamesService namesService) { + NamesService namesService, + SystemService systemService) { this.iSystemGroupRepository = iSystemGroupRepository; + this.iSystemRepository = iSystemRepository; this.systemGroupRepository = systemGroupRepository; this.namesService = namesService; + this.systemService = systemService; + } + + @Transactional(propagation = Propagation.MANDATORY) + public StructureElement deleteStructure(StructureElementCommand structureElement, + Date requested, String requestedBy) { + // validation outside method + // transaction + // do + // find + // create structure to pending, not latest, deleted, with data + // possibly validate that deleted + // return + // structure element for deleted structure + + String uuid = structureElement.getUuid().toString(); + + // find + List<SystemGroup> systemGroups = systemGroupRepository.readSystemGroups(Status.APPROVED, Boolean.FALSE, uuid, null, null, null, null, null); + if (ValidateUtil.isNullOrNotSize(systemGroups, 1)) { + return null; + } + SystemGroup toBeDeleted = systemGroups.get(0); + + // create + SystemGroup systemGroup = new SystemGroup(toBeDeleted.getUuid(), + toBeDeleted.getName(), toBeDeleted.getMnemonic(), toBeDeleted.getMnemonicEquivalence(), + toBeDeleted.getDescription(), Status.PENDING, Boolean.FALSE, Boolean.TRUE, + requested, requestedBy, structureElement.getComment()); + systemGroupRepository.createSystemGroup(systemGroup); + + return StructureElementUtil.getStructureElementRequested(systemGroup); } @Transactional(propagation = Propagation.MANDATORY) @@ -96,6 +138,9 @@ public class SystemGroupService { // update related names // for different mnemonic // not for device group + // approve delete + // keep related names - legacy names + // delete sub structures // return // structure element for approved structure @@ -134,6 +179,7 @@ public class SystemGroupService { // approve create // approve update + // approve delete if (StructureCommand.CREATE.equals(structureCommandCUD)) { boolean existsName = !StringUtils.isEmpty(systemGroup.getMnemonic()) && namesService.existsName(StructureUtil.getMnemonicPath(systemGroup, holder)); if (!existsName) { @@ -143,9 +189,22 @@ public class SystemGroupService { } } else if (StructureCommand.UPDATE.equals(structureCommandCUD)) { namesService.updateNames(previous, systemGroup); + } else if (StructureCommand.DELETE.equals(structureCommandCUD)) { + // not delete names - legacy names + // delete sub structures - delete, approve + List<StructureElementCommand> structureElementCommands = Lists.newArrayList(); + List<System> systems = iSystemRepository.findLatestNotDeletedByParent(uuid); + for (System system : systems) { + structureElementCommands.add(new StructureElementCommand(system.getUuid(), Type.SYSTEM, null, null, null, null, StructuresService.DELETE_AFTER_APPROVE_STRUCTURE_CHANGE)); + } + for (StructureElementCommand structureElementCommand : structureElementCommands) { + systemService.deleteStructure(structureElementCommand, processed, processedBy); + } + for (StructureElementCommand structureElementCommand : structureElementCommands) { + systemService.approveStructure(structureElementCommand, processed, processedBy, holder); + } } - LOGGER.log(Level.FINE, "approveStructure, structureElement: {0}", structureElement); return StructureElementUtil.getStructureElementProcessed(systemGroup, holder, StructureChoice.STRUCTURE); } diff --git a/src/main/java/org/openepics/names/service/SystemService.java b/src/main/java/org/openepics/names/service/SystemService.java index 73e61ef2..05ab5b07 100644 --- a/src/main/java/org/openepics/names/service/SystemService.java +++ b/src/main/java/org/openepics/names/service/SystemService.java @@ -24,10 +24,13 @@ import java.util.logging.Level; import java.util.logging.Logger; import org.apache.commons.lang3.StringUtils; +import org.openepics.names.repository.ISubsystemRepository; import org.openepics.names.repository.ISystemRepository; import org.openepics.names.repository.SystemRepository; +import org.openepics.names.repository.model.Subsystem; import org.openepics.names.repository.model.System; import org.openepics.names.rest.beans.Status; +import org.openepics.names.rest.beans.Type; import org.openepics.names.rest.beans.element.NameElement; import org.openepics.names.rest.beans.element.NameElementCommand; import org.openepics.names.rest.beans.element.StructureElement; @@ -43,6 +46,8 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; +import com.google.common.collect.Lists; + /** * This class provides structures services for system. * @@ -59,17 +64,54 @@ public class SystemService { private static final Logger LOGGER = Logger.getLogger(SystemService.class.getName()); private ISystemRepository iSystemRepository; + private ISubsystemRepository iSubsystemRepository; private SystemRepository systemRepository; private NamesService namesService; + private SubsystemService subsystemService; @Autowired public SystemService( ISystemRepository iSystemRepository, + ISubsystemRepository iSubsystemRepository, SystemRepository systemRepository, - NamesService namesService) { + NamesService namesService, + SubsystemService subsystemService) { this.iSystemRepository = iSystemRepository; + this.iSubsystemRepository = iSubsystemRepository; this.systemRepository = systemRepository; this.namesService = namesService; + this.subsystemService = subsystemService; + } + + @Transactional(propagation = Propagation.MANDATORY) + public StructureElement deleteStructure(StructureElementCommand structureElement, + Date requested, String requestedBy) { + // validation outside method + // transaction + // do + // find + // create structure to pending, not latest, deleted, with data + // possibly validate that deleted + // return + // structure element for deleted structure + + String uuid = structureElement.getUuid().toString(); + + // find + List<System> systems = systemRepository.readSystems(Status.APPROVED, Boolean.FALSE, uuid, null, null, null, null, null, null); + if (ValidateUtil.isNullOrNotSize(systems, 1)) { + return null; + } + System toBeDeleted = systems.get(0); + + // create + System system = new System(toBeDeleted.getUuid(), toBeDeleted.getParentUuid(), + toBeDeleted.getName(), toBeDeleted.getMnemonic(), toBeDeleted.getMnemonicEquivalence(), + toBeDeleted.getDescription(), Status.PENDING, Boolean.FALSE, Boolean.TRUE, + requested, requestedBy, structureElement.getComment()); + systemRepository.createSystem(system); + + return StructureElementUtil.getStructureElementRequested(system); } @Transactional(propagation = Propagation.MANDATORY) @@ -96,6 +138,9 @@ public class SystemService { // update related names // for different mnemonic // not for device group + // approve delete + // keep related names - legacy names + // delete sub structures // return // structure element for approved structure @@ -134,6 +179,7 @@ public class SystemService { // approve create // approve update + // approve delete if (StructureCommand.CREATE.equals(structureCommandCUD)) { boolean existsName = !StringUtils.isEmpty(system.getMnemonic()) && namesService.existsName(StructureUtil.getMnemonicPath(system, holder)); if (!existsName) { @@ -143,6 +189,20 @@ public class SystemService { } } else if (StructureCommand.UPDATE.equals(structureCommandCUD)) { namesService.updateNames(previous, system); + } else if (StructureCommand.DELETE.equals(structureCommandCUD)) { + // not delete names - legacy names + // delete sub structures - delete, approve + List<StructureElementCommand> structureElementCommands = Lists.newArrayList(); + List<Subsystem> subsystems = iSubsystemRepository.findLatestNotDeletedByParent(uuid); + for (Subsystem subsystem : subsystems) { + structureElementCommands.add(new StructureElementCommand(subsystem.getUuid(), Type.SUBSYSTEM, null, null, null, null, StructuresService.DELETE_AFTER_APPROVE_STRUCTURE_CHANGE)); + } + for (StructureElementCommand structureElementCommand : structureElementCommands) { + subsystemService.deleteStructure(structureElementCommand, processed, processedBy); + } + for (StructureElementCommand structureElementCommand : structureElementCommands) { + subsystemService.approveStructure(structureElementCommand, processed, processedBy, holder); + } } LOGGER.log(Level.FINE, "approveStructure, structureElement: {0}", structureElement); diff --git a/src/test/java/org/openepics/names/docker/complex/StructuresCUDDeleteIT.java b/src/test/java/org/openepics/names/docker/complex/StructuresCUDDeleteIT.java new file mode 100644 index 00000000..ef551113 --- /dev/null +++ b/src/test/java/org/openepics/names/docker/complex/StructuresCUDDeleteIT.java @@ -0,0 +1,583 @@ +/* + * Copyright (C) 2022 European Spallation Source ERIC. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +package org.openepics.names.docker.complex; + +import java.io.File; +import java.util.UUID; + +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.openepics.names.docker.ITUtil; +import org.openepics.names.docker.ITUtilNameElement; +import org.openepics.names.docker.ITUtilStructureElement; +import org.openepics.names.rest.beans.Type; +import org.openepics.names.rest.beans.element.NameElementCommand; +import org.openepics.names.rest.beans.element.StructureElement; +import org.openepics.names.rest.beans.element.StructureElementCommand; +import org.openepics.names.rest.beans.response.ResponsePageStructureElements; +import org.testcontainers.containers.DockerComposeContainer; +import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; + +/** + * Integration tests for Naming and PostgreSQL that make use of existing dockerization + * with docker-compose.yml / Dockerfile. + * + * <p> + * Focus of this class is names endpoint and rules for legacy name. + * In practice, this class contains tests for structures and names, before and after delete of structures. + * </p> + * + * @author Lars Johansson + */ +@Testcontainers +class StructuresCUDDeleteIT { + + // test + // create update delete structures and ensure name is as expected + // + // setup + // system structure + // Sg + // Sys + // Sys-Sub + // system structure + device structure + index + // Sg:Di-Dt-Idx + // Sys:Di-Dt-Idx + // Sys-Sub:Di-Dt-Idx + // + // note + // namecommand + // cud - create update delete + // structurecommand + // cud - create update delete + // acr - approve cancel reject + + @Container + public static final DockerComposeContainer<?> ENVIRONMENT = + new DockerComposeContainer<>(new File("docker-compose-integrationtest.yml")) + .waitingFor(ITUtil.NAMING, Wait.forLogMessage(".*Started NamingApplication.*", 1)); + + // system group + private static UUID sg1 = null; + private static UUID sg2 = null; + + // system + private static UUID sys11, sys12, sys13 = null; + private static UUID sys21, sys22, sys23 = null; + + // subsystem + // sub111, sub112, sub113 + // sub121, sub122, sub123 + // sub131, sub132, sub133 + // sub211, sub212, sub213 + // sub221, sub222, sub223 + // sub231, sub232, sub233 + private static UUID sub132 = null; + private static UUID sub231, sub232, sub233 = null; + + // discipline + private static UUID di2 = null; + + // device group + private static UUID dg21, dg22, dg23 = null; + + // device type + private static UUID dt211, dt212, dt213 = null; + private static UUID dt221, dt222, dt223 = null; + private static UUID dt231, dt232, dt233 = null; + + // name + // n211, n212, n213 + // n221, n222, n223 + // n231, n232, n233 + + @BeforeAll + public static void initAll() { + // init system group, system, subsystem, discipline, device group, device type + // + // test create structure and ensure name is as expected + + NameElementCommand nameElement = null; + StructureElementCommand structureElement = null; + StructureElement approvedStructureElement = null; + + String name = "name"; + String description = "description"; + String comment = "comment"; + + structureElement = new StructureElementCommand(null, Type.SYSTEMGROUP, null, name, "Sg1", description, comment); + approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement); + sg1 = approvedStructureElement.getUuid(); + + structureElement = new StructureElementCommand(null, Type.SYSTEM, sg1, name, "Sys11", description, comment); + approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement); + sys11 = approvedStructureElement.getUuid(); + + structureElement = new StructureElementCommand(null, Type.SYSTEM, sg1, name, "Sys12", description, comment); + approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement); + sys12 = approvedStructureElement.getUuid(); + + structureElement = new StructureElementCommand(null, Type.SYSTEM, sg1, name, "Sys13", description, comment); + approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement); + sys13 = approvedStructureElement.getUuid(); + + structureElement = new StructureElementCommand(null, Type.SUBSYSTEM, sys11, name, "Sub111", description, comment); + approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement); + + structureElement = new StructureElementCommand(null, Type.SUBSYSTEM, sys11, name, "Sub112", description, comment); + approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement); + + structureElement = new StructureElementCommand(null, Type.SUBSYSTEM, sys11, name, "Sub113", description, comment); + approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement); + + structureElement = new StructureElementCommand(null, Type.SUBSYSTEM, sys12, name, "Sub121", description, comment); + approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement); + + structureElement = new StructureElementCommand(null, Type.SUBSYSTEM, sys12, name, "Sub122", description, comment); + approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement); + + structureElement = new StructureElementCommand(null, Type.SUBSYSTEM, sys12, name, "Sub123", description, comment); + approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement); + + structureElement = new StructureElementCommand(null, Type.SUBSYSTEM, sys13, name, "Sub131", description, comment); + approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement); + + structureElement = new StructureElementCommand(null, Type.SUBSYSTEM, sys13, name, "Sub132", description, comment); + approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement); + sub132 = approvedStructureElement.getUuid(); + + structureElement = new StructureElementCommand(null, Type.SUBSYSTEM, sys13, name, "Sub133", description, comment); + approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement); + + ITUtilStructureElement.assertRead("/SYSTEMGROUP", 1); + ITUtilStructureElement.assertRead("/SYSTEM", 3); + ITUtilStructureElement.assertRead("/SUBSYSTEM", 9); + ITUtilNameElement.assertRead("", 13); + + + // at this point + // system group + // Sg1 + // system + // Sys11, Sys12, Sys13 + // subsystem + // Sub111, Sub112, Sub113 + // Sub121, Sub122, Sub123 + // Sub131, Sub132, Sub133 + // name (system structure only) + // Sg1 + // Sys11, Sys12, Sys13 + // Sys11-Sub111, Sys11-Sub112, Sys11-Sub113 + // Sys12-Sub121, Sys12-Sub122, Sys12-Sub123 + // Sys13-Sub131, Sys13-Sub132, Sys13-Sub133 + + structureElement = new StructureElementCommand(null, Type.SYSTEMGROUP, null, name, "Sg2", description, comment); + approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement); + sg2 = approvedStructureElement.getUuid(); + + structureElement = new StructureElementCommand(null, Type.SYSTEM, sg2, name, "Sys21", description, comment); + approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement); + sys21 = approvedStructureElement.getUuid(); + + structureElement = new StructureElementCommand(null, Type.SYSTEM, sg2, name, "Sys22", description, comment); + approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement); + sys22 = approvedStructureElement.getUuid(); + + structureElement = new StructureElementCommand(null, Type.SYSTEM, sg2, name, "Sys23", description, comment); + approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement); + sys23 = approvedStructureElement.getUuid(); + + structureElement = new StructureElementCommand(null, Type.SUBSYSTEM, sys21, name, "Sub211", description, comment); + approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement); + + structureElement = new StructureElementCommand(null, Type.SUBSYSTEM, sys21, name, "Sub212", description, comment); + approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement); + + structureElement = new StructureElementCommand(null, Type.SUBSYSTEM, sys21, name, "Sub213", description, comment); + approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement); + + structureElement = new StructureElementCommand(null, Type.SUBSYSTEM, sys22, name, "Sub221", description, comment); + approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement); + + structureElement = new StructureElementCommand(null, Type.SUBSYSTEM, sys22, name, "Sub222", description, comment); + approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement); + + structureElement = new StructureElementCommand(null, Type.SUBSYSTEM, sys22, name, "Sub223", description, comment); + approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement); + + structureElement = new StructureElementCommand(null, Type.SUBSYSTEM, sys23, name, "Sub231", description, comment); + approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement); + sub231 = approvedStructureElement.getUuid(); + + structureElement = new StructureElementCommand(null, Type.SUBSYSTEM, sys23, name, "Sub232", description, comment); + approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement); + sub232 = approvedStructureElement.getUuid(); + + structureElement = new StructureElementCommand(null, Type.SUBSYSTEM, sys23, name, "Sub233", description, comment); + approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement); + sub233 = approvedStructureElement.getUuid(); + + ITUtilStructureElement.assertRead("/SYSTEMGROUP", 2); + ITUtilStructureElement.assertRead("/SYSTEM", 6); + ITUtilStructureElement.assertRead("/SUBSYSTEM", 18); + ITUtilNameElement.assertRead("", 26); + + // at this point + // above + // + + // system group + // Sg2 + // system + // Sys21, Sys22, Sys23 + // subsystem + // Sub211, Sub212, Sub213 + // Sub221, Sub222, Sub223 + // Sub231, Sub232, Sub233 + // name (system structure only) + // Sg2 + // Sys21, Sys22, Sys23 + // Sys21-Sub211, Sys21-Sub212, Sys21-Sub213 + // Sys22-Sub221, Sys22-Sub222, Sys22-Sub223 + // Sys23-Sub231, Sys23-Sub232, Sys23-Sub233 + + structureElement = new StructureElementCommand(null, Type.DISCIPLINE, null, name, "Di2", description, comment); + approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement); + di2 = approvedStructureElement.getUuid(); + + structureElement = new StructureElementCommand(null, Type.DEVICEGROUP, di2, name, "", description, comment); + approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement); + dg21 = approvedStructureElement.getUuid(); + + structureElement = new StructureElementCommand(null, Type.DEVICEGROUP, di2, name, "", description, comment); + approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement); + dg22 = approvedStructureElement.getUuid(); + + structureElement = new StructureElementCommand(null, Type.DEVICEGROUP, di2, name, "", description, comment); + approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement); + dg23 = approvedStructureElement.getUuid(); + + structureElement = new StructureElementCommand(null, Type.DEVICETYPE, dg21, name, "Dt211", description, comment); + approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement); + dt211 = approvedStructureElement.getUuid(); + + structureElement = new StructureElementCommand(null, Type.DEVICETYPE, dg21, name, "Dt212", description, comment); + approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement); + dt212 = approvedStructureElement.getUuid(); + + structureElement = new StructureElementCommand(null, Type.DEVICETYPE, dg21, name, "Dt213", description, comment); + approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement); + dt213 = approvedStructureElement.getUuid(); + + structureElement = new StructureElementCommand(null, Type.DEVICETYPE, dg22, name, "Dt221", description, comment); + approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement); + dt221 = approvedStructureElement.getUuid(); + + structureElement = new StructureElementCommand(null, Type.DEVICETYPE, dg22, name, "Dt222", description, comment); + approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement); + dt222 = approvedStructureElement.getUuid(); + + structureElement = new StructureElementCommand(null, Type.DEVICETYPE, dg22, name, "Dt223", description, comment); + approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement); + dt223 = approvedStructureElement.getUuid(); + + structureElement = new StructureElementCommand(null, Type.DEVICETYPE, dg23, name, "Dt231", description, comment); + approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement); + dt231 = approvedStructureElement.getUuid(); + + structureElement = new StructureElementCommand(null, Type.DEVICETYPE, dg23, name, "Dt232", description, comment); + approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement); + dt232 = approvedStructureElement.getUuid(); + + structureElement = new StructureElementCommand(null, Type.DEVICETYPE, dg23, name, "Dt233", description, comment); + approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement); + dt233 = approvedStructureElement.getUuid(); + + ITUtilStructureElement.assertRead("/SYSTEMGROUP", 2); + ITUtilStructureElement.assertRead("/SYSTEM", 6); + ITUtilStructureElement.assertRead("/SUBSYSTEM", 18); + ITUtilStructureElement.assertRead("/DISCIPLINE", 1); + ITUtilStructureElement.assertRead("/DEVICEGROUP", 3); + ITUtilStructureElement.assertRead("/DEVICETYPE", 9); + ITUtilNameElement.assertRead("", 26); + + // at this point + // above + // + + // discipline + // Di2 + // device group + // -, -, - + // device type + // Dt211, Dt212, Dt213 + // Dt221, Dt222, Dt223 + // Dt231, Dt232, Dt233 + + nameElement = new NameElementCommand(null, sg2, dt211, "211", description, comment); + ITUtilNameElement.assertCreate(nameElement); + + nameElement = new NameElementCommand(null, sg2, dt212, "212", description, comment); + ITUtilNameElement.assertCreate(nameElement); + + nameElement = new NameElementCommand(null, sg2, dt213, "213", description, comment); + ITUtilNameElement.assertCreate(nameElement); + + nameElement = new NameElementCommand(null, sys22, dt221, "221", description, comment); + ITUtilNameElement.assertCreate(nameElement); + + nameElement = new NameElementCommand(null, sys22, dt222, "222", description, comment); + ITUtilNameElement.assertCreate(nameElement); + + nameElement = new NameElementCommand(null, sys22, dt223, "223", description, comment); + ITUtilNameElement.assertCreate(nameElement); + + nameElement = new NameElementCommand(null, sub231, dt231, "231", description, comment); + ITUtilNameElement.assertCreate(nameElement); + + nameElement = new NameElementCommand(null, sub232, dt232, "232", description, comment); + ITUtilNameElement.assertCreate(nameElement); + + nameElement = new NameElementCommand(null, sub233, dt233, "233", description, comment); + ITUtilNameElement.assertCreate(nameElement); + + ITUtilStructureElement.assertRead("/SYSTEMGROUP", 2); + ITUtilStructureElement.assertRead("/SYSTEM", 6); + ITUtilStructureElement.assertRead("/SUBSYSTEM", 18); + ITUtilStructureElement.assertRead("/DISCIPLINE", 1); + ITUtilStructureElement.assertRead("/DEVICEGROUP", 3); + ITUtilStructureElement.assertRead("/DEVICETYPE", 9); + ITUtilNameElement.assertRead("", 35); + + // at this point + // above + // + + // name (system structure + device structure + index) + // Sg2:Di2-Dt211-211 + // Sg2:Di2-Dt212-212 + // Sg2:Di2-Dt213-213 + // Sys22:Di2-Dt221-221 + // Sys22:Di2-Dt222-222 + // Sys22:Di2-Dt223-223 + // Sys23-Sub231:Di2-Dt231-231 + // Sys23-Sub232:Di2-Dt232-232 + // Sys23-Sub233:Di2-Dt233-233 + + ITUtilNameElement.assertExists("Sg1", Boolean.TRUE); + ITUtilNameElement.assertExists("Sys11", Boolean.TRUE); + ITUtilNameElement.assertExists("Sys12", Boolean.TRUE); + ITUtilNameElement.assertExists("Sys13", Boolean.TRUE); + ITUtilNameElement.assertExists("Sys11-Sub111", Boolean.TRUE); + ITUtilNameElement.assertExists("Sys11-Sub112", Boolean.TRUE); + ITUtilNameElement.assertExists("Sys11-Sub113", Boolean.TRUE); + ITUtilNameElement.assertExists("Sys12-Sub121", Boolean.TRUE); + ITUtilNameElement.assertExists("Sys12-Sub122", Boolean.TRUE); + ITUtilNameElement.assertExists("Sys12-Sub123", Boolean.TRUE); + ITUtilNameElement.assertExists("Sys13-Sub131", Boolean.TRUE); + ITUtilNameElement.assertExists("Sys13-Sub132", Boolean.TRUE); + ITUtilNameElement.assertExists("Sys13-Sub133", Boolean.TRUE); + + ITUtilNameElement.assertExists("Sg2", Boolean.TRUE); + ITUtilNameElement.assertExists("Sys21", Boolean.TRUE); + ITUtilNameElement.assertExists("Sys22", Boolean.TRUE); + ITUtilNameElement.assertExists("Sys23", Boolean.TRUE); + ITUtilNameElement.assertExists("Sys21-Sub211", Boolean.TRUE); + ITUtilNameElement.assertExists("Sys21-Sub212", Boolean.TRUE); + ITUtilNameElement.assertExists("Sys21-Sub213", Boolean.TRUE); + ITUtilNameElement.assertExists("Sys22-Sub221", Boolean.TRUE); + ITUtilNameElement.assertExists("Sys22-Sub222", Boolean.TRUE); + ITUtilNameElement.assertExists("Sys22-Sub223", Boolean.TRUE); + ITUtilNameElement.assertExists("Sys23-Sub231", Boolean.TRUE); + ITUtilNameElement.assertExists("Sys23-Sub232", Boolean.TRUE); + ITUtilNameElement.assertExists("Sys23-Sub233", Boolean.TRUE); + + ITUtilNameElement.assertExists("Sg2:Di2-Dt211-211", Boolean.TRUE); + ITUtilNameElement.assertExists("Sg2:Di2-Dt212-212", Boolean.TRUE); + ITUtilNameElement.assertExists("Sg2:Di2-Dt213-213", Boolean.TRUE); + ITUtilNameElement.assertExists("Sys22:Di2-Dt221-221", Boolean.TRUE); + ITUtilNameElement.assertExists("Sys22:Di2-Dt222-222", Boolean.TRUE); + ITUtilNameElement.assertExists("Sys22:Di2-Dt223-223", Boolean.TRUE); + ITUtilNameElement.assertExists("Sys23-Sub231:Di2-Dt231-231", Boolean.TRUE); + ITUtilNameElement.assertExists("Sys23-Sub232:Di2-Dt232-232", Boolean.TRUE); + ITUtilNameElement.assertExists("Sys23-Sub233:Di2-Dt233-233", Boolean.TRUE); + } + + @Test + void deleteSystemStructure() { + // purpose + // test update system structure and ensure name is as expected + + ResponsePageStructureElements responsePage = null; + StructureElementCommand structureElement = null; + + ITUtilStructureElement.assertExists(Type.SUBSYSTEM, "Sys13-Sub132", Boolean.TRUE); + ITUtilNameElement.assertExists("Sys13-Sub132", Boolean.TRUE); + + responsePage = ITUtilStructureElement.assertRead("/SUBSYSTEM?uuid=" + sub132, 1); + structureElement = responsePage.getList().get(0); + structureElement = ITUtilStructureElement.assertDeleteApprove(structureElement); + + ITUtilStructureElement.assertExists(Type.SUBSYSTEM, "Sys13-Sub132", Boolean.FALSE); + ITUtilNameElement.assertExists("Sys13-Sub132", Boolean.TRUE); + + // ---------------------------------------- + + ITUtilStructureElement.assertExists(Type.SYSTEM, "Sys12", Boolean.TRUE); + ITUtilStructureElement.assertExists(Type.SUBSYSTEM, "Sys12-Sub121", Boolean.TRUE); + ITUtilStructureElement.assertExists(Type.SUBSYSTEM, "Sys12-Sub122", Boolean.TRUE); + ITUtilStructureElement.assertExists(Type.SUBSYSTEM, "Sys12-Sub123", Boolean.TRUE); + ITUtilNameElement.assertExists("Sys12", Boolean.TRUE); + ITUtilNameElement.assertExists("Sys12-Sub121", Boolean.TRUE); + ITUtilNameElement.assertExists("Sys12-Sub122", Boolean.TRUE); + ITUtilNameElement.assertExists("Sys12-Sub123", Boolean.TRUE); + + responsePage = ITUtilStructureElement.assertRead("/SYSTEM?uuid=" + sys12, 1); + structureElement = responsePage.getList().get(0); + structureElement = ITUtilStructureElement.assertDeleteApprove(structureElement); + + ITUtilStructureElement.assertExists(Type.SYSTEM, "Sys12", Boolean.FALSE); + ITUtilStructureElement.assertExists(Type.SUBSYSTEM, "Sys12-Sub121", Boolean.FALSE); + ITUtilStructureElement.assertExists(Type.SUBSYSTEM, "Sys12-Sub122", Boolean.FALSE); + ITUtilStructureElement.assertExists(Type.SUBSYSTEM, "Sys12-Sub123", Boolean.FALSE); + ITUtilNameElement.assertExists("Sys12", Boolean.TRUE); + ITUtilNameElement.assertExists("Sys12-Sub121", Boolean.TRUE); + ITUtilNameElement.assertExists("Sys12-Sub122", Boolean.TRUE); + ITUtilNameElement.assertExists("Sys12-Sub123", Boolean.TRUE); + + // ---------------------------------------- + + ITUtilStructureElement.assertExists(Type.SYSTEMGROUP, "Sg1", Boolean.TRUE); + ITUtilStructureElement.assertExists(Type.SYSTEM, "Sys11", Boolean.TRUE); + ITUtilStructureElement.assertExists(Type.SYSTEM, "Sys12", Boolean.FALSE); + ITUtilStructureElement.assertExists(Type.SYSTEM, "Sys13", Boolean.TRUE); + ITUtilStructureElement.assertExists(Type.SUBSYSTEM, "Sys11-Sub111", Boolean.TRUE); + ITUtilStructureElement.assertExists(Type.SUBSYSTEM, "Sys11-Sub112", Boolean.TRUE); + ITUtilStructureElement.assertExists(Type.SUBSYSTEM, "Sys11-Sub113", Boolean.TRUE); + ITUtilStructureElement.assertExists(Type.SUBSYSTEM, "Sys12-Sub121", Boolean.FALSE); + ITUtilStructureElement.assertExists(Type.SUBSYSTEM, "Sys12-Sub122", Boolean.FALSE); + ITUtilStructureElement.assertExists(Type.SUBSYSTEM, "Sys12-Sub123", Boolean.FALSE); + ITUtilStructureElement.assertExists(Type.SUBSYSTEM, "Sys13-Sub131", Boolean.TRUE); + ITUtilStructureElement.assertExists(Type.SUBSYSTEM, "Sys13-Sub132", Boolean.FALSE); + ITUtilStructureElement.assertExists(Type.SUBSYSTEM, "Sys13-Sub133", Boolean.TRUE); + ITUtilNameElement.assertExists("Sg1", Boolean.TRUE); + + responsePage = ITUtilStructureElement.assertRead("/SYSTEMGROUP?uuid=" + sg1, 1); + structureElement = responsePage.getList().get(0); + structureElement = ITUtilStructureElement.assertDeleteApprove(structureElement); + + ITUtilStructureElement.assertExists(Type.SYSTEMGROUP, "Sg1", Boolean.FALSE); + ITUtilStructureElement.assertExists(Type.SYSTEM, "Sys11", Boolean.FALSE); + ITUtilStructureElement.assertExists(Type.SYSTEM, "Sys12", Boolean.FALSE); + ITUtilStructureElement.assertExists(Type.SYSTEM, "Sys13", Boolean.FALSE); + ITUtilStructureElement.assertExists(Type.SUBSYSTEM, "Sys11-Sub111", Boolean.FALSE); + ITUtilStructureElement.assertExists(Type.SUBSYSTEM, "Sys11-Sub112", Boolean.FALSE); + ITUtilStructureElement.assertExists(Type.SUBSYSTEM, "Sys11-Sub113", Boolean.FALSE); + ITUtilStructureElement.assertExists(Type.SUBSYSTEM, "Sys12-Sub121", Boolean.FALSE); + ITUtilStructureElement.assertExists(Type.SUBSYSTEM, "Sys12-Sub122", Boolean.FALSE); + ITUtilStructureElement.assertExists(Type.SUBSYSTEM, "Sys12-Sub123", Boolean.FALSE); + ITUtilStructureElement.assertExists(Type.SUBSYSTEM, "Sys13-Sub131", Boolean.FALSE); + ITUtilStructureElement.assertExists(Type.SUBSYSTEM, "Sys13-Sub132", Boolean.FALSE); + ITUtilStructureElement.assertExists(Type.SUBSYSTEM, "Sys13-Sub133", Boolean.FALSE); + ITUtilNameElement.assertExists("Sg1", Boolean.TRUE); + } + + @Test + void deleteDeviceStructure() { + // purpose + // test update system structure and ensure name is as expected + + ResponsePageStructureElements responsePage = null; + StructureElementCommand structureElement = null; + + ITUtilStructureElement.assertExists(Type.DEVICETYPE, "Di2-Dt232", Boolean.TRUE); + ITUtilNameElement.assertExists("Sys23-Sub232:Di2-Dt232-232", Boolean.TRUE); + + responsePage = ITUtilStructureElement.assertRead("/DEVICETYPE?uuid=" + dt232, 1); + structureElement = responsePage.getList().get(0); + structureElement = ITUtilStructureElement.assertDeleteApprove(structureElement); + + ITUtilStructureElement.assertExists(Type.DEVICETYPE, "Di2-Dt232", Boolean.FALSE); + ITUtilNameElement.assertExists("Sys23-Sub232:Di2-Dt232-232", Boolean.TRUE); + + // ---------------------------------------- + + ITUtilStructureElement.assertExists(Type.DEVICETYPE, "Di2-Dt221", Boolean.TRUE); + ITUtilStructureElement.assertExists(Type.DEVICETYPE, "Di2-Dt222", Boolean.TRUE); + ITUtilStructureElement.assertExists(Type.DEVICETYPE, "Di2-Dt223", Boolean.TRUE); + ITUtilNameElement.assertExists("Sys22:Di2-Dt221-221", Boolean.TRUE); + ITUtilNameElement.assertExists("Sys22:Di2-Dt222-222", Boolean.TRUE); + ITUtilNameElement.assertExists("Sys22:Di2-Dt223-223", Boolean.TRUE); + + responsePage = ITUtilStructureElement.assertRead("/DEVICEGROUP?uuid=" + dg22, 1); + structureElement = responsePage.getList().get(0); + structureElement = ITUtilStructureElement.assertDeleteApprove(structureElement); + + ITUtilStructureElement.assertExists(Type.DEVICETYPE, "Di2-Dt221", Boolean.FALSE); + ITUtilStructureElement.assertExists(Type.DEVICETYPE, "Di2-Dt222", Boolean.FALSE); + ITUtilStructureElement.assertExists(Type.DEVICETYPE, "Di2-Dt223", Boolean.FALSE); + ITUtilNameElement.assertExists("Sys22:Di2-Dt221-221", Boolean.TRUE); + ITUtilNameElement.assertExists("Sys22:Di2-Dt222-222", Boolean.TRUE); + ITUtilNameElement.assertExists("Sys22:Di2-Dt223-223", Boolean.TRUE); + + // ---------------------------------------- + + ITUtilStructureElement.assertExists(Type.DEVICETYPE, "Di2-Dt211", Boolean.TRUE); + ITUtilStructureElement.assertExists(Type.DEVICETYPE, "Di2-Dt212", Boolean.TRUE); + ITUtilStructureElement.assertExists(Type.DEVICETYPE, "Di2-Dt213", Boolean.TRUE); + ITUtilStructureElement.assertExists(Type.DEVICETYPE, "Di2-Dt221", Boolean.FALSE); + ITUtilStructureElement.assertExists(Type.DEVICETYPE, "Di2-Dt222", Boolean.FALSE); + ITUtilStructureElement.assertExists(Type.DEVICETYPE, "Di2-Dt223", Boolean.FALSE); + ITUtilStructureElement.assertExists(Type.DEVICETYPE, "Di2-Dt231", Boolean.TRUE); + ITUtilStructureElement.assertExists(Type.DEVICETYPE, "Di2-Dt232", Boolean.FALSE); + ITUtilStructureElement.assertExists(Type.DEVICETYPE, "Di2-Dt233", Boolean.TRUE); + ITUtilNameElement.assertExists("Sg2:Di2-Dt211-211", Boolean.TRUE); + ITUtilNameElement.assertExists("Sg2:Di2-Dt212-212", Boolean.TRUE); + ITUtilNameElement.assertExists("Sg2:Di2-Dt213-213", Boolean.TRUE); + ITUtilNameElement.assertExists("Sys22:Di2-Dt221-221", Boolean.TRUE); + ITUtilNameElement.assertExists("Sys22:Di2-Dt222-222", Boolean.TRUE); + ITUtilNameElement.assertExists("Sys22:Di2-Dt223-223", Boolean.TRUE); + ITUtilNameElement.assertExists("Sys23-Sub231:Di2-Dt231-231", Boolean.TRUE); + ITUtilNameElement.assertExists("Sys23-Sub232:Di2-Dt232-232", Boolean.TRUE); + ITUtilNameElement.assertExists("Sys23-Sub233:Di2-Dt233-233", Boolean.TRUE); + + responsePage = ITUtilStructureElement.assertRead("/DISCIPLINE?uuid=" + di2, 1); + structureElement = responsePage.getList().get(0); + structureElement = ITUtilStructureElement.assertDeleteApprove(structureElement); + + ITUtilStructureElement.assertExists(Type.DEVICETYPE, "Di2-Dt211", Boolean.FALSE); + ITUtilStructureElement.assertExists(Type.DEVICETYPE, "Di2-Dt212", Boolean.FALSE); + ITUtilStructureElement.assertExists(Type.DEVICETYPE, "Di2-Dt213", Boolean.FALSE); + ITUtilStructureElement.assertExists(Type.DEVICETYPE, "Di2-Dt221", Boolean.FALSE); + ITUtilStructureElement.assertExists(Type.DEVICETYPE, "Di2-Dt222", Boolean.FALSE); + ITUtilStructureElement.assertExists(Type.DEVICETYPE, "Di2-Dt223", Boolean.FALSE); + ITUtilStructureElement.assertExists(Type.DEVICETYPE, "Di2-Dt231", Boolean.FALSE); + ITUtilStructureElement.assertExists(Type.DEVICETYPE, "Di2-Dt232", Boolean.FALSE); + ITUtilStructureElement.assertExists(Type.DEVICETYPE, "Di2-Dt233", Boolean.FALSE); + ITUtilNameElement.assertExists("Sg2:Di2-Dt211-211", Boolean.TRUE); + ITUtilNameElement.assertExists("Sg2:Di2-Dt212-212", Boolean.TRUE); + ITUtilNameElement.assertExists("Sg2:Di2-Dt213-213", Boolean.TRUE); + ITUtilNameElement.assertExists("Sys22:Di2-Dt221-221", Boolean.TRUE); + ITUtilNameElement.assertExists("Sys22:Di2-Dt222-222", Boolean.TRUE); + ITUtilNameElement.assertExists("Sys22:Di2-Dt223-223", Boolean.TRUE); + ITUtilNameElement.assertExists("Sys23-Sub231:Di2-Dt231-231", Boolean.TRUE); + ITUtilNameElement.assertExists("Sys23-Sub232:Di2-Dt232-232", Boolean.TRUE); + ITUtilNameElement.assertExists("Sys23-Sub233:Di2-Dt233-233", Boolean.TRUE); + } + +} diff --git a/src/test/java/org/openepics/names/docker/complex/StructuresCUDNamesIT.java b/src/test/java/org/openepics/names/docker/complex/StructuresCUDUpdateIT.java similarity index 99% rename from src/test/java/org/openepics/names/docker/complex/StructuresCUDNamesIT.java rename to src/test/java/org/openepics/names/docker/complex/StructuresCUDUpdateIT.java index fcdc10b2..bedfaa62 100644 --- a/src/test/java/org/openepics/names/docker/complex/StructuresCUDNamesIT.java +++ b/src/test/java/org/openepics/names/docker/complex/StructuresCUDUpdateIT.java @@ -42,13 +42,13 @@ import org.testcontainers.junit.jupiter.Testcontainers; * * <p> * Focus of this class is names endpoint and rules for legacy name. - * In practice, this class contains tests for structures and names, before and after delete of structures. + * In practice, this class contains tests for structures and names, before and after update of structures. * </p> * * @author Lars Johansson */ @Testcontainers -class StructuresCUDNamesIT { +class StructuresCUDUpdateIT { // test // create update delete structures and ensure name is as expected -- GitLab