Open Source Repository

Home /spring/spring-context-3.0.5 | Repository Home



org/springframework/jmx/support/NotificationListenerHolder.java
/*
 * Copyright 2002-2008 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.jmx.support;

import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.Set;
import javax.management.MalformedObjectNameException;
import javax.management.NotificationFilter;
import javax.management.NotificationListener;
import javax.management.ObjectName;

import org.springframework.util.ObjectUtils;

/**
 * Helper class that aggregates a {@link javax.management.NotificationListener},
 * a {@link javax.management.NotificationFilter}, and an arbitrary handback
 * object, as well as the names of MBeans from which the listener wishes
 * to receive {@link javax.management.Notification Notifications}.
 *
 @author Juergen Hoeller
 @since 2.5.2
 @see org.springframework.jmx.export.NotificationListenerBean
 @see org.springframework.jmx.access.NotificationListenerRegistrar
 */
public class NotificationListenerHolder {

  private NotificationListener notificationListener;

  private NotificationFilter notificationFilter;

  private Object handback;

  protected Set<Object> mappedObjectNames;


  /**
   * Set the {@link javax.management.NotificationListener}.
   */
  public void setNotificationListener(NotificationListener notificationListener) {
    this.notificationListener = notificationListener;
  }

  /**
   * Get the {@link javax.management.NotificationListener}.
   */
  public NotificationListener getNotificationListener() {
    return this.notificationListener;
  }

  /**
   * Set the {@link javax.management.NotificationFilter} associated
   * with the encapsulated {@link #getNotificationFilter() NotificationFilter}.
   <p>May be <code>null</code>.
   */
  public void setNotificationFilter(NotificationFilter notificationFilter) {
    this.notificationFilter = notificationFilter;
  }

  /**
   * Return the {@link javax.management.NotificationFilter} associated
   * with the encapsulated {@link #getNotificationFilter() NotificationFilter}.
   <p>May be <code>null</code>.
   */
  public NotificationFilter getNotificationFilter() {
    return this.notificationFilter;
  }

  /**
   * Set the (arbitrary) object that will be 'handed back' as-is by an
   {@link javax.management.NotificationBroadcaster} when notifying
   * any {@link javax.management.NotificationListener}.
   @param handback the handback object (can be <code>null</code>)
   @see javax.management.NotificationListener#handleNotification(javax.management.Notification, Object)
   */
  public void setHandback(Object handback) {
    this.handback = handback;
  }

  /**
   * Return the (arbitrary) object that will be 'handed back' as-is by an
   {@link javax.management.NotificationBroadcaster} when notifying
   * any {@link javax.management.NotificationListener}.
   @return the handback object (may be <code>null</code>)
   @see javax.management.NotificationListener#handleNotification(javax.management.Notification, Object)
   */
  public Object getHandback() {
    return this.handback;
  }

  /**
   * Set the {@link javax.management.ObjectName}-style name of the single MBean
   * that the encapsulated {@link #getNotificationFilter() NotificationFilter}
   * will be registered with to listen for {@link javax.management.Notification Notifications}.
   * Can be specified as <code>ObjectName</code> instance or as <code>String</code>.
   @see #setMappedObjectNames
   */
  public void setMappedObjectName(Object mappedObjectName) {
    setMappedObjectNames(mappedObjectName != null new Object[] {mappedObjectNamenull);
  }

  /**
   * Set an array of {@link javax.management.ObjectName}-style names of the MBeans
   * that the encapsulated {@link #getNotificationFilter() NotificationFilter}
   * will be registered with to listen for {@link javax.management.Notification Notifications}.
   * Can be specified as <code>ObjectName</code> instances or as <code>String</code>s.
   @see #setMappedObjectName
   */
  public void setMappedObjectNames(Object[] mappedObjectNames) {
    this.mappedObjectNames = (mappedObjectNames != null ?
        new LinkedHashSet<Object>(Arrays.asList(mappedObjectNames)) null);
  }

  /**
   * Return the list of {@link javax.management.ObjectName} String representations for
   * which the encapsulated {@link #getNotificationFilter() NotificationFilter} will
   * be registered as a listener for {@link javax.management.Notification Notifications}.
   @throws MalformedObjectNameException if an <code>ObjectName</code> is malformed
   */
  public ObjectName[] getResolvedObjectNames() throws MalformedObjectNameException {
    if (this.mappedObjectNames == null) {
      return null;
    }
    ObjectName[] resolved = new ObjectName[this.mappedObjectNames.size()];
    int i = 0;
    for (Object objectName : this.mappedObjectNames) {
      resolved[i= ObjectNameManager.getInstance(objectName);
      i++;
    }
    return resolved;
  }


  @Override
  public boolean equals(Object other) {
    if (this == other) {
      return true;
    }
    if (!(other instanceof NotificationListenerHolder)) {
      return false;
    }
    NotificationListenerHolder otherNlh = (NotificationListenerHolderother;
    return (ObjectUtils.nullSafeEquals(this.notificationListener, otherNlh.notificationListener&&
        ObjectUtils.nullSafeEquals(this.notificationFilter, otherNlh.notificationFilter&&
        ObjectUtils.nullSafeEquals(this.handback, otherNlh.handback&&
        ObjectUtils.nullSafeEquals(this.mappedObjectNames, otherNlh.mappedObjectNames));
  }

  @Override
  public int hashCode() {
    int hashCode = ObjectUtils.nullSafeHashCode(this.notificationListener);
    hashCode = 29 * hashCode + ObjectUtils.nullSafeHashCode(this.notificationFilter);
    hashCode = 29 * hashCode + ObjectUtils.nullSafeHashCode(this.handback);
    hashCode = 29 * hashCode + ObjectUtils.nullSafeHashCode(this.mappedObjectNames);
    return hashCode;
  }

}