1 23 24 package org.continuent.sequoia.controller.core; 25 26 import java.io.BufferedReader ; 27 import java.io.BufferedWriter ; 28 import java.io.File ; 29 import java.io.FileReader ; 30 import java.io.FileWriter ; 31 import java.io.IOException ; 32 import java.io.PrintWriter ; 33 import java.io.StringWriter ; 34 import java.util.Date ; 35 import java.util.Enumeration ; 36 import java.util.Hashtable ; 37 38 import org.apache.log4j.FileAppender; 39 import org.apache.log4j.Logger; 40 import org.apache.log4j.RollingFileAppender; 41 import org.continuent.sequoia.common.log.Trace; 42 import org.continuent.sequoia.common.util.Constants; 43 import org.continuent.sequoia.common.util.ReadWrite; 44 import org.continuent.sequoia.common.xml.ControllerXmlTags; 45 import org.continuent.sequoia.common.xml.XmlTools; 46 47 54 public class ReportManager 55 { 56 private static final String FILE_APPENDER_NAME = "Filetrace"; 57 58 private static final String LINE_SEPARATOR = System 59 .getProperty("line.separator"); 60 61 62 static Trace logger = Trace 63 .getLogger(ReportManager.class 64 .getName()); 65 66 67 boolean reportEnabled = false; 68 boolean hideSensitiveData = true; 69 boolean generateOnShutdown = true; 70 boolean generateOnFatal = true; 71 boolean enableFileLogging = true; 72 boolean showLogsOnly = false; 73 String reportLocation = System 74 .getProperty("sequoia.log") == null 75 ? "." 76 : System 77 .getProperty("sequoia.log"); 78 79 private Controller controller; 80 private BufferedWriter fos; 81 82 87 public ReportManager(Controller controller) 88 { 89 this.controller = controller; 90 } 91 92 98 public ReportManager(Controller controller, boolean showLogsOnly) 99 { 100 this(controller); 101 this.showLogsOnly = showLogsOnly; 102 } 103 104 112 public synchronized void generate(boolean displaySettingsInfo) 113 { 114 try 115 { 116 createFileAndWriteSettings(displaySettingsInfo); 117 118 writeLogs(); 120 } 121 catch (Exception e) 122 { 123 logger.warn("Error while generating the report", e); 124 } 125 finally 126 { 127 try 128 { 129 fos.close(); 130 } 131 catch (IOException ignore) 132 { 133 } 134 } 135 } 136 137 146 public synchronized void generateAndWriteException( 147 boolean displaySettingsInfo, Exception e) 148 { 149 try 150 { 151 createFileAndWriteSettings(displaySettingsInfo); 152 153 writeException(e); 154 } 155 catch (Exception ex) 156 { 157 logger.warn("Error while generating the report", ex); 158 } 159 finally 160 { 161 try 162 { 163 fos.close(); 164 } 165 catch (IOException ignore) 166 { 167 } 168 } 169 } 170 171 private void createFileAndWriteSettings(boolean displaySettingsInfo) 172 throws IOException 173 { 174 File reportFile = new File (reportLocation + File.separator 175 + ControllerConstants.REPORT_FILE); 176 reportFile.getParentFile().mkdirs(); 177 fos = new BufferedWriter (new FileWriter (reportFile)); 178 179 if (displaySettingsInfo) 180 { writeTitle("Sequoia (version:" + Constants.VERSION 182 + ") REPORT generated on " + new Date ().toString()); 183 writeJavaProperties(); 184 writeControllerSettings(); 185 writeControllerInfo(); 186 } 187 } 188 189 192 private void writeControllerInfo() 193 { 194 try 195 { 196 writeHeader("CONTROLLER INFO XML"); 197 write(controller.getXml()); 198 writeHeader("DATABASE INFO XML"); 199 write(XmlTools.prettyXml(controller.getXmlVirtualDatabases())); 200 } 201 catch (Exception e) 202 { 203 e.printStackTrace(); 204 } 205 } 206 207 208 private void writeControllerSettings() 209 { 210 writeHeader("CONTROLLER SETTINGS"); 211 write(controller.getConfiguration()); 212 } 213 214 219 private void writeException(Exception e) 220 { 221 writeHeader("EXCEPTION DESCRIPTION"); 222 write(e.getClass().toString()); 223 write(e.getMessage()); 224 write(e.toString()); 225 StringWriter sw = new StringWriter (); 226 PrintWriter pw = new PrintWriter (sw); 227 e.printStackTrace(pw); 228 write(sw.toString()); 229 } 230 231 232 private void writeJavaProperties() 233 { 234 writeHeader("JAVA SETTINGS"); 235 write(System.getProperties()); 236 } 237 238 241 private void writeLogs() 242 { 243 writeHeader("LOG CONFIGURATION"); 244 String s = this.getClass().getResource(ControllerConstants.LOG4J_RESOURCE) 245 .getFile(); 246 writeFile(s); 247 writeHeader("LOGS"); 248 if (isEnableFileLogging()) 249 { 250 Logger log = Logger.getRootLogger(); 251 FileAppender appender = (FileAppender) log 252 .getAppender(FILE_APPENDER_NAME); 253 s = appender.getFile(); 254 writeFile(s); 255 } 256 } 257 258 private void write(String string) 259 { 260 try 261 { 262 fos.write(string); 263 } 264 catch (Exception e) 265 { 266 e.printStackTrace(); 267 } 268 } 269 270 private void write(Hashtable table) 271 { 272 write(ReadWrite.write(table, true)); 273 } 274 275 private void writeFile(String filename) 276 { 277 try 278 { 279 File f = new File (filename); 280 BufferedReader input = new BufferedReader (new FileReader (f)); 281 String line = null; 282 while ((line = input.readLine()) != null) 283 write(line + LINE_SEPARATOR); 284 } 285 catch (Exception e) 286 { 287 e.printStackTrace(); 288 } 289 } 290 291 private void writeHeader(String header) 292 { 293 write(LINE_SEPARATOR); 294 write("############################################################" 295 + LINE_SEPARATOR); 296 write("####\t\t" + header + LINE_SEPARATOR); 297 write("############################################################" 298 + LINE_SEPARATOR); 299 } 300 301 private void writeTitle(String title) 302 { 303 write("===========================================================================" 304 + LINE_SEPARATOR); 305 write("===========================================================================" 306 + LINE_SEPARATOR); 307 write("==== " + title + LINE_SEPARATOR); 308 write("===========================================================================" 309 + LINE_SEPARATOR); 310 write("===========================================================================" 311 + LINE_SEPARATOR); 312 } 313 314 private void setLogsDeleteOnExit() 315 { 316 try 317 { 318 Logger log = Logger.getRootLogger(); 319 RollingFileAppender appender = (RollingFileAppender) log 320 .getAppender(FILE_APPENDER_NAME); 321 File logFile = new File (appender.getFile()); 322 logFile.deleteOnExit(); 323 } 324 catch (Exception e) 325 { 326 logger.debug("Failed to set deleteOnExit on log file", e); 328 } 329 } 330 331 334 public final void setSettings(Hashtable settings) 335 { 336 if (settings == null) 338 { 339 reportEnabled = false; 340 } 341 else if (settings.containsKey(ControllerXmlTags.ATT_REPORT_ENABLED)) 342 { 343 reportEnabled = new Boolean ((String ) settings 344 .get(ControllerXmlTags.ATT_REPORT_ENABLED)).booleanValue(); 345 } 346 if (!reportEnabled) 347 { 348 hideSensitiveData = false; 349 generateOnShutdown = false; 350 generateOnFatal = false; 351 enableFileLogging = false; 352 return; 354 } 355 else 356 { 357 if ("true".equals(settings 358 .get(ControllerXmlTags.ATT_REPORT_DELETE_ON_SHUTDOWN))) 359 { 360 setLogsDeleteOnExit(); 361 } 362 if (settings 363 .containsKey(ControllerXmlTags.ATT_REPORT_ENABLE_FILE_LOGGING)) 364 { 365 enableFileLogging = new Boolean ((String ) settings 366 .get(ControllerXmlTags.ATT_REPORT_ENABLE_FILE_LOGGING)) 367 .booleanValue(); 368 if (!enableFileLogging) 369 { 370 } 372 } 373 if (settings.containsKey(ControllerXmlTags.ATT_REPORT_GENERATE_ON_FATAL)) 374 { 375 generateOnFatal = new Boolean ((String ) settings 376 .get(ControllerXmlTags.ATT_REPORT_GENERATE_ON_FATAL)) 377 .booleanValue(); 378 } 379 if (settings 380 .containsKey(ControllerXmlTags.ATT_REPORT_GENERATE_ON_SHUTDOWN)) 381 { 382 generateOnShutdown = new Boolean ((String ) settings 383 .get(ControllerXmlTags.ATT_REPORT_GENERATE_ON_SHUTDOWN)) 384 .booleanValue(); 385 } 386 if (settings 387 .containsKey(ControllerXmlTags.ATT_REPORT_HIDE_SENSITIVE_DATA)) 388 { 389 hideSensitiveData = new Boolean ((String ) settings 390 .get(ControllerXmlTags.ATT_REPORT_HIDE_SENSITIVE_DATA)) 391 .booleanValue(); 392 } 393 if (settings.containsKey(ControllerXmlTags.ATT_REPORT_REPORT_LOCATION)) 394 { 395 reportLocation = (String ) settings 396 .get(ControllerXmlTags.ATT_REPORT_REPORT_LOCATION); 397 } 398 } 399 } 400 401 void listLoggers() 402 { 403 Logger log = Logger.getRootLogger(); 404 if (!log.isDebugEnabled()) 405 return; 406 Enumeration loggers = Logger.getDefaultHierarchy().getCurrentLoggers(); 407 while (loggers.hasMoreElements()) 408 { 409 Logger l = (Logger) loggers.nextElement(); 410 log.debug("Found logger:" + l.getName()); 411 } 412 } 413 414 417 public boolean isEnableFileLogging() 418 { 419 return enableFileLogging; 420 } 421 422 425 public boolean isGenerateOnFatal() 426 { 427 return reportEnabled && generateOnFatal; 428 } 429 430 433 public boolean isGenerateOnShutdown() 434 { 435 return reportEnabled && generateOnShutdown; 436 } 437 438 441 public boolean isHideSensitiveData() 442 { 443 return hideSensitiveData; 444 } 445 446 449 public boolean isReportEnabled() 450 { 451 return reportEnabled; 452 } 453 454 457 public String getReportLocation() 458 { 459 return reportLocation; 460 } 461 462 467 public void setEnableFileLogging(boolean enableFileLogging) 468 { 469 this.enableFileLogging = enableFileLogging; 470 } 471 472 477 public void setGenerateOnFatal(boolean generateOnFatal) 478 { 479 this.generateOnFatal = generateOnFatal; 480 } 481 482 487 public void setGenerateOnShutdown(boolean generateOnShutdown) 488 { 489 this.generateOnShutdown = generateOnShutdown; 490 } 491 492 497 public void setHideSensitiveData(boolean hideSensitiveData) 498 { 499 this.hideSensitiveData = hideSensitiveData; 500 } 501 502 507 public void setReportEnabled(boolean reportEnabled) 508 { 509 this.reportEnabled = reportEnabled; 510 } 511 512 517 public void setReportLocation(String reportLocation) 518 { 519 this.reportLocation = reportLocation; 520 } 521 } | Popular Tags |