00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 package org.objectweb.cjdbc.controller.core;
00026
00027 import java.io.File;
00028 import java.io.FileInputStream;
00029 import java.io.FileOutputStream;
00030 import java.io.PrintWriter;
00031 import java.io.StringWriter;
00032 import java.util.Date;
00033 import java.util.Enumeration;
00034 import java.util.Hashtable;
00035
00036 import org.apache.log4j.FileAppender;
00037 import org.apache.log4j.Logger;
00038 import org.apache.log4j.RollingFileAppender;
00039 import org.objectweb.cjdbc.common.log.Trace;
00040 import org.objectweb.cjdbc.common.util.Constants;
00041 import org.objectweb.cjdbc.common.util.ReadWrite;
00042 import org.objectweb.cjdbc.common.xml.ControllerXmlTags;
00043 import org.objectweb.cjdbc.common.xml.XmlTools;
00044
00045
00046
00047
00048
00049
00050
00051
00052 public class ReportManager
00053 {
00054
00055
00056 static Trace logger = Trace
00057 .getLogger(ReportManager.class
00058 .getName());
00059
00060
00061 boolean reportEnabled = false;
00062 boolean hideSensitiveData = true;
00063 boolean generateOnShutdown = true;
00064 boolean generateOnFatal = true;
00065 boolean enableFileLogging = true;
00066 boolean showLogsOnly = false;
00067 String reportLocation = ControllerConstants.REPORT_LOCATION;
00068
00069 private Controller controller;
00070 private StringBuffer buffer;
00071 private FileOutputStream fos;
00072
00073
00074
00075
00076
00077
00078 public ReportManager(Controller controller)
00079 {
00080 this.controller = controller;
00081 buffer = new StringBuffer();
00082
00083 }
00084
00085
00086
00087
00088
00089 public void startReport()
00090 {
00091 writeTitle("CJDBC (version:" + Constants.VERSION + ") REPORT generated on "
00092 + new Date().toString());
00093 writeJavaProperties();
00094 writeControllerSettings();
00095 writeControllerInfo();
00096 }
00097
00098
00099
00100
00101
00102
00103
00104 public ReportManager(Controller controller, boolean showLogsOnly)
00105 {
00106 this(controller);
00107 this.showLogsOnly = showLogsOnly;
00108 }
00109
00110
00111
00112
00113
00114
00115
00116 public ReportManager(Controller controller, Exception e)
00117 {
00118 this(controller);
00119 writeException(e);
00120 }
00121
00122
00123
00124
00125 public void writeControllerInfo()
00126 {
00127 try
00128 {
00129 writeHeader("CONTROLLER INFO XML");
00130 write(controller.getXml());
00131 writeHeader("DATABASE INFO");
00132 write(XmlTools
00133 .applyXsl(controller.getXmlVirtualDatabases(), "c-jdbc.xsl"));
00134 writeHeader("DATABASE INFO XML");
00135 write(XmlTools.prettyXml(controller.getXmlVirtualDatabases()));
00136 }
00137 catch (Exception e)
00138 {
00139 e.printStackTrace();
00140 }
00141 }
00142
00143
00144 public void writeControllerSettings()
00145 {
00146 writeHeader("CONTROLLER SETTINGS");
00147 write(controller.getConfiguration());
00148 }
00149
00150
00151 public void writeJavaProperties()
00152 {
00153 writeHeader("JAVA SETTINGS");
00154 write(System.getProperties());
00155 }
00156
00157
00158 public void writeLogs()
00159 {
00160 writeHeader("LOG CONFIGURATION");
00161 String s = this.getClass().getResource(ControllerConstants.LOG4J_RESOURCE)
00162 .getFile();
00163 writeFile(s);
00164 writeHeader("LOGS");
00165 if (isEnableFileLogging())
00166 {
00167 Logger log = Logger.getRootLogger();
00168 FileAppender appender = (FileAppender) log.getAppender("Filetrace");
00169 s = appender.getFile();
00170 writeFile(s);
00171 }
00172 }
00173
00174
00175
00176
00177
00178
00179 public void writeException(Exception e)
00180 {
00181 writeHeader("EXCEPTION DESCRIPTION");
00182 write(e.getClass().toString());
00183 write(e.getMessage());
00184 write(e.toString());
00185 StringWriter sw = new StringWriter();
00186 PrintWriter pw = new PrintWriter(sw);
00187 e.printStackTrace(pw);
00188 write(sw.toString());
00189 }
00190
00191
00192
00193
00194
00195
00196 public String generate()
00197 {
00198
00199 writeLogs();
00200 try
00201 {
00202 File reportFile = new File(reportLocation + File.separator
00203 + ControllerConstants.REPORT_FILE);
00204 reportFile.getParentFile().mkdirs();
00205 fos = new FileOutputStream(reportFile);
00206 fos.write(buffer.toString().getBytes());
00207 fos.close();
00208 String returned = buffer.toString();
00209
00210 buffer.delete(0, buffer.length());
00211 return returned;
00212 }
00213 catch (Exception e)
00214 {
00215 e.printStackTrace();
00216 return "";
00217 }
00218 }
00219
00220
00221
00222
00223
00224
00225 public String generateJustLogs()
00226 {
00227 String s = this.getClass().getResource(ControllerConstants.LOG4J_RESOURCE)
00228 .getFile();
00229 Logger log = Logger.getRootLogger();
00230 try
00231 {
00232 FileAppender appender = (FileAppender) log.getAppender("Filetrace");
00233 s = appender.getFile();
00234 writeFile(s);
00235 return buffer.toString();
00236 }
00237 catch (Exception e)
00238 {
00239 logger
00240 .warn("Filetrace appender is not of type FileAppender and cannot be dumped ("
00241 + e + ")");
00242 return "";
00243 }
00244 }
00245
00246
00247
00248 private void write(String string)
00249 {
00250 try
00251 {
00252 buffer.append(string.toString());
00253 }
00254 catch (Exception e)
00255 {
00256 e.printStackTrace();
00257 }
00258 }
00259
00260 private void writeFile(String filename)
00261 {
00262 try
00263 {
00264 File f = new File(filename);
00265 FileInputStream fis = new FileInputStream(f);
00266 byte[] logs = new byte[(int) f.length()];
00267 fis.read(logs);
00268 write(new String(logs));
00269 }
00270 catch (Exception e)
00271 {
00272 e.printStackTrace();
00273 }
00274 }
00275
00276 private void write(Hashtable table)
00277 {
00278 buffer.append(ReadWrite.write(table, true));
00279 }
00280
00281 private void writeTitle(String title)
00282 {
00283 write("==========================================================================="
00284 + System.getProperty("line.separator"));
00285 write("==========================================================================="
00286 + System.getProperty("line.separator"));
00287 write("==== " + title + System.getProperty("line.separator"));
00288 write("==========================================================================="
00289 + System.getProperty("line.separator"));
00290 write("==========================================================================="
00291 + System.getProperty("line.separator"));
00292 }
00293
00294 private void writeHeader(String header)
00295 {
00296 write(System.getProperty("line.separator"));
00297 write("############################################################"
00298 + System.getProperty("line.separator"));
00299 write("####\t\t" + header + System.getProperty("line.separator"));
00300 write("############################################################"
00301 + System.getProperty("line.separator"));
00302 }
00303
00304 private void setLogsDeleteOnExit()
00305 {
00306 try
00307 {
00308 Logger log = Logger.getRootLogger();
00309 RollingFileAppender appender = (RollingFileAppender) log
00310 .getAppender("Filetrace");
00311 File logFile = new File(appender.getFile());
00312 logFile.deleteOnExit();
00313 }
00314 catch (Exception e)
00315 {
00316
00317 logger.debug("Failed to set deleteOnExit on log file", e);
00318 }
00319 }
00320
00321
00322
00323
00324 public final void setSettings(Hashtable settings)
00325 {
00326
00327 if (settings == null)
00328 {
00329 reportEnabled = false;
00330 }
00331 else if (settings.containsKey(ControllerXmlTags.ATT_REPORT_ENABLED))
00332 {
00333 reportEnabled = new Boolean((String) settings
00334 .get(ControllerXmlTags.ATT_REPORT_ENABLED)).booleanValue();
00335 }
00336 if (!reportEnabled)
00337 {
00338 hideSensitiveData = false;
00339 generateOnShutdown = false;
00340 generateOnFatal = false;
00341 enableFileLogging = false;
00342
00343 return;
00344 }
00345 else
00346 {
00347 if ("true".equals(settings
00348 .get(ControllerXmlTags.ATT_REPORT_DELETE_ON_SHUTDOWN)))
00349 {
00350 setLogsDeleteOnExit();
00351 }
00352 if (settings
00353 .containsKey(ControllerXmlTags.ATT_REPORT_ENABLE_FILE_LOGGING))
00354 {
00355 enableFileLogging = new Boolean((String) settings
00356 .get(ControllerXmlTags.ATT_REPORT_ENABLE_FILE_LOGGING))
00357 .booleanValue();
00358 if (!enableFileLogging)
00359 {
00360
00361 }
00362 }
00363 if (settings.containsKey(ControllerXmlTags.ATT_REPORT_GENERATE_ON_FATAL))
00364 {
00365 generateOnFatal = new Boolean((String) settings
00366 .get(ControllerXmlTags.ATT_REPORT_GENERATE_ON_FATAL))
00367 .booleanValue();
00368 }
00369 if (settings
00370 .containsKey(ControllerXmlTags.ATT_REPORT_GENERATE_ON_SHUTDOWN))
00371 {
00372 generateOnShutdown = new Boolean((String) settings
00373 .get(ControllerXmlTags.ATT_REPORT_GENERATE_ON_SHUTDOWN))
00374 .booleanValue();
00375 }
00376 if (settings
00377 .containsKey(ControllerXmlTags.ATT_REPORT_HIDE_SENSITIVE_DATA))
00378 {
00379 hideSensitiveData = new Boolean((String) settings
00380 .get(ControllerXmlTags.ATT_REPORT_HIDE_SENSITIVE_DATA))
00381 .booleanValue();
00382 }
00383 if (settings.containsKey(ControllerXmlTags.ATT_REPORT_REPORT_LOCATION))
00384 {
00385 reportLocation = (String) settings
00386 .get(ControllerXmlTags.ATT_REPORT_REPORT_LOCATION);
00387 }
00388 }
00389 }
00390
00391 void listLoggers()
00392 {
00393 Logger log = Logger.getRootLogger();
00394 Enumeration loggers = Logger.getDefaultHierarchy().getCurrentLoggers();
00395 while (loggers.hasMoreElements())
00396 {
00397 Logger logger = (Logger) loggers.nextElement();
00398 log.debug("Found logger:" + logger.getName());
00399 }
00400 }
00401
00402
00403
00404
00405 public boolean isEnableFileLogging()
00406 {
00407 return enableFileLogging;
00408 }
00409
00410
00411
00412
00413 public boolean isGenerateOnFatal()
00414 {
00415 return reportEnabled && generateOnFatal;
00416 }
00417
00418
00419
00420
00421 public boolean isGenerateOnShutdown()
00422 {
00423 return reportEnabled && generateOnShutdown;
00424 }
00425
00426
00427
00428
00429 public boolean isHideSensitiveData()
00430 {
00431 return hideSensitiveData;
00432 }
00433
00434
00435
00436
00437 public boolean isReportEnabled()
00438 {
00439 return reportEnabled;
00440 }
00441
00442
00443
00444
00445 public String getReportLocation()
00446 {
00447 return reportLocation;
00448 }
00449
00450
00451
00452
00453
00454
00455 public void setEnableFileLogging(boolean enableFileLogging)
00456 {
00457 this.enableFileLogging = enableFileLogging;
00458 }
00459
00460
00461
00462
00463
00464
00465 public void setGenerateOnFatal(boolean generateOnFatal)
00466 {
00467 this.generateOnFatal = generateOnFatal;
00468 }
00469
00470
00471
00472
00473
00474
00475 public void setGenerateOnShutdown(boolean generateOnShutdown)
00476 {
00477 this.generateOnShutdown = generateOnShutdown;
00478 }
00479
00480
00481
00482
00483
00484
00485 public void setHideSensitiveData(boolean hideSensitiveData)
00486 {
00487 this.hideSensitiveData = hideSensitiveData;
00488 }
00489
00490
00491
00492
00493
00494
00495 public void setReportEnabled(boolean reportEnabled)
00496 {
00497 this.reportEnabled = reportEnabled;
00498 }
00499
00500
00501
00502
00503
00504
00505 public void setReportLocation(String reportLocation)
00506 {
00507 this.reportLocation = reportLocation;
00508 }
00509 }