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}