@Override public void scan(CtRole role, Map<String, ? extends CtElement> elements) { if (isTerminated() || elements == null) { return; } for (CtElement obj : elements.values()) { scan(role, obj); if (isTerminated()) { return; } } }
@Override public void scan(CtRole role, Collection<? extends CtElement> elements) { if (isTerminated() || elements == null) { return; } // we use defensive copy so as to be able to change the class while scanning // otherwise one gets a ConcurrentModificationException for (CtElement e : new ArrayList<>(elements)) { scan(role, e); if (isTerminated()) { return; } } }
@Override public void scan(CtRole role, Object o) { if (isTerminated() || o == null) { return; } if (o instanceof CtElement) { scan(role, (CtElement) o); } else if (o instanceof Collection<?>) { scan(role, (Collection<? extends CtElement>) o); } else if (o instanceof Map<?, ?>) { for (Object obj : ((Map) o).values()) { scan(role, obj); if (isTerminated()) { return; } } } }
@Override public void scan(CtElement element) { if (element == null || isTerminated()) { return; } if (listener == null) { //the listener is not defined //visit this element and may be children doScan(scannedRole, element, ScanningMode.NORMAL); } else { //the listener is defined, call it's enter method first ScanningMode mode = listener.enter(scannedRole, element); if (mode != ScanningMode.SKIP_ALL) { //the listener decided to visit this element and may be children doScan(scannedRole, element, mode); //then call exit, only if enter returned true listener.exit(scannedRole, element); } //else the listener decided to skip this element and all children. Do not call exit. } }