/*******************************************************************************
* This file is part of OpenNMS(R).
*
* Copyright (C) 2006-2011 The OpenNMS Group, Inc.
* OpenNMS(R) is Copyright (C) 1999-2011 The OpenNMS Group, Inc.
*
* OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc.
*
* OpenNMS(R) is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published
* by the Free Software Foundation, either version 3 of the License,
* or (at your option) any later version.
*
* OpenNMS(R) 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with OpenNMS(R). If not, see:
* http://www.gnu.org/licenses/
*
* For more information contact:
* OpenNMS(R) Licensing <license@opennms.org>
* http://www.opennms.org/
* http://www.opennms.com/
*******************************************************************************/
package org.opennms.netmgt.translator;
import java.util.Iterator;
import java.util.List;
import javax.sql.DataSource;
import org.opennms.netmgt.EventConstants;
import org.opennms.netmgt.config.EventTranslatorConfig;
import org.opennms.netmgt.daemon.AbstractServiceDaemon;
import org.opennms.netmgt.eventd.EventIpcManager;
import org.opennms.netmgt.model.events.EventBuilder;
import org.opennms.netmgt.model.events.EventListener;
import org.opennms.netmgt.model.events.EventUtils;
import org.opennms.netmgt.xml.event.Event;
import org.opennms.netmgt.xml.event.Events;
import org.opennms.netmgt.xml.event.Log;
import org.opennms.netmgt.xml.event.Parm;
/**
* <p>EventTranslator class.</p>
*
* @author <a href="mailto:brozow@opennms.org">Mathew Brozowski</a>
* @author <a href="mailto:david@opennms.org">David Hustace</a>
* @author <a href="mailto:mhuot@opennms.org">Mike Huot</a>
*/
public class EventTranslator extends AbstractServiceDaemon implements EventListener {
private static EventTranslator s_instance = new EventTranslator();
private volatile EventIpcManager m_eventMgr;
private volatile EventTranslatorConfig m_config;
private volatile boolean m_initialized = false;
private DataSource m_dataSource;
/**
* <p>Constructor for EventTranslator.</p>
*/
public EventTranslator() {
super(EventTranslatorConfig.TRANSLATOR_NAME);
}
/**
* <p>Constructor for EventTranslator.</p>
*
* @param eventMgr a {@link org.opennms.netmgt.eventd.EventIpcManager} object.
*/
public EventTranslator(EventIpcManager eventMgr) {
this();
setEventManager(eventMgr);
}
/**
* <p>setInstance</p>
*
* @param psk a {@link org.opennms.netmgt.translator.EventTranslator} object.
*/
public synchronized static void setInstance(EventTranslator psk) {
s_instance = psk;
}
/**
* <p>getInstance</p>
*
* @return a {@link org.opennms.netmgt.translator.EventTranslator} object.
*/
public synchronized static EventTranslator getInstance() {
return s_instance;
}
/**
* <p>onInit</p>
*/
protected void onInit() {
if (m_initialized) return;
checkPreRequisites();
createMessageSelectorAndSubscribe();
m_initialized = true;
}
private void checkPreRequisites() {
if (m_config == null)
throw new IllegalStateException("config has not been set");
if (m_eventMgr == null)
throw new IllegalStateException("eventManager has not been set");
if (m_dataSource == null)
throw new IllegalStateException("dataSource has not been set");
}
/**
* <p>onStop</p>
*/
protected void onStop() {
m_initialized = false;
m_eventMgr = null;
m_config = null;
}
private void createMessageSelectorAndSubscribe() {
// Subscribe to eventd
List<String> ueiList = m_config.getUEIList();
ueiList.add(EventConstants.RELOAD_DAEMON_CONFIG_UEI);
getEventManager().addEventListener(this, ueiList);
}
/** {@inheritDoc} */
public void onEvent(Event e) {
if (isReloadConfigEvent(e)) {
handleReloadEvent(e);
return;
}
if (getName().equals(e.getSource())) {
log().debug("onEvent: ignoring event with EventTranslator as source");
return;
}
if (!m_config.isTranslationEvent(e)) {
log().debug("onEvent: received event that matches no translations: \n"+EventUtils.toString(e));
return;
}
log().debug("onEvent: received valid registered translation event: \n"+EventUtils.toString(e));
List<Event> translated = m_config.translateEvent(e);
if (translated != null) {
Log log = new Log();
Events events = new Events();
for (Iterator<Event> iter = translated.iterator(); iter.hasNext();) {
Event event = iter.next();
events.addEvent(event);
log().debug("onEvent: sended translated event: \n"+EventUtils.toString(event));
}
log.setEvents(events);
getEventManager().sendNow(log);
}
}
/**
* Re-marshals the translator specs into the factory's config member and
* re-registers the UIEs with the eventProxy.
*
* @param e The reload daemon config event<code>Event</code>
*/
protected void handleReloadEvent(Event e) {
log().info("onEvent: reloading configuration....");
EventBuilder ebldr = null;
try {
List<String> previousUeis = m_config.getUEIList();
m_config.update();
//need to re-register the UEIs not including those the daemon
//registered separate from the config (i.e. reloadDaemonConfig)
getEventManager().removeEventListener(this, previousUeis);
getEventManager().addEventListener(this, m_config.getUEIList());
log().debug("onEvent: configuration reloaded.");
ebldr = new EventBuilder(EventConstants.RELOAD_DAEMON_CONFIG_SUCCESSFUL_UEI, getName());
ebldr.addParam(EventConstants.PARM_DAEMON_NAME, "Translator");
} catch (Throwable exception) {
log().error("onEvent: reload config failed:"+e, exception);
ebldr = new EventBuilder(EventConstants.RELOAD_DAEMON_CONFIG_FAILED_UEI, getName());
ebldr.addParam(EventConstants.PARM_DAEMON_NAME, "Translator");
ebldr.addParam(EventConstants.PARM_REASON, exception.getLocalizedMessage().substring(1, 128));
}
if (ebldr != null) {
m_eventMgr.sendNow(ebldr.getEvent());
}
log().info("onEvent: reload configuration: reload configuration contains "+m_config.getUEIList().size()+" UEI specs.");
}
private boolean isReloadConfigEvent(Event event) {
boolean isTarget = false;
if (EventConstants.RELOAD_DAEMON_CONFIG_UEI.equals(event.getUei())) {
List<Parm> parmCollection = event.getParmCollection();
for (Parm parm : parmCollection) {
if (EventConstants.PARM_DAEMON_NAME.equals(parm.getParmName()) &&
"Translator".equalsIgnoreCase(parm.getValue().getContent())) {
isTarget = true;
break;
}
}
log().debug("isReloadConfigEventTarget: Event Translator was target of reload event: "+isTarget);
}
return isTarget;
}
/**
* <p>getEventManager</p>
*
* @return a {@link org.opennms.netmgt.eventd.EventIpcManager} object.
*/
public EventIpcManager getEventManager() {
return m_eventMgr;
}
/**
* <p>setEventManager</p>
*
* @param eventMgr a {@link org.opennms.netmgt.eventd.EventIpcManager} object.
*/
public void setEventManager(EventIpcManager eventMgr) {
m_eventMgr = eventMgr;
}
/**
* <p>getConfig</p>
*
* @return a {@link org.opennms.netmgt.config.EventTranslatorConfig} object.
*/
public EventTranslatorConfig getConfig() {
return m_config;
}
/**
* <p>setConfig</p>
*
* @param config a {@link org.opennms.netmgt.config.EventTranslatorConfig} object.
*/
public void setConfig(EventTranslatorConfig config) {
m_config = config;
}
/**
* <p>getDataSource</p>
*
* @return a {@link javax.sql.DataSource} object.
*/
public DataSource getDataSource() {
return m_dataSource;
}
/**
* <p>setDataSource</p>
*
* @param dataSource a {@link javax.sql.DataSource} object.
*/
public void setDataSource(DataSource dataSource) {
m_dataSource = dataSource;
}
}