/*
* Copyright (c) 1999, 2007, Oracle and/or its affiliates. All rights reserved.
* ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*/
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);
}
}