/******************************************************************************* * This file is part of OpenNMS(R). * * Copyright (C) 2009-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.poller.monitors; import java.sql.Statement; import java.sql.Connection; import java.sql.SQLException; import java.sql.ResultSet; import java.util.Map; import java.util.HashMap; import org.opennms.core.utils.ParameterMap; import org.opennms.netmgt.model.PollStatus; /** * <p>JDBCQueryMonitor class.</p> * * @author ranger * @version $Id: $ */ public final class JDBCQueryMonitor extends JDBCMonitor { private static final int OPERATOR_MAP_EQUALS = 0; private static final int OPERATOR_MAP_LESS_THAN = 1; private static final int OPERATOR_MAP_GREATER_THAN = 2; private static final int OPERATOR_MAP_NOT_EQUAL = 3; private static final int OPERATOR_MAP_LESS_THAN_EQUAL_TO = 4; private static final int OPERATOR_MAP_GREATER_THAN_EQUAL_TO = 5; private static final int QUERY_ACTION_ROW_COUNT = 0 ; private static final int QUERY_ACTION_COMPARE_STRING = 1; private static final int QUERY_ACTION_COMPARE_INT = 2; private static final int QUERY_ACTION_COMPARE_BOOLEAN = 3; private static Map <String,Integer>operatorMap = new HashMap<String, Integer>(); private static Map<String, Integer> actionMap = new HashMap<String, Integer>(); /** * <p>Constructor for JDBCQueryMonitor.</p> * * @throws java.lang.ClassNotFoundException if any. * @throws java.lang.InstantiationException if any. * @throws java.lang.IllegalAccessException if any. */ public JDBCQueryMonitor() throws ClassNotFoundException, InstantiationException, IllegalAccessException { super(); operatorMap.put("=", OPERATOR_MAP_EQUALS); operatorMap.put("<", OPERATOR_MAP_LESS_THAN); operatorMap.put(">", OPERATOR_MAP_GREATER_THAN); operatorMap.put("!=",OPERATOR_MAP_NOT_EQUAL); operatorMap.put("<=",OPERATOR_MAP_LESS_THAN_EQUAL_TO); operatorMap.put(">=",OPERATOR_MAP_GREATER_THAN_EQUAL_TO); actionMap.put( "row_count", QUERY_ACTION_ROW_COUNT); actionMap.put( "compare_string", QUERY_ACTION_COMPARE_STRING); actionMap.put( "compare_int", QUERY_ACTION_COMPARE_INT); actionMap.put( "compare_bool", QUERY_ACTION_COMPARE_BOOLEAN); } /** {@inheritDoc} */ public PollStatus checkDatabaseStatus(Connection con, Map<String, Object> parameters) { PollStatus ps = PollStatus.unavailable(); Statement st = null; String query = ParameterMap.getKeyedString(parameters, "query", null); String action = ParameterMap.getKeyedString(parameters, "action", "row_count"); String column = ParameterMap.getKeyedString(parameters, "column", null); String operator = ParameterMap.getKeyedString(parameters, "operator", ">="); String message = ParameterMap.getKeyedString(parameters, "message", null ); log().debug("Query: " + query); if (query == null) { ps = PollStatus.unavailable("Null Query, ensure query value set in poller configuration."); return ps; } try { st = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); ResultSet rs = st.executeQuery(query); rs.first(); switch(actionMap.get(action).intValue()) { case QUERY_ACTION_ROW_COUNT: rs.last(); int rowCount = rs.getRow(); int expectedRowCount = ParameterMap.getKeyedInteger(parameters,"operand",1); if (integerCheck(rowCount,expectedRowCount,operator)) ps = PollStatus.available(); else ps = PollStatus.unavailable("Row Count Check Failed: " + rowCount + " " + operator + " " + expectedRowCount ); break; case QUERY_ACTION_COMPARE_STRING: String expectedString = ParameterMap.getKeyedString(parameters, "operand", null); String retrivedString = rs.getString(column); if ( expectedString.equals(retrivedString)) ps = PollStatus.available(); else ps = PollStatus.unavailable("String Field Check Failed: Expected: " + expectedString + " Returned: " + retrivedString ); break; case QUERY_ACTION_COMPARE_INT: int expectedInt = ParameterMap.getKeyedInteger(parameters, "operand", 1); int retrivedInt = rs.getInt(column); if (integerCheck(retrivedInt,expectedInt,operator)) ps = PollStatus.available(); else ps = PollStatus.unavailable("Integer Field Check Failed: " + expectedInt + " " + operator + " " + retrivedInt ); break; } } catch ( SQLException sqle ){ ps = PollStatus.unavailable("Err: " + sqle.toString()); } catch ( Exception exp ){ ps = PollStatus.unavailable("Err: " + exp.toString()); } finally { closeStmt(st); } if(message != null && ps.isUnavailable()) ps = PollStatus.unavailable(message + " " + ps.getReason()); return ps; } private boolean integerCheck(int val, int expected, String operator){ switch(operatorMap.get(operator).intValue()){ case OPERATOR_MAP_EQUALS: return val == expected; case OPERATOR_MAP_GREATER_THAN: return val > expected; case OPERATOR_MAP_GREATER_THAN_EQUAL_TO: return val >= expected; case OPERATOR_MAP_LESS_THAN: return val < expected; case OPERATOR_MAP_LESS_THAN_EQUAL_TO: return val <= expected; case OPERATOR_MAP_NOT_EQUAL: return val != expected; } return false; } }