/* * TeleStax, Open Source Cloud Communications Copyright 2012. * and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.mobicents.protocols.ss7.oam.common.alarm; import java.util.List; import javax.management.NotCompliantMBeanException; import javax.management.NotificationBroadcasterSupport; import org.mobicents.protocols.ss7.oam.common.jmx.MBeanHost; import org.mobicents.protocols.ss7.oam.common.jmx.MBeanType; import javolution.util.FastList; /** * * @author sergey vetyutnev * */ public class AlarmProvider extends NotificationBroadcasterSupport implements AlarmProviderMBean, AlarmListener { public static String ALARM_EVENT = "Alarm_Event"; private final MBeanHost beanHost; private final AlarmMediator alarmMediator; private List<AlarmMediator> alarmMediators = new FastList<AlarmMediator>(); private long sequenceNumber = 0; private String alarmProviderObjectPath; private String alarmProviderObjectPathWithSlash; private String name = "AlarmHost"; public AlarmProvider(MBeanHost beanHost, AlarmMediator alarmMediator) { super(); this.beanHost = beanHost; this.alarmMediator = alarmMediator; } public String getName() { return this.name; } public void setName(String val) { this.name = val; } public void start() { synchronized (this) { try { AlarmProviderStandardMBean sbean = new AlarmProviderStandardMBean(this, AlarmProviderMBean.class, this); this.beanHost.registerMBean(AlarmLayer.ALARM, AlarmManagementType.MANAGEMENT, this.name, sbean); } catch (NotCompliantMBeanException e) { // TODO Auto-generated catch block e.printStackTrace(); } alarmMediator.registerAlarmListener(this); this.registerAlarmMediator(alarmMediator); } } public void stop() { synchronized (this) { alarmMediator.unregisterAlarmListener(this); this.unregisterAlarmMediator(alarmMediator); } } public void registerAlarmMediator(AlarmMediator am) { synchronized (this.alarmMediators) { this.alarmMediators.add(am); } } public void unregisterAlarmMediator(AlarmMediator am) { synchronized (this.alarmMediators) { this.alarmMediators.remove(am); } } @Override public String getAlarmProviderObjectPath() { return alarmProviderObjectPath; } /** * Set a prefix that AlarmProvider will be add at the begin of AlarmMessage.ObjectPath field (without "/") */ public void setAlarmProviderObjectPath(String value) { alarmProviderObjectPath = value; if (alarmProviderObjectPath != null && !alarmProviderObjectPath.equals("")) alarmProviderObjectPathWithSlash = "/" + alarmProviderObjectPath; else alarmProviderObjectPathWithSlash = null; } @Override public CurrentAlarmList getCurrentAlarmList() { CurrentAlarmListImpl al = new CurrentAlarmListImpl(); synchronized (this.alarmMediators) { for (AlarmMediator amr : this.alarmMediators) { CurrentAlarmList temp = amr.getCurrentAlarmList(); for (AlarmMessage alm : temp.getCurrentAlarmList()) { if (alarmProviderObjectPath != null) alm.addPrefixToAlarmSource(alarmProviderObjectPath); al.addAlarm(alm); } } } al.sortAlarms(); return al; } @Override public void onAlarm(AlarmMessage alarm) { if (alarmProviderObjectPath != null) alarm.addPrefixToAlarmSource(alarmProviderObjectPath); this.doSendNotif(alarm); } private synchronized void doSendNotif(AlarmMessage alarm) { AlarmNotification notif = new AlarmNotification(ALARM_EVENT + "-" + alarmProviderObjectPath, "AlarmProvider", ++sequenceNumber, System.currentTimeMillis(), null, alarm); // String type, Object source, long sequenceNumber, long timeStamp, String msg, AlarmMessage alarmMessage // notif.setUserData(userData); this.sendNotification(notif); } public enum AlarmManagementType implements MBeanType { MANAGEMENT("Management"); private final String name; public static final String NAME_MANAGEMENT = "Management"; private AlarmManagementType(String name) { this.name = name; } public String getName() { return this.name; } public static AlarmManagementType getInstance(String name) { if (NAME_MANAGEMENT.equals(name)) { return MANAGEMENT; } return null; } } }