package org.opennaas.core.resources.alarms;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.opennaas.core.events.EventFilter;
import org.opennaas.core.events.IEventManager;
import org.opennaas.core.resources.ResourceNotFoundException;
import org.osgi.service.event.Event;
import org.osgi.service.event.EventHandler;
public class AlarmsRepository implements IAlarmsRepository, EventHandler {
/** logger */
private Log log = LogFactory.getLog(AlarmsRepository.class);
/** The map of running resource instances **/
protected Map<String, List<AlarmElement>> alarmsRepository = null;
public AlarmsRepository() {
alarmsRepository = new HashMap<String, List<AlarmElement>>();
}
/**
* Blueprint callback (executed when EventManager is available)
*
* @param eventManager
*/
public void setEventManager(IEventManager eventManager) {
/* register alarms repository */
try {
EventFilter filter = new EventFilter(ResourceAlarm.TOPIC);
eventManager.registerEventHandler(this, filter);
} catch (Exception e) {
log.error(e.getMessage());
}
log.info("Alarms repository is registered!!");
}
@Override
public String addResourceAlarm(ResourceAlarm resourceAlarm, String resourceId) {
String alarmId = UUID.randomUUID().toString();
List<AlarmElement> alarms = null;
if (alarmsRepository.containsKey(resourceId)) {
alarms = alarmsRepository.get(resourceId);
} else {
alarms = new ArrayList<AlarmElement>();
}
AlarmElement alarmElement = new AlarmElement(resourceAlarm, alarmId);
alarms.add(alarmElement);
alarmsRepository.put(resourceId, alarms);
return alarmId;
}
@Override
public void clear() {
alarmsRepository.clear();
}
@Override
public void clearResourceAlarms(String resourceId) {
List<AlarmElement> alarmElems = alarmsRepository.get(resourceId);
if (alarmElems != null) {
alarmsRepository.remove(resourceId);
}
log.debug("Alarms cleared for resource " + resourceId);
}
@Override
public ResourceAlarm getAlarmById(String alarmId) throws ResourceNotFoundException {
Set<String> keys = alarmsRepository.keySet();
for (String key : keys) {
List<AlarmElement> alarms = alarmsRepository.get(key);
for (AlarmElement elemAlarm : alarms) {
if (elemAlarm.id.equals(alarmId))
return elemAlarm.alarm;
}
}
throw new ResourceNotFoundException("Alarm not found in repository");
}
@Override
public List<ResourceAlarm> getAlarms() {
List<ResourceAlarm> resourceAlarms = new ArrayList<ResourceAlarm>();
Set<String> keys = alarmsRepository.keySet();
for (String key : keys) {
List<AlarmElement> alarmElems = alarmsRepository.get(key);
if (alarmElems != null) {
for (AlarmElement alarmElem : alarmElems) {
resourceAlarms.add(alarmElem.alarm);
}
}
}
return resourceAlarms;
}
@Override
public List<ResourceAlarm> getResourceAlarms(String resourceId) throws ResourceNotFoundException {
List<ResourceAlarm> resourceAlarms = new ArrayList<ResourceAlarm>();
List<AlarmElement> alarmElems = alarmsRepository.get(resourceId);
if (alarmElems != null) {
for (AlarmElement alarmElem : alarmElems) {
resourceAlarms.add(alarmElem.alarm);
}
}
return resourceAlarms;
}
public Map<String, List<AlarmElement>> getAlarmRepository() {
return alarmsRepository;
}
class AlarmElement {
ResourceAlarm alarm = null;
String id = null;
public AlarmElement(ResourceAlarm resourceAlarm, String alarmId) {
alarm = resourceAlarm;
id = alarmId;
}
public ResourceAlarm getAlarm() {
return alarm;
}
public void setAlarm(ResourceAlarm alarm) {
this.alarm = alarm;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public boolean equals(Object obj) {
AlarmElement toCompare = (AlarmElement) obj;
return (this.id.equals(toCompare.id));
}
}
@Override
public void handleEvent(Event event) {
if (event instanceof ResourceAlarm) {
ResourceAlarm resourceAlarm = (ResourceAlarm) event;
String resourceId = (String) resourceAlarm.getProperty(ResourceAlarm.RESOURCE_ID_PROPERTY);
addResourceAlarm(resourceAlarm, resourceId);
}
}
}