1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.monitoring.gauges;
18
19 import org.apache.commons.monitoring.Role;
20 import org.apache.commons.monitoring.repositories.Repository;
21
22 import java.util.LinkedList;
23 import java.util.ServiceLoader;
24
25 public interface Gauge {
26 Role role();
27 double value();
28 long period();
29
30 public static class LoaderHelper {
31 private LinkedList<Gauge> gauges = new LinkedList<Gauge>();
32
33 public LoaderHelper(final boolean excludeParent, final String... includedPrefixes) {
34 final ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
35
36 for (final Gauge g : ServiceLoader.load(Gauge.class, classLoader)) {
37 addGaugeIfNecessary(classLoader, g, excludeParent, includedPrefixes);
38 }
39 for (final GaugeFactory gf : ServiceLoader.load(GaugeFactory.class, classLoader)) {
40 for (final Gauge g : gf.gauges()) {
41 addGaugeIfNecessary(classLoader, g, excludeParent, includedPrefixes);
42 }
43 }
44 }
45
46 private void addGaugeIfNecessary(final ClassLoader classLoader, final Gauge g, final boolean excludeParent, final String... prefixes) {
47 final Class<? extends Gauge> gaugeClass = g.getClass();
48 if (!excludeParent || gaugeClass.getClassLoader() == classLoader) {
49 if (prefixes != null) {
50 for (final String p : prefixes) {
51 if (!gaugeClass.getName().startsWith(p)) {
52 return;
53 }
54 }
55 }
56 Repository.INSTANCE.addGauge(g);
57 gauges.add(g);
58 }
59 }
60
61 public void destroy() {
62 for (final Gauge gauge : gauges) {
63 Repository.INSTANCE.stopGauge(gauge.role());
64 }
65 }
66 }
67 }