package javax.slee.management;
import javax.management.ObjectName;
/**
* This class identifies a notification such as an {@link AlarmNotification alarm} or
* {@link TraceNotification trace} notification as being generated from some internal
* subsystem in the SLEE.
* @since SLEE 1.1
*/
public final class SubsystemNotification extends AbstractNotificationSource implements NotificationSource {
/**
* The JMX notification type of alarm notifications that are generated in response
* to an internal component or subsystem of the SLEE interacting with the
* {@link javax.slee.facilities.AlarmFacility} (or a similar internal interface).
* <p>
* The notification type is equal to the string "javax.slee.management.alarm.subsystem".
*/
public static final String ALARM_NOTIFICATION_TYPE = "javax.slee.management.alarm.subsystem";
/**
* The JMX notification type of trace notifications that are generated in response
* to an internal component or subsystem of the SLEE interacting with a
* {@link javax.slee.facilities.Tracer} object (or a similar internal interface).
* <p>
* The notification type is equal to the string "javax.slee.management.trace.subsystem".
*/
public static final String TRACE_NOTIFICATION_TYPE = "javax.slee.management.trace.subsystem";
/**
* The JMX notification type of usage notifications that are generated by a
* {@link javax.slee.usage.UsageMBean} containing a <code>SubsystemNotification</code>
* as a notification source.
* <p>
* The notification type is equal to the string "javax.slee.management.usage.subsystem".
*/
public static final String USAGE_NOTIFICATION_TYPE = "javax.slee.management.usage.subsystem";
/**
* The JMX Object Name property key that identifies the name of the internal subsystem
* in a Usage MBean whose {@link javax.slee.usage.UsageMBean#NOTIFICATION_SOURCE_KEY}
* property has a value equal to {@link #USAGE_NOTIFICATION_TYPE}. This key is
* equal to the string "subsystemName".
* @see javax.slee.usage.UsageMBean#BASE_OBJECT_NAME
* @see javax.slee.usage.UsageMBean#NOTIFICATION_SOURCE_KEY
* @since SLEE 1.1
*/
public static final String SUBSYSTEM_NAME_KEY = "subsystemName";
/**
* Create a new <code>SubsystemNotification</code> object that uniquely identifies an
* internal component or subsystem of the SLEE.
* @param subsystemName the name of the SLEE internal component or subsystem. Subsystem
* names may be any vendor-defined string.
* @throws NullPointerException if <code>subsystemName</code> is <code>null</code>.
*/
public SubsystemNotification(String subsystemName) {
if (subsystemName == null) throw new NullPointerException("entityName is null");
this.subsystemName = subsystemName;
}
/**
* Get the name of the internal component or subsystem of the SLEE identified by this
* notification source.
* @return the name of the internal component or subsystem.
*/
public String getSubsystemName() {
return subsystemName;
}
/**
* Get the JMX notification type of alarm notifications generated in response
* to a SLEE internal component or subsystem interacting with the Alarm Facility.
* @return the string defined by {@link #ALARM_NOTIFICATION_TYPE}.
*/
public String getAlarmNotificationType() {
return ALARM_NOTIFICATION_TYPE;
}
/**
* Get the JMX notification type of trace notifications generated in response
* to a SLEE internal component or subsystem interacting with the Trace Facility.
* @return the string defined by {@link #TRACE_NOTIFICATION_TYPE}.
*/
public String getTraceNotificationType() {
return TRACE_NOTIFICATION_TYPE;
}
/**
* Get the JMX notification type of usage notifications generated in response
* to a SLEE internal component or subsystem interacting with its usage parameters.
* @return the string defined by {@link #USAGE_NOTIFICATION_TYPE}.
*/
public String getUsageNotificationType() {
return USAGE_NOTIFICATION_TYPE;
}
/**
* Get a JMX Object Name property string that uniquely identifies the specified SLEE
* internal component or subsystem, suitable for inclusion in the Object Name of a Usage
* MBean. This method makes use of the {@link javax.management.ObjectName#quote}</code>
* method to ensure that the name is valid for inclusion as property values in an Object
* Name.
* <p>
* This method can be used as follows to manually construct a complete Object Name
* for a Usage MBean:
* <br><ul><code>
* ObjectName name = new ObjectName(<br>
* {@link javax.slee.usage.UsageMBean#BASE_OBJECT_NAME} + "," +<br>
* {@link javax.slee.usage.UsageMBean#USAGE_PARAMETER_SET_NAME_KEY} + "=" + ObjectName.quote(paramSetName) + "," // optional<br>
* {@link javax.slee.usage.UsageMBean#NOTIFICATION_SOURCE_KEY} + "=" + {@link #USAGE_NOTIFICATION_TYPE SubsystemNotification.USAGE_NOTIFICATION_TYPE} + "," +<br>
* {@link #getUsageMBeanProperties(String) SubsystemNotification.getUsageMBeanProperties(subsystemName)}<br>
* );
* </code></ul>
* @param subsystemName the name of the SLEE internal component or subsystem.
* @return an Object Name property string that uniquely identifies the specified
* internal component or subsystem.
* @throws NullPointerException if <code>subsystem</code> is <code>null</code>.
*/
public static String getUsageMBeanProperties(String subsystemName) {
if (subsystemName == null) throw new NullPointerException("subsystemName is null");
return SUBSYSTEM_NAME_KEY + '=' + ObjectName.quote(subsystemName);
}
/**
* Get a JMX Object Name property string that uniquely identifies the SLEE internal
* component or subsystem of this notification source, suitable for inclusion in
* the Object Name of a Usage MBean.
* <p>
* This method is equivalent to {@link #getUsageMBeanProperties(String) getUsageMBeanProperties(getSubsystemName())}.
* @return an Object Name property string that uniquely identifies the
* internal component or subsystem.
* @return an Object Name property string that uniquely identifies the SLEE
* internal component or subsystem of this notification source.
*/
public String getUsageMBeanProperties() {
return getUsageMBeanProperties(subsystemName);
}
/**
* Compare this notification source for equality with another object.
* @param obj the object to compare this with.
* @return <code>true</code> if <code>obj</code> is an instance of this class and
* contains the subsystem name as this, <code>false</code> otherwise.
*/
public boolean equals(Object obj) {
if (obj == this) return true;
if (!(obj instanceof SubsystemNotification)) return false;
return this.subsystemName.equals(((SubsystemNotification)obj).subsystemName);
}
/**
* Get a hash code value for this notification source.
* @return a hash code value for this notification source.
*/
public int hashCode() {
return subsystemName.hashCode();
}
/**
* Get a string representation for this notification source.
* @return a string representation for this notification source.
* @see Object#toString()
*/
public String toString() {
StringBuffer buf = new StringBuffer();
buf.append("SubsystemNotification[subsystem=").append(subsystemName).append(']');
return buf.toString();
}
/**
* Compare this notification source with the specified object for order.
* Returns a negative integer, zero, or a positive integer if this object
* is less than, equal to, or greater than the specified object.
* <p>
* If <code>obj</code> is a <code>SubsystemNotification</code>, order is
* determined by comparing the encapsulated subsystem name. Otherwise, if
* <code>obj</code> is a <code>NotificationSource</code>, ordering is determined
* by comparing the class name of this class with the class name of <code>obj</code>.
* <p>
* @param obj the object to compare this with.
* @return a negative integer, zero, or a positive integer if this notification
* source is considered less than, equal to, or greater than the
* specified object.
* @throws ClassCastException if <code>obj</code> does not implement the
* {@link NotificationSource} interface.
* @see Comparable#compareTo(Object)
*/
public int compareTo(Object obj) {
// can't compare with null
if (obj == null) throw new NullPointerException("obj is null");
if (obj == this) return 0;
if (obj instanceof SubsystemNotification) {
// compare the profile table name
SubsystemNotification that = (SubsystemNotification)obj;
return this.subsystemName.compareTo(that.subsystemName);
}
else {
return super.compareTo(TYPE, obj);
}
}
// protected
protected String getClassName() {
return TYPE;
}
private final String subsystemName;
// constant to avoid expensive getClass() invocations at runtime
private static final String TYPE = SubsystemNotification.class.getName();
}