/* |
|
* Copyright (c) 1999, 2007, Oracle and/or its affiliates. All rights reserved. |
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
|
* |
|
* This code is free software; you can redistribute it and/or modify it |
|
* under the terms of the GNU General Public License version 2 only, as |
|
* published by the Free Software Foundation. Oracle designates this |
|
* particular file as subject to the "Classpath" exception as provided |
|
* by Oracle in the LICENSE file that accompanied this code. |
|
* |
|
* This code is distributed in the hope that it will be useful, but WITHOUT |
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
|
* version 2 for more details (a copy is included in the LICENSE file that |
|
* accompanied this code). |
|
* |
|
* You should have received a copy of the GNU General Public License version |
|
* 2 along with this work; if not, write to the Free Software Foundation, |
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
|
* |
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
|
* or visit www.oracle.com if you need additional information or have any |
|
* questions. |
|
*/ |
|
package javax.management.monitor; |
|
import static com.sun.jmx.defaults.JmxProperties.MONITOR_LOGGER; |
|
import java.util.logging.Level; |
|
import javax.management.ObjectName; |
|
import javax.management.MBeanNotificationInfo; |
|
import static javax.management.monitor.MonitorNotification.*; |
|
/** |
|
* Defines a monitor MBean designed to observe the values of a string |
|
* attribute. |
|
* <P> |
|
* A string monitor sends notifications as follows: |
|
* <UL> |
|
* <LI> if the attribute value matches the string to compare value, |
|
* a {@link MonitorNotification#STRING_TO_COMPARE_VALUE_MATCHED |
|
* match notification} is sent. |
|
* The notify match flag must be set to <CODE>true</CODE>. |
|
* <BR>Subsequent matchings of the string to compare values do not |
|
* cause further notifications unless |
|
* the attribute value differs from the string to compare value. |
|
* <LI> if the attribute value differs from the string to compare value, |
|
* a {@link MonitorNotification#STRING_TO_COMPARE_VALUE_DIFFERED |
|
* differ notification} is sent. |
|
* The notify differ flag must be set to <CODE>true</CODE>. |
|
* <BR>Subsequent differences from the string to compare value do |
|
* not cause further notifications unless |
|
* the attribute value matches the string to compare value. |
|
* </UL> |
|
* |
|
* |
|
* @since 1.5 |
|
*/ |
|
public class StringMonitor extends Monitor implements StringMonitorMBean { |
|
/* |
|
* ------------------------------------------ |
|
* PACKAGE CLASSES |
|
* ------------------------------------------ |
|
*/ |
|
static class StringMonitorObservedObject extends ObservedObject { |
|
public StringMonitorObservedObject(ObjectName observedObject) { |
|
super(observedObject); |
|
} |
|
public final synchronized int getStatus() { |
|
return status; |
|
} |
|
public final synchronized void setStatus(int status) { |
|
this.status = status; |
|
} |
|
private int status; |
|
} |
|
/* |
|
* ------------------------------------------ |
|
* PRIVATE VARIABLES |
|
* ------------------------------------------ |
|
*/ |
|
/** |
|
* String to compare with the observed attribute. |
|
* <BR>The default value is an empty character sequence. |
|
*/ |
|
private String stringToCompare = ""; |
|
/** |
|
* Flag indicating if the string monitor notifies when matching |
|
* the string to compare. |
|
* <BR>The default value is set to <CODE>false</CODE>. |
|
*/ |
|
private boolean notifyMatch = false; |
|
/** |
|
* Flag indicating if the string monitor notifies when differing |
|
* from the string to compare. |
|
* <BR>The default value is set to <CODE>false</CODE>. |
|
*/ |
|
private boolean notifyDiffer = false; |
|
private static final String[] types = { |
|
RUNTIME_ERROR, |
|
OBSERVED_OBJECT_ERROR, |
|
OBSERVED_ATTRIBUTE_ERROR, |
|
OBSERVED_ATTRIBUTE_TYPE_ERROR, |
|
STRING_TO_COMPARE_VALUE_MATCHED, |
|
STRING_TO_COMPARE_VALUE_DIFFERED |
|
}; |
|
private static final MBeanNotificationInfo[] notifsInfo = { |
|
new MBeanNotificationInfo( |
|
types, |
|
"javax.management.monitor.MonitorNotification", |
|
"Notifications sent by the StringMonitor MBean") |
|
}; |
|
// Flags needed to implement the matching/differing mechanism. |
|
// |
|
private static final int MATCHING = 0; |
|
private static final int DIFFERING = 1; |
|
private static final int MATCHING_OR_DIFFERING = 2; |
|
/* |
|
* ------------------------------------------ |
|
* CONSTRUCTORS |
|
* ------------------------------------------ |
|
*/ |
|
/** |
|
* Default constructor. |
|
*/ |
|
public StringMonitor() { |
|
} |
|
/* |
|
* ------------------------------------------ |
|
* PUBLIC METHODS |
|
* ------------------------------------------ |
|
*/ |
|
/** |
|
* Starts the string monitor. |
|
*/ |
|
public synchronized void start() { |
|
if (isActive()) { |
|
MONITOR_LOGGER.logp(Level.FINER, StringMonitor.class.getName(), |
|
"start", "the monitor is already active"); |
|
return; |
|
} |
|
// Reset values. |
|
// |
|
for (ObservedObject o : observedObjects) { |
|
final StringMonitorObservedObject smo = |
|
(StringMonitorObservedObject) o; |
|
smo.setStatus(MATCHING_OR_DIFFERING); |
|
} |
|
doStart(); |
|
} |
|
/** |
|
* Stops the string monitor. |
|
*/ |
|
public synchronized void stop() { |
|
doStop(); |
|
} |
|
// GETTERS AND SETTERS |
|
//-------------------- |
|
/** |
|
* Gets the derived gauge of the specified object, if this object is |
|
* contained in the set of observed MBeans, or <code>null</code> otherwise. |
|
* |
|
* @param object the name of the MBean whose derived gauge is required. |
|
* |
|
* @return The derived gauge of the specified object. |
|
* |
|
*/ |
|
@Override |
|
public synchronized String getDerivedGauge(ObjectName object) { |
|
return (String) super.getDerivedGauge(object); |
|
} |
|
/** |
|
* Gets the derived gauge timestamp of the specified object, if |
|
* this object is contained in the set of observed MBeans, or |
|
* <code>0</code> otherwise. |
|
* |
|
* @param object the name of the object whose derived gauge |
|
* timestamp is to be returned. |
|
* |
|
* @return The derived gauge timestamp of the specified object. |
|
* |
|
*/ |
|
@Override |
|
public synchronized long getDerivedGaugeTimeStamp(ObjectName object) { |
|
return super.getDerivedGaugeTimeStamp(object); |
|
} |
|
/** |
|
* Returns the derived gauge of the first object in the set of |
|
* observed MBeans. |
|
* |
|
* @return The derived gauge. |
|
* |
|
* @deprecated As of JMX 1.2, replaced by |
|
* {@link #getDerivedGauge(ObjectName)} |
|
*/ |
|
@Deprecated |
|
public synchronized String getDerivedGauge() { |
|
if (observedObjects.isEmpty()) { |
|
return null; |
|
} else { |
|
return (String) observedObjects.get(0).getDerivedGauge(); |
|
} |
|
} |
|
/** |
|
* Gets the derived gauge timestamp of the first object in the set |
|
* of observed MBeans. |
|
* |
|
* @return The derived gauge timestamp. |
|
* |
|
* @deprecated As of JMX 1.2, replaced by |
|
* {@link #getDerivedGaugeTimeStamp(ObjectName)} |
|
*/ |
|
@Deprecated |
|
public synchronized long getDerivedGaugeTimeStamp() { |
|
if (observedObjects.isEmpty()) { |
|
return 0; |
|
} else { |
|
return observedObjects.get(0).getDerivedGaugeTimeStamp(); |
|
} |
|
} |
|
/** |
|
* Gets the string to compare with the observed attribute common |
|
* to all observed MBeans. |
|
* |
|
* @return The string value. |
|
* |
|
* @see #setStringToCompare |
|
*/ |
|
public synchronized String getStringToCompare() { |
|
return stringToCompare; |
|
} |
|
/** |
|
* Sets the string to compare with the observed attribute common |
|
* to all observed MBeans. |
|
* |
|
* @param value The string value. |
|
* |
|
* @exception IllegalArgumentException The specified |
|
* string to compare is null. |
|
* |
|
* @see #getStringToCompare |
|
*/ |
|
public synchronized void setStringToCompare(String value) |
|
throws IllegalArgumentException { |
|
if (value == null) { |
|
throw new IllegalArgumentException("Null string to compare"); |
|
} |
|
if (stringToCompare.equals(value)) |
|
return; |
|
stringToCompare = value; |
|
// Reset values. |
|
// |
|
for (ObservedObject o : observedObjects) { |
|
final StringMonitorObservedObject smo = |
|
(StringMonitorObservedObject) o; |
|
smo.setStatus(MATCHING_OR_DIFFERING); |
|
} |
|
} |
|
/** |
|
* Gets the matching notification's on/off switch value common to |
|
* all observed MBeans. |
|
* |
|
* @return <CODE>true</CODE> if the string monitor notifies when |
|
* matching the string to compare, <CODE>false</CODE> otherwise. |
|
* |
|
* @see #setNotifyMatch |
|
*/ |
|
public synchronized boolean getNotifyMatch() { |
|
return notifyMatch; |
|
} |
|
/** |
|
* Sets the matching notification's on/off switch value common to |
|
* all observed MBeans. |
|
* |
|
* @param value The matching notification's on/off switch value. |
|
* |
|
* @see #getNotifyMatch |
|
*/ |
|
public synchronized void setNotifyMatch(boolean value) { |
|
if (notifyMatch == value) |
|
return; |
|
notifyMatch = value; |
|
} |
|
/** |
|
* Gets the differing notification's on/off switch value common to |
|
* all observed MBeans. |
|
* |
|
* @return <CODE>true</CODE> if the string monitor notifies when |
|
* differing from the string to compare, <CODE>false</CODE> otherwise. |
|
* |
|
* @see #setNotifyDiffer |
|
*/ |
|
public synchronized boolean getNotifyDiffer() { |
|
return notifyDiffer; |
|
} |
|
/** |
|
* Sets the differing notification's on/off switch value common to |
|
* all observed MBeans. |
|
* |
|
* @param value The differing notification's on/off switch value. |
|
* |
|
* @see #getNotifyDiffer |
|
*/ |
|
public synchronized void setNotifyDiffer(boolean value) { |
|
if (notifyDiffer == value) |
|
return; |
|
notifyDiffer = value; |
|
} |
|
/** |
|
* Returns a <CODE>NotificationInfo</CODE> object containing the name of |
|
* the Java class of the notification and the notification types sent by |
|
* the string monitor. |
|
*/ |
|
@Override |
|
public MBeanNotificationInfo[] getNotificationInfo() { |
|
return notifsInfo.clone(); |
|
} |
|
/* |
|
* ------------------------------------------ |
|
* PACKAGE METHODS |
|
* ------------------------------------------ |
|
*/ |
|
/** |
|
* Factory method for ObservedObject creation. |
|
* |
|
* @since 1.6 |
|
*/ |
|
@Override |
|
ObservedObject createObservedObject(ObjectName object) { |
|
final StringMonitorObservedObject smo = |
|
new StringMonitorObservedObject(object); |
|
smo.setStatus(MATCHING_OR_DIFFERING); |
|
return smo; |
|
} |
|
/** |
|
* Check that the type of the supplied observed attribute |
|
* value is one of the value types supported by this monitor. |
|
*/ |
|
@Override |
|
synchronized boolean isComparableTypeValid(ObjectName object, |
|
String attribute, |
|
Comparable<?> value) { |
|
// Check that the observed attribute is of type "String". |
|
// |
|
if (value instanceof String) { |
|
return true; |
|
} |
|
return false; |
|
} |
|
@Override |
|
synchronized void onErrorNotification(MonitorNotification notification) { |
|
final StringMonitorObservedObject o = (StringMonitorObservedObject) |
|
getObservedObject(notification.getObservedObject()); |
|
if (o == null) |
|
return; |
|
// Reset values. |
|
// |
|
o.setStatus(MATCHING_OR_DIFFERING); |
|
} |
|
@Override |
|
synchronized MonitorNotification buildAlarmNotification( |
|
ObjectName object, |
|
String attribute, |
|
Comparable<?> value) { |
|
String type = null; |
|
String msg = null; |
|
Object trigger = null; |
|
final StringMonitorObservedObject o = |
|
(StringMonitorObservedObject) getObservedObject(object); |
|
if (o == null) |
|
return null; |
|
// Send matching notification if notifyMatch is true. |
|
// Send differing notification if notifyDiffer is true. |
|
// |
|
if (o.getStatus() == MATCHING_OR_DIFFERING) { |
|
if (o.getDerivedGauge().equals(stringToCompare)) { |
|
if (notifyMatch) { |
|
type = STRING_TO_COMPARE_VALUE_MATCHED; |
|
msg = ""; |
|
trigger = stringToCompare; |
|
} |
|
o.setStatus(DIFFERING); |
|
} else { |
|
if (notifyDiffer) { |
|
type = STRING_TO_COMPARE_VALUE_DIFFERED; |
|
msg = ""; |
|
trigger = stringToCompare; |
|
} |
|
o.setStatus(MATCHING); |
|
} |
|
} else { |
|
if (o.getStatus() == MATCHING) { |
|
if (o.getDerivedGauge().equals(stringToCompare)) { |
|
if (notifyMatch) { |
|
type = STRING_TO_COMPARE_VALUE_MATCHED; |
|
msg = ""; |
|
trigger = stringToCompare; |
|
} |
|
o.setStatus(DIFFERING); |
|
} |
|
} else if (o.getStatus() == DIFFERING) { |
|
if (!o.getDerivedGauge().equals(stringToCompare)) { |
|
if (notifyDiffer) { |
|
type = STRING_TO_COMPARE_VALUE_DIFFERED; |
|
msg = ""; |
|
trigger = stringToCompare; |
|
} |
|
o.setStatus(MATCHING); |
|
} |
|
} |
|
} |
|
return new MonitorNotification(type, |
|
this, |
|
0, |
|
0, |
|
msg, |
|
null, |
|
null, |
|
null, |
|
trigger); |
|
} |
|
} |