/******************************************************************************* * This file is part of OpenNMS(R). * * Copyright (C) 2010-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.tools.spectrum; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.opennms.core.utils.LogUtils; import org.opennms.netmgt.xml.eventconf.Decode; import org.opennms.netmgt.xml.eventconf.Varbindsdecode; import org.springframework.core.io.FileSystemResource; import org.springframework.core.io.Resource; public class SpectrumUtils { private String m_modelTypeAssetField = "manufacturer"; private Map<String,EventTable> m_eventTableCache; public SpectrumUtils() { m_eventTableCache = new HashMap<String,EventTable>(); } public String translateAllSubstTokens(EventFormat format) { String untranslated = format.getContents(); String translated = untranslated; Matcher m = Pattern.compile("(?s)(\\{.*?\\})").matcher(untranslated); while (m.find()) { LogUtils.debugf(this, "Found a token [%s], replacing it with token [%s]", m.group(1), translateFormatSubstToken(m.group(1))); translated = translated.replace(m.group(1), translateFormatSubstToken(m.group(1))); LogUtils.debugf(this, "New translated string: %s", translated); } return translated; } /** * * @param inToken the substitution token from the Spectrum event format * @return the OpenNMS event XML equivalent for the inToken */ public String translateFormatSubstToken(String inToken) { if (inToken == null) { throw new IllegalArgumentException("The input token must be non-null"); } String outToken = inToken; if (inToken.startsWith("{d")) { outToken = "%time%"; } else if (inToken.equals("{t}")) { outToken = "%asset[" + m_modelTypeAssetField + "]%"; } else if (inToken.equals("{m}")) { outToken = "%nodelabel%"; } else if (inToken.equals("{e}")) { outToken = "%uei%"; } else if (inToken.startsWith("{I") || inToken.startsWith("{S") || inToken.startsWith("{T")) { Matcher m = Pattern.compile("^\\{\\s*[IST]\\s+(\\w+\\s+)?(\\d+)\\s*\\}$").matcher(inToken); if (m.matches()) { outToken = "%parm[#" + m.group(2) + "]%"; } } return outToken; } public List<Varbindsdecode> translateAllEventTables(EventFormat ef, String eventTablePath) throws IOException { List<Varbindsdecode> vbds = new ArrayList<Varbindsdecode>(); Pattern pat = Pattern.compile("^\\{\\s*T\\s+(\\w+)\\s+(\\d+)\\s*\\}"); for (String token : ef.getSubstTokens()) { Matcher mat = pat.matcher(token); if (mat.matches()) { LogUtils.debugf(this, "Token [%s] looks like an event-table, processing it", token); EventTable et = loadEventTable(eventTablePath, mat.group(1)); String parmId = "parm[#" + mat.group(2) + "]"; Varbindsdecode vbd = translateEventTable(et, parmId); LogUtils.debugf(this, "Loaded event-table [%s] with parm-ID [%s], with %d mappings", et.getTableName(), parmId, vbd.getDecodeCount()); vbds.add(translateEventTable(et, parmId)); } else { LogUtils.debugf(this, "Token [%s] does not look like an event-table, skipping it", token); } } LogUtils.debugf(this, "Translated %d event-tables for event-code [%s]", vbds.size(), ef.getEventCode()); return vbds; } public Varbindsdecode translateEventTable(EventTable et, String parmId) { Varbindsdecode vbd = new Varbindsdecode(); vbd.setParmid(parmId); for (Integer key : et.keySet()) { Decode decode = new Decode(); decode.setVarbindvalue(key.toString()); decode.setVarbinddecodedstring(et.get(key)); vbd.addDecode(decode); } return vbd; } public String translateSeverity(int spectrumSeverity) { if (spectrumSeverity == 0) return "Normal"; else if (spectrumSeverity == 1) return "Warning"; else if (spectrumSeverity == 2) return "Minor"; else if (spectrumSeverity == 3) return "Major"; else if (spectrumSeverity == 4) return "Critical"; else return "Indeterminate"; } private EventTable loadEventTable(String eventTablePath, String tableName) throws IOException { if (m_eventTableCache.containsKey(tableName)) { LogUtils.debugf(this, "Retrieving event-table [%s] from cache", tableName); return m_eventTableCache.get(tableName); } Resource tableFile = new FileSystemResource(eventTablePath + File.separator + tableName); EventTableReader etr = new EventTableReader(tableFile); LogUtils.debugf(this, "Attempting to load event-table [%s] from [%s]", tableName, tableFile); EventTable et = etr.getEventTable(); LogUtils.debugf(this, "Storing event-table [%s] in cache", tableName); return et; } public void setModelTypeAssetField(String fieldName) { m_modelTypeAssetField = fieldName; } public String getModelTypeAssetField() { return m_modelTypeAssetField; } }