/* * 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. *
* A string monitor sends notifications as follows: *
true
.
* true
.
* false
.
*/
private boolean notifyMatch = false;
/**
* Flag indicating if the string monitor notifies when differing
* from the string to compare.
* false
.
*/
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 null
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
* 0
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 true
if the string monitor notifies when
* matching the string to compare, false
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 true
if the string monitor notifies when
* differing from the string to compare, false
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 NotificationInfo
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);
}
}