1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski package stats; 24*b1cdbd2cSJim Jagielski 25*b1cdbd2cSJim Jagielski import share.LogWriter; 26*b1cdbd2cSJim Jagielski import share.DescEntry; 27*b1cdbd2cSJim Jagielski 28*b1cdbd2cSJim Jagielski import java.util.Hashtable; 29*b1cdbd2cSJim Jagielski 30*b1cdbd2cSJim Jagielski /** 31*b1cdbd2cSJim Jagielski * 32*b1cdbd2cSJim Jagielski * @author sg128468 33*b1cdbd2cSJim Jagielski */ 34*b1cdbd2cSJim Jagielski public abstract class DataBaseOutProducer implements LogWriter { 35*b1cdbd2cSJim Jagielski protected Hashtable mSqlInput = null; 36*b1cdbd2cSJim Jagielski protected Hashtable mSqlOutput = null; 37*b1cdbd2cSJim Jagielski protected String[] mWriteableEntryTypes = null; 38*b1cdbd2cSJim Jagielski protected SQLExecution mSqlExec; 39*b1cdbd2cSJim Jagielski protected boolean m_bDebug = false; 40*b1cdbd2cSJim Jagielski 41*b1cdbd2cSJim Jagielski 42*b1cdbd2cSJim Jagielski /** Creates a new instance of DataBaseOutProducer 43*b1cdbd2cSJim Jagielski * @param param The Hashtable with test parameters 44*b1cdbd2cSJim Jagielski */ DataBaseOutProducer(Hashtable param)45*b1cdbd2cSJim Jagielski public DataBaseOutProducer(Hashtable param) { 46*b1cdbd2cSJim Jagielski mSqlInput = new Hashtable(); 47*b1cdbd2cSJim Jagielski mSqlInput.putAll(param); 48*b1cdbd2cSJim Jagielski 49*b1cdbd2cSJim Jagielski Object o = param.get("DebugIsActive"); 50*b1cdbd2cSJim Jagielski String debug = null; 51*b1cdbd2cSJim Jagielski if (o instanceof String) 52*b1cdbd2cSJim Jagielski debug = (String)o; 53*b1cdbd2cSJim Jagielski else 54*b1cdbd2cSJim Jagielski debug = o.toString(); 55*b1cdbd2cSJim Jagielski if (debug != null && (debug.equalsIgnoreCase("true") || debug.equalsIgnoreCase("yes"))) { 56*b1cdbd2cSJim Jagielski m_bDebug = true; 57*b1cdbd2cSJim Jagielski } 58*b1cdbd2cSJim Jagielski // set default for writeable entries: method 59*b1cdbd2cSJim Jagielski setWriteableEntryTypes(new String[]{"method"}); 60*b1cdbd2cSJim Jagielski } 61*b1cdbd2cSJim Jagielski 62*b1cdbd2cSJim Jagielski /** initialization 63*b1cdbd2cSJim Jagielski * 64*b1cdbd2cSJim Jagielski */ initialize(DescEntry entry, boolean active)65*b1cdbd2cSJim Jagielski public boolean initialize(DescEntry entry, boolean active) { 66*b1cdbd2cSJim Jagielski if (entry.UserDefinedParams != null) 67*b1cdbd2cSJim Jagielski mSqlInput.putAll(entry.UserDefinedParams); 68*b1cdbd2cSJim Jagielski 69*b1cdbd2cSJim Jagielski String jdbcClass = (String)mSqlInput.get("JDBC"); 70*b1cdbd2cSJim Jagielski if (jdbcClass == null) 71*b1cdbd2cSJim Jagielski jdbcClass = "org.gjt.mm.mysql.Driver"; 72*b1cdbd2cSJim Jagielski String dbURL = (String)mSqlInput.get("DataBaseURL"); 73*b1cdbd2cSJim Jagielski String user = (String)mSqlInput.get("User"); 74*b1cdbd2cSJim Jagielski String password = (String)mSqlInput.get("Password"); 75*b1cdbd2cSJim Jagielski if (user == null) 76*b1cdbd2cSJim Jagielski user = (String)mSqlInput.get("OperatingSystem"); 77*b1cdbd2cSJim Jagielski if (password == null) 78*b1cdbd2cSJim Jagielski password = user; 79*b1cdbd2cSJim Jagielski 80*b1cdbd2cSJim Jagielski mSqlExec = new SQLExecution(jdbcClass, dbURL, user, password, m_bDebug); 81*b1cdbd2cSJim Jagielski mSqlExec.openConnection(); 82*b1cdbd2cSJim Jagielski prepareDataBase(entry.Logger); 83*b1cdbd2cSJim Jagielski return true; 84*b1cdbd2cSJim Jagielski } 85*b1cdbd2cSJim Jagielski 86*b1cdbd2cSJim Jagielski /** 87*b1cdbd2cSJim Jagielski * 88*b1cdbd2cSJim Jagielski * 89*b1cdbd2cSJim Jagielski */ summary(DescEntry entry)90*b1cdbd2cSJim Jagielski public boolean summary(DescEntry entry) { 91*b1cdbd2cSJim Jagielski mSqlExec.openConnection(); 92*b1cdbd2cSJim Jagielski findTypeInEntryTree(entry, entry.Logger); 93*b1cdbd2cSJim Jagielski // checkDataBase(entry.Logger); 94*b1cdbd2cSJim Jagielski mSqlExec.closeConnection(); 95*b1cdbd2cSJim Jagielski return true; 96*b1cdbd2cSJim Jagielski } 97*b1cdbd2cSJim Jagielski 98*b1cdbd2cSJim Jagielski /** 99*b1cdbd2cSJim Jagielski * Step recursively through the entry tree: write all entries of the 100*b1cdbd2cSJim Jagielski * defined types to the database. 101*b1cdbd2cSJim Jagielski * @param entry The description entry that is take as root 102*b1cdbd2cSJim Jagielski * @param log The log writer 103*b1cdbd2cSJim Jagielski */ findTypeInEntryTree(DescEntry entry, LogWriter log)104*b1cdbd2cSJim Jagielski protected boolean findTypeInEntryTree(DescEntry entry, LogWriter log) { 105*b1cdbd2cSJim Jagielski boolean returnVal = true; 106*b1cdbd2cSJim Jagielski if (isWriteableEntryType(entry)) { 107*b1cdbd2cSJim Jagielski returnVal &= insertEntry(entry, log); 108*b1cdbd2cSJim Jagielski } 109*b1cdbd2cSJim Jagielski 110*b1cdbd2cSJim Jagielski if (entry.SubEntryCount >0) { 111*b1cdbd2cSJim Jagielski for (int i=0; i<entry.SubEntryCount; i++) { 112*b1cdbd2cSJim Jagielski returnVal &= findTypeInEntryTree(entry.SubEntries[i], log); 113*b1cdbd2cSJim Jagielski } 114*b1cdbd2cSJim Jagielski } 115*b1cdbd2cSJim Jagielski // if we are not on method leaf, exit here 116*b1cdbd2cSJim Jagielski // insert one method result into database 117*b1cdbd2cSJim Jagielski return returnVal; 118*b1cdbd2cSJim Jagielski } 119*b1cdbd2cSJim Jagielski 120*b1cdbd2cSJim Jagielski /** 121*b1cdbd2cSJim Jagielski * Insert this entrry to the database. 122*b1cdbd2cSJim Jagielski * @param entry The entry to write. 123*b1cdbd2cSJim Jagielski * @param log The log writer. 124*b1cdbd2cSJim Jagielski */ insertEntry(DescEntry entry, LogWriter log)125*b1cdbd2cSJim Jagielski protected boolean insertEntry(DescEntry entry, LogWriter log) { 126*b1cdbd2cSJim Jagielski // copy the swlInput Hashtable, so it can be reset easily for the next run 127*b1cdbd2cSJim Jagielski Hashtable copySqlInput = new Hashtable(); 128*b1cdbd2cSJim Jagielski copySqlInput.putAll(mSqlInput); 129*b1cdbd2cSJim Jagielski // put some stuff from entry in the Hashtable 130*b1cdbd2cSJim Jagielski mSqlInput.put("EntryLongName", entry.longName); 131*b1cdbd2cSJim Jagielski mSqlInput.put("EntryName", entry.entryName); 132*b1cdbd2cSJim Jagielski mSqlInput.put("EntryState", entry.State); 133*b1cdbd2cSJim Jagielski mSqlInput.put("EntryType", entry.EntryType); 134*b1cdbd2cSJim Jagielski boolean result = insertEntry(log); 135*b1cdbd2cSJim Jagielski // reset the Hashtable 136*b1cdbd2cSJim Jagielski mSqlInput = copySqlInput; 137*b1cdbd2cSJim Jagielski return result; 138*b1cdbd2cSJim Jagielski 139*b1cdbd2cSJim Jagielski } 140*b1cdbd2cSJim Jagielski 141*b1cdbd2cSJim Jagielski /** 142*b1cdbd2cSJim Jagielski * Set the writeable entry types: for example "method", "interface", etc. 143*b1cdbd2cSJim Jagielski * All these entries are written to the database. 144*b1cdbd2cSJim Jagielski * @param types A String array with all types that have to be written. 145*b1cdbd2cSJim Jagielski */ setWriteableEntryTypes(String[] types)146*b1cdbd2cSJim Jagielski public void setWriteableEntryTypes(String[] types) { 147*b1cdbd2cSJim Jagielski mWriteableEntryTypes = types; 148*b1cdbd2cSJim Jagielski } 149*b1cdbd2cSJim Jagielski 150*b1cdbd2cSJim Jagielski /** 151*b1cdbd2cSJim Jagielski * Is the entry of the writeable entry type? 152*b1cdbd2cSJim Jagielski * @param entry The entry that is checked 153*b1cdbd2cSJim Jagielski * @return True, if it is indeed a writeable entry. 154*b1cdbd2cSJim Jagielski */ isWriteableEntryType(DescEntry entry)155*b1cdbd2cSJim Jagielski protected boolean isWriteableEntryType(DescEntry entry) { 156*b1cdbd2cSJim Jagielski boolean result = false; 157*b1cdbd2cSJim Jagielski for (int i=0; i<mWriteableEntryTypes.length; i++) { 158*b1cdbd2cSJim Jagielski if (entry.EntryType.equals(mWriteableEntryTypes[i])) { 159*b1cdbd2cSJim Jagielski result = true; 160*b1cdbd2cSJim Jagielski break; 161*b1cdbd2cSJim Jagielski } 162*b1cdbd2cSJim Jagielski } 163*b1cdbd2cSJim Jagielski return result; 164*b1cdbd2cSJim Jagielski } 165*b1cdbd2cSJim Jagielski 166*b1cdbd2cSJim Jagielski /** 167*b1cdbd2cSJim Jagielski * Wrap the command of SQLExecution class for transparency. 168*b1cdbd2cSJim Jagielski */ executeSQLCommand(String command, boolean mergeOutput)169*b1cdbd2cSJim Jagielski protected boolean executeSQLCommand(String command, boolean mergeOutput) { 170*b1cdbd2cSJim Jagielski return mSqlExec.executeSQLCommand(command, mSqlInput, mSqlOutput, mergeOutput); 171*b1cdbd2cSJim Jagielski } 172*b1cdbd2cSJim Jagielski 173*b1cdbd2cSJim Jagielski /** 174*b1cdbd2cSJim Jagielski * Wrap the command of SQLExecution class for transparency. 175*b1cdbd2cSJim Jagielski */ executeSQLCommand(String command)176*b1cdbd2cSJim Jagielski protected boolean executeSQLCommand(String command) { 177*b1cdbd2cSJim Jagielski return mSqlExec.executeSQLCommand(command, mSqlInput, mSqlOutput); 178*b1cdbd2cSJim Jagielski } 179*b1cdbd2cSJim Jagielski 180*b1cdbd2cSJim Jagielski /** 181*b1cdbd2cSJim Jagielski * Method to print: empty here 182*b1cdbd2cSJim Jagielski */ println(String msg)183*b1cdbd2cSJim Jagielski public void println(String msg) { 184*b1cdbd2cSJim Jagielski } 185*b1cdbd2cSJim Jagielski 186*b1cdbd2cSJim Jagielski /** 187*b1cdbd2cSJim Jagielski * Prepare the database: executed once at the beginning. 188*b1cdbd2cSJim Jagielski * Abstract method, so derived classes have to overwrite it. 189*b1cdbd2cSJim Jagielski */ prepareDataBase(LogWriter log)190*b1cdbd2cSJim Jagielski protected abstract boolean prepareDataBase(LogWriter log); 191*b1cdbd2cSJim Jagielski 192*b1cdbd2cSJim Jagielski /** 193*b1cdbd2cSJim Jagielski * Insert one entr into the database. 194*b1cdbd2cSJim Jagielski * Abstract method, so derived classes have to overwrite it. 195*b1cdbd2cSJim Jagielski */ insertEntry(LogWriter log)196*b1cdbd2cSJim Jagielski protected abstract boolean insertEntry(LogWriter log); 197*b1cdbd2cSJim Jagielski 198*b1cdbd2cSJim Jagielski /** 199*b1cdbd2cSJim Jagielski * 200*b1cdbd2cSJim Jagielski protected abstract boolean checkDataBase(LogWriter log); 201*b1cdbd2cSJim Jagielski */ 202*b1cdbd2cSJim Jagielski 203*b1cdbd2cSJim Jagielski } 204