From f65d4db11cb5e5dfd1dfeb65649b03b89b6d1df3 Mon Sep 17 00:00:00 2001 From: Vladislav Sehtman Date: Fri, 27 Jan 2023 09:29:55 +0100 Subject: [PATCH 01/19] Violation of L9-Logic layer doesnt dep. on service --- ...ionLogicLayerDependsAccessesServiceLayer.java | 16 ++++++++++++++++ .../archunit/task/service/TaskService.java | 3 +++ 2 files changed, 19 insertions(+) create mode 100644 src/main/java/com/devonfw/sample/archunit/task/logic/L9ViolationLogicLayerDependsAccessesServiceLayer.java diff --git a/src/main/java/com/devonfw/sample/archunit/task/logic/L9ViolationLogicLayerDependsAccessesServiceLayer.java b/src/main/java/com/devonfw/sample/archunit/task/logic/L9ViolationLogicLayerDependsAccessesServiceLayer.java new file mode 100644 index 0000000..62d1709 --- /dev/null +++ b/src/main/java/com/devonfw/sample/archunit/task/logic/L9ViolationLogicLayerDependsAccessesServiceLayer.java @@ -0,0 +1,16 @@ +package com.devonfw.sample.archunit.task.logic; + +import javax.inject.Inject; + +import com.devonfw.sample.archunit.task.service.TaskService; + +public class L9ViolationLogicLayerDependsAccessesServiceLayer { + @Inject + TaskService taskService; + + public String thisMethodIsErroneouslyUsingTheServiceLayer() + { + String helloFromService = this.taskService.thisMethodIsUsedToViolateTheAccessOfItFromLogicLayer(); + return "Logic Layer calling service method...: " + helloFromService; + } +} diff --git a/src/main/java/com/devonfw/sample/archunit/task/service/TaskService.java b/src/main/java/com/devonfw/sample/archunit/task/service/TaskService.java index 4551084..a977e74 100644 --- a/src/main/java/com/devonfw/sample/archunit/task/service/TaskService.java +++ b/src/main/java/com/devonfw/sample/archunit/task/service/TaskService.java @@ -133,4 +133,7 @@ public void deleteTaskItem(@PathParam("id") Long id) { this.ucDeleteTaskItem.delete(id); } + public String thisMethodIsUsedToViolateTheAccessOfItFromLogicLayer() { + return "Hello from Service"; + } } From eb4b24587f9980dedee667fa69e269e523a4927b Mon Sep 17 00:00:00 2001 From: Vladislav Sehtman Date: Fri, 27 Jan 2023 09:35:01 +0100 Subject: [PATCH 02/19] Violation of L1 - Common Layer doesnt depend on any other layer. --- .../L1ViolationCommonLayerDependsOnOtherLayer.java | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/main/java/com/devonfw/sample/archunit/task/common/L1ViolationCommonLayerDependsOnOtherLayer.java diff --git a/src/main/java/com/devonfw/sample/archunit/task/common/L1ViolationCommonLayerDependsOnOtherLayer.java b/src/main/java/com/devonfw/sample/archunit/task/common/L1ViolationCommonLayerDependsOnOtherLayer.java new file mode 100644 index 0000000..3c6c6fd --- /dev/null +++ b/src/main/java/com/devonfw/sample/archunit/task/common/L1ViolationCommonLayerDependsOnOtherLayer.java @@ -0,0 +1,10 @@ +package com.devonfw.sample.archunit.task.common; + +import javax.inject.Inject; + +import com.devonfw.sample.archunit.task.logic.TaskItemMapper; + +public class L1ViolationCommonLayerDependsOnOtherLayer { + @Inject + TaskItemMapper taskItemMapper; +} From ffbca63bdfbab152be7d86e1bdcceff556c926fc Mon Sep 17 00:00:00 2001 From: Vladislav Sehtman Date: Fri, 27 Jan 2023 11:36:26 +0100 Subject: [PATCH 03/19] Added sample client. Removed rules from ArchitectureTest.java. Because they were too restrictive. Violation of L2 - Client layer doesnt depend on any other layer. --- ...entLayerDependsOnOtherLayerThanClient.java | 11 ++++++++ .../sample/archunit/client/SampleClient.java | 28 +++++++++++++++++++ .../sample/archunit/ArchitectureTest.java | 4 +-- 3 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/devonfw/sample/archunit/client/L2ViolationClientLayerDependsOnOtherLayerThanClient.java create mode 100644 src/main/java/com/devonfw/sample/archunit/client/SampleClient.java diff --git a/src/main/java/com/devonfw/sample/archunit/client/L2ViolationClientLayerDependsOnOtherLayerThanClient.java b/src/main/java/com/devonfw/sample/archunit/client/L2ViolationClientLayerDependsOnOtherLayerThanClient.java new file mode 100644 index 0000000..7b7452a --- /dev/null +++ b/src/main/java/com/devonfw/sample/archunit/client/L2ViolationClientLayerDependsOnOtherLayerThanClient.java @@ -0,0 +1,11 @@ +package com.devonfw.sample.archunit.client; + +import javax.inject.Inject; + +import com.devonfw.sample.archunit.task.service.TaskService; + +public class L2ViolationClientLayerDependsOnOtherLayerThanClient { + // Violation! Client layer should not depend on service layer + @Inject + TaskService taskService; +} diff --git a/src/main/java/com/devonfw/sample/archunit/client/SampleClient.java b/src/main/java/com/devonfw/sample/archunit/client/SampleClient.java new file mode 100644 index 0000000..ef985cc --- /dev/null +++ b/src/main/java/com/devonfw/sample/archunit/client/SampleClient.java @@ -0,0 +1,28 @@ +package com.devonfw.sample.archunit.client; + +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.net.http.HttpResponse.BodyHandlers; + +public class SampleClient { + + public static void httpGetTaskItem(String taskId) throws URISyntaxException, IOException, InterruptedException { + HttpClient client = HttpClient.newHttpClient(); + HttpRequest request = HttpRequest.newBuilder() + .version(HttpClient.Version.HTTP_2) + .uri(URI.create("http://localhost:8080/task/item/" + taskId)) + .headers("Accept-Enconding", "gzip, deflate") + .build(); + HttpResponse response = client.send(request, BodyHandlers.ofString()); + + String responseBody = response.body(); + int responseStatusCode = response.statusCode(); + + System.out.println("httpGetRequest: " + responseBody); + System.out.println("httpGetRequest status code: " + responseStatusCode); + } +} diff --git a/src/test/java/com/devonfw/sample/archunit/ArchitectureTest.java b/src/test/java/com/devonfw/sample/archunit/ArchitectureTest.java index f995716..2a1a181 100644 --- a/src/test/java/com/devonfw/sample/archunit/ArchitectureTest.java +++ b/src/test/java/com/devonfw/sample/archunit/ArchitectureTest.java @@ -24,9 +24,9 @@ public class ArchitectureTest { .whereLayer("common").mayOnlyAccessLayers("common") // L01: Common Layer doesnt depend on any other layer - .whereLayer("client").mayOnlyBeAccessedByLayers("client") + //.whereLayer("client").mayOnlyBeAccessedByLayers("client") // L02: verifying that only client layer code may depend on client layer. - .whereLayer("client").mayOnlyAccessLayers("client") + //.whereLayer("client").mayOnlyAccessLayers("client") // L03: verifying that client layer does not depend on logic layer. // L04: verifying that client layer does not depend on dataaccess layer. // L05: verifying that client layer does not depend on batch layer. From 87a48804d394280e20b4e46966004ae96bd8893a Mon Sep 17 00:00:00 2001 From: Vladislav Sehtman Date: Fri, 27 Jan 2023 11:42:03 +0100 Subject: [PATCH 04/19] Violationf of L3. Client Layer doesnt depend on logic layer. --- .../L3ViolationClientLayerDependsOnLogicLayer.java | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/main/java/com/devonfw/sample/archunit/client/L3ViolationClientLayerDependsOnLogicLayer.java diff --git a/src/main/java/com/devonfw/sample/archunit/client/L3ViolationClientLayerDependsOnLogicLayer.java b/src/main/java/com/devonfw/sample/archunit/client/L3ViolationClientLayerDependsOnLogicLayer.java new file mode 100644 index 0000000..55e26fe --- /dev/null +++ b/src/main/java/com/devonfw/sample/archunit/client/L3ViolationClientLayerDependsOnLogicLayer.java @@ -0,0 +1,11 @@ +package com.devonfw.sample.archunit.client; + +import javax.inject.Inject; + +import com.devonfw.sample.archunit.task.logic.TaskItemMapper; + +public class L3ViolationClientLayerDependsOnLogicLayer { + // Violation! Client layer should not depend on logic layer + @Inject + TaskItemMapper taskItemMapper; +} From 2826baa7b5ab0145572b3c3874d2199d81ccf506 Mon Sep 17 00:00:00 2001 From: Vladislav Sehtman Date: Fri, 27 Jan 2023 11:45:44 +0100 Subject: [PATCH 05/19] Violation of L4. Client Layer doesnt depend on dataaccess layer. --- ...4ViolationClientLayerDependsOnDataaccessLayer.java | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/main/java/com/devonfw/sample/archunit/client/L4ViolationClientLayerDependsOnDataaccessLayer.java diff --git a/src/main/java/com/devonfw/sample/archunit/client/L4ViolationClientLayerDependsOnDataaccessLayer.java b/src/main/java/com/devonfw/sample/archunit/client/L4ViolationClientLayerDependsOnDataaccessLayer.java new file mode 100644 index 0000000..55b2050 --- /dev/null +++ b/src/main/java/com/devonfw/sample/archunit/client/L4ViolationClientLayerDependsOnDataaccessLayer.java @@ -0,0 +1,11 @@ +package com.devonfw.sample.archunit.client; + +import javax.inject.Inject; + +import com.devonfw.sample.archunit.task.dataaccess.TaskItemRepository; + +public class L4ViolationClientLayerDependsOnDataaccessLayer { + // Violation! Client layer should not depend on dataaccess layer + @Inject + TaskItemRepository taskItemRepository; +} From fc1152f8c004cb598f077f904a08f0ec72a159d6 Mon Sep 17 00:00:00 2001 From: Vladislav Sehtman Date: Fri, 27 Jan 2023 12:30:44 +0100 Subject: [PATCH 06/19] Refactored L9Violation class name for consistency. Added Violation of L8. Service layer doesnt depend on dataaccess layer. --- ...tionLogicLayerDependsAndAccessesServiceLayer.java} | 3 ++- ...ViolationServiceLayerDependsOnDataaccessLayer.java | 11 +++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) rename src/main/java/com/devonfw/sample/archunit/task/logic/{L9ViolationLogicLayerDependsAccessesServiceLayer.java => L9ViolationLogicLayerDependsAndAccessesServiceLayer.java} (74%) create mode 100644 src/main/java/com/devonfw/sample/archunit/task/service/L8ViolationServiceLayerDependsOnDataaccessLayer.java diff --git a/src/main/java/com/devonfw/sample/archunit/task/logic/L9ViolationLogicLayerDependsAccessesServiceLayer.java b/src/main/java/com/devonfw/sample/archunit/task/logic/L9ViolationLogicLayerDependsAndAccessesServiceLayer.java similarity index 74% rename from src/main/java/com/devonfw/sample/archunit/task/logic/L9ViolationLogicLayerDependsAccessesServiceLayer.java rename to src/main/java/com/devonfw/sample/archunit/task/logic/L9ViolationLogicLayerDependsAndAccessesServiceLayer.java index 62d1709..ce5dbf9 100644 --- a/src/main/java/com/devonfw/sample/archunit/task/logic/L9ViolationLogicLayerDependsAccessesServiceLayer.java +++ b/src/main/java/com/devonfw/sample/archunit/task/logic/L9ViolationLogicLayerDependsAndAccessesServiceLayer.java @@ -4,7 +4,8 @@ import com.devonfw.sample.archunit.task.service.TaskService; -public class L9ViolationLogicLayerDependsAccessesServiceLayer { +public class L9ViolationLogicLayerDependsAndAccessesServiceLayer { + // Violation! Logic layer should not depend on dataaccess layer nor acces it. @Inject TaskService taskService; diff --git a/src/main/java/com/devonfw/sample/archunit/task/service/L8ViolationServiceLayerDependsOnDataaccessLayer.java b/src/main/java/com/devonfw/sample/archunit/task/service/L8ViolationServiceLayerDependsOnDataaccessLayer.java new file mode 100644 index 0000000..8cb7a09 --- /dev/null +++ b/src/main/java/com/devonfw/sample/archunit/task/service/L8ViolationServiceLayerDependsOnDataaccessLayer.java @@ -0,0 +1,11 @@ +package com.devonfw.sample.archunit.task.service; + +import javax.inject.Inject; + +import com.devonfw.sample.archunit.task.dataaccess.TaskItemRepository; + +public class L8ViolationServiceLayerDependsOnDataaccessLayer { + // Violation! Service layer should not depend on dataaccess layer + @Inject + TaskItemRepository taskItemRepository; +} From 8b0138a359a90564235902bd11114d3328ce0266 Mon Sep 17 00:00:00 2001 From: Vladislav Sehtman Date: Fri, 27 Jan 2023 12:38:04 +0100 Subject: [PATCH 07/19] Violation of L10. Dataaccess layer doesnt depend on service layer. --- ...0ViolationDataaccessLayerDependsOnServiceLayer.java | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/main/java/com/devonfw/sample/archunit/task/dataaccess/L10ViolationDataaccessLayerDependsOnServiceLayer.java diff --git a/src/main/java/com/devonfw/sample/archunit/task/dataaccess/L10ViolationDataaccessLayerDependsOnServiceLayer.java b/src/main/java/com/devonfw/sample/archunit/task/dataaccess/L10ViolationDataaccessLayerDependsOnServiceLayer.java new file mode 100644 index 0000000..c00cb39 --- /dev/null +++ b/src/main/java/com/devonfw/sample/archunit/task/dataaccess/L10ViolationDataaccessLayerDependsOnServiceLayer.java @@ -0,0 +1,10 @@ +package com.devonfw.sample.archunit.task.dataaccess; + +import javax.inject.Inject; + +import com.devonfw.sample.archunit.task.service.TaskService; + +public class L10ViolationDataaccessLayerDependsOnServiceLayer { + @Inject + TaskService taskService; +} From b6a6e8c28cefb2424187eb37dad57a623969e1d9 Mon Sep 17 00:00:00 2001 From: Vladislav Sehtman Date: Fri, 27 Jan 2023 12:47:46 +0100 Subject: [PATCH 08/19] Refactored L10: Added comment. Added Violation of L12. Dataaccess layer doesnt depend on logic layer. --- ...ViolationDataaccessLayerDependsOnServiceLayer.java | 1 + ...12ViolationDataaccessLayerDependsOnLogicLayer.java | 11 +++++++++++ 2 files changed, 12 insertions(+) create mode 100644 src/main/java/com/devonfw/sample/archunit/task/dataaccess/L12ViolationDataaccessLayerDependsOnLogicLayer.java diff --git a/src/main/java/com/devonfw/sample/archunit/task/dataaccess/L10ViolationDataaccessLayerDependsOnServiceLayer.java b/src/main/java/com/devonfw/sample/archunit/task/dataaccess/L10ViolationDataaccessLayerDependsOnServiceLayer.java index c00cb39..0894a43 100644 --- a/src/main/java/com/devonfw/sample/archunit/task/dataaccess/L10ViolationDataaccessLayerDependsOnServiceLayer.java +++ b/src/main/java/com/devonfw/sample/archunit/task/dataaccess/L10ViolationDataaccessLayerDependsOnServiceLayer.java @@ -5,6 +5,7 @@ import com.devonfw.sample.archunit.task.service.TaskService; public class L10ViolationDataaccessLayerDependsOnServiceLayer { + // Violation! Dataaccess layer should not depend on service layer. @Inject TaskService taskService; } diff --git a/src/main/java/com/devonfw/sample/archunit/task/dataaccess/L12ViolationDataaccessLayerDependsOnLogicLayer.java b/src/main/java/com/devonfw/sample/archunit/task/dataaccess/L12ViolationDataaccessLayerDependsOnLogicLayer.java new file mode 100644 index 0000000..db35a24 --- /dev/null +++ b/src/main/java/com/devonfw/sample/archunit/task/dataaccess/L12ViolationDataaccessLayerDependsOnLogicLayer.java @@ -0,0 +1,11 @@ +package com.devonfw.sample.archunit.task.dataaccess; + +import javax.inject.Inject; + +import com.devonfw.sample.archunit.task.logic.TaskItemMapper; + +public class L12ViolationDataaccessLayerDependsOnLogicLayer { + // Violation! Dataaccess layer should not depend on logic layer. + @Inject + TaskItemMapper taskItemMapper; +} From 264cd9033807a5252ac3c5aef05a750440df0cb2 Mon Sep 17 00:00:00 2001 From: Vladislav Sehtman Date: Sat, 28 Jan 2023 10:58:28 +0100 Subject: [PATCH 09/19] Added sample import script. Added sample tasklist and taskitem dump file. --- .../archunit/batch/SampleTaskImport.java | 67 ++++++++++++++++++ .../devonfw/sample/archunit/batch/myBackup | Bin 0 -> 11264 bytes 2 files changed, 67 insertions(+) create mode 100644 src/main/java/com/devonfw/sample/archunit/batch/SampleTaskImport.java create mode 100644 src/main/java/com/devonfw/sample/archunit/batch/myBackup diff --git a/src/main/java/com/devonfw/sample/archunit/batch/SampleTaskImport.java b/src/main/java/com/devonfw/sample/archunit/batch/SampleTaskImport.java new file mode 100644 index 0000000..f4d44c4 --- /dev/null +++ b/src/main/java/com/devonfw/sample/archunit/batch/SampleTaskImport.java @@ -0,0 +1,67 @@ +package com.devonfw.sample.archunit.batch; + +import java.io.BufferedReader; +import java.io.InputStreamReader; + +public class SampleTaskImport { + public static void main(String[] args) { + + if ( args == null || args.length< 3 ) + { + System.err.println("Container id as first argument required"); + System.err.println("Filename as second argument required"); + System.err.println("Username as third argument required"); + System.exit(1); + } + String containerId = args[0]; + String filename = args[1]; + String username = args[2]; + try { + sampleTaskImport(containerId, filename, username); + } catch (Exception e) { + System.out.println(e.toString()); + e.printStackTrace(); + } + + } + + private static void sampleTaskImport(String containerId, String filename, String username) throws Exception { + try { + Runtime rt = Runtime.getRuntime(); + String dockerCopyCommand = String.format("docker cp %s %s:/var/lib/postgresql/data", filename, containerId); + Process pr = rt.exec("cmd /c "+ dockerCopyCommand); + + BufferedReader input = new BufferedReader(new InputStreamReader(pr.getInputStream())); + + String line=null; + + while((line=input.readLine()) != null) { + System.out.println(line); + } + + int exitVal = pr.waitFor(); + System.out.println("Exited with error code "+ exitVal); + if(exitVal == 0) { + String pg_restoreCommand = String.format("docker exec %s pg_restore -U %s -d quarkus --clean /var/lib/postgresql/data/%s", containerId, username, filename); + Process pr2 = rt.exec("cmd /c "+ pg_restoreCommand); + BufferedReader input2 = new BufferedReader(new InputStreamReader(pr.getInputStream())); + + String line2 = null; + + while((line2 = input2.readLine()) != null) { + System.out.println(line2); + } + int exitVal2 = pr2.waitFor(); + System.out.println("Exited with error code " + exitVal2); + + } else { + System.out.println("Import failed. Could not copy data to docker mount"); + } + + } catch(Exception e) { + System.out.println(e.toString()); + e.printStackTrace(); + } + } + +} diff --git a/src/main/java/com/devonfw/sample/archunit/batch/myBackup b/src/main/java/com/devonfw/sample/archunit/batch/myBackup new file mode 100644 index 0000000000000000000000000000000000000000..6d709bf02a0937e2ffdf46352a13f38b0796b2be GIT binary patch literal 11264 zcmeHMTW{mm5#~0VHWr#Z^d$v?6!Wl!ZNyedUFfxq1*(BY)S_H2V!cu-sRfWXsZ=a`9E651$@0hx!oJUfxP1P; zs-7&ti;SZS=KKFl-!GrlE-oK@Bt87#J)z-ebbCyHAJN|@^vAEi#ShZ2@abl3_}Ak= z`W-$irMwDzHP*Ea7Y8!09xC}!-|8!h{F$Rfkc(V;Z61c>R39Law0Q-`fqC;hTfb$Os3!2e6Aj4$A&o z`2CdV`4B&>6x0HTSy79ROEc`D@vK$!%F{|)lengT#*%7FtLPfU6%cU^zB<>RgRWg% z)~Wglglsr+jF8C?6C@dSs5h&XIyKs5Zs)3?E!fTB@{zHK7q)cWfM3jv^AH9wGEktc(!ir7=872iW5_+7@)} zzU_w4XzI|os@D&A`Ag;pw&w!Yus-ueq3I!kSje!C=Q+%9MX|*U%duSsp*>{i%EJ-d z+Tp+(hr9&->bXp`q_xAJ?;hHr!@wLEzF~&UhnI#wLC@bSl*{{~n_~xIC($&AP9}Yd z_VE$Owl0nO6vhEFMk|s3hiH%g^T;17Q{+jpdE{@f&qCy>!#c<>!)O&A^vyTM<9nK- zXl00&8S-tKpXO;uv%DA*nvNt|B=7M38+@%cFJEM^(Y6jCBHaNbL_2_(TnDsB5P1%e zR7jWuh*+@?XRYQ1*5W#b#JInoapek%%=P1wOtGk_e0TRlwza9DUvBMDmbHQbGuCo@ z-qZ|b#*8Cw#($D^We$(@M_!t-623H?z1@X#F0O|~94LRxW>&=4 z9v%5un1xzMl9iZ4K3Py@HC{W8W$CwAG@aa%r_Sh_P52sLZ8mT#QaNwv+@+;2u|uV< zYb_9bZ8qv@Uh=uHQmetVH_Xb0%hvftrS$?n*IvM$ZPDcP^gg12PhSh=F7Q|Z$K4%e zvdYf#8CAfI+G51YQ^YtWxmDby)<=xGFGMVny%u6z$4tZ$xoaa9xeiCHzZfx9`aL#D zMjv|De=#RFo@!0PvU59pH70`mgMRk;9o7iWeT&6wac;@C;H=rw&Yv{| z0XZ7TLTG7cT8nl}?U~7z>LZpm@1snLrAstP4*+NDGRl%87nP$@%-!gIcSNwo&*(~) zhz;sQ=iw#if4NXBq|X0^vbsJ0Z*WXv(S;p(r?*qUF*uY9he{EYqZ9e~q*Tb46lEve z>DjIw4EX*R9AkppS&NOBYvDm=0{+-x!H$wEt`K7S3=criH9~U$p$GPGXeB7Kac+@=(^e~ z9!T*gpyTnIpF_4Tm=NTD`vD`~q35%FaN}&u&=vl#mXAvF{$DQPQndB|jSWd6`0y}y zcu27_?F1j_`OL=X6~%!Aa2dw7aJ}v_U=~K@tUR=NoER{u4UZmCy!p{1z*skR^chBD zO$K%-whQ4v$RP>zY}r0Dk!%wThq$4E8wda=9qjj{!@{ zK2W@nqJ&RCKIK&oZfnw|w&k#n?RL;)H^3Mn#w9U098i2R-FR_gV|Ajz!vNB{VSkct z4jAg+8@ocsE~Zu(B`|nuKv?){=y)Tt0E=l@5e88a>5Zw64hB&JqtAQZ8a@rXXySXf zXtz1`?QnwKyjo2FSc0E7&|yS8C{%JM>IuaS`3q6 ze2SW>?HHzs&Waw3=?)8!cBqxcWO!;AD=`)V7SF zNnuK%thb0MiCYKLRjHZ9mhvwyw6un2d%kZFlX!y7jLCd5zaN)2ns&hm#D?-ZyYaT^ z4{_*?JW-G#3!)S&-T)#&iB-9pEZbM~oH2^W6Q)Lq;Z9Fi@wg{5D$Z5+8u`o}&1B)te?X?xoyX(eT6o_NPis7%7wN`YjkOnLofS%z5u onMA|pP+t=HUpEI48@=efk|cuphBP^ZZ6CG>Y!TQZ@D338FLqMS)Bpeg literal 0 HcmV?d00001 From 8314815013ff2586c51b43219e790709048f88a5 Mon Sep 17 00:00:00 2001 From: Vladislav Sehtman Date: Sat, 28 Jan 2023 11:12:01 +0100 Subject: [PATCH 10/19] Violation of L5. Client layer doesnt depend on batch layer. --- .../L5ViolationClientLayerDependsOnBatchLayer.java | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/main/java/com/devonfw/sample/archunit/client/L5ViolationClientLayerDependsOnBatchLayer.java diff --git a/src/main/java/com/devonfw/sample/archunit/client/L5ViolationClientLayerDependsOnBatchLayer.java b/src/main/java/com/devonfw/sample/archunit/client/L5ViolationClientLayerDependsOnBatchLayer.java new file mode 100644 index 0000000..2352741 --- /dev/null +++ b/src/main/java/com/devonfw/sample/archunit/client/L5ViolationClientLayerDependsOnBatchLayer.java @@ -0,0 +1,11 @@ +package com.devonfw.sample.archunit.client; + +import javax.inject.Inject; + +import com.devonfw.sample.archunit.batch.SampleTaskImport; + +public class L5ViolationClientLayerDependsOnBatchLayer { + // Violation! Client layer should not depend on batch layer + @Inject + SampleTaskImport taskImport; +} From 3e3394cdd9468b263bbf0cd7fc5a5ea83201296f Mon Sep 17 00:00:00 2001 From: Vladislav Sehtman Date: Sat, 28 Jan 2023 11:21:48 +0100 Subject: [PATCH 11/19] Violation of L6. Service layer doesnt depend on batch layer. --- .../L6ViolationServiceLayerDependsOnBatchLayer.java | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/main/java/com/devonfw/sample/archunit/task/service/L6ViolationServiceLayerDependsOnBatchLayer.java diff --git a/src/main/java/com/devonfw/sample/archunit/task/service/L6ViolationServiceLayerDependsOnBatchLayer.java b/src/main/java/com/devonfw/sample/archunit/task/service/L6ViolationServiceLayerDependsOnBatchLayer.java new file mode 100644 index 0000000..db57827 --- /dev/null +++ b/src/main/java/com/devonfw/sample/archunit/task/service/L6ViolationServiceLayerDependsOnBatchLayer.java @@ -0,0 +1,11 @@ +package com.devonfw.sample.archunit.task.service; + +import javax.inject.Inject; + +import com.devonfw.sample.archunit.batch.SampleTaskImport; + +public class L6ViolationServiceLayerDependsOnBatchLayer { + // Violation! Service layer should not depend on batch layer + @Inject + SampleTaskImport sampleTaskImport; +} From 7ffb53c3cb012cdd1f8d8b58fde238e7e8688216 Mon Sep 17 00:00:00 2001 From: Vladislav Sehtman Date: Sat, 28 Jan 2023 12:14:31 +0100 Subject: [PATCH 12/19] Violation of L7. Batch layer doesnt depend on service layer. --- .../L7ViolationBatchLayerDependsOnServiceLayer.java | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/main/java/com/devonfw/sample/archunit/batch/L7ViolationBatchLayerDependsOnServiceLayer.java diff --git a/src/main/java/com/devonfw/sample/archunit/batch/L7ViolationBatchLayerDependsOnServiceLayer.java b/src/main/java/com/devonfw/sample/archunit/batch/L7ViolationBatchLayerDependsOnServiceLayer.java new file mode 100644 index 0000000..c6e3c8b --- /dev/null +++ b/src/main/java/com/devonfw/sample/archunit/batch/L7ViolationBatchLayerDependsOnServiceLayer.java @@ -0,0 +1,11 @@ +package com.devonfw.sample.archunit.batch; + +import javax.inject.Inject; + +import com.devonfw.sample.archunit.task.service.TaskService; + +public class L7ViolationBatchLayerDependsOnServiceLayer { + // Violation! Batch layer should not depend on service layer + @Inject + TaskService taskService; +} From 1c8c0793a7c3a57dbdc71e13877a6a441e764944 Mon Sep 17 00:00:00 2001 From: Vladislav Sehtman Date: Sat, 28 Jan 2023 12:38:17 +0100 Subject: [PATCH 13/19] Violation of L11. Batch layer doesnt depend on dataaccess layer. --- ...11ViolationBatchLayerDependsOnDataaccessLayer.java | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/main/java/com/devonfw/sample/archunit/batch/L11ViolationBatchLayerDependsOnDataaccessLayer.java diff --git a/src/main/java/com/devonfw/sample/archunit/batch/L11ViolationBatchLayerDependsOnDataaccessLayer.java b/src/main/java/com/devonfw/sample/archunit/batch/L11ViolationBatchLayerDependsOnDataaccessLayer.java new file mode 100644 index 0000000..910dde5 --- /dev/null +++ b/src/main/java/com/devonfw/sample/archunit/batch/L11ViolationBatchLayerDependsOnDataaccessLayer.java @@ -0,0 +1,11 @@ +package com.devonfw.sample.archunit.batch; + +import javax.inject.Inject; + +import com.devonfw.sample.archunit.task.dataaccess.TaskItemRepository; + +public class L11ViolationBatchLayerDependsOnDataaccessLayer { + // Violation! Batch layer should not depend on dataaccess layer + @Inject + TaskItemRepository taskItemRepository; +} From d37e64317e15fe26a15e43b4aed6ae5bbbaa68f9 Mon Sep 17 00:00:00 2001 From: Vladislav Sehtman Date: Mon, 30 Jan 2023 11:43:30 +0100 Subject: [PATCH 14/19] Deleted redundant layer rules check. LayerDependencyRulesTest.java includes all necessary tests. --- .../sample/archunit/ArchitectureTest.java | 22 ------------------- 1 file changed, 22 deletions(-) diff --git a/src/test/java/com/devonfw/sample/archunit/ArchitectureTest.java b/src/test/java/com/devonfw/sample/archunit/ArchitectureTest.java index 2a1a181..50f5cd2 100644 --- a/src/test/java/com/devonfw/sample/archunit/ArchitectureTest.java +++ b/src/test/java/com/devonfw/sample/archunit/ArchitectureTest.java @@ -22,28 +22,6 @@ public class ArchitectureTest { .layer("service").definedBy("com.devonfw.sample.archunit.service..") // .layer("client").definedBy("com.devonfw.sample.archunit.client..") - .whereLayer("common").mayOnlyAccessLayers("common") - // L01: Common Layer doesnt depend on any other layer - //.whereLayer("client").mayOnlyBeAccessedByLayers("client") - // L02: verifying that only client layer code may depend on client layer. - //.whereLayer("client").mayOnlyAccessLayers("client") - // L03: verifying that client layer does not depend on logic layer. - // L04: verifying that client layer does not depend on dataaccess layer. - // L05: verifying that client layer does not depend on batch layer. - .whereLayer("service").mayOnlyBeAccessedByLayers("client") - .whereLayer("service").mayOnlyAccessLayers("logic", "common") - // L08: verifying that code from service layer does not depend on dataaccess layer. - // L06: verifying that service layer does not on depend batch layer. - //.whereLayer("batch").mayOnlyAccessLayers("java") - // L07: verifying that batch layer does not depend on service layer. - // L11: verifying that batch layer does not depend on dataaccess layer. - .whereLayer("logic").mayOnlyBeAccessedByLayers("service") - .whereLayer("logic").mayOnlyAccessLayers("dataaccess", "common") - // L09: verifying that code from logic layer does not depend on service layer (of same app). - .whereLayer("dataaccess").mayOnlyBeAccessedByLayers("logic") - .whereLayer("dataaccess").mayOnlyAccessLayers("dataaccess", "common") - // L10: verifying that dataaccess layer does not depend on service layer. - // L12: verifying that dataaccess layer does not depend on logic layer. .withOptionalLayers(true) .because("Dependency of technical layers violates architecture rules."); // ... From cd26c1b3add170e06173abda008b3931c1610a6a Mon Sep 17 00:00:00 2001 From: Vladislav Sehtman Date: Tue, 31 Jan 2023 11:51:10 +0100 Subject: [PATCH 15/19] Adjusted ArchitectureTest.java. Deleted LayerDependencyRulesTest.java. Refactored L2Violation and moved into service layer. Refactored TaskService and L9Violation to resemble to other Violations. --- .../archunit/batch/SampleTaskImport.java | 4 +- ...entLayerDependsOnOtherLayerThanClient.java | 11 --- ...icLayerDependsAndAccessesServiceLayer.java | 17 ---- ...lationLogicLayerDependsOnServiceLayer.java | 12 +++ ...erOtherThanClientDependsOnClientLayer.java | 11 +++ .../archunit/task/service/TaskService.java | 3 - .../sample/archunit/ArchitectureTest.java | 20 ++-- .../archunit/LayerDependencyRulesTest.java | 97 ------------------- 8 files changed, 38 insertions(+), 137 deletions(-) delete mode 100644 src/main/java/com/devonfw/sample/archunit/client/L2ViolationClientLayerDependsOnOtherLayerThanClient.java delete mode 100644 src/main/java/com/devonfw/sample/archunit/task/logic/L9ViolationLogicLayerDependsAndAccessesServiceLayer.java create mode 100644 src/main/java/com/devonfw/sample/archunit/task/logic/L9ViolationLogicLayerDependsOnServiceLayer.java create mode 100644 src/main/java/com/devonfw/sample/archunit/task/service/L2ViolationNoLayerOtherThanClientDependsOnClientLayer.java delete mode 100644 src/test/java/com/devonfw/sample/archunit/LayerDependencyRulesTest.java diff --git a/src/main/java/com/devonfw/sample/archunit/batch/SampleTaskImport.java b/src/main/java/com/devonfw/sample/archunit/batch/SampleTaskImport.java index f4d44c4..837c1c3 100644 --- a/src/main/java/com/devonfw/sample/archunit/batch/SampleTaskImport.java +++ b/src/main/java/com/devonfw/sample/archunit/batch/SampleTaskImport.java @@ -8,9 +8,7 @@ public static void main(String[] args) { if ( args == null || args.length< 3 ) { - System.err.println("Container id as first argument required"); - System.err.println("Filename as second argument required"); - System.err.println("Username as third argument required"); + System.err.println("Container id as first, dumpfilename as second and postgre-username as third argument required"); System.exit(1); } String containerId = args[0]; diff --git a/src/main/java/com/devonfw/sample/archunit/client/L2ViolationClientLayerDependsOnOtherLayerThanClient.java b/src/main/java/com/devonfw/sample/archunit/client/L2ViolationClientLayerDependsOnOtherLayerThanClient.java deleted file mode 100644 index 7b7452a..0000000 --- a/src/main/java/com/devonfw/sample/archunit/client/L2ViolationClientLayerDependsOnOtherLayerThanClient.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.devonfw.sample.archunit.client; - -import javax.inject.Inject; - -import com.devonfw.sample.archunit.task.service.TaskService; - -public class L2ViolationClientLayerDependsOnOtherLayerThanClient { - // Violation! Client layer should not depend on service layer - @Inject - TaskService taskService; -} diff --git a/src/main/java/com/devonfw/sample/archunit/task/logic/L9ViolationLogicLayerDependsAndAccessesServiceLayer.java b/src/main/java/com/devonfw/sample/archunit/task/logic/L9ViolationLogicLayerDependsAndAccessesServiceLayer.java deleted file mode 100644 index ce5dbf9..0000000 --- a/src/main/java/com/devonfw/sample/archunit/task/logic/L9ViolationLogicLayerDependsAndAccessesServiceLayer.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.devonfw.sample.archunit.task.logic; - -import javax.inject.Inject; - -import com.devonfw.sample.archunit.task.service.TaskService; - -public class L9ViolationLogicLayerDependsAndAccessesServiceLayer { - // Violation! Logic layer should not depend on dataaccess layer nor acces it. - @Inject - TaskService taskService; - - public String thisMethodIsErroneouslyUsingTheServiceLayer() - { - String helloFromService = this.taskService.thisMethodIsUsedToViolateTheAccessOfItFromLogicLayer(); - return "Logic Layer calling service method...: " + helloFromService; - } -} diff --git a/src/main/java/com/devonfw/sample/archunit/task/logic/L9ViolationLogicLayerDependsOnServiceLayer.java b/src/main/java/com/devonfw/sample/archunit/task/logic/L9ViolationLogicLayerDependsOnServiceLayer.java new file mode 100644 index 0000000..c483b51 --- /dev/null +++ b/src/main/java/com/devonfw/sample/archunit/task/logic/L9ViolationLogicLayerDependsOnServiceLayer.java @@ -0,0 +1,12 @@ +package com.devonfw.sample.archunit.task.logic; + +import javax.inject.Inject; + +import com.devonfw.sample.archunit.task.service.TaskService; + +public class L9ViolationLogicLayerDependsOnServiceLayer { + // Violation! Logic layer should not depend on service layer + @Inject + TaskService taskService; + +} diff --git a/src/main/java/com/devonfw/sample/archunit/task/service/L2ViolationNoLayerOtherThanClientDependsOnClientLayer.java b/src/main/java/com/devonfw/sample/archunit/task/service/L2ViolationNoLayerOtherThanClientDependsOnClientLayer.java new file mode 100644 index 0000000..fd69ea3 --- /dev/null +++ b/src/main/java/com/devonfw/sample/archunit/task/service/L2ViolationNoLayerOtherThanClientDependsOnClientLayer.java @@ -0,0 +1,11 @@ +package com.devonfw.sample.archunit.task.service; + +import javax.inject.Inject; + +import com.devonfw.sample.archunit.client.SampleClient; + +public class L2ViolationNoLayerOtherThanClientDependsOnClientLayer { + // Violation! No layer should depend on client layer + @Inject + SampleClient sampleClient; +} diff --git a/src/main/java/com/devonfw/sample/archunit/task/service/TaskService.java b/src/main/java/com/devonfw/sample/archunit/task/service/TaskService.java index a977e74..4551084 100644 --- a/src/main/java/com/devonfw/sample/archunit/task/service/TaskService.java +++ b/src/main/java/com/devonfw/sample/archunit/task/service/TaskService.java @@ -133,7 +133,4 @@ public void deleteTaskItem(@PathParam("id") Long id) { this.ucDeleteTaskItem.delete(id); } - public String thisMethodIsUsedToViolateTheAccessOfItFromLogicLayer() { - return "Hello from Service"; - } } diff --git a/src/test/java/com/devonfw/sample/archunit/ArchitectureTest.java b/src/test/java/com/devonfw/sample/archunit/ArchitectureTest.java index 50f5cd2..32cfca3 100644 --- a/src/test/java/com/devonfw/sample/archunit/ArchitectureTest.java +++ b/src/test/java/com/devonfw/sample/archunit/ArchitectureTest.java @@ -16,13 +16,21 @@ public class ArchitectureTest { @ArchTest private static final ArchRule shouldOnlyAccessValidLayers = // layeredArchitecture().consideringAllDependencies() // - .layer("common").definedBy("com.devonfw.sample.archunit.common..") // - .layer("logic").definedBy("com.devonfw.sample.archunit.logic..") // - .layer("dataaccess").definedBy("com.devonfw.sample.archunit.dataaccess..") // - .layer("service").definedBy("com.devonfw.sample.archunit.service..") // - .layer("client").definedBy("com.devonfw.sample.archunit.client..") + .layer("common").definedBy("..common..") // + .layer("logic").definedBy("..logic..") // + .layer("dataaccess").definedBy("..dataaccess..") // + .layer("service").definedBy("..service..") // + .layer("client").definedBy("..client..") + .layer("batch").definedBy("..batch..") - .withOptionalLayers(true) + .whereLayer("client").mayNotBeAccessedByAnyLayer() + .whereLayer("batch").mayOnlyBeAccessedByLayers( "logic") + .whereLayer("service").mayOnlyBeAccessedByLayers("client") + .whereLayer("logic").mayOnlyBeAccessedByLayers("service", "batch") + .whereLayer("dataaccess").mayOnlyBeAccessedByLayers("logic") + .whereLayer("common").mayOnlyBeAccessedByLayers("common", "dataaccess", "logic", "service") + + .withOptionalLayers(true) .because("Dependency of technical layers violates architecture rules."); // ... diff --git a/src/test/java/com/devonfw/sample/archunit/LayerDependencyRulesTest.java b/src/test/java/com/devonfw/sample/archunit/LayerDependencyRulesTest.java deleted file mode 100644 index f3e5fe2..0000000 --- a/src/test/java/com/devonfw/sample/archunit/LayerDependencyRulesTest.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.devonfw.sample.archunit; - -import com.tngtech.archunit.core.importer.ImportOption; -import com.tngtech.archunit.junit.AnalyzeClasses; -import com.tngtech.archunit.junit.ArchTest; -import com.tngtech.archunit.lang.ArchRule; - -import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.classes; -import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.noClasses; - -@AnalyzeClasses(packages = "com.devonfw.sample.archunit", importOptions = ImportOption.DoNotIncludeTests.class) -public class LayerDependencyRulesTest { - - // 'access' catches only violations by real accesses, i.e. accessing a field, calling a method; compare 'dependOn' further down - - // L09: verifying that code from logic layer does not access service layer (of same app). - @ArchTest - static final ArchRule logic_should_not_access_services = - noClasses().that().resideInAPackage("..logic..") - .should().accessClassesThat().resideInAPackage("..service.."); - - // L10: verifying that dataaccess layer does not access service layer. - // L12: verifying that dataaccess layer does not access logic layer. - @ArchTest - static final ArchRule persistence_should_not_access_services_or_logic = - noClasses().that().resideInAPackage("..dataaccess..") - .should().accessClassesThat().resideInAnyPackage("..service..", "..logic.."); - - @ArchTest - static final ArchRule services_should_only_be_accessed_by_clients_or_other_services = - classes().that().resideInAPackage("..service..") - .should().onlyBeAccessed().byAnyPackage("..client..", "..service.."); - - @ArchTest - static final ArchRule services_should_only_access_logic_common_or_other_services = - classes().that().resideInAPackage("..service..") - .should().onlyAccessClassesThat().resideInAnyPackage("..service..", "..common..", "..logic..", "java..", "javax.."); - - // 'dependOn' catches a wider variety of violations, e.g. having fields of type, having method parameters of type, extending type ... - - // L09: verifying that code from logic layer does not depend on service layer (of same app). - @ArchTest - static final ArchRule logic_should_not_depend_on_services = - noClasses().that().resideInAPackage("..logic..") - .should().dependOnClassesThat().resideInAPackage("..service.."); - - // L06: verifying that service layer does not depend on batch layer. - // L08: verifying that service layer does not depend on dataaccess layer. - @ArchTest - static final ArchRule services_should_not_depend_on_batch_or_persistence = - noClasses().that().resideInAPackage("..service..") - .should().dependOnClassesThat().resideInAnyPackage("..batch..", "..dataaccess.."); - - // L10: verifying that dataaccess layer does not depend on service layer. - // L12: verifying that dataaccess layer does not depend on logic layer. - @ArchTest - static final ArchRule persistence_should_not_depend_on_services_or_logic = - noClasses().that().resideInAPackage("..dataaccess..") - .should().dependOnClassesThat().resideInAnyPackage("..service..", "..logic.."); - - @ArchTest - static final ArchRule services_should_only_be_depended_on_by_controllers_or_other_services = - classes().that().resideInAPackage("..service..") - .should().onlyHaveDependentClassesThat().resideInAnyPackage("..controller..", "..service.."); - - @ArchTest - static final ArchRule services_should_only_depend_on_logic_common_or_other_services = - classes().that().resideInAPackage("..service..") - .should().onlyDependOnClassesThat().resideInAnyPackage("..service..", "..logic..", "..common..", "java..", "javax.."); - - // L01: Common Layer does not depend on any other layer - @ArchTest - static final ArchRule common_should_only_depend_on_common = - classes().that().resideInAPackage("..common..") - .should().onlyDependOnClassesThat().resideInAnyPackage("..common..", "java..", "javax.."); - - // L02: verifying that only client layer code may depend on client layer. - @ArchTest - static final ArchRule client_should_only_depend_on_client = - classes().that().resideInAPackage("..client..") - .should().onlyDependOnClassesThat().resideInAnyPackage("..client..", "java..", "javax..").allowEmptyShould(true); - - // L03: verifying that client layer does not depend on logic layer. - // L04: verifying that client layer does not depend on dataaccess layer. - // L05: verifying that client layer does not depend on batch layer. - @ArchTest - static final ArchRule client_should_not_depend_on_logic_persistence_or_batch_layer = - noClasses().that().resideInAPackage("..client..") - .should().dependOnClassesThat().resideInAnyPackage("..logic..", "..dataaccess..", "..batch..").allowEmptyShould(true); - - // L07: verifying that batch layer does not depend on service layer. - // L11: verifying that batch layer does not depend on dataaccess layer. - @ArchTest - static final ArchRule batch_should_not_depend_on_service_or_persistence = - noClasses().that().resideInAPackage("..batch..") - .should().dependOnClassesThat().resideInAnyPackage("..service..", "..dataaccess..").allowEmptyShould(true); -} From e781fa9eefecc7401bc06a723c31c9427be5418a Mon Sep 17 00:00:00 2001 From: Vladislav Sehtman Date: Mon, 6 Feb 2023 10:33:41 +0100 Subject: [PATCH 16/19] Adjusted layer rules. They equal those of add-layer-rules branch now. --- .../com/devonfw/sample/archunit/ArchitectureTest.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/test/java/com/devonfw/sample/archunit/ArchitectureTest.java b/src/test/java/com/devonfw/sample/archunit/ArchitectureTest.java index 32cfca3..f9f5901 100644 --- a/src/test/java/com/devonfw/sample/archunit/ArchitectureTest.java +++ b/src/test/java/com/devonfw/sample/archunit/ArchitectureTest.java @@ -15,7 +15,7 @@ public class ArchitectureTest { @ArchTest private static final ArchRule shouldOnlyAccessValidLayers = // - layeredArchitecture().consideringAllDependencies() // + layeredArchitecture().consideringAllDependencies() // .layer("common").definedBy("..common..") // .layer("logic").definedBy("..logic..") // .layer("dataaccess").definedBy("..dataaccess..") // @@ -24,14 +24,12 @@ public class ArchitectureTest { .layer("batch").definedBy("..batch..") .whereLayer("client").mayNotBeAccessedByAnyLayer() - .whereLayer("batch").mayOnlyBeAccessedByLayers( "logic") + .whereLayer("batch").mayNotBeAccessedByAnyLayer() .whereLayer("service").mayOnlyBeAccessedByLayers("client") .whereLayer("logic").mayOnlyBeAccessedByLayers("service", "batch") .whereLayer("dataaccess").mayOnlyBeAccessedByLayers("logic") - .whereLayer("common").mayOnlyBeAccessedByLayers("common", "dataaccess", "logic", "service") - .withOptionalLayers(true) .because("Dependency of technical layers violates architecture rules."); - // ... + // ... } From 3221b3ef1c472c1aa319df719558f2ffed08db82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Hohwiller?= Date: Tue, 7 Feb 2023 18:07:18 +0100 Subject: [PATCH 17/19] avoid pointless change/diff --- src/test/java/com/devonfw/sample/archunit/ArchitectureTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/devonfw/sample/archunit/ArchitectureTest.java b/src/test/java/com/devonfw/sample/archunit/ArchitectureTest.java index f9f5901..b8a6ca2 100644 --- a/src/test/java/com/devonfw/sample/archunit/ArchitectureTest.java +++ b/src/test/java/com/devonfw/sample/archunit/ArchitectureTest.java @@ -30,6 +30,6 @@ public class ArchitectureTest { .whereLayer("dataaccess").mayOnlyBeAccessedByLayers("logic") .withOptionalLayers(true) .because("Dependency of technical layers violates architecture rules."); - // ... + // ... } From 8cd83b1d26cc28cfb44c5c6f3f0edd1a32eb43f0 Mon Sep 17 00:00:00 2001 From: Vladislav Sehtman Date: Wed, 8 Feb 2023 10:30:31 +0100 Subject: [PATCH 18/19] Deleted the unnecessary dump and import script. Replaced the import script with a simple class declaration, to demonstrate dependencies towards the batch layer. --- .../archunit/batch/SampleBatchClass.java | 6 ++ .../archunit/batch/SampleTaskImport.java | 65 ------------------ .../devonfw/sample/archunit/batch/myBackup | Bin 11264 -> 0 bytes ...olationClientLayerDependsOnBatchLayer.java | 4 +- ...lationServiceLayerDependsOnBatchLayer.java | 4 +- 5 files changed, 10 insertions(+), 69 deletions(-) create mode 100644 src/main/java/com/devonfw/sample/archunit/batch/SampleBatchClass.java delete mode 100644 src/main/java/com/devonfw/sample/archunit/batch/SampleTaskImport.java delete mode 100644 src/main/java/com/devonfw/sample/archunit/batch/myBackup diff --git a/src/main/java/com/devonfw/sample/archunit/batch/SampleBatchClass.java b/src/main/java/com/devonfw/sample/archunit/batch/SampleBatchClass.java new file mode 100644 index 0000000..684d37c --- /dev/null +++ b/src/main/java/com/devonfw/sample/archunit/batch/SampleBatchClass.java @@ -0,0 +1,6 @@ +package com.devonfw.sample.archunit.batch; +// This demo class is provided to be erroneously depended on by: +// L5ViolationClientLayerDependsOnBatchLayer and L6ViolationServiceLayerDependsOnBatchLayer +public class SampleBatchClass { + +} diff --git a/src/main/java/com/devonfw/sample/archunit/batch/SampleTaskImport.java b/src/main/java/com/devonfw/sample/archunit/batch/SampleTaskImport.java deleted file mode 100644 index 837c1c3..0000000 --- a/src/main/java/com/devonfw/sample/archunit/batch/SampleTaskImport.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.devonfw.sample.archunit.batch; - -import java.io.BufferedReader; -import java.io.InputStreamReader; - -public class SampleTaskImport { - public static void main(String[] args) { - - if ( args == null || args.length< 3 ) - { - System.err.println("Container id as first, dumpfilename as second and postgre-username as third argument required"); - System.exit(1); - } - String containerId = args[0]; - String filename = args[1]; - String username = args[2]; - try { - sampleTaskImport(containerId, filename, username); - } catch (Exception e) { - System.out.println(e.toString()); - e.printStackTrace(); - } - - } - - private static void sampleTaskImport(String containerId, String filename, String username) throws Exception { - try { - Runtime rt = Runtime.getRuntime(); - String dockerCopyCommand = String.format("docker cp %s %s:/var/lib/postgresql/data", filename, containerId); - Process pr = rt.exec("cmd /c "+ dockerCopyCommand); - - BufferedReader input = new BufferedReader(new InputStreamReader(pr.getInputStream())); - - String line=null; - - while((line=input.readLine()) != null) { - System.out.println(line); - } - - int exitVal = pr.waitFor(); - System.out.println("Exited with error code "+ exitVal); - if(exitVal == 0) { - String pg_restoreCommand = String.format("docker exec %s pg_restore -U %s -d quarkus --clean /var/lib/postgresql/data/%s", containerId, username, filename); - Process pr2 = rt.exec("cmd /c "+ pg_restoreCommand); - BufferedReader input2 = new BufferedReader(new InputStreamReader(pr.getInputStream())); - - String line2 = null; - - while((line2 = input2.readLine()) != null) { - System.out.println(line2); - } - int exitVal2 = pr2.waitFor(); - System.out.println("Exited with error code " + exitVal2); - - } else { - System.out.println("Import failed. Could not copy data to docker mount"); - } - - } catch(Exception e) { - System.out.println(e.toString()); - e.printStackTrace(); - } - } - -} diff --git a/src/main/java/com/devonfw/sample/archunit/batch/myBackup b/src/main/java/com/devonfw/sample/archunit/batch/myBackup deleted file mode 100644 index 6d709bf02a0937e2ffdf46352a13f38b0796b2be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11264 zcmeHMTW{mm5#~0VHWr#Z^d$v?6!Wl!ZNyedUFfxq1*(BY)S_H2V!cu-sRfWXsZ=a`9E651$@0hx!oJUfxP1P; zs-7&ti;SZS=KKFl-!GrlE-oK@Bt87#J)z-ebbCyHAJN|@^vAEi#ShZ2@abl3_}Ak= z`W-$irMwDzHP*Ea7Y8!09xC}!-|8!h{F$Rfkc(V;Z61c>R39Law0Q-`fqC;hTfb$Os3!2e6Aj4$A&o z`2CdV`4B&>6x0HTSy79ROEc`D@vK$!%F{|)lengT#*%7FtLPfU6%cU^zB<>RgRWg% z)~Wglglsr+jF8C?6C@dSs5h&XIyKs5Zs)3?E!fTB@{zHK7q)cWfM3jv^AH9wGEktc(!ir7=872iW5_+7@)} zzU_w4XzI|os@D&A`Ag;pw&w!Yus-ueq3I!kSje!C=Q+%9MX|*U%duSsp*>{i%EJ-d z+Tp+(hr9&->bXp`q_xAJ?;hHr!@wLEzF~&UhnI#wLC@bSl*{{~n_~xIC($&AP9}Yd z_VE$Owl0nO6vhEFMk|s3hiH%g^T;17Q{+jpdE{@f&qCy>!#c<>!)O&A^vyTM<9nK- zXl00&8S-tKpXO;uv%DA*nvNt|B=7M38+@%cFJEM^(Y6jCBHaNbL_2_(TnDsB5P1%e zR7jWuh*+@?XRYQ1*5W#b#JInoapek%%=P1wOtGk_e0TRlwza9DUvBMDmbHQbGuCo@ z-qZ|b#*8Cw#($D^We$(@M_!t-623H?z1@X#F0O|~94LRxW>&=4 z9v%5un1xzMl9iZ4K3Py@HC{W8W$CwAG@aa%r_Sh_P52sLZ8mT#QaNwv+@+;2u|uV< zYb_9bZ8qv@Uh=uHQmetVH_Xb0%hvftrS$?n*IvM$ZPDcP^gg12PhSh=F7Q|Z$K4%e zvdYf#8CAfI+G51YQ^YtWxmDby)<=xGFGMVny%u6z$4tZ$xoaa9xeiCHzZfx9`aL#D zMjv|De=#RFo@!0PvU59pH70`mgMRk;9o7iWeT&6wac;@C;H=rw&Yv{| z0XZ7TLTG7cT8nl}?U~7z>LZpm@1snLrAstP4*+NDGRl%87nP$@%-!gIcSNwo&*(~) zhz;sQ=iw#if4NXBq|X0^vbsJ0Z*WXv(S;p(r?*qUF*uY9he{EYqZ9e~q*Tb46lEve z>DjIw4EX*R9AkppS&NOBYvDm=0{+-x!H$wEt`K7S3=criH9~U$p$GPGXeB7Kac+@=(^e~ z9!T*gpyTnIpF_4Tm=NTD`vD`~q35%FaN}&u&=vl#mXAvF{$DQPQndB|jSWd6`0y}y zcu27_?F1j_`OL=X6~%!Aa2dw7aJ}v_U=~K@tUR=NoER{u4UZmCy!p{1z*skR^chBD zO$K%-whQ4v$RP>zY}r0Dk!%wThq$4E8wda=9qjj{!@{ zK2W@nqJ&RCKIK&oZfnw|w&k#n?RL;)H^3Mn#w9U098i2R-FR_gV|Ajz!vNB{VSkct z4jAg+8@ocsE~Zu(B`|nuKv?){=y)Tt0E=l@5e88a>5Zw64hB&JqtAQZ8a@rXXySXf zXtz1`?QnwKyjo2FSc0E7&|yS8C{%JM>IuaS`3q6 ze2SW>?HHzs&Waw3=?)8!cBqxcWO!;AD=`)V7SF zNnuK%thb0MiCYKLRjHZ9mhvwyw6un2d%kZFlX!y7jLCd5zaN)2ns&hm#D?-ZyYaT^ z4{_*?JW-G#3!)S&-T)#&iB-9pEZbM~oH2^W6Q)Lq;Z9Fi@wg{5D$Z5+8u`o}&1B)te?X?xoyX(eT6o_NPis7%7wN`YjkOnLofS%z5u onMA|pP+t=HUpEI48@=efk|cuphBP^ZZ6CG>Y!TQZ@D338FLqMS)Bpeg diff --git a/src/main/java/com/devonfw/sample/archunit/client/L5ViolationClientLayerDependsOnBatchLayer.java b/src/main/java/com/devonfw/sample/archunit/client/L5ViolationClientLayerDependsOnBatchLayer.java index 2352741..35489c1 100644 --- a/src/main/java/com/devonfw/sample/archunit/client/L5ViolationClientLayerDependsOnBatchLayer.java +++ b/src/main/java/com/devonfw/sample/archunit/client/L5ViolationClientLayerDependsOnBatchLayer.java @@ -2,10 +2,10 @@ import javax.inject.Inject; -import com.devonfw.sample.archunit.batch.SampleTaskImport; +import com.devonfw.sample.archunit.batch.SampleBatchClass; public class L5ViolationClientLayerDependsOnBatchLayer { // Violation! Client layer should not depend on batch layer @Inject - SampleTaskImport taskImport; + SampleBatchClass sampleBatchClass; } diff --git a/src/main/java/com/devonfw/sample/archunit/task/service/L6ViolationServiceLayerDependsOnBatchLayer.java b/src/main/java/com/devonfw/sample/archunit/task/service/L6ViolationServiceLayerDependsOnBatchLayer.java index db57827..e00c2f2 100644 --- a/src/main/java/com/devonfw/sample/archunit/task/service/L6ViolationServiceLayerDependsOnBatchLayer.java +++ b/src/main/java/com/devonfw/sample/archunit/task/service/L6ViolationServiceLayerDependsOnBatchLayer.java @@ -2,10 +2,10 @@ import javax.inject.Inject; -import com.devonfw.sample.archunit.batch.SampleTaskImport; +import com.devonfw.sample.archunit.batch.SampleBatchClass; public class L6ViolationServiceLayerDependsOnBatchLayer { // Violation! Service layer should not depend on batch layer @Inject - SampleTaskImport sampleTaskImport; + SampleBatchClass sampleBatchClass; } From d9e0b8a1cd8bd64d5ab5183d80a55782e277fa1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Hohwiller?= Date: Tue, 25 Apr 2023 10:44:18 +0200 Subject: [PATCH 19/19] Update L2ViolationNoLayerOtherThanClientDependsOnClientLayer.java --- .../L2ViolationNoLayerOtherThanClientDependsOnClientLayer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/devonfw/sample/archunit/task/service/L2ViolationNoLayerOtherThanClientDependsOnClientLayer.java b/src/main/java/com/devonfw/sample/archunit/task/service/L2ViolationNoLayerOtherThanClientDependsOnClientLayer.java index fd69ea3..ec169cf 100644 --- a/src/main/java/com/devonfw/sample/archunit/task/service/L2ViolationNoLayerOtherThanClientDependsOnClientLayer.java +++ b/src/main/java/com/devonfw/sample/archunit/task/service/L2ViolationNoLayerOtherThanClientDependsOnClientLayer.java @@ -5,7 +5,7 @@ import com.devonfw.sample.archunit.client.SampleClient; public class L2ViolationNoLayerOtherThanClientDependsOnClientLayer { - // Violation! No layer should depend on client layer + // Violation: service layer may not depend on client layer. @Inject SampleClient sampleClient; }