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}