package org.opennaas.extensions.roadm.wonesys.protocols.listeners;
import java.util.Date;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.opennaas.core.resources.ActivatorException;
import org.opennaas.core.resources.alarms.SessionAlarm;
import org.opennaas.core.resources.protocol.ProtocolException;
import org.opennaas.extensions.roadm.wonesys.protocols.WonesysProtocolBundleActivator;
import org.opennaas.extensions.roadm.wonesys.protocols.alarms.WonesysAlarm;
import org.opennaas.extensions.roadm.wonesys.protocols.alarms.WonesysAlarmFactory;
import org.opennaas.extensions.roadm.wonesys.transports.rawsocket.RawSocketTransport;
import org.osgi.service.event.Event;
import org.osgi.service.event.EventHandler;
public class RawSocketAlarmListener implements EventHandler {
public static Log log = LogFactory.getLog(RawSocketAlarmListener.class);
private String sessionId;
private long creationTime;
public RawSocketAlarmListener(String sessionID) {
this.sessionId = sessionID;
creationTime = new Date().getTime();
log.info("Created RawSocketAlarmListener for session: " + sessionId);
}
@Override
public void handleEvent(Event event) {
// FIXME: remove log message
log.info("AlarmListener received a message!");
String message = (String) event.getProperty(RawSocketTransport.MESSAGE_PROPERTY_NAME);
if (message != null) {
if (isAlarm(message)) {
boolean isOld = false;
Long arrivalTime = (Long) event.getProperty(RawSocketTransport.ARRIVAL_TIME_PROPERTY_NAME);
if (arrivalTime != null) {
if (arrivalTime < creationTime)
isOld = true;
}
// Only publish if event arrived after listener creation
if (!isOld) {
try {
log.info("Session received an alarm: " + message + " created in " + arrivalTime);
createAndPublishAlarm(message);
} catch (ProtocolException e) {
log.error("Error publishing received alarm: " + message + ". Received alarm will be unavailable for the rest of the system",
e);
}
} else {
log.debug("Skipping old alarm: " + message);
}
}
}
}
private boolean isAlarm(String message) {
if (message.substring(0, 4).equalsIgnoreCase("ffff")
&& message.substring(14, 16).equalsIgnoreCase("ff"))
return true;
return false;
}
private void createAndPublishAlarm(String alarmMessage) throws ProtocolException {
Map<String, Object> properties = WonesysAlarmFactory.loadAlarmProperties(alarmMessage);
properties.put(SessionAlarm.SESSION_ID_PROPERTY, sessionId);
WonesysAlarm alarm = WonesysAlarmFactory.createAlarm(properties);
publishEvent(alarm);
}
private void publishEvent(Event event) throws ProtocolException {
try {
WonesysProtocolBundleActivator.getEventManagerService().publishEvent(event);
} catch (ActivatorException e) {
throw new ProtocolException("Failed to publish alarm", e);
}
}
}