MonitorAdminEventHandler.java :  » OSGi » osgilab » org » knowhowlab » osgi » jmx » beans » service » monitor » Java Open Source

Java Open Source » OSGi » osgilab 
osgilab » org » knowhowlab » osgi » jmx » beans » service » monitor » MonitorAdminEventHandler.java
/*
 * Copyright (c) 2010 Dmytro Pishchukhin (http://knowhowlab.org)
 *
 * 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.knowhowlab.osgi.jmx.beans.service.monitor;

import org.knowhowlab.osgi.jmx.beans.LogVisitor;
import org.knowhowlab.osgi.jmx.beans.OsgiVisitor;
import org.knowhowlab.osgi.jmx.service.monitor.MonitorAdminMBean;
import org.osgi.service.event.Event;
import org.osgi.service.event.EventConstants;
import org.osgi.service.event.EventHandler;

import javax.management.Notification;
import javax.management.NotificationBroadcaster;
import javax.management.NotificationBroadcasterSupport;
import javax.management.openmbean.CompositeDataSupport;
import java.util.Dictionary;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;

/**
 * MonitorAdmin events handler
 *
 * @author dmytro.pishchukhin
 */
public class MonitorAdminEventHandler implements EventHandler {
    /**
     * System property that enables all MonitorAdmin events notification
     */
    public static final String MONITOR_ADMIN_ALL_EVENTS_NOTIFICATION_PROPS = "org.knowhowlab.osgi.jmx.beans.service.monitor.all.events";
    /**
     * <code>MonitorAdmin</code> events topic
     */
    public final static String TOPIC = "org/osgi/service/monitor";
    /**
     * <code>Monitorable</code> ID
     */
    public final static String MON_MONITORABLE_PID = "mon.monitorable.pid";
    /**
     * <code>StatusVariable</code> name
     */
    public final static String MON_STATUSVARIABLE_NAME = "mon.statusvariable.name";
    /**
     * <code>StatusVariable</code> value
     */
    public final static String MON_STATUSVARIABLE_VALUE = "mon.statusvariable.value";
    /**
     * Initiator
     */
    public final static String MON_LISTENER_ID = "mon.listener.id";

    private int sequenceNumber = 0;
    private OsgiVisitor visitor;
    private LogVisitor logVisitor;
    private NotificationBroadcasterSupport nbs;
    private NotificationBroadcaster broadcaster;

    public MonitorAdminEventHandler(OsgiVisitor visitor, LogVisitor logVisitor,
                                    NotificationBroadcasterSupport nbs, NotificationBroadcaster broadcaster) {
        this.visitor = visitor;
        this.logVisitor = logVisitor;
        this.nbs = nbs;
        this.broadcaster = broadcaster;
    }

    public Dictionary<String, String> getHandlerProperties() {
        boolean allEvents = Boolean.valueOf(visitor.getProperty(MONITOR_ADMIN_ALL_EVENTS_NOTIFICATION_PROPS));
        Dictionary<String, String> props = new Hashtable<String, String>();
        props.put(EventConstants.EVENT_TOPIC, TOPIC);
        if (!allEvents) {
            props.put(EventConstants.EVENT_FILTER, String.format("(!(%s=*))", MON_LISTENER_ID));
        }
        return props;
    }

    public void handleEvent(Event event) {
        Notification notification = new Notification(MonitorAdminMBean.EVENT, broadcaster, ++sequenceNumber,
                System.currentTimeMillis());

        try {
            Map<String, String> values = new HashMap<String, String>();

            String monitorableId = (String) event.getProperty(MON_MONITORABLE_PID);
            values.put(MonitorAdminMBean.MONITORABLE_PID, monitorableId);

            String name = (String) event.getProperty(MON_STATUSVARIABLE_NAME);
            values.put(MonitorAdminMBean.STATUS_VARIABLE_NAME, name);

            String value = (String) event.getProperty(MON_STATUSVARIABLE_VALUE);
            values.put(MonitorAdminMBean.STATUS_VARIABLE_VALUE, value);

            String initiator = (String) event.getProperty(MON_LISTENER_ID);
            initiator = initiator != null ? initiator : "";
            values.put(MonitorAdminMBean.EVENT_INITIATOR, initiator);
            
            notification.setUserData(new CompositeDataSupport(MonitorAdminMBean.EVENT_TYPE, values));

            nbs.sendNotification(notification);
        } catch (Exception e) {
            logVisitor.warning("Unable to send MonitorAdminEvent notification", e);
        }
    }
}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.