/* 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.apache.felix.mosgi.jmx.rmiconnector.mx4j.remote;

import java.io.IOException;

import javax.management.NotificationBroadcasterSupport;
import javax.management.remote.JMXConnectionNotification;
import javax.management.remote.JMXConnector;
import javax.management.remote.rmi.RMIConnector;

/**
 *
 * @author <a href="mailto:biorn_steedom@users.sourceforge.net">Simone Bordet</a>
 * @version $Revision: 1.1.1.1 $
 */
public class ConnectionNotificationEmitter extends NotificationBroadcasterSupport
{
   private static long sequenceNumber;

   private JMXConnector connector;

   public ConnectionNotificationEmitter(JMXConnector connector)
   {
      this.connector = connector;
   }

   private long getNextNotificationNumber()
   {
      synchronized (RMIConnector.class)
      {
         return sequenceNumber++;
      }
   }

   private String getConnectionId()
   {
      try
      {
         return connector.getConnectionId();
      }
      catch (IOException x)
      {
         return null;
      }
   }

   public void sendConnectionNotificationOpened()
   {
      JMXConnectionNotification notification = new JMXConnectionNotification(JMXConnectionNotification.OPENED, connector, getConnectionId(), getNextNotificationNumber(), "Connection opened", null);
      sendNotification(notification);
   }

   public void sendConnectionNotificationClosed()
   {
      JMXConnectionNotification notification = new JMXConnectionNotification(JMXConnectionNotification.CLOSED, connector, getConnectionId(), getNextNotificationNumber(), "Connection closed", null);
      sendNotification(notification);
   }

   public void sendConnectionNotificationFailed()
   {
      JMXConnectionNotification notification = new JMXConnectionNotification(JMXConnectionNotification.FAILED, connector, getConnectionId(), getNextNotificationNumber(), "Connection failed", null);
      sendNotification(notification);
   }

   public void sendConnectionNotificationLost(long howMany)
   {
      JMXConnectionNotification notification = new JMXConnectionNotification(JMXConnectionNotification.NOTIFS_LOST, connector, getConnectionId(), getNextNotificationNumber(), "Some notification (" + howMany + ") was lost", null);
      sendNotification(notification);
   }
}
