From d35ccfb45018fc2aa6f3ceca2e1ccdbd2038f93c Mon Sep 17 00:00:00 2001
From: Lars Johansson <lars.johansson@ess.eu>
Date: Thu, 5 May 2022 11:36:39 +0200
Subject: [PATCH] Fix issues as noted by SonarLint + enum comparison

Assignments should not be redundant
Collection sizes and array length comparisons should make sense
Conditionally executed code should be reachable
Empty arrays and collections should be returned instead of null
Local variables should not shadow class fields
Null pointers should not be dereferenced
Pattern Matching for "instanceof" operator should be used instead of simple "instanceof" + cast
Return of boolean expressions should not be wrapped into an "if-then-else" statement
Sections of code should not be commented out
"switch" statements should have at least 3 "case" clauses
Two branches in a conditional structure should not have exactly the same implementation
---
 .../GlobalControllerExceptionHandler.java     |   3 +-
 .../names/util/EssNamingConvention.java       |  61 +++++----
 .../util/HolderSystemDeviceStructure.java     |  62 +++++-----
 .../openepics/names/util/NameElementUtil.java |  64 ----------
 .../org/openepics/names/util/NameUtil.java    | 116 ------------------
 .../names/util/NamingConventionUtil.java      |   4 +-
 .../names/util/StructureElementUtil.java      |  23 ++--
 .../openepics/names/util/ValidateUtil.java    |  38 +++---
 .../names/util/NamingConventionUtilTest.java  |   3 +-
 9 files changed, 91 insertions(+), 283 deletions(-)

diff --git a/src/main/java/org/openepics/names/rest/controller/GlobalControllerExceptionHandler.java b/src/main/java/org/openepics/names/rest/controller/GlobalControllerExceptionHandler.java
index 5aaf9bdd..2e36231f 100644
--- a/src/main/java/org/openepics/names/rest/controller/GlobalControllerExceptionHandler.java
+++ b/src/main/java/org/openepics/names/rest/controller/GlobalControllerExceptionHandler.java
@@ -66,8 +66,7 @@ public class GlobalControllerExceptionHandler extends ResponseEntityExceptionHan
 
         HttpStatus resultStatus = HttpStatus.INTERNAL_SERVER_ERROR;
 
