X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=vpnservice.git;a=blobdiff_plain;f=fcapsmanager%2Falarmmanager%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fvpnservice%2Ffcapsmanager%2Falarmmanager%2FAlarmNotificationListeners.java;fp=fcapsmanager%2Falarmmanager%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fvpnservice%2Ffcapsmanager%2Falarmmanager%2FAlarmNotificationListeners.java;h=7cb878516be58d63824d999bdff9a2ab591beb72;hp=0000000000000000000000000000000000000000;hb=de6f0c4da2c7ac55cd9059ea957483ad04bc21f3;hpb=d89e5915c691b50d173c44f9d09e3038838957a9 diff --git a/fcapsmanager/alarmmanager/src/main/java/org/opendaylight/vpnservice/fcapsmanager/alarmmanager/AlarmNotificationListeners.java b/fcapsmanager/alarmmanager/src/main/java/org/opendaylight/vpnservice/fcapsmanager/alarmmanager/AlarmNotificationListeners.java new file mode 100644 index 00000000..7cb87851 --- /dev/null +++ b/fcapsmanager/alarmmanager/src/main/java/org/opendaylight/vpnservice/fcapsmanager/alarmmanager/AlarmNotificationListeners.java @@ -0,0 +1,179 @@ +/* + * Copyright (c) 2016 Ericsson India Global Services Pvt Ltd. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.vpnservice.fcapsmanager.alarmmanager; + +import javax.management.*; +import java.lang.management.ManagementFactory; +import java.util.*; +import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.opendaylight.vpnservice.fcapsmanager.AlarmServiceFacade; + +public class AlarmNotificationListeners implements Runnable { + static Logger s_logger = LoggerFactory.getLogger(AlarmNotificationListeners.class); + private MBeanServer mbs = null; + private static String DOMAIN = "SDNC.FM"; + + private final DelegateListener delegateListener = new DelegateListener(); + private BundleContext context = null; + + public AlarmNotificationListeners(BundleContext context) { + this.context=context; + } + + /** + * Platform dependent bundle injects its handle and it is retrieved in the method + */ + private AlarmServiceFacade getAlarmServiceSPI (){ + AlarmServiceFacade service =null; + if(context != null) { + try { + ServiceReference serviceReference = context. + getServiceReference(AlarmServiceFacade.class.getName()); + service = (AlarmServiceFacade) context. + getService(serviceReference); + }catch (NullPointerException ex){ + service = null; + }catch (Exception e){ + s_logger.error("Exception {} occurred in getting AlarmServiceSPI",e); + } + } + return service; + } + + /** + * Gets register notification when a mbean is registered in platform Mbeanserver and checks if it is alarm mbean and add attribute notification listener to it. + * Gets attribute notification when alarm mbean is updated by the application. + */ + public class DelegateListener implements NotificationListener { + public void handleNotification(Notification notification, Object obj) { + if (notification instanceof MBeanServerNotification) { + MBeanServerNotification msnotification = + (MBeanServerNotification) notification; + String nType = msnotification.getType(); + ObjectName mbn = msnotification.getMBeanName(); + + if (nType.equals("JMX.mbean.registered")) { + if (mbn.toString().contains(DOMAIN)) { + s_logger.debug("Received registeration of Mbean "+mbn); + try { + mbs.addNotificationListener(mbn,delegateListener, null, null); + s_logger.debug("Added attribute notification listener for Mbean "+ mbn); + } catch (InstanceNotFoundException e) { + s_logger.error("Exception while adding attribute notification of mbean {}", e); + } + } + } + + if (nType.equals("JMX.mbean.unregistered")) { + if (mbn.toString().contains(DOMAIN)) { + s_logger.debug("Time: " + msnotification.getTimeStamp() + "MBean " + msnotification.getMBeanName()+" unregistered successfully"); + } + } + } + else if (notification instanceof AttributeChangeNotification) { + AttributeChangeNotification acn = + (AttributeChangeNotification) notification; + + s_logger.debug("Received attribute notification of Mbean: " + + notification.getSource() + + " for attribute:" + acn.getAttributeName() ); + + if(acn.getAttributeName().toString().equals("raiseAlarmObject")){ + + String value=acn.getNewValue().toString(); + value = value.replace(value.charAt(0), ' '); + value = value.replace(value.charAt(value.lastIndexOf("]")), ' '); + + String[] args =value.split(","); + s_logger.debug("Receive attribute value :"+args[0].trim()+args[1].trim()+args[2].trim()); + if(getAlarmServiceSPI() != null ) { + getAlarmServiceSPI().raiseAlarm(args[0].trim(),args[1].trim(),args[2].trim()); + } else { + s_logger.debug("Alarm service not available"); + } + + } else if(acn.getAttributeName().toString().equals("clearAlarmObject")){ + + String value=acn.getNewValue().toString(); + value = value.replace(value.charAt(0), ' '); + value = value.replace(value.charAt(value.lastIndexOf("]")), ' '); + + String[] args =value.split(","); + s_logger.debug("Receive attribute value :"+args[0].trim()+args[1].trim()+args[2].trim()); + if(getAlarmServiceSPI() != null ) + getAlarmServiceSPI().clearAlarm(args[0].trim(), args[1].trim(), args[2].trim()); + else + s_logger.debug("Alarm service not available"); + } + } + } + } + + /** + * Gets the platform MBeanServer instance and registers to get notification whenever alarm mbean is registered in the mbeanserver + */ + @Override + public void run() { + mbs = ManagementFactory.getPlatformMBeanServer(); + + queryMbeans(); + + ObjectName delegate = null; + try { + delegate = new ObjectName("JMImplementation:type=MBeanServerDelegate"); + } catch (MalformedObjectNameException e) { + e.printStackTrace(); + } + NotificationFilterSupport filter = new NotificationFilterSupport(); + filter.enableType("JMX.mbean.registered"); + filter.enableType("JMX.mbean.unregistered"); + + try { + mbs.addNotificationListener(delegate, delegateListener, filter, null); + s_logger.debug("Added registeration listener for Mbean {}",delegate); + } catch (InstanceNotFoundException e) { + s_logger.error("Failed to add registeration listener {}", e); + } + + waitForNotification(); + } + + /** + * Pre-provisioning case to handle all alarm mbeans which are registered before installation of framework bundle + * Queries the platform Mbeanserver to retrieve registered alarm mbean and add attribute notification listener to it + */ + public void queryMbeans() { + + Set names = + new TreeSet(mbs.queryNames(null, null)); + s_logger.debug("Queried MBeanServer for MBeans:"); + for (ObjectName beanName : names) { + if(beanName.toString().contains(DOMAIN)){ + try { + mbs.addNotificationListener(beanName,delegateListener, null, null); + s_logger.debug("Added attribute notification listener for Mbean "+ beanName); + } catch (InstanceNotFoundException e) { + s_logger.error("Failed to add attribute notification for Mbean {}", e); + } + } + } + } + public void waitForNotification() { + while(true){ + try { + Thread.sleep(50); + } + catch(Exception ex){ + ex.printStackTrace(); + } + } + } +} \ No newline at end of file