From 574ce04e994b52e475f2b4690cfd74f7786eecc6 Mon Sep 17 00:00:00 2001
From: Lars Johansson <lars.johansson@ess.eu>
Date: Wed, 23 Aug 2023 15:34:13 +0200
Subject: [PATCH] Add structures endpoint for retrieving structure

Add structures endpoint for retrieving structure.
Refactor tests and test utilities.
---
 .../names/rest/api/v1/IStructures.java        | 57 +++++++++++++++++++
 .../rest/controller/StructuresController.java | 33 +++++++++++
 .../names/docker/ITUtilStructures.java        | 52 +++++++++++++++++
 .../names/docker/StructuresDeviceGroupIT.java | 28 +++++++++
 .../names/docker/StructuresDeviceTypeIT.java  | 29 ++++++++++
 .../names/docker/StructuresDisciplineIT.java  | 30 +++++++++-
 .../names/docker/StructuresSubsystemIT.java   | 29 ++++++++++
 .../names/docker/StructuresSystemGroupIT.java | 30 +++++++++-
 .../names/docker/StructuresSystemIT.java      | 28 +++++++++
 9 files changed, 314 insertions(+), 2 deletions(-)

diff --git a/src/main/java/org/openepics/names/rest/api/v1/IStructures.java b/src/main/java/org/openepics/names/rest/api/v1/IStructures.java
index a7168af2..afff5780 100644
--- a/src/main/java/org/openepics/names/rest/api/v1/IStructures.java
+++ b/src/main/java/org/openepics/names/rest/api/v1/IStructures.java
@@ -97,6 +97,7 @@ public interface IStructures {
            ----------------------------------------------------------------------------------------------------
            read      GET    /structures/{type}                                - readStructures
            read      GET    /structures/{type}/download                       - readStructuresDownload         download Excel file
+           read      GET    /structures/{type}/{uuid}                         - readStructure
            read      GET    /structures/children/{uuid}                       - readStructuresChildren
            read      GET    /structures/mnemonic/{mnemonic}                   - readStructuresMnemonic
            read      GET    /structures/mnemonicPath/{mnemonicPath}           - readStructuresMnemonicPath
@@ -442,6 +443,62 @@ public interface IStructures {
             @Parameter(in = ParameterIn.QUERY, description = "page starting from 0, offset") @RequestParam(required = false, defaultValue = DEFAULT_PAGE) Integer page,
             @Parameter(in = ParameterIn.QUERY, description = "page size, limit") @RequestParam(required = false, defaultValue = DEFAULT_PAGE_SIZE) Integer pageSize);
 
+    /**
+     * Find valid structure by type and uuid (exact match).
+     * Return paged list of structure elements.
+     * Maximum number of elements will be two (PENDING, APPROVED) for given uuid.
+     *
+     * @param type type of structure
+     * @param uuid uuid
+     * @return structure element
+     */
+    @Operation(
+            summary     = "Find valid structure by type and uuid (exact match)",
+            description = """
+                          Find valid structure by type and uuid (exact match).
+                          Return paged list of structure elements.
+                          Maximum number of elements will be two (PENDING, APPROVED) for given uuid.
+                          """
+    )
+    @ApiResponses(value = {
+            @ApiResponse(
+                    responseCode = "200",
+                    description  = "OK. Return paged list of structure elements.",
+                    content = @Content(
+                            mediaType = "application/json",
+                            schema = @Schema(implementation = ResponsePageStructureElements.class))),
+            @ApiResponse(
+                    responseCode = "400",
+                    description  = "Bad request. Reason and information such as message, details, field are available.",
+                    content = @Content(
+                            mediaType = "application/json",
+                            schema = @Schema(implementation = Response.class))),
+            @ApiResponse(
+                    responseCode = "404",
+                    description  = "Not found. Reason and information such as message, details, field are available.",
+                    content = @Content(
+                            mediaType = "application/json",
+                            schema = @Schema(implementation = Response.class))),
+            @ApiResponse(
+                    responseCode = "422",
+                    description  = "Unprocessable entity. Reason and information such as message, details, field are available.",
+                    content = @Content(
+                            mediaType = "application/json",
+                            schema = @Schema(implementation = Response.class))),
+            @ApiResponse(
+                    responseCode = "500",
+                    description  = "Internal server error. Reason and information such as message, details, field are available.",
+                    content = @Content(
+                            mediaType = "application/json",
+                            schema = @Schema(implementation = Response.class)))
+    })
+    @GetMapping(
+            value = "/{type}/{uuid}",
+            produces = {"application/json"})
+    public ResponseEntity<ResponsePageStructureElements>  readStructure(
+            @Parameter(in = ParameterIn.PATH, description = "find by type of structure") @PathVariable("type") Type type,
+            @Parameter(in = ParameterIn.PATH, description = "find by uuid") @PathVariable("uuid") String uuid);
+
     /**
      * Find valid children structures by parent uuid (exact match).
      * Return paged list of structure elements.
diff --git a/src/main/java/org/openepics/names/rest/controller/StructuresController.java b/src/main/java/org/openepics/names/rest/controller/StructuresController.java
index 41851831..0d671ec1 100644
--- a/src/main/java/org/openepics/names/rest/controller/StructuresController.java
+++ b/src/main/java/org/openepics/names/rest/controller/StructuresController.java
@@ -193,6 +193,39 @@ public class StructuresController implements IStructures {
                 .body(isr);
     }
 
+    @Override
+    public ResponseEntity<ResponsePageStructureElements> readStructure(Type type, String uuid) {
+        // validate
+        // read structure
+        // maximum number of elements will be two (PENDING, APPROVED) for given uuid
+
+        try {
+            ValidateUtil.validateInputType(type);
+            ValidateUtil.validateInputUuid(uuid);
+            ResponsePageStructureElements structureElements = structuresService.readStructures(type, null, null,
+                    uuid, null, null, null, null, null, null, null,
+                    null, null, null, null);
+
+            HttpStatus status = null;
+            if (structureElements.getListSize() == 0) {
+                status = HttpStatus.NOT_FOUND;
+            } else if (structureElements.getListSize() > 2) {
+                status = HttpStatus.UNPROCESSABLE_ENTITY;
+            } else {
+                status = HttpStatus.OK;
+            }
+
+            return new ResponseEntity<>(structureElements, Response.getHeaderJson(), status);
+        } catch (ServiceException e) {
+            logService.logServiceException(LOGGER, Level.WARNING, e);
+            logService.logStackTraceElements(LOGGER, Level.WARNING, e);
+            throw e;
+        } catch (Exception e) {
+            logService.logStackTraceElements(LOGGER, Level.WARNING, e);
+            throw e;
+        }
+    }
+
     @Override
     public ResponsePageStructureElements readStructuresChildren(String uuid, Type type, Status[] statuses, Boolean deleted,
             String name, String mnemonic, String mnemonicEquivalence, String mnemonicPath, String description, String who,
diff --git a/src/test/java/org/openepics/names/docker/ITUtilStructures.java b/src/test/java/org/openepics/names/docker/ITUtilStructures.java
index a41fed31..3b1fa5e0 100644
--- a/src/test/java/org/openepics/names/docker/ITUtilStructures.java
+++ b/src/test/java/org/openepics/names/docker/ITUtilStructures.java
@@ -243,6 +243,58 @@ public class ITUtilStructures {
 
     // ----------------------------------------------------------------------------------------------------
 
+    /**
+     * Utility method to find structure elements.
+     *
+     * @param queryString query string
+     * @return esponse page structure elements
+     */
+    public static ResponsePageStructureElements assertFind(String queryString) {
+        return assertFind(queryString, HttpURLConnection.HTTP_OK);
+    }
+    /**
+     * Utility method to find structure elements.
+     *
+     * @param queryString query string
+     * @param responseCode expected response code
+     * @return response page structure elements
+     */
+    public static ResponsePageStructureElements assertFind(String queryString, int responseCode) {
+        // maximum number of elements will be two (PENDING, APPROVED) for given uuid
+        try {
+            String[] response = null;
+            ResponsePageStructureElements responsePageStructureElements = null;
+
+            response = ITUtil.doGetJson(ITUtil.HTTP_IP_PORT_NAMING_API_V1_STRUCTURES + queryString);
+            ITUtil.assertResponseLength2Code(response, responseCode);
+            responsePageStructureElements = mapper.readValue(response[1], ResponsePageStructureElements.class);
+
+            // response code and value
+            if (HttpURLConnection.HTTP_OK == responseCode) {
+                assertNotNull(responsePageStructureElements);
+                int listSize = responsePageStructureElements.getListSize();
+                assertTrue(listSize >= 1);
+                assertTrue(listSize <= 2);
+            } else if (HttpURLConnection.HTTP_NOT_FOUND == responseCode){
+                assertNotNull(responsePageStructureElements);
+                int listSize = responsePageStructureElements.getListSize();
+                assertEquals(0, listSize);
+            } else {
+                assertNotNull(responsePageStructureElements);
+            }
+
+            // expected value for latest for items in list
+            assertLatest(responsePageStructureElements);
+
+            return responsePageStructureElements;
+        } catch (IOException e) {
+            fail();
+        } catch (Exception e) {
+            fail();
+        }
+        return null;
+    }
+
     /**
      * Utility method to read structure elements.
      *
diff --git a/src/test/java/org/openepics/names/docker/StructuresDeviceGroupIT.java b/src/test/java/org/openepics/names/docker/StructuresDeviceGroupIT.java
index 26f34c15..44490ada 100644
--- a/src/test/java/org/openepics/names/docker/StructuresDeviceGroupIT.java
+++ b/src/test/java/org/openepics/names/docker/StructuresDeviceGroupIT.java
@@ -1108,6 +1108,8 @@ class StructuresDeviceGroupIT {
             ITUtilStructures.assertRead("/DEVICEGROUP?statuses=REJECTED&mnemonic=Rsha",  0);
             ITUtilStructures.assertRead("/DEVICEGROUP?uuid=" + createdStructureElement.getUuid().toString(),  1);
 
+            ITUtilStructures.assertFind("/DEVICEGROUP/" + createdStructureElement.getUuid().toString());
+
             ITUtilStructures.assertRead("/mnemonic/Di",           1);
             ITUtilStructures.assertRead("/mnemonic/Rsha",         0);
             ITUtilStructures.assertRead("/mnemonic/Di-Rsha",      0);
@@ -1136,6 +1138,8 @@ class StructuresDeviceGroupIT {
             ITUtilStructures.assertRead("/DEVICEGROUP?statuses=REJECTED&mnemonic=Rsha",  0);
             ITUtilStructures.assertRead("/DEVICEGROUP?uuid=" + approvedStructureElement.getUuid().toString(), 1);
 
+            ITUtilStructures.assertFind("/DEVICEGROUP/" + approvedStructureElement.getUuid().toString());
+
             ITUtilStructures.assertRead("/mnemonic/Di",          1);
             ITUtilStructures.assertRead("/mnemonic/Rsha",        0);
             ITUtilStructures.assertRead("/mnemonic/Di-Rsha",     0);
@@ -1192,6 +1196,8 @@ class StructuresDeviceGroupIT {
             ITUtilStructures.assertRead("/DEVICEGROUP?statuses=REJECTED&mnemonic=Rshc",  0);
             ITUtilStructures.assertRead("/DEVICEGROUP?uuid=" + createdStructureElement.getUuid().toString(),   1);
 
+            ITUtilStructures.assertFind("/DEVICEGROUP/" + createdStructureElement.getUuid().toString());
+
             ITUtilStructures.assertRead("/mnemonic/Di",          1);
             ITUtilStructures.assertRead("/mnemonic/Rshc",        0);
             ITUtilStructures.assertRead("/mnemonic/Di-Rshc",     0);
@@ -1220,6 +1226,8 @@ class StructuresDeviceGroupIT {
             ITUtilStructures.assertRead("/DEVICEGROUP?statuses=REJECTED&mnemonic=Rshc",  0);
             ITUtilStructures.assertRead("/DEVICEGROUP?uuid=" + cancelledStructureElement.getUuid().toString(), 1);
 
+            ITUtilStructures.assertFind("/DEVICEGROUP/" + cancelledStructureElement.getUuid().toString());
+
             ITUtilStructures.assertRead("/mnemonic/Di",          1);
             ITUtilStructures.assertRead("/mnemonic/Rshc",        0);
             ITUtilStructures.assertRead("/mnemonic/Di-Rshc",     0);
@@ -1276,6 +1284,8 @@ class StructuresDeviceGroupIT {
             ITUtilStructures.assertRead("/DEVICEGROUP?statuses=REJECTED&mnemonic=Rshr",  0);
             ITUtilStructures.assertRead("/DEVICEGROUP?uuid=" + createdStructureElement.getUuid().toString(),  1);
 
+            ITUtilStructures.assertFind("/DEVICEGROUP/" + createdStructureElement.getUuid().toString());
+
             ITUtilStructures.assertRead("/mnemonic/Di",          1);
             ITUtilStructures.assertRead("/mnemonic/Rshr",        0);
             ITUtilStructures.assertRead("/mnemonic/Di-Rshr",     0);
@@ -1304,6 +1314,8 @@ class StructuresDeviceGroupIT {
             ITUtilStructures.assertRead("/DEVICEGROUP?statuses=REJECTED&mnemonic=Rshr",  0);
             ITUtilStructures.assertRead("/DEVICEGROUP?uuid=" + rejectedStructureElement.getUuid().toString(), 1);
 
+            ITUtilStructures.assertFind("/DEVICEGROUP/" + rejectedStructureElement.getUuid().toString());
+
             ITUtilStructures.assertRead("/mnemonic/Di",          1);
             ITUtilStructures.assertRead("/mnemonic/Rshr",        0);
             ITUtilStructures.assertRead("/mnemonic/Di-Rshr",     0);
@@ -1400,6 +1412,11 @@ class StructuresDeviceGroupIT {
             ITUtilStructures.assertRead("/DEVICEGROUP?uuid=" + uuid3.toString(), 1);
             ITUtilStructures.assertRead("/DEVICEGROUP?uuid=" + uuid4.toString(), 1);
 
+            ITUtilStructures.assertFind("/DEVICEGROUP/" + uuid.toString());
+            ITUtilStructures.assertFind("/DEVICEGROUP/" + uuid2.toString());
+            ITUtilStructures.assertFind("/DEVICEGROUP/" + uuid3.toString());
+            ITUtilStructures.assertFind("/DEVICEGROUP/" + uuid4.toString());
+
             ITUtilStructures.assertRead("/mnemonic/P1", 0);
             ITUtilStructures.assertRead("/mnemonic/C1", 0);
             ITUtilStructures.assertRead("/mnemonic/R1", 0);
@@ -1573,6 +1590,11 @@ class StructuresDeviceGroupIT {
             ITUtilStructures.assertRead("/DEVICEGROUP?uuid=" + uuid3.toString(), 2);
             ITUtilStructures.assertRead("/DEVICEGROUP?uuid=" + uuid4.toString(), 1);
 
+            ITUtilStructures.assertFind("/DEVICEGROUP/" + uuid.toString());
+            ITUtilStructures.assertFind("/DEVICEGROUP/" + uuid2.toString());
+            ITUtilStructures.assertFind("/DEVICEGROUP/" + uuid3.toString());
+            ITUtilStructures.assertFind("/DEVICEGROUP/" + uuid4.toString());
+
             ITUtilStructures.assertRead("/mnemonic/P9", 0);
             ITUtilStructures.assertRead("/mnemonic/C9", 0);
             ITUtilStructures.assertRead("/mnemonic/R9", 0);
@@ -1988,6 +2010,12 @@ class StructuresDeviceGroupIT {
             response2 = ITUtilStructures.assertRead("/DEVICEGROUP?mnemonicPath=Di2&page=2&pageSize=12&orderBy=WHEN&isAsc=true",         6);
             assertEquals(response.getList().get(0), response2.getList().get(response2.getList().size()-1));
 
+            // type and uuid
+            //     /{type}/{uuid}
+            ITUtilStructures.assertFind("/DEVICEGROUP/" + discipline2Uuid.toString(),         HttpURLConnection.HTTP_NOT_FOUND);
+            ITUtilStructures.assertFind("/DEVICEGROUP/" + uuid.toString());
+            ITUtilStructures.assertFind("/DEVICEGROUP/" + uuid2.toString());
+
             // children
             //     /children/{uuid}
             //     uuid, type, statuses, deleted, name, mnemonic, mnemonicEquivalence, mnemonicPath, description
diff --git a/src/test/java/org/openepics/names/docker/StructuresDeviceTypeIT.java b/src/test/java/org/openepics/names/docker/StructuresDeviceTypeIT.java
index 00fef5e9..9a38ff0f 100644
--- a/src/test/java/org/openepics/names/docker/StructuresDeviceTypeIT.java
+++ b/src/test/java/org/openepics/names/docker/StructuresDeviceTypeIT.java
@@ -1104,6 +1104,8 @@ class StructuresDeviceTypeIT {
             ITUtilStructures.assertRead("/DEVICETYPE?statuses=REJECTED&mnemonic=Rsha",  0);
             ITUtilStructures.assertRead("/DEVICETYPE?uuid=" + createdStructureElement.getUuid().toString(),  1);
 
+            ITUtilStructures.assertFind("/DEVICETYPE/" + createdStructureElement.getUuid().toString());
+
             ITUtilStructures.assertRead("/mnemonic/Di",          1);
             ITUtilStructures.assertRead("/mnemonic/Rsha",        0);
             ITUtilStructures.assertRead("/mnemonic/Di-Rsha",     0);
@@ -1133,6 +1135,8 @@ class StructuresDeviceTypeIT {
             ITUtilStructures.assertRead("/DEVICETYPE?statuses=REJECTED&mnemonic=Rsha",  0);
             ITUtilStructures.assertRead("/DEVICETYPE?uuid=" + approvedStructureElement.getUuid().toString(), 1);
 
+            ITUtilStructures.assertFind("/DEVICETYPE/" + approvedStructureElement.getUuid().toString());
+
             ITUtilStructures.assertRead("/mnemonic/Di",          1);
             ITUtilStructures.assertRead("/mnemonic/Rsha",        1);
             ITUtilStructures.assertRead("/mnemonic/Di-Rsha",     0);
@@ -1190,6 +1194,8 @@ class StructuresDeviceTypeIT {
             ITUtilStructures.assertRead("/DEVICETYPE?statuses=REJECTED&mnemonic=Rshc",  0);
             ITUtilStructures.assertRead("/DEVICETYPE?uuid=" + createdStructureElement.getUuid().toString(),   1);
 
+            ITUtilStructures.assertFind("/DEVICETYPE/" + createdStructureElement.getUuid().toString());
+
             ITUtilStructures.assertRead("/mnemonic/Di",          1);
             ITUtilStructures.assertRead("/mnemonic/Rshc",        0);
             ITUtilStructures.assertRead("/mnemonic/Di-Rshc",     0);
@@ -1219,6 +1225,8 @@ class StructuresDeviceTypeIT {
             ITUtilStructures.assertRead("/DEVICETYPE?statuses=REJECTED&mnemonic=Rshc",  0);
             ITUtilStructures.assertRead("/DEVICETYPE?uuid=" + cancelledStructureElement.getUuid().toString(), 1);
 
+            ITUtilStructures.assertFind("/DEVICETYPE/" + cancelledStructureElement.getUuid().toString());
+
             ITUtilStructures.assertRead("/mnemonic/Di",          1);
             ITUtilStructures.assertRead("/mnemonic/Rshc",        0);
             ITUtilStructures.assertRead("/mnemonic/Di-Rshc",     0);
@@ -1276,6 +1284,8 @@ class StructuresDeviceTypeIT {
             ITUtilStructures.assertRead("/DEVICETYPE?statuses=REJECTED&mnemonic=Rshr",  0);
             ITUtilStructures.assertRead("/DEVICETYPE?uuid=" + createdStructureElement.getUuid().toString(),  1);
 
+            ITUtilStructures.assertFind("/DEVICETYPE/" + createdStructureElement.getUuid().toString());
+
             ITUtilStructures.assertRead("/mnemonic/Di",          1);
             ITUtilStructures.assertRead("/mnemonic/Rshr",        0);
             ITUtilStructures.assertRead("/mnemonic/Di-Rshr",     0);
@@ -1305,6 +1315,8 @@ class StructuresDeviceTypeIT {
             ITUtilStructures.assertRead("/DEVICETYPE?statuses=REJECTED&mnemonic=Rshr",  1);
             ITUtilStructures.assertRead("/DEVICETYPE?uuid=" + rejectedStructureElement.getUuid().toString(), 1);
 
+            ITUtilStructures.assertFind("/DEVICETYPE/" + rejectedStructureElement.getUuid().toString());
+
             ITUtilStructures.assertRead("/mnemonic/Di",          1);
             ITUtilStructures.assertRead("/mnemonic/Rshr",        0);
             ITUtilStructures.assertRead("/mnemonic/Di-Rshr",     0);
@@ -1402,6 +1414,11 @@ class StructuresDeviceTypeIT {
             ITUtilStructures.assertRead("/DEVICETYPE?uuid=" + uuid3.toString(), 1);
             ITUtilStructures.assertRead("/DEVICETYPE?uuid=" + uuid4.toString(), 1);
 
+            ITUtilStructures.assertFind("/DEVICETYPE/" + uuid.toString());
+            ITUtilStructures.assertFind("/DEVICETYPE/" + uuid2.toString());
+            ITUtilStructures.assertFind("/DEVICETYPE/" + uuid3.toString());
+            ITUtilStructures.assertFind("/DEVICETYPE/" + uuid4.toString());
+
             ITUtilStructures.assertRead("/mnemonic/P1", 0);
             ITUtilStructures.assertRead("/mnemonic/C1", 0);
             ITUtilStructures.assertRead("/mnemonic/R1", 0);
@@ -1578,6 +1595,11 @@ class StructuresDeviceTypeIT {
             ITUtilStructures.assertRead("/DEVICETYPE?uuid=" + uuid3.toString(), 2);
             ITUtilStructures.assertRead("/DEVICETYPE?uuid=" + uuid4.toString(), 1);
 
+            ITUtilStructures.assertFind("/DEVICETYPE/" + uuid.toString());
+            ITUtilStructures.assertFind("/DEVICETYPE/" + uuid2.toString());
+            ITUtilStructures.assertFind("/DEVICETYPE/" + uuid3.toString());
+            ITUtilStructures.assertFind("/DEVICETYPE/" + uuid4.toString());
+
             ITUtilStructures.assertRead("/mnemonic/P9", 1);
             ITUtilStructures.assertRead("/mnemonic/C9", 1);
             ITUtilStructures.assertRead("/mnemonic/R9", 1);
@@ -1998,6 +2020,13 @@ class StructuresDeviceTypeIT {
             response2 = ITUtilStructures.assertRead("/DEVICETYPE?mnemonic=A__&page=2&pageSize=20&orderBy=WHEN&isAsc=true",      5);
             assertEquals(response.getList().get(0), response2.getList().get(response2.getList().size()-1));
 
+            // type and uuid
+            //     /{type}/{uuid}
+            ITUtilStructures.assertFind("/DEVICETYPE/" + disciplineUuid.toString(),          HttpURLConnection.HTTP_NOT_FOUND);
+            ITUtilStructures.assertFind("/DEVICETYPE/" + deviceGroupUuid.toString(),         HttpURLConnection.HTTP_NOT_FOUND);
+            ITUtilStructures.assertFind("/DEVICETYPE/" + uuid.toString());
+            ITUtilStructures.assertFind("/DEVICETYPE/" + uuid2.toString());
+
             // children
             //     /children/{uuid}
             //     uuid, type, statuses, deleted, name, mnemonic, mnemonicEquivalence, mnemonicPath, description
diff --git a/src/test/java/org/openepics/names/docker/StructuresDisciplineIT.java b/src/test/java/org/openepics/names/docker/StructuresDisciplineIT.java
index 3df1c35c..2ea05cde 100644
--- a/src/test/java/org/openepics/names/docker/StructuresDisciplineIT.java
+++ b/src/test/java/org/openepics/names/docker/StructuresDisciplineIT.java
@@ -1039,6 +1039,8 @@ class StructuresDisciplineIT {
             ITUtilStructures.assertRead("/DISCIPLINE?statuses=REJECTED&mnemonic=Rsha",  0);
             ITUtilStructures.assertRead("/DISCIPLINE?uuid=" + createdStructureElement.getUuid().toString(),  1);
 
+            ITUtilStructures.assertFind("/DISCIPLINE/" + createdStructureElement.getUuid().toString());
+
             ITUtilStructures.assertRead("/mnemonic/Rsha",     0);
 
             ITUtilStructures.assertRead("/mnemonicPath/Rsha", 0);
@@ -1063,6 +1065,8 @@ class StructuresDisciplineIT {
             ITUtilStructures.assertRead("/DISCIPLINE?statuses=REJECTED&mnemonic=Rsha",  0);
             ITUtilStructures.assertRead("/DISCIPLINE?uuid=" + approvedStructureElement.getUuid().toString(), 1);
 
+            ITUtilStructures.assertFind("/DISCIPLINE/" + approvedStructureElement.getUuid().toString());
+
             ITUtilStructures.assertRead("/mnemonic/Rsha",     1);
 
             ITUtilStructures.assertRead("/mnemonicPath/Rsha", 1);
@@ -1115,6 +1119,8 @@ class StructuresDisciplineIT {
             ITUtilStructures.assertRead("/DISCIPLINE?statuses=REJECTED&mnemonic=Rshc",  0);
             ITUtilStructures.assertRead("/DISCIPLINE?uuid=" + createdStructureElement.getUuid().toString(),   1);
 
+            ITUtilStructures.assertFind("/DISCIPLINE/" + createdStructureElement.getUuid().toString());
+
             ITUtilStructures.assertRead("/mnemonic/Rshc",     0);
 
             ITUtilStructures.assertRead("/mnemonicPath/Rshc", 0);
@@ -1139,6 +1145,8 @@ class StructuresDisciplineIT {
             ITUtilStructures.assertRead("/DISCIPLINE?statuses=REJECTED&mnemonic=Rshc",  0);
             ITUtilStructures.assertRead("/DISCIPLINE?uuid=" + cancelledStructureElement.getUuid().toString(), 1);
 
+            ITUtilStructures.assertFind("/DISCIPLINE/" + cancelledStructureElement.getUuid().toString());
+
             ITUtilStructures.assertRead("/mnemonic/Rshc",     0);
 
             ITUtilStructures.assertRead("/mnemonicPath/Rshc", 0);
@@ -1191,6 +1199,8 @@ class StructuresDisciplineIT {
             ITUtilStructures.assertRead("/DISCIPLINE?statuses=REJECTED&mnemonic=Rshr",  0);
             ITUtilStructures.assertRead("/DISCIPLINE?uuid=" + createdStructureElement.getUuid().toString(),  1);
 
+            ITUtilStructures.assertFind("/DISCIPLINE/" + createdStructureElement.getUuid().toString());
+
             ITUtilStructures.assertRead("/mnemonic/Rshr",     0);
 
             ITUtilStructures.assertRead("/mnemonicPath/Rshr", 0);
@@ -1215,6 +1225,8 @@ class StructuresDisciplineIT {
             ITUtilStructures.assertRead("/DISCIPLINE?statuses=REJECTED&mnemonic=Rshr",  1);
             ITUtilStructures.assertRead("/DISCIPLINE?uuid=" + rejectedStructureElement.getUuid().toString(), 1);
 
+            ITUtilStructures.assertFind("/DISCIPLINE/" + rejectedStructureElement.getUuid().toString());
+
             ITUtilStructures.assertRead("/mnemonic/Rshr",     0);
 
             ITUtilStructures.assertRead("/mnemonicPath/Rshr", 0);
@@ -1307,6 +1319,11 @@ class StructuresDisciplineIT {
             ITUtilStructures.assertRead("/DISCIPLINE?uuid=" + uuid3.toString(), 1);
             ITUtilStructures.assertRead("/DISCIPLINE?uuid=" + uuid4.toString(), 1);
 
+            ITUtilStructures.assertFind("/DISCIPLINE/" + uuid.toString());
+            ITUtilStructures.assertFind("/DISCIPLINE/" + uuid2.toString());
+            ITUtilStructures.assertFind("/DISCIPLINE/" + uuid3.toString());
+            ITUtilStructures.assertFind("/DISCIPLINE/" + uuid4.toString());
+
             ITUtilStructures.assertRead("/mnemonic/P1", 0);
             ITUtilStructures.assertRead("/mnemonic/C1", 0);
             ITUtilStructures.assertRead("/mnemonic/R1", 0);
@@ -1479,6 +1496,11 @@ class StructuresDisciplineIT {
             ITUtilStructures.assertRead("/DISCIPLINE?uuid=" + uuid3.toString(), 2);
             ITUtilStructures.assertRead("/DISCIPLINE?uuid=" + uuid4.toString(), 1);
 
+            ITUtilStructures.assertFind("/DISCIPLINE/" + uuid.toString());
+            ITUtilStructures.assertFind("/DISCIPLINE/" + uuid2.toString());
+            ITUtilStructures.assertFind("/DISCIPLINE/" + uuid3.toString());
+            ITUtilStructures.assertFind("/DISCIPLINE/" + uuid4.toString());
+
             ITUtilStructures.assertRead("/mnemonic/P9", 1);
             ITUtilStructures.assertRead("/mnemonic/C9", 1);
             ITUtilStructures.assertRead("/mnemonic/R9", 1);
@@ -1836,9 +1858,9 @@ class StructuresDisciplineIT {
             ITUtilStructures.assertRead("/DISCIPLINE?deleted=true&statuses=REJECTED&mnemonic=A__",                    5);
             ITUtilStructures.assertRead("/DISCIPLINE?deleted=true&statuses=PENDING&statuses=APPROVED&mnemonic=A__",  10);
 
+            ITUtilStructures.assertRead("/DISCIPLINE?uuid=" + uuidRandom.toString(),  0);
             ITUtilStructures.assertRead("/DISCIPLINE?uuid=" + uuid.toString(),        1);
             ITUtilStructures.assertRead("/DISCIPLINE?uuid=" + uuid2.toString(),       2);
-            ITUtilStructures.assertRead("/DISCIPLINE?uuid=" + uuidRandom.toString(),  0);
 
             ITUtilStructures.assertRead("/DISCIPLINE?parent=" + uuid.toString(),      0);
 
@@ -1893,6 +1915,12 @@ class StructuresDisciplineIT {
             response2 = ITUtilStructures.assertRead("/DISCIPLINE?mnemonic=A__&page=2&pageSize=20&orderBy=WHEN&isAsc=true",      5);
             assertEquals(response.getList().get(0), response2.getList().get(response2.getList().size()-1));
 
+            // type and uuid
+            //     /{type}/{uuid}
+            ITUtilStructures.assertFind("/DISCIPLINE/" + uuidRandom.toString(),       HttpURLConnection.HTTP_NOT_FOUND);
+            ITUtilStructures.assertFind("/DISCIPLINE/" + uuid.toString());
+            ITUtilStructures.assertFind("/DISCIPLINE/" + uuid2.toString());
+
             // children
             //     /children/{uuid}
             //     uuid, type, statuses, deleted, name, mnemonic, mnemonicEquivalence, mnemonicPath, description
diff --git a/src/test/java/org/openepics/names/docker/StructuresSubsystemIT.java b/src/test/java/org/openepics/names/docker/StructuresSubsystemIT.java
index c0320ac2..cdb1d31e 100644
--- a/src/test/java/org/openepics/names/docker/StructuresSubsystemIT.java
+++ b/src/test/java/org/openepics/names/docker/StructuresSubsystemIT.java
@@ -1102,6 +1102,8 @@ class StructuresSubsystemIT {
             ITUtilStructures.assertRead("/SUBSYSTEM?statuses=REJECTED&mnemonic=Rsha",  0);
             ITUtilStructures.assertRead("/SUBSYSTEM?uuid=" + createdStructureElement.getUuid().toString(),  1);
 
+            ITUtilStructures.assertFind("/SUBSYSTEM/" + createdStructureElement.getUuid().toString());
+
             ITUtilStructures.assertRead("/mnemonic/Sg",              1);
             ITUtilStructures.assertRead("/mnemonic/Sys",             1);
             ITUtilStructures.assertRead("/mnemonic/Rsha",            0);
@@ -1138,6 +1140,8 @@ class StructuresSubsystemIT {
             ITUtilStructures.assertRead("/SUBSYSTEM?statuses=REJECTED&mnemonic=Rsha",  0);
             ITUtilStructures.assertRead("/SUBSYSTEM?uuid=" + approvedStructureElement.getUuid().toString(), 1);
 
+            ITUtilStructures.assertFind("/SUBSYSTEM/" + approvedStructureElement.getUuid().toString());
+
             ITUtilStructures.assertRead("/mnemonic/Sg",              1);
             ITUtilStructures.assertRead("/mnemonic/Sys",             1);
             ITUtilStructures.assertRead("/mnemonic/Rsha",            1);
@@ -1202,6 +1206,8 @@ class StructuresSubsystemIT {
             ITUtilStructures.assertRead("/SUBSYSTEM?statuses=REJECTED&mnemonic=Rshc",  0);
             ITUtilStructures.assertRead("/SUBSYSTEM?uuid=" + createdStructureElement.getUuid().toString(),   1);
 
+            ITUtilStructures.assertFind("/SUBSYSTEM/" + createdStructureElement.getUuid().toString());
+
             ITUtilStructures.assertRead("/mnemonic/Sg",              1);
             ITUtilStructures.assertRead("/mnemonic/Sys",             1);
             ITUtilStructures.assertRead("/mnemonic/Rshc",            0);
@@ -1238,6 +1244,8 @@ class StructuresSubsystemIT {
             ITUtilStructures.assertRead("/SUBSYSTEM?statuses=REJECTED&mnemonic=Rshc",  0);
             ITUtilStructures.assertRead("/SUBSYSTEM?uuid=" + cancelledStructureElement.getUuid().toString(), 1);
 
+            ITUtilStructures.assertFind("/SUBSYSTEM/" + cancelledStructureElement.getUuid().toString());
+
             ITUtilStructures.assertRead("/mnemonic/Sg",              1);
             ITUtilStructures.assertRead("/mnemonic/Sys",             1);
             ITUtilStructures.assertRead("/mnemonic/Rshc",            0);
@@ -1302,6 +1310,8 @@ class StructuresSubsystemIT {
             ITUtilStructures.assertRead("/SUBSYSTEM?statuses=REJECTED&mnemonic=Rshr",  0);
             ITUtilStructures.assertRead("/SUBSYSTEM?uuid=" + createdStructureElement.getUuid().toString(),  1);
 
+            ITUtilStructures.assertFind("/SUBSYSTEM/" + createdStructureElement.getUuid().toString());
+
             ITUtilStructures.assertRead("/mnemonic/Sg",              1);
             ITUtilStructures.assertRead("/mnemonic/Sys",             1);
             ITUtilStructures.assertRead("/mnemonic/Rshr",            0);
@@ -1338,6 +1348,8 @@ class StructuresSubsystemIT {
             ITUtilStructures.assertRead("/SUBSYSTEM?statuses=REJECTED&mnemonic=Rshr",  1);
             ITUtilStructures.assertRead("/SUBSYSTEM?uuid=" + rejectedStructureElement.getUuid().toString(), 1);
 
+            ITUtilStructures.assertFind("/SUBSYSTEM/" + rejectedStructureElement.getUuid().toString());
+
             ITUtilStructures.assertRead("/mnemonic/Sg",              1);
             ITUtilStructures.assertRead("/mnemonic/Sys",             1);
             ITUtilStructures.assertRead("/mnemonic/Rshr",            0);
@@ -1442,6 +1454,11 @@ class StructuresSubsystemIT {
             ITUtilStructures.assertRead("/SUBSYSTEM?uuid=" + uuid3.toString(), 1);
             ITUtilStructures.assertRead("/SUBSYSTEM?uuid=" + uuid4.toString(), 1);
 
+            ITUtilStructures.assertFind("/SUBSYSTEM/" + uuid.toString());
+            ITUtilStructures.assertFind("/SUBSYSTEM/" + uuid2.toString());
+            ITUtilStructures.assertFind("/SUBSYSTEM/" + uuid3.toString());
+            ITUtilStructures.assertFind("/SUBSYSTEM/" + uuid4.toString());
+
             ITUtilStructures.assertRead("/mnemonic/P1", 0);
             ITUtilStructures.assertRead("/mnemonic/C1", 0);
             ITUtilStructures.assertRead("/mnemonic/R1", 0);
@@ -1622,6 +1639,11 @@ class StructuresSubsystemIT {
             ITUtilStructures.assertRead("/SUBSYSTEM?uuid=" + uuid3.toString(), 2);
             ITUtilStructures.assertRead("/SUBSYSTEM?uuid=" + uuid4.toString(), 1);
 
+            ITUtilStructures.assertFind("/SUBSYSTEM/" + uuid.toString());
+            ITUtilStructures.assertFind("/SUBSYSTEM/" + uuid2.toString());
+            ITUtilStructures.assertFind("/SUBSYSTEM/" + uuid3.toString());
+            ITUtilStructures.assertFind("/SUBSYSTEM/" + uuid4.toString());
+
             ITUtilStructures.assertRead("/mnemonic/P9", 1);
             ITUtilStructures.assertRead("/mnemonic/C9", 1);
             ITUtilStructures.assertRead("/mnemonic/R9", 1);
@@ -2046,6 +2068,13 @@ class StructuresSubsystemIT {
             response2 = ITUtilStructures.assertRead("/SUBSYSTEM?mnemonic=A__&page=2&pageSize=20&orderBy=WHEN&isAsc=true",      5);
             assertEquals(response.getList().get(0), response2.getList().get(response2.getList().size()-1));
 
+            // type and uuid
+            //     /{type}/{uuid}
+            ITUtilStructures.assertFind("/SUBSYSTEM/" + systemGroupUuid.toString(),         HttpURLConnection.HTTP_NOT_FOUND);
+            ITUtilStructures.assertFind("/SUBSYSTEM/" + systemUuid.toString(),              HttpURLConnection.HTTP_NOT_FOUND);
+            ITUtilStructures.assertFind("/SUBSYSTEM/" + uuid.toString());
+            ITUtilStructures.assertFind("/SUBSYSTEM/" + uuid2.toString());
+
             // children
             //     /children/{uuid}
             //     uuid, type, statuses, deleted, name, mnemonic, mnemonicEquivalence, mnemonicPath, description
diff --git a/src/test/java/org/openepics/names/docker/StructuresSystemGroupIT.java b/src/test/java/org/openepics/names/docker/StructuresSystemGroupIT.java
index fdd13004..e0a70f7a 100644
--- a/src/test/java/org/openepics/names/docker/StructuresSystemGroupIT.java
+++ b/src/test/java/org/openepics/names/docker/StructuresSystemGroupIT.java
@@ -1101,6 +1101,8 @@ class StructuresSystemGroupIT {
             ITUtilStructures.assertRead("/SYSTEMGROUP?statuses=REJECTED&mnemonic=Rsha",  0);
             ITUtilStructures.assertRead("/SYSTEMGROUP?uuid=" + createdStructureElement.getUuid().toString(),  1);
 
+            ITUtilStructures.assertFind("/SYSTEMGROUP/" + createdStructureElement.getUuid().toString());
+
             ITUtilStructures.assertRead("/mnemonic/Rsha",     0);
 
             ITUtilStructures.assertRead("/mnemonicPath/Rsha", 0);
@@ -1125,6 +1127,8 @@ class StructuresSystemGroupIT {
             ITUtilStructures.assertRead("/SYSTEMGROUP?statuses=REJECTED&mnemonic=Rsha",  0);
             ITUtilStructures.assertRead("/SYSTEMGROUP?uuid=" + approvedStructureElement.getUuid().toString(), 1);
 
+            ITUtilStructures.assertFind("/SYSTEMGROUP/" + approvedStructureElement.getUuid().toString());
+
             ITUtilStructures.assertRead("/mnemonic/Rsha",     1);
 
             ITUtilStructures.assertRead("/mnemonicPath/Rsha", 1);
@@ -1177,6 +1181,8 @@ class StructuresSystemGroupIT {
             ITUtilStructures.assertRead("/SYSTEMGROUP?statuses=REJECTED&mnemonic=Rshc",  0);
             ITUtilStructures.assertRead("/SYSTEMGROUP?uuid=" + createdStructureElement.getUuid().toString(),   1);
 
+            ITUtilStructures.assertFind("/SYSTEMGROUP/" + createdStructureElement.getUuid().toString());
+
             ITUtilStructures.assertRead("/mnemonic/Rshc",     0);
 
             ITUtilStructures.assertRead("/mnemonicPath/Rshc", 0);
@@ -1201,6 +1207,8 @@ class StructuresSystemGroupIT {
             ITUtilStructures.assertRead("/SYSTEMGROUP?statuses=REJECTED&mnemonic=Rshc",  0);
             ITUtilStructures.assertRead("/SYSTEMGROUP?uuid=" + cancelledStructureElement.getUuid().toString(), 1);
 
+            ITUtilStructures.assertFind("/SYSTEMGROUP/" + cancelledStructureElement.getUuid().toString());
+
             ITUtilStructures.assertRead("/mnemonic/Rshc",     0);
 
             ITUtilStructures.assertRead("/mnemonicPath/Rshc", 0);
@@ -1253,6 +1261,8 @@ class StructuresSystemGroupIT {
             ITUtilStructures.assertRead("/SYSTEMGROUP?statuses=REJECTED&mnemonic=Rshr",  0);
             ITUtilStructures.assertRead("/SYSTEMGROUP?uuid=" + createdStructureElement.getUuid().toString(),  1);
 
+            ITUtilStructures.assertFind("/SYSTEMGROUP/" + createdStructureElement.getUuid().toString());
+
             ITUtilStructures.assertRead("/mnemonic/Rshr",     0);
 
             ITUtilStructures.assertRead("/mnemonicPath/Rshr", 0);
@@ -1277,6 +1287,8 @@ class StructuresSystemGroupIT {
             ITUtilStructures.assertRead("/SYSTEMGROUP?statuses=REJECTED&mnemonic=Rshr",  1);
             ITUtilStructures.assertRead("/SYSTEMGROUP?uuid=" + rejectedStructureElement.getUuid().toString(), 1);
 
+            ITUtilStructures.assertFind("/SYSTEMGROUP/" + rejectedStructureElement.getUuid().toString());
+
             ITUtilStructures.assertRead("/mnemonic/Rshr",     0);
 
             ITUtilStructures.assertRead("/mnemonicPath/Rshr", 0);
@@ -1369,6 +1381,11 @@ class StructuresSystemGroupIT {
             ITUtilStructures.assertRead("/SYSTEMGROUP?uuid=" + uuid3.toString(), 1);
             ITUtilStructures.assertRead("/SYSTEMGROUP?uuid=" + uuid4.toString(), 1);
 
+            ITUtilStructures.assertFind("/SYSTEMGROUP/" + uuid.toString());
+            ITUtilStructures.assertFind("/SYSTEMGROUP/" + uuid2.toString());
+            ITUtilStructures.assertFind("/SYSTEMGROUP/" + uuid3.toString());
+            ITUtilStructures.assertFind("/SYSTEMGROUP/" + uuid4.toString());
+
             ITUtilStructures.assertRead("/mnemonic/P1", 0);
             ITUtilStructures.assertRead("/mnemonic/C1", 0);
             ITUtilStructures.assertRead("/mnemonic/R1", 0);
@@ -1541,6 +1558,11 @@ class StructuresSystemGroupIT {
             ITUtilStructures.assertRead("/SYSTEMGROUP?uuid=" + uuid3.toString(), 2);
             ITUtilStructures.assertRead("/SYSTEMGROUP?uuid=" + uuid4.toString(), 1);
 
+            ITUtilStructures.assertFind("/SYSTEMGROUP/" + uuid.toString());
+            ITUtilStructures.assertFind("/SYSTEMGROUP/" + uuid2.toString());
+            ITUtilStructures.assertFind("/SYSTEMGROUP/" + uuid3.toString());
+            ITUtilStructures.assertFind("/SYSTEMGROUP/" + uuid4.toString());
+
             ITUtilStructures.assertRead("/mnemonic/P9", 1);
             ITUtilStructures.assertRead("/mnemonic/C9", 1);
             ITUtilStructures.assertRead("/mnemonic/R9", 1);
@@ -1898,9 +1920,9 @@ class StructuresSystemGroupIT {
             ITUtilStructures.assertRead("/SYSTEMGROUP?deleted=true&statuses=REJECTED&mnemonic=A__",                    5);
             ITUtilStructures.assertRead("/SYSTEMGROUP?deleted=true&statuses=PENDING&statuses=APPROVED&mnemonic=A__",  10);
 
+            ITUtilStructures.assertRead("/SYSTEMGROUP?uuid=" + uuidRandom.toString(),  0);
             ITUtilStructures.assertRead("/SYSTEMGROUP?uuid=" + uuid.toString(),        1);
             ITUtilStructures.assertRead("/SYSTEMGROUP?uuid=" + uuid2.toString(),       2);
-            ITUtilStructures.assertRead("/SYSTEMGROUP?uuid=" + uuidRandom.toString(),  0);
 
             ITUtilStructures.assertRead("/SYSTEMGROUP?parent=" + uuid.toString(),      0);
 
@@ -1955,6 +1977,12 @@ class StructuresSystemGroupIT {
             response2 = ITUtilStructures.assertRead("/SYSTEMGROUP?mnemonic=A__&page=2&pageSize=20&orderBy=WHEN&isAsc=true",      5);
             assertEquals(response.getList().get(0), response2.getList().get(response2.getList().size()-1));
 
+            // type and uuid
+            //     /{type}/{uuid}
+            ITUtilStructures.assertFind("/SYSTEMGROUP/" + uuidRandom.toString(),       HttpURLConnection.HTTP_NOT_FOUND);
+            ITUtilStructures.assertFind("/SYSTEMGROUP/" + uuid.toString());
+            ITUtilStructures.assertFind("/SYSTEMGROUP/" + uuid2.toString());
+
             // children
             //     /children/{uuid}
             //     uuid, type, statuses, deleted, name, mnemonic, mnemonicEquivalence, mnemonicPath, description
diff --git a/src/test/java/org/openepics/names/docker/StructuresSystemIT.java b/src/test/java/org/openepics/names/docker/StructuresSystemIT.java
index b1c1adee..d975918b 100644
--- a/src/test/java/org/openepics/names/docker/StructuresSystemIT.java
+++ b/src/test/java/org/openepics/names/docker/StructuresSystemIT.java
@@ -1085,6 +1085,8 @@ class StructuresSystemIT {
             ITUtilStructures.assertRead("/SYSTEM?statuses=REJECTED&mnemonic=Rsha",  0);
             ITUtilStructures.assertRead("/SYSTEM?uuid=" + createdStructureElement.getUuid().toString(),  1);
 
+            ITUtilStructures.assertFind("/SYSTEM/" + createdStructureElement.getUuid().toString());
+
             ITUtilStructures.assertRead("/mnemonic/Sg",          1);
             ITUtilStructures.assertRead("/mnemonic/Rsha",        0);
             ITUtilStructures.assertRead("/mnemonic/Sg-Rsha",     0);
@@ -1114,6 +1116,8 @@ class StructuresSystemIT {
             ITUtilStructures.assertRead("/SYSTEM?statuses=REJECTED&mnemonic=Rsha",  0);
             ITUtilStructures.assertRead("/SYSTEM?uuid=" + approvedStructureElement.getUuid().toString(), 1);
 
+            ITUtilStructures.assertFind("/SYSTEM/" + approvedStructureElement.getUuid().toString());
+
             ITUtilStructures.assertRead("/mnemonic/Sg",          1);
             ITUtilStructures.assertRead("/mnemonic/Rsha",        1);
             ITUtilStructures.assertRead("/mnemonic/Sg-Rsha",     0);
@@ -1171,6 +1175,8 @@ class StructuresSystemIT {
             ITUtilStructures.assertRead("/SYSTEM?statuses=REJECTED&mnemonic=Rshc",  0);
             ITUtilStructures.assertRead("/SYSTEM?uuid=" + createdStructureElement.getUuid().toString(),   1);
 
+            ITUtilStructures.assertFind("/SYSTEM/" + createdStructureElement.getUuid().toString());
+
             ITUtilStructures.assertRead("/mnemonic/Sg",          1);
             ITUtilStructures.assertRead("/mnemonic/Rshc",        0);
             ITUtilStructures.assertRead("/mnemonic/Sg-Rshc",     0);
@@ -1200,6 +1206,8 @@ class StructuresSystemIT {
             ITUtilStructures.assertRead("/SYSTEM?statuses=REJECTED&mnemonic=Rshc",  0);
             ITUtilStructures.assertRead("/SYSTEM?uuid=" + cancelledStructureElement.getUuid().toString(), 1);
 
+            ITUtilStructures.assertFind("/SYSTEM/" + cancelledStructureElement.getUuid().toString());
+
             ITUtilStructures.assertRead("/mnemonic/Sg",          1);
             ITUtilStructures.assertRead("/mnemonic/Rshc",        0);
             ITUtilStructures.assertRead("/mnemonic/Sg-Rshc",     0);
@@ -1257,6 +1265,8 @@ class StructuresSystemIT {
             ITUtilStructures.assertRead("/SYSTEM?statuses=REJECTED&mnemonic=Rshr",  0);
             ITUtilStructures.assertRead("/SYSTEM?uuid=" + createdStructureElement.getUuid().toString(),  1);
 
+            ITUtilStructures.assertFind("/SYSTEM/" + createdStructureElement.getUuid().toString());
+
             ITUtilStructures.assertRead("/mnemonic/Sg",          1);
             ITUtilStructures.assertRead("/mnemonic/Rshr",        0);
             ITUtilStructures.assertRead("/mnemonic/Sg-Rshr",     0);
@@ -1286,6 +1296,8 @@ class StructuresSystemIT {
             ITUtilStructures.assertRead("/SYSTEM?statuses=REJECTED&mnemonic=Rshr",  1);
             ITUtilStructures.assertRead("/SYSTEM?uuid=" + rejectedStructureElement.getUuid().toString(), 1);
 
+            ITUtilStructures.assertFind("/SYSTEM/" + rejectedStructureElement.getUuid().toString());
+
             ITUtilStructures.assertRead("/mnemonic/Sg",          1);
             ITUtilStructures.assertRead("/mnemonic/Rshr",        0);
             ITUtilStructures.assertRead("/mnemonic/Sg-Rshr",     0);
@@ -1383,6 +1395,11 @@ class StructuresSystemIT {
             ITUtilStructures.assertRead("/SYSTEM?uuid=" + uuid3.toString(), 1);
             ITUtilStructures.assertRead("/SYSTEM?uuid=" + uuid4.toString(), 1);
 
+            ITUtilStructures.assertFind("/SYSTEM/" + uuid.toString());
+            ITUtilStructures.assertFind("/SYSTEM/" + uuid2.toString());
+            ITUtilStructures.assertFind("/SYSTEM/" + uuid3.toString());
+            ITUtilStructures.assertFind("/SYSTEM/" + uuid4.toString());
+
             ITUtilStructures.assertRead("/mnemonic/P1", 0);
             ITUtilStructures.assertRead("/mnemonic/C1", 0);
             ITUtilStructures.assertRead("/mnemonic/R1", 0);
@@ -1559,6 +1576,11 @@ class StructuresSystemIT {
             ITUtilStructures.assertRead("/SYSTEM?uuid=" + uuid3.toString(), 2);
             ITUtilStructures.assertRead("/SYSTEM?uuid=" + uuid4.toString(), 1);
 
+            ITUtilStructures.assertFind("/SYSTEM/" + uuid.toString());
+            ITUtilStructures.assertFind("/SYSTEM/" + uuid2.toString());
+            ITUtilStructures.assertFind("/SYSTEM/" + uuid3.toString());
+            ITUtilStructures.assertFind("/SYSTEM/" + uuid4.toString());
+
             ITUtilStructures.assertRead("/mnemonic/P9", 1);
             ITUtilStructures.assertRead("/mnemonic/C9", 1);
             ITUtilStructures.assertRead("/mnemonic/R9", 1);
@@ -1977,6 +1999,12 @@ class StructuresSystemIT {
             response2 = ITUtilStructures.assertRead("/SYSTEM?mnemonic=A__&page=2&pageSize=20&orderBy=WHEN&isAsc=true",      5);
             assertEquals(response.getList().get(0), response2.getList().get(response2.getList().size()-1));
 
+            // type and uuid
+            //     /{type}/{uuid}
+            ITUtilStructures.assertFind("/SYSTEM/" + systemGroupUuid.toString(),            HttpURLConnection.HTTP_NOT_FOUND);
+            ITUtilStructures.assertFind("/SYSTEM/" + uuid.toString());
+            ITUtilStructures.assertFind("/SYSTEM/" + uuid2.toString());
+
             // children
             //     /children/{uuid}
             //     uuid, type, statuses, deleted, name, mnemonic, mnemonicEquivalence, mnemonicPath, description
-- 
GitLab