use of com.tngtech.archunit.lang.ArchCondition in project ArchUnit by TNG.
the class PublicAPIRules method bePubliclyAccessible.
private static ArchCondition<JavaMember> bePubliclyAccessible() {
return new ArchCondition<JavaMember>("be publicly accessible") {
@Override
public void check(JavaMember member, ConditionEvents events) {
boolean declaringClassIsPublic = getAllEnclosingClasses(member).allMatch(c -> c.getModifiers().contains(PUBLIC));
boolean satisfied = member.getModifiers().contains(PUBLIC) && declaringClassIsPublic;
events.add(new SimpleConditionEvent(member, satisfied, String.format("member %s.%s is %sdeclared in public location in %s", member.getOwner().getName(), member.getName(), satisfied ? "" : "not ", member.getSourceCodeLocation())));
}
private Stream<JavaClass> getAllEnclosingClasses(JavaMember member) {
List<JavaClass> enclosingClasses = newArrayList(member.getOwner());
while (getLast(enclosingClasses).getEnclosingClass().isPresent()) {
enclosingClasses.add(getLast(enclosingClasses).getEnclosingClass().get());
}
return enclosingClasses.stream();
}
};
}
use of com.tngtech.archunit.lang.ArchCondition in project ArchUnit by TNG.
the class PublicAPIRules method beInterfaces.
private static ArchCondition<? super JavaClass> beInterfaces() {
return new ArchCondition<JavaClass>("be interfaces") {
@Override
public void check(JavaClass item, ConditionEvents events) {
boolean satisfied = item.isInterface();
events.add(new SimpleConditionEvent(item, satisfied, String.format("class %s is %sinterface", item.getName(), satisfied ? "" : "no ")));
}
};
}
use of com.tngtech.archunit.lang.ArchCondition in project ArchUnit by TNG.
the class ProxyRules method directly_call_other_methods_declared_in_the_same_class_that.
/**
* Returns a condition that matches classes that directly calls other methods
* declared in the same class that matches the given predicate.
*
* <p>
* For an example, see {@link #directly_call_other_methods_declared_in_the_same_class_that_are_annotated_with(Class)}
* </p>
*/
@PublicAPI(usage = ACCESS)
public static ArchCondition<JavaClass> directly_call_other_methods_declared_in_the_same_class_that(final DescribedPredicate<? super MethodCallTarget> predicate) {
return new ArchCondition<JavaClass>("directly call other methods declared in the same class that " + predicate.getDescription()) {
@Override
public void check(JavaClass javaClass, ConditionEvents events) {
for (JavaMethodCall call : javaClass.getMethodCallsFromSelf()) {
boolean satisfied = call.getOriginOwner().equals(call.getTargetOwner()) && predicate.test(call.getTarget());
events.add(new SimpleConditionEvent(call, satisfied, call.getDescription()));
}
}
};
}
use of com.tngtech.archunit.lang.ArchCondition in project flink by apache.
the class Conditions method haveLeafExceptionTypes.
/**
* Tests leaf exception types of a method against the given predicate.
*
* <p>See {@link #haveLeafTypes(DescribedPredicate)} for details.
*/
public static ArchCondition<JavaMethod> haveLeafExceptionTypes(DescribedPredicate<JavaClass> typePredicate) {
return new ArchCondition<JavaMethod>("have leaf exception types" + typePredicate.getDescription()) {
@Override
public void check(JavaMethod method, ConditionEvents events) {
final List<JavaClass> leafArgumentTypes = method.getExceptionTypes().stream().flatMap(argumentType -> getLeafTypes(argumentType).stream()).collect(Collectors.toList());
for (JavaClass leafType : leafArgumentTypes) {
if (!isJavaClass(leafType)) {
continue;
}
if (!typePredicate.apply(leafType)) {
final String message = String.format("%s: Exception leaf type %s does not satisfy: %s", method.getFullName(), leafType.getName(), typePredicate.getDescription());
events.add(SimpleConditionEvent.violated(method, message));
}
}
}
};
}
use of com.tngtech.archunit.lang.ArchCondition in project flink by splunk.
the class Conditions method haveLeafArgumentTypes.
/**
* Tests leaf argument types of a method against the given predicate.
*
* <p>See {@link #haveLeafTypes(DescribedPredicate)} for details.
*/
public static ArchCondition<JavaMethod> haveLeafArgumentTypes(DescribedPredicate<JavaClass> typePredicate) {
return new ArchCondition<JavaMethod>("have leaf argument types" + typePredicate.getDescription()) {
@Override
public void check(JavaMethod method, ConditionEvents events) {
final List<JavaClass> leafArgumentTypes = method.getParameterTypes().stream().flatMap(argumentType -> getLeafTypes(argumentType).stream()).collect(Collectors.toList());
for (JavaClass leafType : leafArgumentTypes) {
if (!isJavaClass(leafType)) {
continue;
}
if (!typePredicate.apply(leafType)) {
final String message = String.format("%s: Argument leaf type %s does not satisfy: %s", method.getFullName(), leafType.getName(), typePredicate.getDescription());
events.add(SimpleConditionEvent.violated(method, message));
}
}
}
};
}
Aggregations