1
2
3
4
5
6
7 package org.abraracourcix.alipes.monitors.url;
8 import java.io.IOException;
9 import java.net.URL;
10 import java.util.HashMap;
11 import java.util.Iterator;
12 import java.util.Map;
13 import java.util.Set;
14 import org.abraracourcix.alipes.listeners.Listener;
15 import org.abraracourcix.alipes.listeners.ListenerException;
16 import org.abraracourcix.alipes.monitors.PollingMonitor;
17
18 /***
19 * Concrete implementation of a PollingMonitor. Given a URL or a
20 * collection of URLs it checks their status.
21 * @author jdt
22 */
23 public class URLMonitor extends PollingMonitor {
24 /***
25 * Commons-logging logger
26 */
27 private static org.apache.commons.logging.Log log =
28 org.apache.commons.logging.LogFactory.getLog(URLMonitor.class);
29 /***
30 * Collection of URLs we're interested in
31 */
32 private Map urls = new HashMap();
33 /***
34 * Constructor
35 *
36 * @param listener
37 * who's listening
38 * @param pollingFrequency
39 * in seconds
40 */
41 public URLMonitor(final Listener listener, final long pollingFrequency) {
42 super(listener, pollingFrequency);
43 }
44 /***
45 * Constructor
46 *
47 * @param listener
48 * who's listening
49 * @param pollingFrequency
50 * in seconds
51 * @param url
52 * the url to poll
53 */
54 public URLMonitor(
55 final Listener listener,
56 final long pollingFrequency,
57 final URL url) {
58 this(listener, pollingFrequency);
59 addNewURL(url);
60 }
61 /***
62 * Add a new URL to the list we monitor
63 *
64 * @param url
65 * url to add
66 */
67 public final void addNewURL(final URL url) {
68 log.info("addNewURL: url=" + url);
69 urls.put(url, Status.UNKNOWN);
70 }
71 /***
72 * Constructor defaults to polling every 60 seconds
73 *
74 * @param listener
75 * who's listening
76 * @param url
77 * the url to poll
78 */
79 public URLMonitor(final Listener listener, final URL url) {
80 this(listener, 60, url);
81 }
82 /***
83 * Pole the URLs
84 * @TODO deal with exceptions
85 * @see org.abraracourcix.alipes.monitors.AbstractMonitor#pole()
86 */
87 public final void pole() {
88 final Set keys = urls.keySet();
89 final Iterator it = keys.iterator();
90 while (it.hasNext()) {
91 final URL url = (URL) it.next();
92 final Status oldStatus = (Status) urls.get(url);
93 log.debug("Checking status of " + url);
94 log.debug("Previous status: " + oldStatus);
95 Status newStatus;
96 try {
97 url.openStream().close();
98 newStatus = Status.UP;
99 } catch (IOException io) {
100 newStatus = Status.DOWN;
101 }
102 log.debug("Current status: " + newStatus);
103 try {
104 if (oldStatus == Status.DOWN && newStatus == Status.UP) {
105 signalListener(URLEvent.GONE_UP, url);
106 }
107 if (oldStatus == Status.UP && newStatus == Status.DOWN) {
108 signalListener(URLEvent.GONE_DOWN, url);
109 }
110 if (newStatus == Status.UP) {
111 signalListener(URLEvent.UP, url);
112 } else {
113 signalListener(URLEvent.DOWN, url);
114 }
115 } catch (ListenerException le) {
116
117 }
118 urls.put(url, newStatus);
119 }
120 }
121
122 /***
123 * The status of a URL: up, down or unknown.
124 * @author jdt
125 */
126 private static final class Status {
127 /***
128 * Java enum value
129 */
130 public static final Status UP = new Status("up");
131 /***
132 * Java enum value
133 */
134 public static final Status DOWN = new Status("down");
135 /***
136 * Java enum value
137 */
138 public static final Status UNKNOWN = new Status("unknown");
139 /***
140 *
141 * Constructor
142 * @param string human readable representation of this status
143 */
144 private Status(final String string) {
145 this.string = string;
146 }
147 /***
148 * description
149 */
150 private String string;
151 /***
152 * return description
153 * @return description
154 */
155 public String toString() {
156 return string;
157 }
158 };
159 }
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186