001package org.javasimon;
002
003import org.javasimon.callback.CompositeCallback;
004
005import java.util.Collection;
006
007/**
008 * {@link Manager} implementation that supports {@link #enable()} and {@link #disable()} and switches between
009 * backing {@link EnabledManager} and {@link DisabledManager} accordingly.
010 *
011 * @author <a href="mailto:virgo47@gmail.com">Richard "Virgo" Richter</a>
012 */
013public final class SwitchingManager implements Manager {
014
015        private Manager enabled = new EnabledManager();
016
017        private Manager disabled = new DisabledManager();
018
019        private Manager manager = enabled;
020
021        @Override
022        public Simon getRootSimon() {
023                return manager.getRootSimon();
024        }
025
026        @Override
027        public Simon getSimon(String name) {
028                return manager.getSimon(name);
029        }
030
031        @Override
032        public Counter getCounter(String name) {
033                return manager.getCounter(name);
034        }
035
036        @Override
037        public Stopwatch getStopwatch(String name) {
038                return manager.getStopwatch(name);
039        }
040
041        @Override
042        public Collection<String> getSimonNames() {
043                return manager.getSimonNames();
044        }
045
046        @Override
047        public Collection<Simon> getSimons(SimonFilter simonFilter) {
048                return manager.getSimons(simonFilter);
049        }
050
051        @Override
052        public void destroySimon(String name) {
053                manager.destroySimon(name);
054        }
055
056        @Override
057        public void clear() {
058                manager.clear();
059        }
060
061        @Override
062        public CompositeCallback callback() {
063                return manager.callback();
064        }
065
066        @Override
067        public ManagerConfiguration configuration() {
068                return manager.configuration();
069        }
070
071        /** Enables the Simon Manager. Enabled manager provides real Simons. */
072        @Override
073        public void enable() {
074                manager = enabled;
075        }
076
077        /** Disables the Simon Manager. Disabled manager provides null Simons that actually do nothing. */
078        @Override
079        public void disable() {
080                manager = disabled;
081        }
082
083        /**
084         * Returns true if the Java Simon API is enabled.
085         *
086         * @return true if the API is enabled
087         */
088        @Override
089        public boolean isEnabled() {
090                return manager == enabled;
091        }
092
093        @Override
094        public void message(String message) {
095                manager.message(message);
096        }
097
098        @Override
099        public void warning(String warning, Exception cause) {
100                manager.warning(warning, cause);
101        }
102
103        @Override
104        public long milliTime() {
105                return manager.milliTime();
106        }
107
108        @Override
109        public long nanoTime() {
110                return manager.nanoTime();
111        }
112
113        @Override
114        public long millisForNano(long nanos) {
115                return manager.millisForNano(nanos);
116        }
117
118        void purgeIncrementalSimonsOlderThan(long thresholdMs) {
119                // Store reference to current manager to avoid check-than-act
120                Manager currentManager = manager;
121
122                if (currentManager instanceof EnabledManager) {
123                        ((EnabledManager) currentManager).purgeIncrementalSimonsOlderThan(thresholdMs);
124                }
125        }
126}