001package org.javasimon.console; 002 003import java.util.Iterator; 004 005import org.javasimon.Manager; 006import org.javasimon.callback.Callback; 007import org.javasimon.callback.CompositeCallback; 008import org.javasimon.proxy.Delegating; 009 010/** 011 * Simon callback helper class 012 * 013 * @author gquintana 014 */ 015public class SimonCallbacks { 016 017 /** 018 * Get the first callback of given type in manager 019 * 020 * @param manager Simon manager containing callbacks 021 * @param callbackType Expected callback type 022 * @return Callback or null if not any 023 */ 024 public static <T extends Callback> T getCallbackByType(Manager manager, Class<T> callbackType) { 025 return getCallbackByType(manager.callback().callbacks(), callbackType); 026 } 027 028 /** 029 * Search callback by type in list of callbacks 030 * 031 * @param callbacks List of callback 032 * @param callbackType Callback type 033 * @return Callback matching type 034 */ 035 private static <T extends Callback> T getCallbackByType(Iterable<Callback> callbacks, Class<T> callbackType) { 036 T foundCallback = null; 037 Iterator<Callback> callbackIterator = callbacks.iterator(); 038 while (foundCallback == null && callbackIterator.hasNext()) { 039 Callback callback = callbackIterator.next(); 040 // Remove callback wrappers 041 while ((callback instanceof Delegating) && (!callbackType.isInstance(callback))) { 042 callback = ((Delegating<Callback>) callback).getDelegate(); 043 } 044 if (callbackType.isInstance(callback)) { 045 // Callback found 046 foundCallback = callbackType.cast(callback); 047 } else if (callback instanceof CompositeCallback) { 048 // Visit the composite callback 049 foundCallback = getCallbackByType(((CompositeCallback) callback).callbacks(), callbackType); 050 } 051 } 052 return foundCallback; 053 } 054}