From c51ba5c3310108803e9fffa476bb134e50ee0780 Mon Sep 17 00:00:00 2001 From: moritzLanger Date: Mon, 6 Feb 2023 10:02:46 +0100 Subject: [PATCH 01/28] implemeted PackeageRuleTest --- .../sample/archunit/ArchitectureTest.java | 30 -------- .../sample/archunit/PackageRuleTest.java | 76 +++++++++++++++++++ 2 files changed, 76 insertions(+), 30 deletions(-) delete mode 100644 src/test/java/com/devonfw/sample/archunit/ArchitectureTest.java create mode 100644 src/test/java/com/devonfw/sample/archunit/PackageRuleTest.java diff --git a/src/test/java/com/devonfw/sample/archunit/ArchitectureTest.java b/src/test/java/com/devonfw/sample/archunit/ArchitectureTest.java deleted file mode 100644 index b9c6742..0000000 --- a/src/test/java/com/devonfw/sample/archunit/ArchitectureTest.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.devonfw.sample.archunit; - -import static com.tngtech.archunit.library.Architectures.layeredArchitecture; - -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; - -/** - * JUnit test that validates the architecture of this application. - */ -@AnalyzeClasses(packages = "com.devonfw.sample.archunit", importOptions = ImportOption.DoNotIncludeTests.class) -public class ArchitectureTest { - - @ArchTest - private static final ArchRule shouldOnlyAccessValidLayers = // - layeredArchitecture().consideringAllDependencies() // - .layer("common").definedBy("..common..") // - .layer("logic").definedBy("..logic..") // - .layer("dataaccess").definedBy("..dataaccess..") // - .layer("service").definedBy("..service..") // - .layer("batch").definedBy("..batch..") // - .layer("ui").definedBy("..ui..") // - // TODO - .because("Dependency of technical layers violates architecture rules."); - - // ... - -} diff --git a/src/test/java/com/devonfw/sample/archunit/PackageRuleTest.java b/src/test/java/com/devonfw/sample/archunit/PackageRuleTest.java new file mode 100644 index 0000000..41eb295 --- /dev/null +++ b/src/test/java/com/devonfw/sample/archunit/PackageRuleTest.java @@ -0,0 +1,76 @@ +package com.devonfw.sample.archunit; + +import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.classes; + +import com.tngtech.archunit.core.domain.JavaClass; +import com.tngtech.archunit.core.importer.ImportOption; +import com.tngtech.archunit.junit.AnalyzeClasses; +import com.tngtech.archunit.junit.ArchTest; +import com.tngtech.archunit.lang.ArchCondition; +import com.tngtech.archunit.lang.ArchRule; +import com.tngtech.archunit.lang.ConditionEvents; + + +import java.util.Arrays; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import com.tngtech.archunit.lang.SimpleConditionEvent; + +/** + * JUnit test that validates the Packages of this application. + */ + + +@AnalyzeClasses(packages = "com.devonfw.sample.archunit", importOptions = ImportOption.DoNotIncludeTests.class) +public class PackageRuleTest { + +/*Components */ +public static final String COMPONENT_GENERAL = "general"; + +public static final String COMPONENT_TASK = "task"; + +/*Layer */ +public static final String LAYER_COMMON = "common"; + +public static final String LAYER_DATA_ACCESS = "dataaccess"; + +public static final String LAYER_LOGIC = "logic"; + +public static final String LAYER_SERVICE = "service"; + +public static final String LAYER_CLIENT = "client"; + +public static final String LAYER_BATCH = "batch"; + +public static final List LAYERS = Arrays.asList(LAYER_CLIENT, LAYER_COMMON, LAYER_DATA_ACCESS, +LAYER_LOGIC, LAYER_SERVICE, LAYER_BATCH); + +/* Pattern */ +private static final String PATTERN_SEGMENT = "[a-zA-Z0-9_]+"; + +private static final String PATTERN_LAYERS = LAYER_COMMON + "|" + + LAYER_DATA_ACCESS + "|" + LAYER_SERVICE + "|" + LAYER_LOGIC + "|" + LAYER_BATCH + "|" + + LAYER_CLIENT; + +private static final String COMPONENT_LAYERS = COMPONENT_GENERAL + "|" + COMPONENT_TASK; + +public static final String DEFAULT_PATTERN = "(" + PATTERN_SEGMENT + ")\\.(" + COMPONENT_LAYERS + ")\\.(" + PATTERN_LAYERS + ")\\.(" + PATTERN_SEGMENT + ")*"; + +/* ArchRule and Condition */ + @ArchTest + public ArchRule shouldHaveValidLayers = classes().should(containsValidPackageStructureCondition()); + + + private static ArchCondition containsValidPackageStructureCondition() { + return new ArchCondition("check for the package structure to be valid", new Object(){}) { + @Override + public void check(JavaClass javaClass, ConditionEvents events) { + Pattern pattern = Pattern.compile(DEFAULT_PATTERN); + Matcher matcher = pattern.matcher(javaClass.getName()); + events.add(new SimpleConditionEvent(javaClass, + matcher.find(), "true if valid, flase if invalid")); + } + }; + }; +} \ No newline at end of file From 96b2a49e50c4cf69411c51a16e591d9b24da1f9d Mon Sep 17 00:00:00 2001 From: moritzLanger Date: Mon, 6 Feb 2023 10:06:46 +0100 Subject: [PATCH 02/28] implement PackageRuleTest --- .../sample/archunit/ArchitectureTest.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 src/test/java/com/devonfw/sample/archunit/ArchitectureTest.java diff --git a/src/test/java/com/devonfw/sample/archunit/ArchitectureTest.java b/src/test/java/com/devonfw/sample/archunit/ArchitectureTest.java new file mode 100644 index 0000000..b9c6742 --- /dev/null +++ b/src/test/java/com/devonfw/sample/archunit/ArchitectureTest.java @@ -0,0 +1,30 @@ +package com.devonfw.sample.archunit; + +import static com.tngtech.archunit.library.Architectures.layeredArchitecture; + +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; + +/** + * JUnit test that validates the architecture of this application. + */ +@AnalyzeClasses(packages = "com.devonfw.sample.archunit", importOptions = ImportOption.DoNotIncludeTests.class) +public class ArchitectureTest { + + @ArchTest + private static final ArchRule shouldOnlyAccessValidLayers = // + layeredArchitecture().consideringAllDependencies() // + .layer("common").definedBy("..common..") // + .layer("logic").definedBy("..logic..") // + .layer("dataaccess").definedBy("..dataaccess..") // + .layer("service").definedBy("..service..") // + .layer("batch").definedBy("..batch..") // + .layer("ui").definedBy("..ui..") // + // TODO + .because("Dependency of technical layers violates architecture rules."); + + // ... + +} From aefe8383eca0cd573a224e21d8ee283444662b67 Mon Sep 17 00:00:00 2001 From: moritzLanger Date: Thu, 9 Feb 2023 12:42:15 +0100 Subject: [PATCH 03/28] implemented suggestions/improvements --- .../sample/archunit/PackageRuleTest.java | 46 +++++++++---------- 1 file changed, 21 insertions(+), 25 deletions(-) diff --git a/src/test/java/com/devonfw/sample/archunit/PackageRuleTest.java b/src/test/java/com/devonfw/sample/archunit/PackageRuleTest.java index 41eb295..fc5a88c 100644 --- a/src/test/java/com/devonfw/sample/archunit/PackageRuleTest.java +++ b/src/test/java/com/devonfw/sample/archunit/PackageRuleTest.java @@ -1,6 +1,7 @@ package com.devonfw.sample.archunit; import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.classes; +import static org.mockito.ArgumentMatchers.matches; import com.tngtech.archunit.core.domain.JavaClass; import com.tngtech.archunit.core.importer.ImportOption; @@ -9,53 +10,47 @@ import com.tngtech.archunit.lang.ArchCondition; import com.tngtech.archunit.lang.ArchRule; import com.tngtech.archunit.lang.ConditionEvents; +import com.tngtech.archunit.lang.SimpleConditionEvent; - -import java.util.Arrays; -import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; -import com.tngtech.archunit.lang.SimpleConditionEvent; /** * JUnit test that validates the Packages of this application. */ - @AnalyzeClasses(packages = "com.devonfw.sample.archunit", importOptions = ImportOption.DoNotIncludeTests.class) public class PackageRuleTest { -/*Components */ -public static final String COMPONENT_GENERAL = "general"; - -public static final String COMPONENT_TASK = "task"; - /*Layer */ -public static final String LAYER_COMMON = "common"; - -public static final String LAYER_DATA_ACCESS = "dataaccess"; +private static final String LAYER_COMMON = "common"; -public static final String LAYER_LOGIC = "logic"; +private static final String LAYER_DATA_ACCESS = "dataaccess"; -public static final String LAYER_SERVICE = "service"; +private static final String LAYER_LOGIC = "logic"; -public static final String LAYER_CLIENT = "client"; +private static final String LAYER_SERVICE = "service"; -public static final String LAYER_BATCH = "batch"; +private static final String LAYER_CLIENT = "client"; -public static final List LAYERS = Arrays.asList(LAYER_CLIENT, LAYER_COMMON, LAYER_DATA_ACCESS, -LAYER_LOGIC, LAYER_SERVICE, LAYER_BATCH); +private static final String LAYER_BATCH = "batch"; /* Pattern */ -private static final String PATTERN_SEGMENT = "[a-zA-Z0-9_]+"; +private static final String PATTERN_SEGMENT = "[a-z0-9_]+"; private static final String PATTERN_LAYERS = LAYER_COMMON + "|" + LAYER_DATA_ACCESS + "|" + LAYER_SERVICE + "|" + LAYER_LOGIC + "|" + LAYER_BATCH + "|" + LAYER_CLIENT; + +private static final String ROOT_PACKAGE = + // ....1..........................2 + "(" + PATTERN_SEGMENT +")\\.(" + PATTERN_SEGMENT +".)*"; -private static final String COMPONENT_LAYERS = COMPONENT_GENERAL + "|" + COMPONENT_TASK; +private static final String DEFAULT_PATTERN = + // ....1......................2...........................3...........................4 + "(" + ROOT_PACKAGE + ")\\.(" + PATTERN_SEGMENT + ")\\.(" + PATTERN_LAYERS + ")\\.?(" + PATTERN_SEGMENT + ")*"; -public static final String DEFAULT_PATTERN = "(" + PATTERN_SEGMENT + ")\\.(" + COMPONENT_LAYERS + ")\\.(" + PATTERN_LAYERS + ")\\.(" + PATTERN_SEGMENT + ")*"; +private static final Pattern pattern = Pattern.compile(DEFAULT_PATTERN); /* ArchRule and Condition */ @ArchTest @@ -66,10 +61,11 @@ private static ArchCondition containsValidPackageStructureCondition() return new ArchCondition("check for the package structure to be valid", new Object(){}) { @Override public void check(JavaClass javaClass, ConditionEvents events) { - Pattern pattern = Pattern.compile(DEFAULT_PATTERN); - Matcher matcher = pattern.matcher(javaClass.getName()); + Matcher matcher = pattern.matcher(javaClass.getPackageName()); + System.out.println(javaClass.getPackageName() +" ---- " +matcher.matches()); + String message = javaClass.getSimpleName() + "test result is" + matcher.matches(); events.add(new SimpleConditionEvent(javaClass, - matcher.find(), "true if valid, flase if invalid")); + matcher.matches(), message)); } }; }; From 2f0591cc99c8ef5a46700c570ae2592be9e7e0a8 Mon Sep 17 00:00:00 2001 From: moritzLanger Date: Thu, 9 Feb 2023 12:45:21 +0100 Subject: [PATCH 04/28] removed Println --- src/test/java/com/devonfw/sample/archunit/PackageRuleTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/com/devonfw/sample/archunit/PackageRuleTest.java b/src/test/java/com/devonfw/sample/archunit/PackageRuleTest.java index fc5a88c..e280759 100644 --- a/src/test/java/com/devonfw/sample/archunit/PackageRuleTest.java +++ b/src/test/java/com/devonfw/sample/archunit/PackageRuleTest.java @@ -62,7 +62,6 @@ private static ArchCondition containsValidPackageStructureCondition() @Override public void check(JavaClass javaClass, ConditionEvents events) { Matcher matcher = pattern.matcher(javaClass.getPackageName()); - System.out.println(javaClass.getPackageName() +" ---- " +matcher.matches()); String message = javaClass.getSimpleName() + "test result is" + matcher.matches(); events.add(new SimpleConditionEvent(javaClass, matcher.matches(), message)); From 1b0cb973fe2650e16208d79b68ba48f1bbcc7e41 Mon Sep 17 00:00:00 2001 From: moritzLanger Date: Thu, 9 Feb 2023 12:48:46 +0100 Subject: [PATCH 05/28] removed 1 Space --- src/test/java/com/devonfw/sample/archunit/PackageRuleTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/com/devonfw/sample/archunit/PackageRuleTest.java b/src/test/java/com/devonfw/sample/archunit/PackageRuleTest.java index e280759..81c9117 100644 --- a/src/test/java/com/devonfw/sample/archunit/PackageRuleTest.java +++ b/src/test/java/com/devonfw/sample/archunit/PackageRuleTest.java @@ -18,7 +18,6 @@ /** * JUnit test that validates the Packages of this application. */ - @AnalyzeClasses(packages = "com.devonfw.sample.archunit", importOptions = ImportOption.DoNotIncludeTests.class) public class PackageRuleTest { From cbee2e611b96847da61ac13871e0b491b1524a44 Mon Sep 17 00:00:00 2001 From: moritzLanger Date: Thu, 9 Feb 2023 12:49:48 +0100 Subject: [PATCH 06/28] removed unnessary Import --- src/test/java/com/devonfw/sample/archunit/PackageRuleTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/com/devonfw/sample/archunit/PackageRuleTest.java b/src/test/java/com/devonfw/sample/archunit/PackageRuleTest.java index 81c9117..9926a01 100644 --- a/src/test/java/com/devonfw/sample/archunit/PackageRuleTest.java +++ b/src/test/java/com/devonfw/sample/archunit/PackageRuleTest.java @@ -1,7 +1,6 @@ package com.devonfw.sample.archunit; import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.classes; -import static org.mockito.ArgumentMatchers.matches; import com.tngtech.archunit.core.domain.JavaClass; import com.tngtech.archunit.core.importer.ImportOption; From fb55de045b1f98a0be4e1adfa5eb70ae3b2f6624 Mon Sep 17 00:00:00 2001 From: moritzLanger Date: Mon, 13 Feb 2023 11:01:56 +0100 Subject: [PATCH 07/28] added Spaces to message + Capitalised Constant --- .../java/com/devonfw/sample/archunit/PackageRuleTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/java/com/devonfw/sample/archunit/PackageRuleTest.java b/src/test/java/com/devonfw/sample/archunit/PackageRuleTest.java index 9926a01..bec9d5b 100644 --- a/src/test/java/com/devonfw/sample/archunit/PackageRuleTest.java +++ b/src/test/java/com/devonfw/sample/archunit/PackageRuleTest.java @@ -48,7 +48,7 @@ public class PackageRuleTest { // ....1......................2...........................3...........................4 "(" + ROOT_PACKAGE + ")\\.(" + PATTERN_SEGMENT + ")\\.(" + PATTERN_LAYERS + ")\\.?(" + PATTERN_SEGMENT + ")*"; -private static final Pattern pattern = Pattern.compile(DEFAULT_PATTERN); +private static final Pattern PATTERN = Pattern.compile(DEFAULT_PATTERN); /* ArchRule and Condition */ @ArchTest @@ -59,8 +59,8 @@ private static ArchCondition containsValidPackageStructureCondition() return new ArchCondition("check for the package structure to be valid", new Object(){}) { @Override public void check(JavaClass javaClass, ConditionEvents events) { - Matcher matcher = pattern.matcher(javaClass.getPackageName()); - String message = javaClass.getSimpleName() + "test result is" + matcher.matches(); + Matcher matcher = PATTERN.matcher(javaClass.getPackageName()); + String message = javaClass.getSimpleName() + " test result is " + matcher.matches(); events.add(new SimpleConditionEvent(javaClass, matcher.matches(), message)); } From 84573ff688e8133131cfbbe0880fa409da20e871 Mon Sep 17 00:00:00 2001 From: moritzLanger Date: Mon, 13 Feb 2023 12:23:51 +0100 Subject: [PATCH 08/28] Fix Point mistake in ROOT_PACKAGE --- .../java/com/devonfw/sample/archunit/PackageRuleTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/devonfw/sample/archunit/PackageRuleTest.java b/src/test/java/com/devonfw/sample/archunit/PackageRuleTest.java index bec9d5b..49c7f6f 100644 --- a/src/test/java/com/devonfw/sample/archunit/PackageRuleTest.java +++ b/src/test/java/com/devonfw/sample/archunit/PackageRuleTest.java @@ -42,8 +42,8 @@ public class PackageRuleTest { private static final String ROOT_PACKAGE = // ....1..........................2 - "(" + PATTERN_SEGMENT +")\\.(" + PATTERN_SEGMENT +".)*"; - + "(" + PATTERN_SEGMENT +")(\\." + PATTERN_SEGMENT +")*"; + private static final String DEFAULT_PATTERN = // ....1......................2...........................3...........................4 "(" + ROOT_PACKAGE + ")\\.(" + PATTERN_SEGMENT + ")\\.(" + PATTERN_LAYERS + ")\\.?(" + PATTERN_SEGMENT + ")*"; From b5711fb6be6de5bcf04b0999faaecada71e63ca5 Mon Sep 17 00:00:00 2001 From: moritzLanger Date: Mon, 13 Feb 2023 12:33:00 +0100 Subject: [PATCH 09/28] fixed minor mistake in DEFAULT_PATTERN --- .../java/com/devonfw/sample/archunit/PackageRuleTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/devonfw/sample/archunit/PackageRuleTest.java b/src/test/java/com/devonfw/sample/archunit/PackageRuleTest.java index 49c7f6f..4ff0ee7 100644 --- a/src/test/java/com/devonfw/sample/archunit/PackageRuleTest.java +++ b/src/test/java/com/devonfw/sample/archunit/PackageRuleTest.java @@ -43,10 +43,10 @@ public class PackageRuleTest { private static final String ROOT_PACKAGE = // ....1..........................2 "(" + PATTERN_SEGMENT +")(\\." + PATTERN_SEGMENT +")*"; - + private static final String DEFAULT_PATTERN = // ....1......................2...........................3...........................4 - "(" + ROOT_PACKAGE + ")\\.(" + PATTERN_SEGMENT + ")\\.(" + PATTERN_LAYERS + ")\\.?(" + PATTERN_SEGMENT + ")*"; + "(" + ROOT_PACKAGE + ")\\.(" + PATTERN_SEGMENT + ")\\.(" + PATTERN_LAYERS + ")(\\." + PATTERN_SEGMENT + ")*"; private static final Pattern PATTERN = Pattern.compile(DEFAULT_PATTERN); From 228125af6c07c89b473a683ac53b2d6194087593 Mon Sep 17 00:00:00 2001 From: moritzLanger Date: Mon, 27 Mar 2023 09:40:43 +0200 Subject: [PATCH 10/28] added Violations --- .../ApplicationAccessControlConfig.java | 6 +- .../common/ApplicationPersistenceEntity.java | 16 ++++ .../violation/common/ViolationItem.java | 10 +++ .../violation/common/ViolationRepository.java | 15 ++++ .../common/WrongInterfaceViolationEto.java | 13 +++ .../violation/common/WrongNameRepository.java | 18 ++++ .../violation/dataaccess/MapperViolation.java | 14 ++++ .../dataaccess/ServiceViolation.java | 15 ++++ .../violation/dataaccess/UcViolation.java | 20 +++++ .../violation/dataaccess/ViolationEntity.java | 83 +++++++++++++++++++ .../violation/dataaccess/ViolationEto.java | 13 +++ 11 files changed, 220 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/devonfw/sample/archunit/violation/common/ApplicationPersistenceEntity.java create mode 100644 src/main/java/com/devonfw/sample/archunit/violation/common/ViolationItem.java create mode 100644 src/main/java/com/devonfw/sample/archunit/violation/common/ViolationRepository.java create mode 100644 src/main/java/com/devonfw/sample/archunit/violation/common/WrongInterfaceViolationEto.java create mode 100644 src/main/java/com/devonfw/sample/archunit/violation/common/WrongNameRepository.java create mode 100644 src/main/java/com/devonfw/sample/archunit/violation/dataaccess/MapperViolation.java create mode 100644 src/main/java/com/devonfw/sample/archunit/violation/dataaccess/ServiceViolation.java create mode 100644 src/main/java/com/devonfw/sample/archunit/violation/dataaccess/UcViolation.java create mode 100644 src/main/java/com/devonfw/sample/archunit/violation/dataaccess/ViolationEntity.java create mode 100644 src/main/java/com/devonfw/sample/archunit/violation/dataaccess/ViolationEto.java diff --git a/src/main/java/com/devonfw/sample/archunit/task/common/security/ApplicationAccessControlConfig.java b/src/main/java/com/devonfw/sample/archunit/task/common/security/ApplicationAccessControlConfig.java index 53e878c..9a2191b 100644 --- a/src/main/java/com/devonfw/sample/archunit/task/common/security/ApplicationAccessControlConfig.java +++ b/src/main/java/com/devonfw/sample/archunit/task/common/security/ApplicationAccessControlConfig.java @@ -23,13 +23,13 @@ public class ApplicationAccessControlConfig { /** Permission to delete a {@link org.example.app.task.common.TaskList}. */ public static final String PERMISSION_DELETE_TASK_LIST = PREFIX + "DeleteTaskList"; - /** Permission to find a {@link org.example.app.task.common.TaskItem}. */ + /** Permission to find a {@link org.ViolationItem.app.task.common.TaskItem}. */ public static final String PERMISSION_FIND_TASK_ITEM = PREFIX + "FindTaskItem"; - /** Permission to save (insert or update) a {@link org.example.app.task.common.TaskItem}. */ + /** Permission to save (insert or update) a {@link org.ViolationItem.app.task.common.TaskItem}. */ public static final String PERMISSION_SAVE_TASK_ITEM = PREFIX + "SaveTaskItem"; - /** Permission to delete a {@link org.example.app.task.common.TaskItem}. */ + /** Permission to delete a {@link org.ViolationItem.app.task.common.TaskItem}. */ public static final String PERMISSION_DELETE_TASK_ITEM = PREFIX + "DeleteTaskItem"; } diff --git a/src/main/java/com/devonfw/sample/archunit/violation/common/ApplicationPersistenceEntity.java b/src/main/java/com/devonfw/sample/archunit/violation/common/ApplicationPersistenceEntity.java new file mode 100644 index 0000000..1d0351c --- /dev/null +++ b/src/main/java/com/devonfw/sample/archunit/violation/common/ApplicationPersistenceEntity.java @@ -0,0 +1,16 @@ +package com.devonfw.sample.archunit.violation.common; + +import javax.persistence.MappedSuperclass; + +import com.devonfw.sample.archunit.general.common.ApplicationEntity; + +/** + * Abstract base class for all persistent entities of this app. + */ +@MappedSuperclass +public abstract class ApplicationPersistenceEntity implements ApplicationEntity { + /* + ApplicationPersistenceEntity have to have be in layer dataaccess + */ + +} diff --git a/src/main/java/com/devonfw/sample/archunit/violation/common/ViolationItem.java b/src/main/java/com/devonfw/sample/archunit/violation/common/ViolationItem.java new file mode 100644 index 0000000..42a2055 --- /dev/null +++ b/src/main/java/com/devonfw/sample/archunit/violation/common/ViolationItem.java @@ -0,0 +1,10 @@ +package com.devonfw.sample.archunit.violation.common; + + +import com.devonfw.sample.archunit.general.common.ApplicationEntity; + +/** + * {@link ApplicationEntity} for a single task item. + */ +public interface ViolationItem extends ApplicationEntity { +} diff --git a/src/main/java/com/devonfw/sample/archunit/violation/common/ViolationRepository.java b/src/main/java/com/devonfw/sample/archunit/violation/common/ViolationRepository.java new file mode 100644 index 0000000..8eb6c47 --- /dev/null +++ b/src/main/java/com/devonfw/sample/archunit/violation/common/ViolationRepository.java @@ -0,0 +1,15 @@ +package com.devonfw.sample.archunit.violation.common; + +import org.springframework.data.jpa.repository.JpaRepository; + +import com.devonfw.sample.archunit.violation.dataaccess.ViolationEntity; + +/** + * Interface for the {@link JpaRepository} giving database access to {@link ViolationEntity}. + */ +public interface ViolationRepository extends JpaRepository { + /* + * JpaRepository have to be in layer dataaccess and + * should be in the same package as the entity. + */ +} diff --git a/src/main/java/com/devonfw/sample/archunit/violation/common/WrongInterfaceViolationEto.java b/src/main/java/com/devonfw/sample/archunit/violation/common/WrongInterfaceViolationEto.java new file mode 100644 index 0000000..46d279d --- /dev/null +++ b/src/main/java/com/devonfw/sample/archunit/violation/common/WrongInterfaceViolationEto.java @@ -0,0 +1,13 @@ +package com.devonfw.sample.archunit.violation.common; + + +import com.devonfw.sample.archunit.general.common.AbstractEto; + +/** + * {@link ViolationItem} implementation as {@link AbstractEto}. + */ +public class WrongInterfaceViolationEto extends AbstractEto implements ViolationItem { + /* + * they implement an interface with the same simple-name excluding the Eto suffix + */ +} diff --git a/src/main/java/com/devonfw/sample/archunit/violation/common/WrongNameRepository.java b/src/main/java/com/devonfw/sample/archunit/violation/common/WrongNameRepository.java new file mode 100644 index 0000000..b817611 --- /dev/null +++ b/src/main/java/com/devonfw/sample/archunit/violation/common/WrongNameRepository.java @@ -0,0 +1,18 @@ +package com.devonfw.sample.archunit.violation.common; + + +import org.springframework.data.jpa.repository.JpaRepository; + + +import com.devonfw.sample.archunit.violation.dataaccess.ViolationEntity; + +/** + * Interface for the {@link JpaRepository} giving database access to {@link ViolationEntity}. + */ +public interface WrongNameRepository extends JpaRepository { + /* + * has to be named «EntityName»Repository + * where «EntityName» is the name of the entity filled in + * the generic argument of JpaRepository excluding the Entity suffix. + */ +} diff --git a/src/main/java/com/devonfw/sample/archunit/violation/dataaccess/MapperViolation.java b/src/main/java/com/devonfw/sample/archunit/violation/dataaccess/MapperViolation.java new file mode 100644 index 0000000..1feeb51 --- /dev/null +++ b/src/main/java/com/devonfw/sample/archunit/violation/dataaccess/MapperViolation.java @@ -0,0 +1,14 @@ +package com.devonfw.sample.archunit.violation.dataaccess; + +import org.mapstruct.Mapper; + +/** + * {@link Mapper} for {@link com.devonfw.sample.archunit.task.common.TaskItem}. + */ +@Mapper(componentModel = "cdi") +public abstract interface MapperViolation { + + /* + * @Mapper (org.mapstruct.Mapper) need to be in layer logic and have to end with Mapper. + */ +} \ No newline at end of file diff --git a/src/main/java/com/devonfw/sample/archunit/violation/dataaccess/ServiceViolation.java b/src/main/java/com/devonfw/sample/archunit/violation/dataaccess/ServiceViolation.java new file mode 100644 index 0000000..2617436 --- /dev/null +++ b/src/main/java/com/devonfw/sample/archunit/violation/dataaccess/ServiceViolation.java @@ -0,0 +1,15 @@ +package com.devonfw.sample.archunit.violation.dataaccess; + +import javax.ws.rs.Path; + +/** + * Rest service for task component with {@link com.devonfw.sample.archunit.task.common.TaskList} and + * {@link com.devonfw.sample.archunit.task.common.TaskItem}. + */ +@Path("/task") +public class ServiceViolation { + + /* + * @Path (javax.ws.rs.Path) need to be in layer service and have to end with Service. + */ +} diff --git a/src/main/java/com/devonfw/sample/archunit/violation/dataaccess/UcViolation.java b/src/main/java/com/devonfw/sample/archunit/violation/dataaccess/UcViolation.java new file mode 100644 index 0000000..09ae571 --- /dev/null +++ b/src/main/java/com/devonfw/sample/archunit/violation/dataaccess/UcViolation.java @@ -0,0 +1,20 @@ +package com.devonfw.sample.archunit.violation.dataaccess; + +import javax.enterprise.context.ApplicationScoped; +import javax.inject.Named; +import javax.transaction.Transactional; + +import com.devonfw.sample.archunit.general.logic.AbstractUc; + +/** + * {@link AbstractUc Use-case} to save {@link com.devonfw.sample.archunit.task.common.TaskList}s. + */ +@ApplicationScoped +@Named +@Transactional +public class UcViolation extends AbstractUc { + + /* + * AbstractUc have to be in layer logic + */ +} diff --git a/src/main/java/com/devonfw/sample/archunit/violation/dataaccess/ViolationEntity.java b/src/main/java/com/devonfw/sample/archunit/violation/dataaccess/ViolationEntity.java new file mode 100644 index 0000000..cf5e1f1 --- /dev/null +++ b/src/main/java/com/devonfw/sample/archunit/violation/dataaccess/ViolationEntity.java @@ -0,0 +1,83 @@ +package com.devonfw.sample.archunit.violation.dataaccess; + +import java.time.LocalDateTime; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; + +import com.devonfw.sample.archunit.general.dataaccess.ApplicationPersistenceEntity; +import com.devonfw.sample.archunit.task.common.TaskItem; + +/** + * {@link TaskItem} implementation as {@link ApplicationPersistenceEntity}. + */ +@Entity +@Table(name = "TASK_ITEM") +public class ViolationEntity extends ApplicationPersistenceEntity implements TaskItem { + + @Override + public String getTitle() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getTitle'"); + } + + @Override + public void setTitle(String title) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setTitle'"); + } + + @Override + public boolean isCompleted() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isCompleted'"); + } + + @Override + public void setCompleted(boolean completed) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setCompleted'"); + } + + @Override + public boolean isStarred() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isStarred'"); + } + + @Override + public void setStarred(boolean starred) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setStarred'"); + } + + @Override + public LocalDateTime getDeadline() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getDeadline'"); + } + + @Override + public void setDeadline(LocalDateTime deadline) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setDeadline'"); + } + + @Override + public Long getTaskListId() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getTaskListId'"); + } + + @Override + public void setTaskListId(Long taskListId) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setTaskListId'"); + } + + +} diff --git a/src/main/java/com/devonfw/sample/archunit/violation/dataaccess/ViolationEto.java b/src/main/java/com/devonfw/sample/archunit/violation/dataaccess/ViolationEto.java new file mode 100644 index 0000000..9ed68ef --- /dev/null +++ b/src/main/java/com/devonfw/sample/archunit/violation/dataaccess/ViolationEto.java @@ -0,0 +1,13 @@ +package com.devonfw.sample.archunit.violation.dataaccess; + +import com.devonfw.sample.archunit.violation.common.ViolationItem; +import com.devonfw.sample.archunit.general.common.AbstractEto; + +/** + * {@link ViolationItem} implementation as {@link AbstractEto}. + */ +public class ViolationEto extends AbstractEto implements ViolationItem { + /* + * AbstractEto have to be in layer common + */ +} From 7cb1ffb2ba28b2cc1c6ad913283293f572954185 Mon Sep 17 00:00:00 2001 From: moritzLanger <44358321+moritzLanger@users.noreply.github.com> Date: Thu, 30 Mar 2023 13:49:52 +0200 Subject: [PATCH 11/28] Update NamingConventionTest.java --- .../java/com/devonfw/sample/archunit/NamingConventionTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/devonfw/sample/archunit/NamingConventionTest.java b/src/test/java/com/devonfw/sample/archunit/NamingConventionTest.java index 3690154..4bc0701 100644 --- a/src/test/java/com/devonfw/sample/archunit/NamingConventionTest.java +++ b/src/test/java/com/devonfw/sample/archunit/NamingConventionTest.java @@ -66,7 +66,7 @@ public void check(JavaClass javaClass, ConditionEvents events) { + javaClass.getSimpleName().replace("Eto", ""); boolean hasCorrectInterface = javaClass.getInterfaces().stream() .anyMatch(i -> i.getName().equals(supposedInterfaceName)); - String message = "The Testresult of " + javaClass.getSimpleName() + " was " + hasCorrectInterface; + String message = "The Class named" + javaClass.getSimpleName() + " has failed the test above."; events.add(new SimpleConditionEvent(javaClass, hasCorrectInterface, message)); } }).because( From f02395b5d006cae3484c1bc77570fedaf08fec9b Mon Sep 17 00:00:00 2001 From: moritzLanger <44358321+moritzLanger@users.noreply.github.com> Date: Thu, 30 Mar 2023 13:52:07 +0200 Subject: [PATCH 12/28] Update NamingConventionTest.java --- .../java/com/devonfw/sample/archunit/NamingConventionTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/devonfw/sample/archunit/NamingConventionTest.java b/src/test/java/com/devonfw/sample/archunit/NamingConventionTest.java index 4bc0701..30f4101 100644 --- a/src/test/java/com/devonfw/sample/archunit/NamingConventionTest.java +++ b/src/test/java/com/devonfw/sample/archunit/NamingConventionTest.java @@ -66,7 +66,7 @@ public void check(JavaClass javaClass, ConditionEvents events) { + javaClass.getSimpleName().replace("Eto", ""); boolean hasCorrectInterface = javaClass.getInterfaces().stream() .anyMatch(i -> i.getName().equals(supposedInterfaceName)); - String message = "The Class named" + javaClass.getSimpleName() + " has failed the test above."; + String message = "The Class named " + javaClass.getSimpleName() + " has failed the test above."; events.add(new SimpleConditionEvent(javaClass, hasCorrectInterface, message)); } }).because( From 802c9295739139f8d98ff73f2e1cf2ca6984b608 Mon Sep 17 00:00:00 2001 From: moritzLanger <44358321+moritzLanger@users.noreply.github.com> Date: Thu, 30 Mar 2023 13:54:51 +0200 Subject: [PATCH 13/28] Update NamingConventionTest.java --- .../com/devonfw/sample/archunit/NamingConventionTest.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/test/java/com/devonfw/sample/archunit/NamingConventionTest.java b/src/test/java/com/devonfw/sample/archunit/NamingConventionTest.java index 30f4101..4e1f771 100644 --- a/src/test/java/com/devonfw/sample/archunit/NamingConventionTest.java +++ b/src/test/java/com/devonfw/sample/archunit/NamingConventionTest.java @@ -66,8 +66,7 @@ public void check(JavaClass javaClass, ConditionEvents events) { + javaClass.getSimpleName().replace("Eto", ""); boolean hasCorrectInterface = javaClass.getInterfaces().stream() .anyMatch(i -> i.getName().equals(supposedInterfaceName)); - String message = "The Class named " + javaClass.getSimpleName() + " has failed the test above."; - events.add(new SimpleConditionEvent(javaClass, hasCorrectInterface, message)); + events.add(new SimpleConditionEvent(javaClass, hasCorrectInterface, "")); } }).because( "Classes extending AbstractEto must follow the naming convention by ending with 'Eto', reside in package common and implent an interface with the same simple name."); @@ -120,7 +119,7 @@ public void check(JavaClass javaClass, ConditionEvents events) { hasCorrectName = javaClass.getFullName().equals(enitiyName + "Repository"); } } - events.add(new SimpleConditionEvent(javaClass, hasCorrectName, "message")); + events.add(new SimpleConditionEvent(javaClass, hasCorrectName, "")); } }); From 4402c4cfdcd95ca01f8ad089cb68f863ab2edbfc Mon Sep 17 00:00:00 2001 From: moritzLanger <44358321+moritzLanger@users.noreply.github.com> Date: Thu, 30 Mar 2023 14:05:18 +0200 Subject: [PATCH 14/28] Update NamingConventionTest.java --- .../devonfw/sample/archunit/NamingConventionTest.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/test/java/com/devonfw/sample/archunit/NamingConventionTest.java b/src/test/java/com/devonfw/sample/archunit/NamingConventionTest.java index 4e1f771..67962ba 100644 --- a/src/test/java/com/devonfw/sample/archunit/NamingConventionTest.java +++ b/src/test/java/com/devonfw/sample/archunit/NamingConventionTest.java @@ -66,8 +66,9 @@ public void check(JavaClass javaClass, ConditionEvents events) { + javaClass.getSimpleName().replace("Eto", ""); boolean hasCorrectInterface = javaClass.getInterfaces().stream() .anyMatch(i -> i.getName().equals(supposedInterfaceName)); - events.add(new SimpleConditionEvent(javaClass, hasCorrectInterface, "")); - } + String message = "The class or interface named " + javaClass.getSimpleName() + "has not implemented or been implemented by a class or interface with the same simple name"; + events.add(new SimpleConditionEvent(javaClass, hasCorrectInterface, message)); + } }).because( "Classes extending AbstractEto must follow the naming convention by ending with 'Eto', reside in package common and implent an interface with the same simple name."); @@ -118,8 +119,10 @@ public void check(JavaClass javaClass, ConditionEvents events) { String enitiyName = typeArguments[0].getTypeName().replace("Entity", ""); hasCorrectName = javaClass.getFullName().equals(enitiyName + "Repository"); } - } - events.add(new SimpleConditionEvent(javaClass, hasCorrectName, "")); + } + String message = "The Class named" + javaClass.getSimpleName() + "does not have the same Simple name as the entity filled in the generic argument of JpaRepository excluding the Entity suffix"; + events.add(new SimpleConditionEvent(javaClass, hasCorrectName, message)); + } }); From 6bb36e268129a4f5573781cc9185feda9addd3d8 Mon Sep 17 00:00:00 2001 From: moritzLanger <44358321+moritzLanger@users.noreply.github.com> Date: Thu, 30 Mar 2023 14:08:08 +0200 Subject: [PATCH 15/28] Update NamingConventionTest.java --- .../com/devonfw/sample/archunit/NamingConventionTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/devonfw/sample/archunit/NamingConventionTest.java b/src/test/java/com/devonfw/sample/archunit/NamingConventionTest.java index 67962ba..ed1a18e 100644 --- a/src/test/java/com/devonfw/sample/archunit/NamingConventionTest.java +++ b/src/test/java/com/devonfw/sample/archunit/NamingConventionTest.java @@ -66,7 +66,7 @@ public void check(JavaClass javaClass, ConditionEvents events) { + javaClass.getSimpleName().replace("Eto", ""); boolean hasCorrectInterface = javaClass.getInterfaces().stream() .anyMatch(i -> i.getName().equals(supposedInterfaceName)); - String message = "The class or interface named " + javaClass.getSimpleName() + "has not implemented or been implemented by a class or interface with the same simple name"; + String message = "The class or interface named " + javaClass.getSimpleName() + " has not implemented or been implemented by a class or interface with the same simple name"; events.add(new SimpleConditionEvent(javaClass, hasCorrectInterface, message)); } }).because( @@ -120,7 +120,7 @@ public void check(JavaClass javaClass, ConditionEvents events) { hasCorrectName = javaClass.getFullName().equals(enitiyName + "Repository"); } } - String message = "The Class named" + javaClass.getSimpleName() + "does not have the same Simple name as the entity filled in the generic argument of JpaRepository excluding the Entity suffix"; + String message = "The Class named" + javaClass.getSimpleName() + " does not have the same Simple name as the entity filled in the generic argument of JpaRepository excluding the Entity suffix"; events.add(new SimpleConditionEvent(javaClass, hasCorrectName, message)); } From 5d3caa068302c00baee8690f91032f0129496fd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Hohwiller?= Date: Tue, 25 Apr 2023 08:05:53 +0200 Subject: [PATCH 16/28] revert undesired changes --- .../common/security/ApplicationAccessControlConfig.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/devonfw/sample/archunit/task/common/security/ApplicationAccessControlConfig.java b/src/main/java/com/devonfw/sample/archunit/task/common/security/ApplicationAccessControlConfig.java index 9a2191b..53e878c 100644 --- a/src/main/java/com/devonfw/sample/archunit/task/common/security/ApplicationAccessControlConfig.java +++ b/src/main/java/com/devonfw/sample/archunit/task/common/security/ApplicationAccessControlConfig.java @@ -23,13 +23,13 @@ public class ApplicationAccessControlConfig { /** Permission to delete a {@link org.example.app.task.common.TaskList}. */ public static final String PERMISSION_DELETE_TASK_LIST = PREFIX + "DeleteTaskList"; - /** Permission to find a {@link org.ViolationItem.app.task.common.TaskItem}. */ + /** Permission to find a {@link org.example.app.task.common.TaskItem}. */ public static final String PERMISSION_FIND_TASK_ITEM = PREFIX + "FindTaskItem"; - /** Permission to save (insert or update) a {@link org.ViolationItem.app.task.common.TaskItem}. */ + /** Permission to save (insert or update) a {@link org.example.app.task.common.TaskItem}. */ public static final String PERMISSION_SAVE_TASK_ITEM = PREFIX + "SaveTaskItem"; - /** Permission to delete a {@link org.ViolationItem.app.task.common.TaskItem}. */ + /** Permission to delete a {@link org.example.app.task.common.TaskItem}. */ public static final String PERMISSION_DELETE_TASK_ITEM = PREFIX + "DeleteTaskItem"; } From 30555bdbf8811621892b10ee1c5d1865140dcc67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Hohwiller?= Date: Tue, 25 Apr 2023 08:06:08 +0200 Subject: [PATCH 17/28] Delete NamingConventionTest.java --- .../sample/archunit/NamingConventionTest.java | 139 ------------------ 1 file changed, 139 deletions(-) delete mode 100644 src/test/java/com/devonfw/sample/archunit/NamingConventionTest.java diff --git a/src/test/java/com/devonfw/sample/archunit/NamingConventionTest.java b/src/test/java/com/devonfw/sample/archunit/NamingConventionTest.java deleted file mode 100644 index ed1a18e..0000000 --- a/src/test/java/com/devonfw/sample/archunit/NamingConventionTest.java +++ /dev/null @@ -1,139 +0,0 @@ -package com.devonfw.sample.archunit; - -import com.devonfw.sample.archunit.general.common.AbstractCto; -import com.devonfw.sample.archunit.general.common.AbstractEto; -import com.devonfw.sample.archunit.general.logic.AbstractUc; - -import javax.ws.rs.Path; -import org.mapstruct.Mapper; -import org.springframework.data.jpa.repository.JpaRepository; - -import com.devonfw.sample.archunit.general.dataaccess.ApplicationPersistenceEntity; -import com.tngtech.archunit.core.importer.ImportOption; -import com.tngtech.archunit.junit.AnalyzeClasses; -import com.tngtech.archunit.junit.ArchTest; -import com.tngtech.archunit.lang.ArchCondition; -import com.tngtech.archunit.lang.ArchRule; -import com.tngtech.archunit.core.domain.JavaClass; -import com.tngtech.archunit.core.domain.JavaModifier; -import com.tngtech.archunit.lang.ConditionEvents; -import com.tngtech.archunit.lang.SimpleConditionEvent; -import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.classes; - -import java.lang.reflect.ParameterizedType; -import java.lang.reflect.Type; - -/** - * JUnit test that validates the naming convention rules of this application. - */ -@AnalyzeClasses(packages = "com.devonfw.sample.archunit", importOptions = ImportOption.DoNotIncludeTests.class) -public class NamingConventionTest { - - /** - * DevonNamingConventionCheck N1 verifying that classes extending AbstractCto are following the naming convention by - * ending with 'Cto'. - */ - @ArchTest - private static final ArchRule N1DevonNamingConventionCtoCheck = classes().that().areAssignableTo(AbstractCto.class) - .should().haveSimpleNameEndingWith("Cto") - .because("Classes extending AbstractCto must follow the naming convention by" + " ending with 'Cto'."); - - /** - * DevonNamingConventionCheck N3 verifying that classes extending ApplicationPersistenceEntity are following the - * naming convention by ending with 'Entity' and have to be in layer dataaccess. - */ - @ArchTest - private static final ArchRule N3DevonNamingConventionEntityCheck = classes().that() - .areAssignableTo(ApplicationPersistenceEntity.class).should().haveSimpleNameEndingWith("Entity").andShould() - .resideInAnyPackage("..dataaccess..") - .because("Classes extending ApplicationPersistenceEntity must follow the naming convention by" - + "ending with 'Entity' and must be located in the package dataaccess."); - - /** - * DevonNamingConventionCheck N4 verifying that classes extending AbstractEto are following the naming convention by - * ending with 'Eto'n reside in package "common" and implement an interface with the same simple name. - */ - @ArchTest - private static final ArchRule N4DevonNamingConventionEtoCheck = classes().that().areAssignableTo(AbstractEto.class) - .and().doNotHaveSimpleName("AbstractEto").should().haveSimpleNameEndingWith("Eto").andShould() - .resideInAnyPackage("..common..") - .andShould(new ArchCondition("implemted an interface with same simple name", new Object() { - }) { - @Override - public void check(JavaClass javaClass, ConditionEvents events) { - - String supposedInterfaceName = javaClass.getPackageName() + "." - + javaClass.getSimpleName().replace("Eto", ""); - boolean hasCorrectInterface = javaClass.getInterfaces().stream() - .anyMatch(i -> i.getName().equals(supposedInterfaceName)); - String message = "The class or interface named " + javaClass.getSimpleName() + " has not implemented or been implemented by a class or interface with the same simple name"; - events.add(new SimpleConditionEvent(javaClass, hasCorrectInterface, message)); - } - }).because( - "Classes extending AbstractEto must follow the naming convention by ending with 'Eto', reside in package common and implent an interface with the same simple name."); - - /** - * DevonAbstractUcCheck verifying that classes extending AbstractUc have to have be in layer logic - */ - @ArchTest - private static final ArchRule DevonAbstractUcCheck = classes().that().areAssignableTo(AbstractUc.class).should() - .resideInAnyPackage("..logic..").because("Classes extending AbstractUc must be located in the package logic"); - - /** - * DevonMapperCheck verifying that classes extending Mapper have to have be in layer logic and end with the suffix - * Mapper - */ - @ArchTest - private static final ArchRule DevonMapperCheck = classes().that().areAnnotatedWith(Mapper.class).should() - .resideInAnyPackage("..logic..").andShould().haveSimpleNameEndingWith("Mapper") - .because("Types annotated with @Mapper must be located in the package logic and end with Mapper"); - - /** - * DevonPathCheck verifying that classes extending Path have to have be in layer service and end with the suffix - * Service - */ - @ArchTest - private static final ArchRule DevonPathCheck = classes().that().areAnnotatedWith(Path.class).should() - .resideInAnyPackage("..service..").andShould().haveSimpleNameEndingWith("Service") - .because("Types annotated with @Path must be located in the package service and end with Service"); - - /** - * DevonJpaRepositoryCheck verifying that classes implementing JpaRepository have to have be in layer dataaccess and - * have to be named «EntityName»Repository where «EntityName» is the name of the entity filled in the generic argument - * of JpaRepository excluding the Entity suffix. Further they should be in the same package as the entity. - */ - @ArchTest - private static final ArchRule DevonJpaRepositoryCheck = classes().that().areAssignableTo(JpaRepository.class).should() - .resideInAnyPackage("..dataaccess..").andShould().haveSimpleNameEndingWith("Repository") - .andShould(new ArchCondition("check for the jpa naming structure to be valid", new Object() { - }) { - @Override - public void check(JavaClass javaClass, ConditionEvents events) { - - Boolean hasCorrectName = false; - Type[] genericInterfaces = javaClass.reflect().getGenericInterfaces(); - for (Type genericInterface : genericInterfaces) { - if (genericInterface instanceof ParameterizedType) { - ParameterizedType parameterizedType = (ParameterizedType) genericInterface; - Type[] typeArguments = parameterizedType.getActualTypeArguments(); - String enitiyName = typeArguments[0].getTypeName().replace("Entity", ""); - hasCorrectName = javaClass.getFullName().equals(enitiyName + "Repository"); - } - } - String message = "The Class named" + javaClass.getSimpleName() + " does not have the same Simple name as the entity filled in the generic argument of JpaRepository excluding the Entity suffix"; - events.add(new SimpleConditionEvent(javaClass, hasCorrectName, message)); - - } - }); - - /** - * DevonNamingConventionCheck N5 verifying that non-abstract classes inherited from AbstractUc are following the - * devonfw naming convention by beginning with 'Uc' and ending with 'Impl'. They must also implement an interface with - * the same name except for the suffix 'Impl'. - */ - @ArchTest - private static final ArchRule N5DevonNamingConventionUcCheck = classes().that().areAssignableTo(AbstractUc.class) - .and().doNotHaveModifier(JavaModifier.ABSTRACT).should().haveSimpleNameStartingWith("Uc") - .because("Classes extending AbstractUc must follow the naming convention by starting with 'Uc'."); - -} From ffef215ff2aff467a5031eb3d79f170fc6af5b7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Hohwiller?= Date: Tue, 25 Apr 2023 08:07:47 +0200 Subject: [PATCH 18/28] Update ApplicationPersistenceEntity.java --- .../violation/common/ApplicationPersistenceEntity.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/com/devonfw/sample/archunit/violation/common/ApplicationPersistenceEntity.java b/src/main/java/com/devonfw/sample/archunit/violation/common/ApplicationPersistenceEntity.java index 1d0351c..ecbcbfb 100644 --- a/src/main/java/com/devonfw/sample/archunit/violation/common/ApplicationPersistenceEntity.java +++ b/src/main/java/com/devonfw/sample/archunit/violation/common/ApplicationPersistenceEntity.java @@ -7,10 +7,8 @@ /** * Abstract base class for all persistent entities of this app. */ +// Violation: ApplicationPersistenceEntity has to be be in layer dataaccess @MappedSuperclass public abstract class ApplicationPersistenceEntity implements ApplicationEntity { - /* - ApplicationPersistenceEntity have to have be in layer dataaccess - */ } From 71e673852cbe4f1871e3524f516ec7c8f0f313d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Hohwiller?= Date: Tue, 25 Apr 2023 08:08:43 +0200 Subject: [PATCH 19/28] Update ViolationRepository.java --- .../archunit/violation/common/ViolationRepository.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main/java/com/devonfw/sample/archunit/violation/common/ViolationRepository.java b/src/main/java/com/devonfw/sample/archunit/violation/common/ViolationRepository.java index 8eb6c47..505ec58 100644 --- a/src/main/java/com/devonfw/sample/archunit/violation/common/ViolationRepository.java +++ b/src/main/java/com/devonfw/sample/archunit/violation/common/ViolationRepository.java @@ -7,9 +7,6 @@ /** * Interface for the {@link JpaRepository} giving database access to {@link ViolationEntity}. */ + // Violation: JpaRepository has to be in layer dataaccess and should be in the same package as the entity. public interface ViolationRepository extends JpaRepository { - /* - * JpaRepository have to be in layer dataaccess and - * should be in the same package as the entity. - */ } From 50e40e8e31e3167a916c52fa9d5f69411f69584d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Hohwiller?= Date: Tue, 25 Apr 2023 08:09:36 +0200 Subject: [PATCH 20/28] Update WrongInterfaceViolationEto.java --- .../archunit/violation/common/WrongInterfaceViolationEto.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/com/devonfw/sample/archunit/violation/common/WrongInterfaceViolationEto.java b/src/main/java/com/devonfw/sample/archunit/violation/common/WrongInterfaceViolationEto.java index 46d279d..46bf94f 100644 --- a/src/main/java/com/devonfw/sample/archunit/violation/common/WrongInterfaceViolationEto.java +++ b/src/main/java/com/devonfw/sample/archunit/violation/common/WrongInterfaceViolationEto.java @@ -6,8 +6,6 @@ /** * {@link ViolationItem} implementation as {@link AbstractEto}. */ + // Violation: ETO for ViolationItem interface shall be named ViolationItemEto public class WrongInterfaceViolationEto extends AbstractEto implements ViolationItem { - /* - * they implement an interface with the same simple-name excluding the Eto suffix - */ } From f5aff54dafb392498715576153ac47adfab01d9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Hohwiller?= Date: Tue, 25 Apr 2023 08:10:51 +0200 Subject: [PATCH 21/28] Update WrongNameRepository.java --- .../archunit/violation/common/WrongNameRepository.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/java/com/devonfw/sample/archunit/violation/common/WrongNameRepository.java b/src/main/java/com/devonfw/sample/archunit/violation/common/WrongNameRepository.java index b817611..a4c9fb1 100644 --- a/src/main/java/com/devonfw/sample/archunit/violation/common/WrongNameRepository.java +++ b/src/main/java/com/devonfw/sample/archunit/violation/common/WrongNameRepository.java @@ -9,10 +9,6 @@ /** * Interface for the {@link JpaRepository} giving database access to {@link ViolationEntity}. */ + // Violation: JpaRepository interface shall be named «EntityName»Repository (ViolationRepository) public interface WrongNameRepository extends JpaRepository { - /* - * has to be named «EntityName»Repository - * where «EntityName» is the name of the entity filled in - * the generic argument of JpaRepository excluding the Entity suffix. - */ } From 6fddd89bd89932a2da8ce2f984e714f9cb65152f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Hohwiller?= Date: Tue, 25 Apr 2023 08:11:32 +0200 Subject: [PATCH 22/28] Update WrongInterfaceViolationEto.java --- .../archunit/violation/common/WrongInterfaceViolationEto.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/devonfw/sample/archunit/violation/common/WrongInterfaceViolationEto.java b/src/main/java/com/devonfw/sample/archunit/violation/common/WrongInterfaceViolationEto.java index 46bf94f..f17ec10 100644 --- a/src/main/java/com/devonfw/sample/archunit/violation/common/WrongInterfaceViolationEto.java +++ b/src/main/java/com/devonfw/sample/archunit/violation/common/WrongInterfaceViolationEto.java @@ -6,6 +6,6 @@ /** * {@link ViolationItem} implementation as {@link AbstractEto}. */ - // Violation: ETO for ViolationItem interface shall be named ViolationItemEto + // Violation: ETO for entity interface shall be named «EntityName»Eto (ViolationItemEto) public class WrongInterfaceViolationEto extends AbstractEto implements ViolationItem { } From f42032876fb25998e1b7d88213250871c74d0021 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Hohwiller?= Date: Tue, 25 Apr 2023 08:12:41 +0200 Subject: [PATCH 23/28] Update MapperViolation.java --- .../archunit/violation/dataaccess/MapperViolation.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/devonfw/sample/archunit/violation/dataaccess/MapperViolation.java b/src/main/java/com/devonfw/sample/archunit/violation/dataaccess/MapperViolation.java index 1feeb51..cee441d 100644 --- a/src/main/java/com/devonfw/sample/archunit/violation/dataaccess/MapperViolation.java +++ b/src/main/java/com/devonfw/sample/archunit/violation/dataaccess/MapperViolation.java @@ -5,10 +5,7 @@ /** * {@link Mapper} for {@link com.devonfw.sample.archunit.task.common.TaskItem}. */ +// Violation: Mapper has to be in logic layer and name has to end with Mapper. @Mapper(componentModel = "cdi") public abstract interface MapperViolation { - - /* - * @Mapper (org.mapstruct.Mapper) need to be in layer logic and have to end with Mapper. - */ -} \ No newline at end of file +} From f423a29b8a117de6e88adcf4187ce3764bfe4e25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Hohwiller?= Date: Tue, 25 Apr 2023 08:13:41 +0200 Subject: [PATCH 24/28] Update ServiceViolation.java --- .../archunit/violation/dataaccess/ServiceViolation.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main/java/com/devonfw/sample/archunit/violation/dataaccess/ServiceViolation.java b/src/main/java/com/devonfw/sample/archunit/violation/dataaccess/ServiceViolation.java index 2617436..0a61185 100644 --- a/src/main/java/com/devonfw/sample/archunit/violation/dataaccess/ServiceViolation.java +++ b/src/main/java/com/devonfw/sample/archunit/violation/dataaccess/ServiceViolation.java @@ -6,10 +6,7 @@ * Rest service for task component with {@link com.devonfw.sample.archunit.task.common.TaskList} and * {@link com.devonfw.sample.archunit.task.common.TaskItem}. */ + // Violation: REST-Service has to be in service layer and name has to end with "Service". @Path("/task") public class ServiceViolation { - - /* - * @Path (javax.ws.rs.Path) need to be in layer service and have to end with Service. - */ } From 4e86f16ef8429884ac21feac1b1b3e8daf850238 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Hohwiller?= Date: Tue, 25 Apr 2023 08:14:19 +0200 Subject: [PATCH 25/28] Update UcViolation.java --- .../sample/archunit/violation/dataaccess/UcViolation.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main/java/com/devonfw/sample/archunit/violation/dataaccess/UcViolation.java b/src/main/java/com/devonfw/sample/archunit/violation/dataaccess/UcViolation.java index 09ae571..68526a1 100644 --- a/src/main/java/com/devonfw/sample/archunit/violation/dataaccess/UcViolation.java +++ b/src/main/java/com/devonfw/sample/archunit/violation/dataaccess/UcViolation.java @@ -12,9 +12,6 @@ @ApplicationScoped @Named @Transactional +// Violation: Use-case has to be in logic layer. public class UcViolation extends AbstractUc { - - /* - * AbstractUc have to be in layer logic - */ } From ed0c1cba956bd98936abd6a68c5fee469df0fde4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Hohwiller?= Date: Tue, 25 Apr 2023 08:16:00 +0200 Subject: [PATCH 26/28] Update ViolationEto.java --- .../sample/archunit/violation/dataaccess/ViolationEto.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/com/devonfw/sample/archunit/violation/dataaccess/ViolationEto.java b/src/main/java/com/devonfw/sample/archunit/violation/dataaccess/ViolationEto.java index 9ed68ef..190138f 100644 --- a/src/main/java/com/devonfw/sample/archunit/violation/dataaccess/ViolationEto.java +++ b/src/main/java/com/devonfw/sample/archunit/violation/dataaccess/ViolationEto.java @@ -6,8 +6,6 @@ /** * {@link ViolationItem} implementation as {@link AbstractEto}. */ + // Violation: ETO has to be in common layer. public class ViolationEto extends AbstractEto implements ViolationItem { - /* - * AbstractEto have to be in layer common - */ } From 81a5d1c71321b47db0c2f37a3c1e8c5e164d6ada Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Hohwiller?= Date: Tue, 25 Apr 2023 08:17:03 +0200 Subject: [PATCH 27/28] Update ViolationEntity.java --- .../violation/dataaccess/ViolationEntity.java | 68 +------------------ 1 file changed, 3 insertions(+), 65 deletions(-) diff --git a/src/main/java/com/devonfw/sample/archunit/violation/dataaccess/ViolationEntity.java b/src/main/java/com/devonfw/sample/archunit/violation/dataaccess/ViolationEntity.java index cf5e1f1..48d8c26 100644 --- a/src/main/java/com/devonfw/sample/archunit/violation/dataaccess/ViolationEntity.java +++ b/src/main/java/com/devonfw/sample/archunit/violation/dataaccess/ViolationEntity.java @@ -10,74 +10,12 @@ import javax.persistence.Table; import com.devonfw.sample.archunit.general.dataaccess.ApplicationPersistenceEntity; -import com.devonfw.sample.archunit.task.common.TaskItem; +import com.devonfw.sample.archunit.violation.common.ViolationItem; /** * {@link TaskItem} implementation as {@link ApplicationPersistenceEntity}. */ @Entity -@Table(name = "TASK_ITEM") -public class ViolationEntity extends ApplicationPersistenceEntity implements TaskItem { - - @Override - public String getTitle() { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'getTitle'"); - } - - @Override - public void setTitle(String title) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'setTitle'"); - } - - @Override - public boolean isCompleted() { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'isCompleted'"); - } - - @Override - public void setCompleted(boolean completed) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'setCompleted'"); - } - - @Override - public boolean isStarred() { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'isStarred'"); - } - - @Override - public void setStarred(boolean starred) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'setStarred'"); - } - - @Override - public LocalDateTime getDeadline() { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'getDeadline'"); - } - - @Override - public void setDeadline(LocalDateTime deadline) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'setDeadline'"); - } - - @Override - public Long getTaskListId() { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'getTaskListId'"); - } - - @Override - public void setTaskListId(Long taskListId) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'setTaskListId'"); - } - - +@Table(name = "VIOLATION") +public class ViolationEntity extends ApplicationPersistenceEntity implements ViolationItem { } From 25aa6d660005c9fec32f8cd8036305f936a92dc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Hohwiller?= Date: Tue, 25 Apr 2023 08:22:58 +0200 Subject: [PATCH 28/28] Update ViolationEntity.java --- .../sample/archunit/violation/dataaccess/ViolationEntity.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/devonfw/sample/archunit/violation/dataaccess/ViolationEntity.java b/src/main/java/com/devonfw/sample/archunit/violation/dataaccess/ViolationEntity.java index 48d8c26..16f8fff 100644 --- a/src/main/java/com/devonfw/sample/archunit/violation/dataaccess/ViolationEntity.java +++ b/src/main/java/com/devonfw/sample/archunit/violation/dataaccess/ViolationEntity.java @@ -17,5 +17,6 @@ */ @Entity @Table(name = "VIOLATION") +// Violation: Entity has to be named «EntityName»Entity (ViolationItemEntity). public class ViolationEntity extends ApplicationPersistenceEntity implements ViolationItem { }