History

My first initial commit with all of mine experimental changes.

Dmitry Kabak (userdima committed 13 years ago

Commit d37b88d1 parent 3f5b46618352 files · +2598093 −-8690Browse files

Showing the changes to java/pkg/javax/management/monitor/StringMonitor.java (1 of 18352 files). Show all

Unified · Split

java/pkg/javax/management/monitor/StringMonitor.java+463−0
@@ -0,0 +1,463 @@
1/*
2 * Copyright (c) 1999, 2007, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package javax.management.monitor;
27
28import static com.sun.jmx.defaults.JmxProperties.MONITOR_LOGGER;
29import java.util.logging.Level;
30import javax.management.ObjectName;
31import javax.management.MBeanNotificationInfo;
32import static javax.management.monitor.MonitorNotification.*;
33
34/**
35 * Defines a monitor MBean designed to observe the values of a string
36 * attribute.
37 * <P>
38 * A string monitor sends notifications as follows:
39 * <UL>
40 * <LI> if the attribute value matches the string to compare value,
41 * a {@link MonitorNotification#STRING_TO_COMPARE_VALUE_MATCHED
42 * match notification} is sent.
43 * The notify match flag must be set to <CODE>true</CODE>.
44 * <BR>Subsequent matchings of the string to compare values do not
45 * cause further notifications unless
46 * the attribute value differs from the string to compare value.
47 * <LI> if the attribute value differs from the string to compare value,
48 * a {@link MonitorNotification#STRING_TO_COMPARE_VALUE_DIFFERED
49 * differ notification} is sent.
50 * The notify differ flag must be set to <CODE>true</CODE>.
51 * <BR>Subsequent differences from the string to compare value do
52 * not cause further notifications unless
53 * the attribute value matches the string to compare value.
54 * </UL>
55 *
56 *
57 * @since 1.5
58 */
59public class StringMonitor extends Monitor implements StringMonitorMBean {
60
61 /*
62 * ------------------------------------------
63 * PACKAGE CLASSES
64 * ------------------------------------------
65 */
66
67 static class StringMonitorObservedObject extends ObservedObject {
68
69 public StringMonitorObservedObject(ObjectName observedObject) {
70 super(observedObject);
71 }
72
73 public final synchronized int getStatus() {
74 return status;
75 }
76 public final synchronized void setStatus(int status) {
77 this.status = status;
78 }
79
80 private int status;
81 }
82
83 /*
84 * ------------------------------------------
85 * PRIVATE VARIABLES
86 * ------------------------------------------
87 */
88
89 /**
90 * String to compare with the observed attribute.
91 * <BR>The default value is an empty character sequence.
92 */
93 private String stringToCompare = "";
94
95 /**
96 * Flag indicating if the string monitor notifies when matching
97 * the string to compare.
98 * <BR>The default value is set to <CODE>false</CODE>.
99 */
100 private boolean notifyMatch = false;
101
102 /**
103 * Flag indicating if the string monitor notifies when differing
104 * from the string to compare.
105 * <BR>The default value is set to <CODE>false</CODE>.
106 */
107 private boolean notifyDiffer = false;
108
109 private static final String[] types = {
110 RUNTIME_ERROR,
111 OBSERVED_OBJECT_ERROR,
112 OBSERVED_ATTRIBUTE_ERROR,
113 OBSERVED_ATTRIBUTE_TYPE_ERROR,
114 STRING_TO_COMPARE_VALUE_MATCHED,
115 STRING_TO_COMPARE_VALUE_DIFFERED
116 };
117
118 private static final MBeanNotificationInfo[] notifsInfo = {
119 new MBeanNotificationInfo(
120 types,
121 "javax.management.monitor.MonitorNotification",
122 "Notifications sent by the StringMonitor MBean")
123 };
124
125 // Flags needed to implement the matching/differing mechanism.
126 //
127 private static final int MATCHING = 0;
128 private static final int DIFFERING = 1;
129 private static final int MATCHING_OR_DIFFERING = 2;
130
131 /*
132 * ------------------------------------------
133 * CONSTRUCTORS
134 * ------------------------------------------
135 */
136
137 /**
138 * Default constructor.
139 */
140 public StringMonitor() {
141 }
142
143 /*
144 * ------------------------------------------
145 * PUBLIC METHODS
146 * ------------------------------------------
147 */
148
149 /**
150 * Starts the string monitor.
151 */
152 public synchronized void start() {
153 if (isActive()) {
154 MONITOR_LOGGER.logp(Level.FINER, StringMonitor.class.getName(),
155 "start", "the monitor is already active");
156 return;
157 }
158 // Reset values.
159 //
160 for (ObservedObject o : observedObjects) {
161 final StringMonitorObservedObject smo =
162 (StringMonitorObservedObject) o;
163 smo.setStatus(MATCHING_OR_DIFFERING);
164 }
165 doStart();
166 }
167
168 /**
169 * Stops the string monitor.
170 */
171 public synchronized void stop() {
172 doStop();
173 }
174
175 // GETTERS AND SETTERS
176 //--------------------
177
178 /**
179 * Gets the derived gauge of the specified object, if this object is
180 * contained in the set of observed MBeans, or <code>null</code> otherwise.
181 *
182 * @param object the name of the MBean whose derived gauge is required.
183 *
184 * @return The derived gauge of the specified object.
185 *
186 */
187 @Override
188 public synchronized String getDerivedGauge(ObjectName object) {
189 return (String) super.getDerivedGauge(object);
190 }
191
192 /**
193 * Gets the derived gauge timestamp of the specified object, if
194 * this object is contained in the set of observed MBeans, or
195 * <code>0</code> otherwise.
196 *
197 * @param object the name of the object whose derived gauge
198 * timestamp is to be returned.
199 *
200 * @return The derived gauge timestamp of the specified object.
201 *
202 */
203 @Override
204 public synchronized long getDerivedGaugeTimeStamp(ObjectName object) {
205 return super.getDerivedGaugeTimeStamp(object);
206 }
207
208 /**
209 * Returns the derived gauge of the first object in the set of
210 * observed MBeans.
211 *
212 * @return The derived gauge.
213 *
214 * @deprecated As of JMX 1.2, replaced by
215 * {@link #getDerivedGauge(ObjectName)}
216 */
217 @Deprecated
218 public synchronized String getDerivedGauge() {
219 if (observedObjects.isEmpty()) {
220 return null;
221 } else {
222 return (String) observedObjects.get(0).getDerivedGauge();
223 }
224 }
225
226 /**
227 * Gets the derived gauge timestamp of the first object in the set
228 * of observed MBeans.
229 *
230 * @return The derived gauge timestamp.
231 *
232 * @deprecated As of JMX 1.2, replaced by
233 * {@link #getDerivedGaugeTimeStamp(ObjectName)}
234 */
235 @Deprecated
236 public synchronized long getDerivedGaugeTimeStamp() {
237 if (observedObjects.isEmpty()) {
238 return 0;
239 } else {
240 return observedObjects.get(0).getDerivedGaugeTimeStamp();
241 }
242 }
243
244 /**
245 * Gets the string to compare with the observed attribute common
246 * to all observed MBeans.
247 *
248 * @return The string value.
249 *
250 * @see #setStringToCompare
251 */
252 public synchronized String getStringToCompare() {
253 return stringToCompare;
254 }
255
256 /**
257 * Sets the string to compare with the observed attribute common
258 * to all observed MBeans.
259 *
260 * @param value The string value.
261 *
262 * @exception IllegalArgumentException The specified
263 * string to compare is null.
264 *
265 * @see #getStringToCompare
266 */
267 public synchronized void setStringToCompare(String value)
268 throws IllegalArgumentException {
269
270 if (value == null) {
271 throw new IllegalArgumentException("Null string to compare");
272 }
273
274 if (stringToCompare.equals(value))
275 return;
276 stringToCompare = value;
277
278 // Reset values.
279 //
280 for (ObservedObject o : observedObjects) {
281 final StringMonitorObservedObject smo =
282 (StringMonitorObservedObject) o;
283 smo.setStatus(MATCHING_OR_DIFFERING);
284 }
285 }
286
287 /**
288 * Gets the matching notification's on/off switch value common to
289 * all observed MBeans.
290 *
291 * @return <CODE>true</CODE> if the string monitor notifies when
292 * matching the string to compare, <CODE>false</CODE> otherwise.
293 *
294 * @see #setNotifyMatch
295 */
296 public synchronized boolean getNotifyMatch() {
297 return notifyMatch;
298 }
299
300 /**
301 * Sets the matching notification's on/off switch value common to
302 * all observed MBeans.
303 *
304 * @param value The matching notification's on/off switch value.
305 *
306 * @see #getNotifyMatch
307 */
308 public synchronized void setNotifyMatch(boolean value) {
309 if (notifyMatch == value)
310 return;
311 notifyMatch = value;
312 }
313
314 /**
315 * Gets the differing notification's on/off switch value common to
316 * all observed MBeans.
317 *
318 * @return <CODE>true</CODE> if the string monitor notifies when
319 * differing from the string to compare, <CODE>false</CODE> otherwise.
320 *
321 * @see #setNotifyDiffer
322 */
323 public synchronized boolean getNotifyDiffer() {
324 return notifyDiffer;
325 }
326
327 /**
328 * Sets the differing notification's on/off switch value common to
329 * all observed MBeans.
330 *
331 * @param value The differing notification's on/off switch value.
332 *
333 * @see #getNotifyDiffer
334 */
335 public synchronized void setNotifyDiffer(boolean value) {
336 if (notifyDiffer == value)
337 return;
338 notifyDiffer = value;
339 }
340
341 /**
342 * Returns a <CODE>NotificationInfo</CODE> object containing the name of
343 * the Java class of the notification and the notification types sent by
344 * the string monitor.
345 */
346 @Override
347 public MBeanNotificationInfo[] getNotificationInfo() {
348 return notifsInfo.clone();
349 }
350
351 /*
352 * ------------------------------------------
353 * PACKAGE METHODS
354 * ------------------------------------------
355 */
356
357 /**
358 * Factory method for ObservedObject creation.
359 *
360 * @since 1.6
361 */
362 @Override
363 ObservedObject createObservedObject(ObjectName object) {
364 final StringMonitorObservedObject smo =
365 new StringMonitorObservedObject(object);
366 smo.setStatus(MATCHING_OR_DIFFERING);
367 return smo;
368 }
369
370 /**
371 * Check that the type of the supplied observed attribute
372 * value is one of the value types supported by this monitor.
373 */
374 @Override
375 synchronized boolean isComparableTypeValid(ObjectName object,
376 String attribute,
377 Comparable<?> value) {
378 // Check that the observed attribute is of type "String".
379 //
380 if (value instanceof String) {
381 return true;
382 }
383 return false;
384 }
385
386 @Override
387 synchronized void onErrorNotification(MonitorNotification notification) {
388 final StringMonitorObservedObject o = (StringMonitorObservedObject)
389 getObservedObject(notification.getObservedObject());
390 if (o == null)
391 return;
392
393 // Reset values.
394 //
395 o.setStatus(MATCHING_OR_DIFFERING);
396 }
397
398 @Override
399 synchronized MonitorNotification buildAlarmNotification(
400 ObjectName object,
401 String attribute,
402 Comparable<?> value) {
403 String type = null;
404 String msg = null;
405 Object trigger = null;
406
407 final StringMonitorObservedObject o =
408 (StringMonitorObservedObject) getObservedObject(object);
409 if (o == null)
410 return null;
411
412 // Send matching notification if notifyMatch is true.
413 // Send differing notification if notifyDiffer is true.
414 //
415 if (o.getStatus() == MATCHING_OR_DIFFERING) {
416 if (o.getDerivedGauge().equals(stringToCompare)) {
417 if (notifyMatch) {
418 type = STRING_TO_COMPARE_VALUE_MATCHED;
419 msg = "";
420 trigger = stringToCompare;
421 }
422 o.setStatus(DIFFERING);
423 } else {
424 if (notifyDiffer) {
425 type = STRING_TO_COMPARE_VALUE_DIFFERED;
426 msg = "";
427 trigger = stringToCompare;
428 }
429 o.setStatus(MATCHING);
430 }
431 } else {
432 if (o.getStatus() == MATCHING) {
433 if (o.getDerivedGauge().equals(stringToCompare)) {
434 if (notifyMatch) {
435 type = STRING_TO_COMPARE_VALUE_MATCHED;
436 msg = "";
437 trigger = stringToCompare;
438 }
439 o.setStatus(DIFFERING);
440 }
441 } else if (o.getStatus() == DIFFERING) {
442 if (!o.getDerivedGauge().equals(stringToCompare)) {
443 if (notifyDiffer) {
444 type = STRING_TO_COMPARE_VALUE_DIFFERED;
445 msg = "";
446 trigger = stringToCompare;
447 }
448 o.setStatus(MATCHING);
449 }
450 }
451 }
452
453 return new MonitorNotification(type,
454 this,
455 0,
456 0,
457 msg,
458 null,
459 null,
460 null,
461 trigger);
462 }
463}