-        if (ex instanceof ServiceException) {
-            ServiceException se = (ServiceException) ex;
+        if (ex instanceof ServiceException se) {
             response.setMessage(StringUtils.trimToEmpty(ex.getMessage()));
             response.setDetails(StringUtils.trimToEmpty(se.getDetails()));
             response.setField(StringUtils.trimToEmpty(se.getField()));
diff --git a/src/main/java/org/openepics/names/util/EssNamingConvention.java b/src/main/java/org/openepics/names/util/EssNamingConvention.java
index d1b8aba1..4c49ac78 100644
--- a/src/main/java/org/openepics/names/util/EssNamingConvention.java
+++ b/src/main/java/org/openepics/names/util/EssNamingConvention.java
@@ -152,7 +152,7 @@ public class EssNamingConvention implements NamingConvention {
         //     same mnemonic only once in mnemonic path
         if (!StringUtils.isEmpty(mnemonicPath)) {
             String[] values = NamingConventionUtil.string2MnemonicPath(mnemonicPath.trim());
-            if (values.length < 0 || values.length > 3) {
+            if (values.length > 3) {
                 return false;
             }
             switch (values.length) {
@@ -171,20 +171,17 @@ public class EssNamingConvention implements NamingConvention {
         return false;
     }
 
-	@Override
-	public boolean isMnemonicRequired(Type type) {
-		if (type != null
-				&& (Type.SYSTEM.equals(type)
-						|| Type.SUBSYSTEM.equals(type)
-						|| Type.DISCIPLINE.equals(type)
-						|| Type.DEVICETYPE.equals(type))) {
-			return true;
-		}
-		return false;
-	}
-
-	@Override
-	public MnemonicValidation validateMnemonic(Type type, String mnemonic) {
+    @Override
+    public boolean isMnemonicRequired(Type type) {
+        return type != null
+                && (Type.SYSTEM.equals(type)
+                        || Type.SUBSYSTEM.equals(type)
+                        || Type.DISCIPLINE.equals(type)
+                        || Type.DEVICETYPE.equals(type));
+    }
+
+    @Override
+    public MnemonicValidation validateMnemonic(Type type, String mnemonic) {
         // mnemonic validation for system and device structure elements
         // rules for characters
         //     depends on system/device structure, required or not
@@ -203,24 +200,24 @@ public class EssNamingConvention implements NamingConvention {
         // accelerator as system
         //     system group as system, not required
 
-		if (type != null) {
-	        boolean empty = StringUtils.isEmpty(mnemonic);
-	        int length = empty ? 0 : mnemonic.length();
-	        boolean length1to6 = (length >= 1) && (length <= 6);
-	        boolean length1to8 = (length >= 1) && (length <= 8);
-	        boolean matchMnemonic = !empty && mnemonic.matches(MNEMONIC_ALPHANUMERIC);
+        if (type != null) {
+            boolean empty = StringUtils.isEmpty(mnemonic);
+            int length = empty ? 0 : mnemonic.length();
+            boolean length1to6 = (length >= 1) && (length <= 6);
+            boolean length1to8 = (length >= 1) && (length <= 8);
+            boolean matchMnemonic = !empty && mnemonic.matches(MNEMONIC_ALPHANUMERIC);
 
-	        MnemonicValidation result = MnemonicValidation.VALID;
+            MnemonicValidation result = MnemonicValidation.VALID;
 
-			if (Type.SYSTEMGROUP.equals(type)) {
+            if (Type.SYSTEMGROUP.equals(type)) {
                 if (empty) {
-                    result = MnemonicValidation.VALID;
+                    return result;
                 } else if (!length1to6) {
                     result = MnemonicValidation.TOO_LONG;
                 } else if (!matchMnemonic) {
                     result = MnemonicValidation.NON_ACCEPTABLE_CHARS;
                 }
-			} else if (Type.SYSTEM.equals(type) || Type.SUBSYSTEM.equals(type)) {
+            } else if (Type.SYSTEM.equals(type) || Type.SUBSYSTEM.equals(type)) {
                 if (empty) {
                     result = MnemonicValidation.EMPTY;
                 } else if (!length1to8) {
@@ -228,7 +225,7 @@ public class EssNamingConvention implements NamingConvention {
                 } else if (!matchMnemonic) {
                     result = MnemonicValidation.NON_ACCEPTABLE_CHARS;
                 }
-			} else if (Type.DISCIPLINE.equals(type) || Type.DEVICETYPE.equals(type)) {
+            } else if (Type.DISCIPLINE.equals(type) || Type.DEVICETYPE.equals(type)) {
                 if (empty) {
                     result = MnemonicValidation.EMPTY;
                 } else if (!length1to6) {
@@ -236,15 +233,15 @@ public class EssNamingConvention implements NamingConvention {
                 } else if (!matchMnemonic) {
                     result = MnemonicValidation.NON_ACCEPTABLE_CHARS;
                 }
-			} else if (Type.DEVICEGROUP.equals(type)) {
+            } else if (Type.DEVICEGROUP.equals(type)) {
                 if (!empty) {
                     result = MnemonicValidation.NON_ACCEPTABLE_CHARS;
                 }
-			}
+            }
 
-			return result;
-		}
-		return null;
-	}
+            return result;
+        }
+        return null;
+    }
 
 }
diff --git a/src/main/java/org/openepics/names/util/HolderSystemDeviceStructure.java b/src/main/java/org/openepics/names/util/HolderSystemDeviceStructure.java
index 9ae0ee09..3c7eff65 100644
--- a/src/main/java/org/openepics/names/util/HolderSystemDeviceStructure.java
+++ b/src/main/java/org/openepics/names/util/HolderSystemDeviceStructure.java
@@ -67,56 +67,56 @@ public class HolderSystemDeviceStructure {
      * @param includeDeleted include deleted structure entries
      */
     public HolderSystemDeviceStructure (HolderIRepositories holderIRepositories, boolean includeDeleted) {
-        List<SystemGroup> systemGroups = null;
-        List<System> systems = null;
-        List<Subsystem> subsystems = null;
-        List<Discipline> disciplines = null;
-        List<DeviceGroup> deviceGroups = null;
-        List<DeviceType> deviceTypes = null;
+        List<SystemGroup> systemGroupsRead = null;
+        List<System> systemsRead = null;
+        List<Subsystem> subsystemsRead = null;
+        List<Discipline> disciplinesRead = null;
+        List<DeviceGroup> deviceGroupsRead = null;
+        List<DeviceType> deviceTypesRead = null;
 
         if (includeDeleted) {
-            systemGroups = holderIRepositories.getSystemGroupRepository().findLatest();
-            systems = holderIRepositories.getSystemRepository().findLatest();
-            subsystems = holderIRepositories.getSubsystemRepository().findLatest();
-            disciplines = holderIRepositories.getDisciplineRepository().findLatest();
-            deviceGroups = holderIRepositories.getDeviceGroupRepository().findLatest();
-            deviceTypes = holderIRepositories.getDeviceTypeRepository().findLatest();
+            systemGroupsRead = holderIRepositories.getSystemGroupRepository().findLatest();
+            systemsRead = holderIRepositories.getSystemRepository().findLatest();
+            subsystemsRead = holderIRepositories.getSubsystemRepository().findLatest();
+            disciplinesRead = holderIRepositories.getDisciplineRepository().findLatest();
+            deviceGroupsRead = holderIRepositories.getDeviceGroupRepository().findLatest();
+            deviceTypesRead = holderIRepositories.getDeviceTypeRepository().findLatest();
         } else {
-            systemGroups = holderIRepositories.getSystemGroupRepository().findLatestNotDeleted();
-            systems = holderIRepositories.getSystemRepository().findLatestNotDeleted();
-            subsystems = holderIRepositories.getSubsystemRepository().findLatestNotDeleted();
-            disciplines = holderIRepositories.getDisciplineRepository().findLatestNotDeleted();
-            deviceGroups = holderIRepositories.getDeviceGroupRepository().findLatestNotDeleted();
-            deviceTypes = holderIRepositories.getDeviceTypeRepository().findLatestNotDeleted();
+            systemGroupsRead = holderIRepositories.getSystemGroupRepository().findLatestNotDeleted();
+            systemsRead = holderIRepositories.getSystemRepository().findLatestNotDeleted();
+            subsystemsRead = holderIRepositories.getSubsystemRepository().findLatestNotDeleted();
+            disciplinesRead = holderIRepositories.getDisciplineRepository().findLatestNotDeleted();
+            deviceGroupsRead = holderIRepositories.getDeviceGroupRepository().findLatestNotDeleted();
+            deviceTypesRead = holderIRepositories.getDeviceTypeRepository().findLatestNotDeleted();
         }
 
         // initial capacity
         //     default load factor 0.75
         //     set at proper size to avoid rehashing
         //     size/0.75+1 (may be rounded downwards so possibly +2 instead)
-        this.systemGroups = new HashMap<>((int)(systemGroups.size()/0.75 + 2));
-        this.systems      = new HashMap<>((int)(systems.size()/0.75 + 2));
-        this.subsystems   = new HashMap<>((int)(subsystems.size()/0.75 + 2));
-        this.disciplines  = new HashMap<>((int)(disciplines.size()/0.75 + 2));
-        this.deviceGroups = new HashMap<>((int)(deviceGroups.size()/0.75 + 2));
-        this.deviceTypes  = new HashMap<>((int)(deviceTypes.size()/0.75 + 2));
-
-        for (SystemGroup systemGroup : systemGroups) {
+        this.systemGroups = new HashMap<>((int)(systemGroupsRead.size()/0.75 + 2));
+        this.systems      = new HashMap<>((int)(systemsRead.size()/0.75 + 2));
+        this.subsystems   = new HashMap<>((int)(subsystemsRead.size()/0.75 + 2));
+        this.disciplines  = new HashMap<>((int)(disciplinesRead.size()/0.75 + 2));
+        this.deviceGroups = new HashMap<>((int)(deviceGroupsRead.size()/0.75 + 2));
+        this.deviceTypes  = new HashMap<>((int)(deviceTypesRead.size()/0.75 + 2));
+
+        for (SystemGroup systemGroup : systemGroupsRead) {
             this.systemGroups.put(systemGroup.getUuid(), systemGroup);
         }
-        for (System system : systems) {
+        for (System system : systemsRead) {
             this.systems.put(system.getUuid(), system);
         }
-        for (Subsystem subsystem : subsystems) {
+        for (Subsystem subsystem : subsystemsRead) {
             this.subsystems.put(subsystem.getUuid(), subsystem);
         }
-        for (Discipline discipline : disciplines) {
+        for (Discipline discipline : disciplinesRead) {
             this.disciplines.put(discipline.getUuid(), discipline);
         }
-        for (DeviceGroup deviceGroup : deviceGroups) {
+        for (DeviceGroup deviceGroup : deviceGroupsRead) {
             this.deviceGroups.put(deviceGroup.getUuid(), deviceGroup);
         }
-        for (DeviceType deviceType : deviceTypes) {
+        for (DeviceType deviceType : deviceTypesRead) {
             this.deviceTypes.put(deviceType.getUuid(), deviceType);
         }
     }
diff --git a/src/main/java/org/openepics/names/util/NameElementUtil.java b/src/main/java/org/openepics/names/util/NameElementUtil.java
index 7141fb59..43c69706 100644
--- a/src/main/java/org/openepics/names/util/NameElementUtil.java
+++ b/src/main/java/org/openepics/names/util/NameElementUtil.java
@@ -186,68 +186,4 @@ public class NameElementUtil {
         return true;
     }
 
-//    /**
-//     * Populate and return name element for name.
-//     *
-//     * @param name name
-//     * @param holderSystemDeviceStructure holder of containers for system and device structure content
-//     * @return name element
-//     */
-//    public static NameElement getNameElement(Name name, HolderSystemDeviceStructure holderSystemDeviceStructure) {
-//        if (name == null) {
-//            return null;
-//        }
-//
-//        // find out how to populate return element for system structure, device structure
-//        // levelSystemStructure -1 ---> error
-//        // levelDeviceStructure -1 ---> error
-//
-//        return new NameElement(
-//                name.getUuid(),
-//                name.getSystemgroupUuid(), name.getSystemUuid(), name.getSubsystemUuid(), name.getDevicetypeUuid(),
-//                getMnemonicPathSystemStructure(
-//                        name,
-//                        StructureUtil.getLevelSystemStructure(name),
-//                        holderSystemDeviceStructure),
-//                getMnemonicPathDeviceStructure(
-//                        name,
-//                        StructureUtil.getLevelDeviceStructure(name),
-//                        holderSystemDeviceStructure),
-//                name.getInstanceIndex(), name.getConventionName(),
-//                name.getDescription(), Status.APPROVED, name.isLatest(), name.isDeleted(),
-//                name.getRequested(), name.getRequestedBy(), name.getRequestedComment());
-//    }
-//
-//    /**
-//     * Populate and return name element for name.
-//     *
-//     * @param name name
-//     * @param holderIRepositories holder of references to repositories
-//     * @return name element
-//     */
-//    public static NameElement getNameElement(Name name, HolderIRepositories holderIRepositories) {
-//        if (name == null) {
-//            return null;
-//        }
-//
-//        // find out how to populate return element for system structure, device structure
-//        // levelSystemStructure -1 ---> error
-//        // levelDeviceStructure -1 ---> error
-//
-//        return new NameElement(
-//                name.getUuid(),
-//                name.getSystemgroupUuid(), name.getSystemUuid(), name.getSubsystemUuid(), name.getDevicetypeUuid(),
-//                getMnemonicPathSystemStructure(
-//                        name,
-//                        StructureUtil.getLevelSystemStructure(name),
-//                        holderIRepositories),
-//                getMnemonicPathDeviceStructure(
-//                        name,
-//                        StructureUtil.getLevelDeviceStructure(name),
-//                        holderIRepositories),
-//                name.getInstanceIndex(), name.getConventionName(),
-//                name.getDescription(), Status.APPROVED, name.isLatest(), name.isDeleted(),
-//                name.getRequested(), name.getRequestedBy(), name.getRequestedComment());
-//    }
-
 }
diff --git a/src/main/java/org/openepics/names/util/NameUtil.java b/src/main/java/org/openepics/names/util/NameUtil.java
index e8153db8..a33ef15c 100644
--- a/src/main/java/org/openepics/names/util/NameUtil.java
+++ b/src/main/java/org/openepics/names/util/NameUtil.java
@@ -132,120 +132,4 @@ public class NameUtil {
                 : null;
     }
 
-//  /**
-//  * Return system structure mnemonic path for name.
-//  *
-//  * @param name name
-//  * @param levelSystemStructure level of system structure
-//  * @param holderIRepositories holder of references to repositories
-//  * @return system structure mnemonic path
-//  */
-// private static String getMnemonicPathSystemStructure(Name name, int levelSystemStructure, HolderIRepositories holderIRepositories) {
-//     // populate return element for system structure
-//     switch (levelSystemStructure) {
-//     case 3: {
-//         Subsystem   subsystem   = holderIRepositories.getSubsystemRepository().findLatestByUuid(name.getSubsystemUuid().toString());
-//         System      system      = holderIRepositories.getSystemRepository().findLatestByUuid(subsystem.getParentUuid().toString());
-//
-//         return system.getMnemonic() + "-" + subsystem.getMnemonic();
-//     }
-//     case 2: {
-//         System      system      = holderIRepositories.getSystemRepository().findLatestByUuid(name.getSystemUuid().toString());
-//
-//         return system.getMnemonic();
-//     }
-//     case 1: {
-//         SystemGroup systemGroup = holderIRepositories.getSystemGroupRepository().findLatestByUuid(name.getSystemgroupUuid().toString());
-//
-//         return systemGroup.getMnemonic();
-//     }
-//     default:
-//         // error
-//         return null;
-//     }
-// }
-//
-// /**
-//  * Return device structure mnemonic path for name.
-//  *
-//  * @param name name
-//  * @param levelDeviceStructure level of device structure
-//  * @param holderIRepositories holder of references to repositories
-//  * @return device structure mnemonic path
-//  */
-// private static String getMnemonicPathDeviceStructure(Name name, int levelDeviceStructure, HolderIRepositories holderIRepositories) {
-//     // populate return element for device structure
-//     switch (levelDeviceStructure) {
-//     case 3: {
-//         DeviceType  deviceType  = holderIRepositories.getDeviceTypeRepository().findLatestByUuid(name.getDevicetypeUuid().toString());
-//         DeviceGroup deviceGroup = holderIRepositories.getDeviceGroupRepository().findLatestByUuid(deviceType.getParentUuid().toString());
-//         Discipline  discipline  = holderIRepositories.getDisciplineRepository().findLatestByUuid(deviceGroup.getParentUuid().toString());
-//
-//         return discipline.getMnemonic() + "-" + deviceType.getMnemonic();
-//     }
-//     default:
-//         // error
-//         return null;
-//     }
-//
-// }
-//
-// /**
-//  * Return system structure mnemonic path for name.
-//  *
-//  * @param name name
-//  * @param levelSystemStructure level of system structure
-//  * @param holderSystemDeviceStructure holder of containers for system and device structure content
-//  * @return system structure mnemonic path
-//  */
-// private static String getMnemonicPathSystemStructure(Name name, int levelSystemStructure, HolderSystemDeviceStructure holderSystemDeviceStructure) {
-//     // populate return element for system structure
-//     switch (levelSystemStructure) {
-//     case 3: {
-//         Subsystem   subsystem   = holderSystemDeviceStructure.findSubsystemByUuid(name.getSubsystemUuid());
-//         System      system      = holderSystemDeviceStructure.findSystemByUuid(subsystem.getParentUuid());
-//
-//         return system.getMnemonic() + "-" + subsystem.getMnemonic();
-//     }
-//     case 2: {
-//         System      system      = holderSystemDeviceStructure.findSystemByUuid(name.getSystemUuid());
-//
-//         return system.getMnemonic();
-//     }
-//     case 1: {
-//         SystemGroup systemGroup = holderSystemDeviceStructure.findSystemGroupByUuid(name.getSystemgroupUuid());
-//
-//         return systemGroup.getMnemonic();
-//     }
-//     default:
-//         // error
-//         return null;
-//     }
-// }
-//
-// /**
-//  * Return device structure mnemonic path for name.
-//  *
-//  * @param name name
-//  * @param levelDeviceStructure level of device structure
-//  * @param holderSystemDeviceStructure holder of containers for system and device structure content
-//  * @return device structure mnemonic path
-//  */
-// private static String getMnemonicPathDeviceStructure(Name name, int levelDeviceStructure, HolderSystemDeviceStructure holderSystemDeviceStructure) {
-//     // populate return element for device structure
-//     switch (levelDeviceStructure) {
-//     case 3: {
-//         DeviceType  deviceType  = holderSystemDeviceStructure.findDeviceTypeByUuid(name.getDevicetypeUuid());
-//         DeviceGroup deviceGroup = holderSystemDeviceStructure.findDeviceGroupByUuid(deviceType.getParentUuid());
-//         Discipline  discipline  = holderSystemDeviceStructure.findDisciplineByUuid(deviceGroup.getParentUuid());
-//
-//         return discipline.getMnemonic() + "-" + deviceType.getMnemonic();
-//     }
-//     default:
-//         // error
-//         return null;
-//     }
-//
-// }
-
 }
diff --git a/src/main/java/org/openepics/names/util/NamingConventionUtil.java b/src/main/java/org/openepics/names/util/NamingConventionUtil.java
index 38b59dac..51e5abfe 100644
--- a/src/main/java/org/openepics/names/util/NamingConventionUtil.java
+++ b/src/main/java/org/openepics/names/util/NamingConventionUtil.java
@@ -99,6 +99,8 @@ public class NamingConventionUtil {
     public static final String DELIMITER_EXTRA = ":";
     public static final String DELIMITER_INTRA = "-";
 
+    private static final String[] EMPTY_ARRAY = new String[] {};
+
     /**
      * This class is not to be instantiated.
      */
@@ -450,7 +452,7 @@ public class NamingConventionUtil {
         if (name != null) {
             return StringUtils.split(name, DELIMITER_INTRA);
         }
-        return null;
+        return EMPTY_ARRAY;
     }
 
     /**
diff --git a/src/main/java/org/openepics/names/util/StructureElementUtil.java b/src/main/java/org/openepics/names/util/StructureElementUtil.java
index bfaf0498..919abe93 100644
--- a/src/main/java/org/openepics/names/util/StructureElementUtil.java
+++ b/src/main/java/org/openepics/names/util/StructureElementUtil.java
@@ -631,6 +631,9 @@ public class StructureElementUtil {
         if (!hasSameContent(structureElement, (NameStructure) structure))
             return false;
 
+        if (structureElement == null)
+            return false;
+
         if (structureElement.getName() == null) {
             if (structure.getName() != null)
                 return false;
@@ -655,11 +658,7 @@ public class StructureElementUtil {
         if (!hasSameContent(structureElement, (Structure) systemGroup))
             return false;
 
-        if (!Type.SYSTEMGROUP.equals(structureElement.getType())) {
-            return false;
-        }
-
-        return true;
+        return Type.SYSTEMGROUP.equals(structureElement.getType());
     }
 
     public static boolean hasSameContent(StructureElement structureElement, System system) {
@@ -674,7 +673,7 @@ public class StructureElementUtil {
         if (!hasSameContent(structureElement, (Structure) system))
             return false;
 
-        if (!Type.SYSTEMGROUP.equals(structureElement.getType())) {
+        if (!Type.SYSTEM.equals(structureElement.getType())) {
             return false;
         }
         if (structureElement.getParent() == null) {
@@ -698,7 +697,7 @@ public class StructureElementUtil {
         if (!hasSameContent(structureElement, (Structure) subsystem))
             return false;
 
-        if (!Type.SYSTEMGROUP.equals(structureElement.getType())) {
+        if (!Type.SUBSYSTEM.equals(structureElement.getType())) {
             return false;
         }
         if (structureElement.getParent() == null) {
@@ -720,11 +719,7 @@ public class StructureElementUtil {
         if (!hasSameContent(structureElement, (Structure) discipline))
             return false;
 
-        if (!Type.SYSTEMGROUP.equals(structureElement.getType())) {
-            return false;
-        }
-
-        return true;
+        return Type.DISCIPLINE.equals(structureElement.getType());
     }
 
     public static boolean hasSameContent(StructureElement structureElement, DeviceGroup deviceGroup) {
@@ -739,7 +734,7 @@ public class StructureElementUtil {
          if (!hasSameContent(structureElement, (Structure) deviceGroup))
              return false;
 
-         if (!Type.SYSTEMGROUP.equals(structureElement.getType())) {
+         if (!Type.DEVICEGROUP.equals(structureElement.getType())) {
              return false;
          }
          if (structureElement.getParent() == null) {
@@ -763,7 +758,7 @@ public class StructureElementUtil {
          if (!hasSameContent(structureElement, (Structure) deviceType))
              return false;
 
-         if (!Type.SYSTEMGROUP.equals(structureElement.getType())) {
+         if (!Type.DEVICETYPE.equals(structureElement.getType())) {
              return false;
          }
          if (structureElement.getParent() == null) {
diff --git a/src/main/java/org/openepics/names/util/ValidateUtil.java b/src/main/java/org/openepics/names/util/ValidateUtil.java
index 323aa70c..4b91a80f 100644
--- a/src/main/java/org/openepics/names/util/ValidateUtil.java
+++ b/src/main/java/org/openepics/names/util/ValidateUtil.java
@@ -537,10 +537,9 @@ public class ValidateUtil {
         if (sub != null) {
             count++;
         }
-        if (count > 2 || count < 1) {
-            throw ExceptionUtil.createDataNotCorrectException("system structure " + TextUtil.IS_NOT_CORRECT, name, null);
-        } else if (    (!StringUtils.isEmpty(sg) && !StringUtils.isEmpty(sys))
-                    || (!StringUtils.isEmpty(sg) && !StringUtils.isEmpty(sub))) {
+        if (count > 2 || count < 1 ||
+                ((!StringUtils.isEmpty(sg) && !StringUtils.isEmpty(sys))
+                        || (!StringUtils.isEmpty(sg) && !StringUtils.isEmpty(sub)))) {
             throw ExceptionUtil.createDataNotCorrectException("system structure " + TextUtil.IS_NOT_CORRECT, name, null);
         }
 
@@ -554,17 +553,13 @@ public class ValidateUtil {
         boolean condition = true;
 
         // ensure that system structure parents and device structure parents are available, latest and not deleted
-        //    if (device type) {
-        //    }
-        //    if (system group) {
-        //    } else {
-        //        if (system) {
-        //        } else {
+        //     if device type
+        //     if system group
+        //     else
+        //         if system
+        //         else
         //             (if not system then error)
-        //        }
-        //        if (subsystem) {
-        //        }
-        //    }
+        //         if subsystem
 
         // device structure
         if (!StringUtils.isEmpty(dt)) {
@@ -746,14 +741,13 @@ public class ValidateUtil {
         validateInputType(structureElement.getType());
 
         if (!StructureChoice.DELETE.equals(structureChoice)) {
-            switch (structureElement.getType()) {
-                case SYSTEM, SUBSYSTEM, DEVICEGROUP, DEVICETYPE:
-                    ExceptionUtil.validateConditionInputNotAvailableException(structureElement.getParent() != null,
-                            "parent uuid " + TextUtil.IS_NOT_AVAILABLE, structureElement.toString(), "parent");
-                    ValidateUtil.validateInputUuid(structureElement.getParent().toString());
-                    break;
-                default:
-                    break;
+            if (Type.SYSTEM.equals(structureElement.getType())
+                    || Type.SUBSYSTEM.equals(structureElement.getType())
+                    || Type.DEVICEGROUP.equals(structureElement.getType())
+                    || Type.DEVICETYPE.equals(structureElement.getType())) {
+                ExceptionUtil.validateConditionInputNotAvailableException(structureElement.getParent() != null,
+                        "parent uuid " + TextUtil.IS_NOT_AVAILABLE, structureElement.toString(), "parent");
+                ValidateUtil.validateInputUuid(structureElement.getParent().toString());
             }
 
             validateInputName(structureElement.getName());
diff --git a/src/test/java/org/openepics/names/util/NamingConventionUtilTest.java b/src/test/java/org/openepics/names/util/NamingConventionUtilTest.java
index 9e1e1d0c..93c9d4ac 100644
--- a/src/test/java/org/openepics/names/util/NamingConventionUtilTest.java
+++ b/src/test/java/org/openepics/names/util/NamingConventionUtilTest.java
@@ -415,7 +415,8 @@ class NamingConventionUtilTest {
         String[] array = null;
 
         array = NamingConventionUtil.string2MnemonicPath(null);
-        assertNull(array);
+        assertNotNull(array);
+        assertEquals(0, array.length);
 
         array = NamingConventionUtil.string2MnemonicPath("");
         assertNotNull(array);
-- 
GitLab