/*
 * 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.servicemix.components.jmx;

import javax.jbi.JBIException;
import javax.jbi.component.ComponentContext;
import javax.jbi.management.DeploymentException;
import javax.jbi.messaging.InOnly;
import javax.jbi.messaging.MessageExchange;
import javax.jbi.messaging.MessagingException;
import javax.jbi.messaging.NormalizedMessage;
import javax.management.MBeanServer;
import javax.management.Notification;
import javax.management.NotificationListener;
import javax.management.ObjectName;
import javax.management.monitor.CounterMonitor;
import javax.xml.transform.Source;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.servicemix.MessageExchangeListener;
import org.apache.servicemix.components.util.ComponentSupport;
import org.apache.servicemix.jbi.jaxp.StringSource;

/**
 * A JMX Counter Monitor as a Component to enable firing notifications
 * 
 * @version $Revision: 426415 $
 */
public class CounterMonitorComponent extends ComponentSupport implements NotificationListener, MessageExchangeListener {
    
    private static final Log log = LogFactory.getLog(ComponentSupport.class);
    private String name;
    private ObjectName ourName;
    private String observedObjectName;
    private String attributeName;
    private long granularityPeriod =5000;
    private Number threshold;
    private Number offset;
    private MBeanServer mbeanServer;
    private CounterMonitor counterMonitor = new CounterMonitor();

    /**
     * Called when the Component is initialized
     * 
     * @param cc
     * @throws JBIException
     */
    public void init(ComponentContext cc) throws JBIException {
        super.init(cc);
        validate();
        if (mbeanServer == null) {
            mbeanServer = cc.getMBeanServer();
        }
        try {
            ObjectName observedName = new ObjectName(observedObjectName);
            if (name == null) {
                String type = observedName.getKeyProperty("type");
                type = type != null ? type : "UNKNOWN";
                name = mbeanServer.getDefaultDomain() + ":type=CounterMonitor_" + type;
            }
            ourName = new ObjectName(name);
            counterMonitor.setNotify(true);
            counterMonitor.addObservedObject(observedName);
            counterMonitor.setObservedAttribute(attributeName);
            counterMonitor.setGranularityPeriod(granularityPeriod);
            counterMonitor.setDifferenceMode(false);
            counterMonitor.setInitThreshold(threshold);
            counterMonitor.setOffset(offset);
            mbeanServer.registerMBean(counterMonitor, ourName);
            mbeanServer.addNotificationListener(ourName, this, null, new Object());
        } catch (Exception e) {
            throw new DeploymentException(e);
        }
    }

    /**
     * Start the item.
     * 
     * @exception javax.jbi.JBIException
     *                if the item fails to start.
     */
    public void start() throws javax.jbi.JBIException {
        super.start();
        counterMonitor.start();
    }

    /**
     * Stop the item. This suspends current messaging activities.
     * 
     * @exception javax.jbi.JBIException
     *                if the item fails to stop.
     */
    public void stop() throws javax.jbi.JBIException {
        counterMonitor.stop();
        super.stop();
    }

    /**
     * Shut down the item. The releases resources, preparatory to uninstallation.
     * 
     * @exception javax.jbi.JBIException
     *                if the item fails to shut down.
     */
    public void shutDown() throws javax.jbi.JBIException {
        stop();
        if (ourName != null && mbeanServer != null) {
            try{
                mbeanServer.removeNotificationListener(ourName,this);
            } catch(Exception e) {
                throw new JBIException(e);
            }
        }
        super.shutDown();
    }

   
    /**
     * @see javax.management.NotificationListener#handleNotification(javax.management.Notification, java.lang.Object)
     */
    public void handleNotification(Notification notification,Object arg1) {
        try {
            Source source = new StringSource(notification.getMessage());
            InOnly exchange = getExchangeFactory().createInOnlyExchange();
            NormalizedMessage message = exchange.createMessage();
            message.setContent(source);
            exchange.setInMessage(message);
            send(exchange);
        }
        catch (Exception e) {
            log.error("Failed to send Notification message to the NMR");
        }
        
    }

    protected void validate() throws JBIException {
        if (observedObjectName == null) {
            throw new DeploymentException("observedObjectName is null");
        }
        if (attributeName == null) {
            throw new DeploymentException("attributeName is null");
        }
        if (threshold == null) {
            throw new DeploymentException("threshold is null");
        }
        if (offset == null) {
            throw new DeploymentException("offset is null");
        }
    }

    /**
     * @return Returns the attributeName.
     */
    public String getAttributeName() {
        return attributeName;
    }

    /**
     * @param attributeName
     *            The attributeName to set.
     */
    public void setAttributeName(String attributeName) {
        this.attributeName = attributeName;
    }

    /**
     * @return Returns the counterMonitor.
     */
    public CounterMonitor getCounterMonitor() {
        return counterMonitor;
    }

    /**
     * @param counterMonitor The counterMonitor to set.
     */
    public void setCounterMonitor(CounterMonitor counterMonitor) {
        this.counterMonitor = counterMonitor;
    }

    /**
     * @return Returns the granularityPeriod.
     */
    public long getGranularityPeriod() {
        return granularityPeriod;
    }

    /**
     * @param granularityPeriod The granularityPeriod to set.
     */
    public void setGranularityPeriod(long granularityPeriod) {
        this.granularityPeriod = granularityPeriod;
    }

    /**
     * @return Returns the mbeanServer.
     */
    public MBeanServer getMbeanServer() {
        return mbeanServer;
    }

    /**
     * @param mbeanServer The mbeanServer to set.
     */
    public void setMbeanServer(MBeanServer mbeanServer) {
        this.mbeanServer = mbeanServer;
    }

    /**
     * @return Returns the name.
     */
    public String getName() {
        return name;
    }

    /**
     * @param name The name to set.
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * @return Returns the observedObjectName.
     */
    public String getObservedObjectName() {
        return observedObjectName;
    }

    /**
     * @param observedObjectName The observedObjectName to set.
     */
    public void setObservedObjectName(String observedObjectName) {
        this.observedObjectName = observedObjectName;
    }

    /**
     * @return Returns the offset.
     */
    public Number getOffset() {
        return offset;
    }

    /**
     * @param offset The offset to set.
     */
    public void setOffset(Number offset) {
        this.offset = offset;
    }

    /**
     * @return Returns the threshold.
     */
    public Number getThreshold() {
        return threshold;
    }

    /**
     * @param threshold The threshold to set.
     */
    public void setThreshold(Number threshold) {
        this.threshold = threshold;
    }

    public void onMessageExchange(MessageExchange exchange) throws MessagingException {
        // We can only receive acks, so do nothing
    }
}
