Правило ArchUnit, чтобы проверить доступ к классу в том же пакете или подпакетах? - PullRequest
0 голосов
/ 03 мая 2020

У меня есть классы, аннотированные моей пользовательской аннотацией @Inner.

Я хотел бы создать правило для ArchUnit, чтобы определить, доступны ли классы, аннотированные этой конкретной аннотацией, в одном и том же пакете или подпрограмме. пакеты.

Например:

пакет: com.example.my.package

Содержит класс: MyInner, помеченный @Inner

Итак, правило следует проверить, доступен ли MyInner только с com.example.my.package или com.example.my.package.baz

1 Ответ

0 голосов
/ 04 мая 2020

Я нашел такое правило:

public class DependencyRules {

    @PublicAPI(usage = ACCESS)
    public static ArchCondition<JavaClass> accessClassesThatResideInAnUpperPackage() {
        return new AccessClassesThatResideInAnUpperPackageCondition();
    }

    private static class AccessClassesThatResideInAnUpperPackageCondition extends ArchCondition<JavaClass> {
        AccessClassesThatResideInAnUpperPackageCondition() {
            super("access classes that reside in an upper package");
        }

        @Override
        public void check(final JavaClass clazz, final ConditionEvents events) {
            for (JavaAccess<?> access : clazz.getAccessesFromSelf()) {
                boolean callToSuperPackage = isCallToSuperPackage(access.getOriginOwner(), access.getTargetOwner());
                events.add(new SimpleConditionEvent(access, callToSuperPackage, access.getDescription()));
            }
        }

        private boolean isCallToSuperPackage(JavaClass origin, JavaClass target) {
            String originPackageName = getOutermostEnclosingClass(origin).getPackageName();
            String targetSubPackagePrefix = getOutermostEnclosingClass(target).getPackageName() + ".";
            return originPackageName.startsWith(targetSubPackagePrefix);
        }

        private JavaClass getOutermostEnclosingClass(JavaClass javaClass) {
            while (javaClass.getEnclosingClass().isPresent()) {
                javaClass = javaClass.getEnclosingClass().get();
            }
            return javaClass;
        }
    }
}

Источник: https://github.com/TNG/ArchUnit/commit/5f7fadc0f67ba61e2c9fe94bfe494303780c37d7

...