00001
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
00051 public class ReportManager
00052 {
00053
00055 static Trace
logger = Trace
00056 .getLogger(
ReportManager.class
00057 .getName());
00058
00060 boolean reportEnabled =
false;
00061 boolean hideSensitiveData =
true;
00062 boolean generateOnShutdown =
true;
00063 boolean generateOnFatal =
true;
00064 boolean enableFileLogging =
true;
00065 boolean showLogsOnly =
false;
00066 String
reportLocation =
ControllerConstants.REPORT_LOCATION;
00067
00068 private Controller controller;
00069 private StringBuffer
buffer;
00070 private FileOutputStream
fos;
00071
00077 public ReportManager(
Controller controller)
00078 {
00079
this.controller = controller;
00080
buffer =
new StringBuffer();
00081
00082 }
00083
00088 public void startReport()
00089 {
00090
writeTitle(
"CJDBC (version:" +
Constants.VERSION +
") REPORT generated on "
00091 +
new Date().toString());
00092
writeJavaProperties();
00093
writeControllerSettings();
00094
writeControllerInfo();
00095 }
00096
00103 public ReportManager(
Controller controller,
boolean showLogsOnly)
00104 {
00105
this(controller);
00106
this.showLogsOnly = showLogsOnly;
00107 }
00108
00115 public ReportManager(
Controller controller, Exception e)
00116 {
00117
this(controller);
00118
writeException(e);
00119 }
00120
00124 public void writeControllerInfo()
00125 {
00126
try
00127 {
00128
writeHeader(
"CONTROLLER INFO XML");
00129
write(
controller.
getXml());
00130
writeHeader(
"DATABASE INFO");
00131
write(
controller.
viewDatabases());
00132
writeHeader(
"DATABASE INFO XML");
00133
write(
controller.
viewDatabasesXml());
00134 }
00135
catch (Exception e)
00136 {
00137 e.printStackTrace();
00138 }
00139 }
00140
00142 public void writeControllerSettings()
00143 {
00144
writeHeader(
"CONTROLLER SETTINGS");
00145
write(
controller.
getConfiguration());
00146 }
00147
00149 public void writeJavaProperties()
00150 {
00151
writeHeader(
"JAVA SETTINGS");
00152
write(System.getProperties());
00153 }
00154
00156 public void writeLogs()
00157 {
00158
writeHeader(
"LOG CONFIGURATION");
00159 String s =
this.getClass().getResource(
ControllerConstants.LOG4J_RESOURCE)
00160 .getFile();
00161
writeFile(s);
00162
writeHeader(
"LOGS");
00163
if (
isEnableFileLogging())
00164 {
00165 Logger log = Logger.getRootLogger();
00166 FileAppender appender = (FileAppender) log
00167 .getAppender(
"Filetrace");
00168 s = appender.getFile();
00169
writeFile(s);
00170 }
00171 }
00172
00178 public void writeException(Exception e)
00179 {
00180
writeHeader(
"EXCEPTION DESCRIPTION");
00181
write(e.getClass().toString());
00182
write(e.getMessage());
00183
write(e.toString());
00184 StringWriter sw =
new StringWriter();
00185 PrintWriter pw =
new PrintWriter(sw);
00186 e.printStackTrace(pw);
00187
write(sw.toString());
00188 }
00189
00195 public String
generate()
00196 {
00197
00198
writeLogs();
00199
try
00200 {
00201 File reportFile =
new File(
reportLocation + File.separator
00202 +
ControllerConstants.REPORT_FILE);
00203 reportFile.getParentFile().mkdirs();
00204
fos =
new FileOutputStream(reportFile);
00205
fos.write(
buffer.toString().getBytes());
00206
fos.close();
00207 String returned =
buffer.toString();
00208
00209
buffer.delete(0,
buffer.length());
00210
return returned;
00211 }
00212
catch (Exception e)
00213 {
00214 e.printStackTrace();
00215
return "";
00216 }
00217 }
00218
00224 public String
generateJustLogs()
00225 {
00226 String s =
this.getClass().getResource(
ControllerConstants.LOG4J_RESOURCE)
00227 .getFile();
00228 Logger log = Logger.getRootLogger();
00229
try
00230 {
00231 FileAppender appender = (FileAppender) log.getAppender(
"Filetrace");
00232 s = appender.getFile();
00233
writeFile(s);
00234
return buffer.toString();
00235 }
00236
catch (Exception e)
00237 {
00238
logger
00239 .warn(
"Filetrace appender is not of type FileAppender and cannot be dumped ("
00240 + e +
")");
00241
return "";
00242 }
00243 }
00244
00245
00246
00247 private void write(String string)
00248 {
00249
try
00250 {
00251
buffer.append(string.toString());
00252 }
00253
catch (Exception e)
00254 {
00255 e.printStackTrace();
00256 }
00257 }
00258
00259 private void writeFile(String filename)
00260 {
00261
try
00262 {
00263 File f =
new File(filename);
00264 FileInputStream fis =
new FileInputStream(f);
00265 byte[] logs =
new byte[(
int) f.length()];
00266 fis.read(logs);
00267
write(
new String(logs));
00268 }
00269
catch (Exception e)
00270 {
00271 e.printStackTrace();
00272 }
00273 }
00274
00275 private void write(Hashtable table)
00276 {
00277
buffer.append(
ReadWrite.write(table,
true));
00278 }
00279
00280 private void writeTitle(String title)
00281 {
00282
write(
"==========================================================================="
00283 + System.getProperty(
"line.separator"));
00284
write(
"==========================================================================="
00285 + System.getProperty(
"line.separator"));
00286
write(
"==== " + title + System.getProperty(
"line.separator"));
00287
write(
"==========================================================================="
00288 + System.getProperty(
"line.separator"));
00289
write(
"==========================================================================="
00290 + System.getProperty(
"line.separator"));
00291 }
00292
00293 private void writeHeader(String header)
00294 {
00295
write(System.getProperty(
"line.separator"));
00296
write(
"############################################################"
00297 + System.getProperty(
"line.separator"));
00298
write(
"####\t\t" + header + System.getProperty(
"line.separator"));
00299
write(
"############################################################"
00300 + System.getProperty(
"line.separator"));
00301 }
00302
00303 private void setLogsDeleteOnExit()
00304 {
00305
try
00306 {
00307 Logger log = Logger.getRootLogger();
00308 RollingFileAppender appender = (RollingFileAppender) log
00309 .getAppender(
"Filetrace");
00310 File logFile =
new File(appender.getFile());
00311 logFile.deleteOnExit();
00312 }
00313
catch (Exception e)
00314 {
00315
00316
logger.debug(
"Failed to set deleteOnExit on log file", e);
00317 }
00318 }
00319
00323 public final void setSettings(Hashtable settings)
00324 {
00325
00326
setLogsDeleteOnExit();
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
00405 public boolean isEnableFileLogging()
00406 {
00407
return enableFileLogging;
00408 }
00409
00413 public boolean isGenerateOnFatal()
00414 {
00415
return reportEnabled &&
generateOnFatal;
00416 }
00417
00421 public boolean isGenerateOnShutdown()
00422 {
00423
return reportEnabled &&
generateOnShutdown;
00424 }
00425
00429 public boolean isHideSensitiveData()
00430 {
00431
return hideSensitiveData;
00432 }
00433
00437 public boolean isReportEnabled()
00438 {
00439
return reportEnabled;
00440 }
00441
00445 public String
getReportLocation()
00446 {
00447
return reportLocation;
00448 }
00449
00455 public void setEnableFileLogging(
boolean enableFileLogging)
00456 {
00457
this.enableFileLogging = enableFileLogging;
00458 }
00459
00465 public void setGenerateOnFatal(
boolean generateOnFatal)
00466 {
00467
this.generateOnFatal = generateOnFatal;
00468 }
00469
00475 public void setGenerateOnShutdown(
boolean generateOnShutdown)
00476 {
00477
this.generateOnShutdown = generateOnShutdown;
00478 }
00479
00485 public void setHideSensitiveData(
boolean hideSensitiveData)
00486 {
00487
this.hideSensitiveData = hideSensitiveData;
00488 }
00489
00495 public void setReportEnabled(
boolean reportEnabled)
00496 {
00497
this.reportEnabled = reportEnabled;
00498 }
00499
00505 public void setReportLocation(String reportLocation)
00506 {
00507
this.reportLocation = reportLocation;
00508 }
00509 }