From fbca4c92c2432ce26d35e33295a530861dbb2c21 Mon Sep 17 00:00:00 2001 From: Peter Gafert Date: Sat, 20 May 2017 19:20:58 +0200 Subject: [PATCH] JavaAccessCondition now ignores accesses from self to self. In particular, self-accesses don't have to be manually ignored anymore, when onlyAccessedBy().. is checked. This resolves #3, since for any smarter ignores, it would be necessary to talk about better fitting objects, than just classes filtered by any criteria. --- .../lang/conditions/JavaAccessCondition.java | 4 +++- ...ShouldOnlyBeAccessedByClassesThatTest.java | 23 +++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/archunit/src/main/java/com/tngtech/archunit/lang/conditions/JavaAccessCondition.java b/archunit/src/main/java/com/tngtech/archunit/lang/conditions/JavaAccessCondition.java index 22ce633256..3c63c44c0d 100644 --- a/archunit/src/main/java/com/tngtech/archunit/lang/conditions/JavaAccessCondition.java +++ b/archunit/src/main/java/com/tngtech/archunit/lang/conditions/JavaAccessCondition.java @@ -31,6 +31,8 @@ class JavaAccessCondition extends ArchCondition> { @Override public void check(JavaAccess item, ConditionEvents events) { - events.add(new SimpleConditionEvent<>(item, predicate.apply(item), item.getDescription())); + if (!item.getOriginOwner().equals(item.getTargetOwner())) { + events.add(new SimpleConditionEvent<>(item, predicate.apply(item), item.getDescription())); + } } } diff --git a/archunit/src/test/java/com/tngtech/archunit/lang/syntax/elements/ShouldOnlyBeAccessedByClassesThatTest.java b/archunit/src/test/java/com/tngtech/archunit/lang/syntax/elements/ShouldOnlyBeAccessedByClassesThatTest.java index c2395a2d3e..917ed05f91 100644 --- a/archunit/src/test/java/com/tngtech/archunit/lang/syntax/elements/ShouldOnlyBeAccessedByClassesThatTest.java +++ b/archunit/src/test/java/com/tngtech/archunit/lang/syntax/elements/ShouldOnlyBeAccessedByClassesThatTest.java @@ -8,6 +8,7 @@ import com.tngtech.archunit.core.domain.JavaClass; import com.tngtech.archunit.core.domain.properties.HasName; import com.tngtech.archunit.core.domain.properties.HasType; +import com.tngtech.archunit.core.importer.ClassFileImporter; import com.tngtech.archunit.lang.syntax.elements.testclasses.access.ClassAccessingOtherClass; import com.tngtech.archunit.lang.syntax.elements.testclasses.accessed.ClassBeingAccessedByOtherClass; import com.tngtech.archunit.lang.syntax.elements.testclasses.anotheraccess.YetAnotherClassAccessingOtherClass; @@ -530,6 +531,15 @@ public void byClassesThat_predicate() { ClassImplementingSomeInterface.class, ClassBeingAccessedByClassImplementingSomeInterface.class); } + @Test + public void accesses_by_the_class_itself_are_ignored() { + ClassesShouldConjunction rule = classes().should().onlyBeAccessed() + .byClassesThat(classWithNameOf(ClassAccessingClassAccessingItself.class)); + + rule.check(new ClassFileImporter().importClasses( + ClassAccessingItself.class, ClassAccessingClassAccessingItself.class)); + } + private DescribedPredicate classWithNameOf(Class type) { return GET_NAME.is(equalTo(type.getName())); } @@ -642,6 +652,19 @@ private static class ClassExtendingClass extends ClassImplementingSomeInterface } private static class ClassBeingAccessedByClassImplementingSomeInterface { + } + + private static class ClassAccessingItself { + private String field; + ClassAccessingItself(String field) { + this.field = field; + } + } + + private static class ClassAccessingClassAccessingItself { + void call() { + new ClassAccessingItself("foo"); + } } } \ No newline at end of file