001package org.javasimon.jmx;
002
003import org.javasimon.*;
004import org.javasimon.utils.SimonUtils;
005
006import java.util.ArrayList;
007import java.util.Arrays;
008import java.util.Collection;
009import java.util.List;
010
011/**
012 * Simon MXBean implementation. See {@link SimonManagerMXBean} for interface
013 * documentation.
014 * Most methods are implemented by calling the {@link Manager}.
015 *
016 * @author Radovan Sninsky
017 * @author <a href="mailto:ivan.mushketyk@gmail.com">Ivan Mushketyk</a>
018 *
019 * @see Manager
020 * @see Simon
021 * @see SimonUtils
022 * @since 2.0
023 */
024public class SimonManagerMXBeanImpl implements SimonManagerMXBean {
025
026        private Manager manager;
027
028        /**
029         * MXBean constructor.
030         *
031         * @param manager instance of {@link Manager}, typically {@code SimonManager.manager()}.
032         */
033        public SimonManagerMXBeanImpl(Manager manager) {
034                this.manager = manager;
035        }
036
037        @Override
038        public final void enable() {
039                manager.enable();
040        }
041
042        @Override
043        public final void disable() {
044                manager.disable();
045        }
046
047        @Override
048        public final boolean isEnabled() {
049                return manager.isEnabled();
050        }
051
052        @Override
053        public final String[] getSimonNames() {
054                Collection<String> simonNames = manager.getSimonNames();
055                return simonNames.toArray(new String[simonNames.size()]);
056        }
057
058        @Override
059        public final String[] getSimonNamesOrdered() {
060                String[] simonNames = getSimonNames();
061                Arrays.sort(simonNames);
062                return simonNames;
063        }
064
065        @Override
066        public final String getType(String name) {
067                Simon s = manager.getSimon(name);
068                return s != null ? s instanceof Stopwatch ? SimonInfo.STOPWATCH : SimonInfo.COUNTER : null;
069        }
070
071        @Override
072        public final SimonInfo[] getSimonInfos() {
073                String[] simonNames = getSimonNamesOrdered();
074                SimonInfo[] simonInfo = new SimonInfo[simonNames.length];
075                int i = 0;
076                for (String name : simonNames) {
077                        Simon s = manager.getSimon(name);
078                        simonInfo[i++] = new SimonInfo(name, s instanceof Stopwatch ? SimonInfo.STOPWATCH :
079                                s instanceof Counter ? SimonInfo.COUNTER : SimonInfo.UNKNOWN);
080                }
081                return simonInfo;
082        }
083
084        @Override
085        public final void clearManager() {
086                manager.clear();
087        }
088
089        @Override
090        public final void enableSimon(String name) {
091                setSimonState(name, SimonState.ENABLED);
092        }
093
094        private void setSimonState(String name, SimonState newState) {
095                Simon simon = manager.getSimon(name);
096                if (simon == null) {
097                        throw new SimonException("Unknown Simon: " + name);
098                }
099                simon.setState(newState, false);
100        }
101
102        @Override
103        public final void disableSimon(String name) {
104                setSimonState(name, SimonState.DISABLED);
105        }
106
107        @Override
108        public final void inheritState(String name) {
109                setSimonState(name, SimonState.INHERIT);
110        }
111
112        /**
113         * Create a JMX Counter Sample from a Sample
114         *
115         * @param counter Counter
116         */
117        private org.javasimon.jmx.CounterSample sampleCounter(Simon counter) {
118                return new CounterSample((org.javasimon.CounterSample) counter.sample());
119        }
120
121        @Override
122        public final CounterSample getCounterSample(String name) {
123                Counter counter = getSimonOfType(name, Counter.class);
124                return sampleCounter(counter);
125        }
126
127        private <T extends Simon> T getSimonOfType(String name, Class<T> simonType) {
128                Simon simon = manager.getSimon(name);
129                if (simon == null) {
130                        throw new SimonException("Unknown Simon: " + name);
131                }
132
133                if (!simonType.isInstance(simon)) {
134                        throw new SimonException("Wrong Simon type");
135                }
136
137                return simonType.cast(simon);
138        }
139
140        @Override
141        public CounterSample getIncrementCounterSample(String name, String key) {
142                Counter counter = getSimonOfType(name, Counter.class);
143                return new CounterSample(counter.sampleIncrement(key));
144        }
145
146        /**
147         * Sample all Counters whose name matches given pattern
148         *
149         * @param namePattern Name pattern, null means all Counters
150         * @return One Sample for each Counter
151         */
152        @Override
153        public List<CounterSample> getCounterSamples(String namePattern) {
154                List<CounterSample> counterSamples = new ArrayList<>();
155                for (Simon simon : manager.getSimons(SimonPattern.createForCounter(namePattern))) {
156                        counterSamples.add(sampleCounter(simon));
157                }
158                return counterSamples;
159        }
160
161        @Override
162        public List<CounterSample> getIncrementCounterSamples(String namePattern, String key) {
163                List<CounterSample> counterSamples = new ArrayList<>();
164                for (Simon simon : manager.getSimons(SimonPattern.createForCounter(namePattern))) {
165                        Counter counter = (Counter) simon;
166                        counterSamples.add(new CounterSample(counter.sampleIncrement(key)));
167                }
168
169                return counterSamples;
170        }
171
172        /**
173         * Sample all Counters
174         *
175         * @return One Sample for each Counter
176         */
177        @Override
178        public List<CounterSample> getCounterSamples() {
179                return getCounterSamples(null);
180        }
181
182        @Override
183        public List<CounterSample> getIncrementCounterSamples(String key) {
184                return getIncrementCounterSamples(null, key);
185        }
186
187        /**
188         * Create a JMX Stopwatch Sample from a Stopwatch
189         *
190         * @param s Stopwatch
191         */
192        private org.javasimon.jmx.StopwatchSample sampleStopwatch(Simon s) {
193                return new StopwatchSample((org.javasimon.StopwatchSample) s.sample());
194        }
195
196        @Override
197        public final StopwatchSample getStopwatchSample(String name) {
198                Stopwatch stopwatch = getSimonOfType(name, Stopwatch.class);
199                return sampleStopwatch(stopwatch);
200        }
201
202        @Override
203        public StopwatchSample getIncrementStopwatchSample(String name, String key) {
204                Stopwatch stopwatch = getSimonOfType(name, Stopwatch.class);
205                return new StopwatchSample(stopwatch.sampleIncrement(key));
206        }
207
208        @Override
209        public List<StopwatchSample> getStopwatchSamples(String namePattern) {
210                List<StopwatchSample> stopwatchSamples = new ArrayList<>();
211                for (Simon simon : manager.getSimons(SimonPattern.createForStopwatch(namePattern))) {
212                        stopwatchSamples.add(sampleStopwatch(simon));
213                }
214                return stopwatchSamples;
215        }
216
217        @Override
218        public List<StopwatchSample> getIncrementStopwatchSamples(String namePattern, String key) {
219                List<StopwatchSample> stopwatchSamples = new ArrayList<>();
220                for (Simon simon : manager.getSimons(SimonPattern.createForStopwatch(namePattern))) {
221                        Stopwatch stopwatch = (Stopwatch) simon;
222                        stopwatchSamples.add(new StopwatchSample(stopwatch.sampleIncrement(key)));
223                }
224
225                return stopwatchSamples;
226        }
227
228        @Override
229        public List<StopwatchSample> getStopwatchSamples() {
230                return getStopwatchSamples(null);
231        }
232
233        @Override
234        public List<StopwatchSample> getIncrementStopwatchSamples(String key) {
235                return getIncrementStopwatchSamples(null, key);
236        }
237
238        @Override
239        public final void printSimonTree() {
240                System.out.println(SimonUtils.simonTreeString(manager.getRootSimon()));
241        }
242
243        Manager getManager() {
244                return manager;
245        }
246}