package org.arquillian.cube.kubernetes.impl.visitor; import io.fabric8.kubernetes.api.builder.v2_2.TypedVisitor; import io.fabric8.kubernetes.api.builder.v2_2.Visitor; import java.lang.reflect.Method; import java.util.List; public class CompositeVisitor<T> implements Visitor<T> { private final List<Visitor<T>> visitors; public CompositeVisitor(List<Visitor<T>> visitors) { this.visitors = visitors; } private static <V, F> Boolean canVisit(V visitor, F fluent) { if (visitor instanceof TypedVisitor) { return ((TypedVisitor) visitor).getType().isAssignableFrom(fluent.getClass()); } for (Method method : visitor.getClass().getDeclaredMethods()) { if (method.getParameterTypes().length != 1) { continue; } Class visitorType = method.getParameterTypes()[0]; if (visitorType.isAssignableFrom(fluent.getClass())) { return true; } else { return false; } } return false; } @Override public void visit(T t) { for (Visitor delegate : visitors) { if (canVisit(delegate, t)) { delegate.visit(t); } } } }