Main Page | Packages | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | Related Pages

ReportManager.java

00001 /**
00002  * C-JDBC: Clustered JDBC.
00003  * Copyright (C) 2002-2005 French National Institute For Research In Computer
00004  * Science And Control (INRIA).
00005  * Contact: c-jdbc@objectweb.org
00006  * 
00007  * This library is free software; you can redistribute it and/or modify it
00008  * under the terms of the GNU Lesser General Public License as published by the
00009  * Free Software Foundation; either version 2.1 of the License, or any later
00010  * version.
00011  * 
00012  * This library is distributed in the hope that it will be useful, but WITHOUT
00013  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
00014  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
00015  * for more details.
00016  * 
00017  * You should have received a copy of the GNU Lesser General Public License
00018  * along with this library; if not, write to the Free Software Foundation,
00019  * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
00020  *
00021  * Initial developer(s): Emmanuel Cecchet. 
00022  * Contributor(s): Nicolas Modrzyk, Mathieu Peltier.
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  * Class to create report from Controller
00047  * 
00048  * @author <a href="mailto:Emmanuel.Cecchet@inria.fr">Emmanuel Cecchet </a>
00049  * @author <a href="mailto:Nicolas.Modrzyk@inrialpes.fr">Nicolas Modrzyk </a>
00050  * @author <a href="mailto:Mathieu.Peltier@inrialpes.fr">Mathieu Peltier </a>
00051  */
00052 public class ReportManager
00053 {
00054 
00055   /** Logger instance. */
00056   static Trace             logger             = Trace
00057                                                   .getLogger(ReportManager.class
00058                                                       .getName());
00059 
00060   /** Settings */
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    * Call above and write controller xml information and information
00075    * 
00076    * @param controller to report
00077    */
00078   public ReportManager(Controller controller)
00079   {
00080     this.controller = controller;
00081     buffer = new StringBuffer();
00082     //listLoggers();
00083   }
00084 
00085   /**
00086    * Starts generating the report. Effectively write the java properties,
00087    * controller settings, controller info but do not write the logs yet.
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    * Creates a new <code>ReportManager.java</code> object Report only logs
00100    * 
00101    * @param controller the controller to report logs from
00102    * @param showLogsOnly show logs
00103    */
00104   public ReportManager(Controller controller, boolean showLogsOnly)
00105   {
00106     this(controller);
00107     this.showLogsOnly = showLogsOnly;
00108   }
00109 
00110   /**
00111    * Call above and write about the exception
00112    * 
00113    * @param controller to report
00114    * @param e exception
00115    */
00116   public ReportManager(Controller controller, Exception e)
00117   {
00118     this(controller);
00119     writeException(e);
00120   }
00121 
00122   /**
00123    * Write Controller info as return by <code>getInformation()</code>
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   /** Write all parameters from <code>ControllerFactory</code> */
00144   public void writeControllerSettings()
00145   {
00146     writeHeader("CONTROLLER SETTINGS");
00147     write(controller.getConfiguration());
00148   }
00149 
00150   /** Write All Java Properties */
00151   public void writeJavaProperties()
00152   {
00153     writeHeader("JAVA SETTINGS");
00154     write(System.getProperties());
00155   }
00156 
00157   /** Write Logs */
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    * Write Details of the exception
00176    * 
00177    * @param e exception to write
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    * Flush and close
00193    * 
00194    * @return report content
00195    */
00196   public String generate()
00197   {
00198     // Here we get all the logs before writing report
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       // Reset buffer
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    * Get a trace of the logs only
00222    * 
00223    * @return <code>String<code> content of the log4j output
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   /* Write Methods */
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       // appender has been removed or is not defined.
00317       logger.debug("Failed to set deleteOnExit on log file", e);
00318     }
00319   }
00320 
00321   /**
00322    * @param settings hashtable of settings
00323    */
00324   public final void setSettings(Hashtable settings)
00325   {
00326     //listLoggers();
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       //removeFileTraceAppender();
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           //removeFileTraceAppender();
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    * @return Returns the enableFileLogging.
00404    */
00405   public boolean isEnableFileLogging()
00406   {
00407     return enableFileLogging;
00408   }
00409 
00410   /**
00411    * @return Returns the generateOnFatal.
00412    */
00413   public boolean isGenerateOnFatal()
00414   {
00415     return reportEnabled && generateOnFatal;
00416   }
00417 
00418   /**
00419    * @return Returns the generateOnShutdown.
00420    */
00421   public boolean isGenerateOnShutdown()
00422   {
00423     return reportEnabled && generateOnShutdown;
00424   }
00425 
00426   /**
00427    * @return Returns the hideSensitiveData.
00428    */
00429   public boolean isHideSensitiveData()
00430   {
00431     return hideSensitiveData;
00432   }
00433 
00434   /**
00435    * @return Returns the reportEnabled.
00436    */
00437   public boolean isReportEnabled()
00438   {
00439     return reportEnabled;
00440   }
00441 
00442   /**
00443    * @return Returns the reportLocation.
00444    */
00445   public String getReportLocation()
00446   {
00447     return reportLocation;
00448   }
00449 
00450   /**
00451    * Sets the enableFileLogging value.
00452    * 
00453    * @param enableFileLogging The enableFileLogging to set.
00454    */
00455   public void setEnableFileLogging(boolean enableFileLogging)
00456   {
00457     this.enableFileLogging = enableFileLogging;
00458   }
00459 
00460   /**
00461    * Sets the generateOnFatal value.
00462    * 
00463    * @param generateOnFatal The generateOnFatal to set.
00464    */
00465   public void setGenerateOnFatal(boolean generateOnFatal)
00466   {
00467     this.generateOnFatal = generateOnFatal;
00468   }
00469 
00470   /**
00471    * Sets the generateOnShutdown value.
00472    * 
00473    * @param generateOnShutdown The generateOnShutdown to set.
00474    */
00475   public void setGenerateOnShutdown(boolean generateOnShutdown)
00476   {
00477     this.generateOnShutdown = generateOnShutdown;
00478   }
00479 
00480   /**
00481    * Sets the hideSensitiveData value.
00482    * 
00483    * @param hideSensitiveData The hideSensitiveData to set.
00484    */
00485   public void setHideSensitiveData(boolean hideSensitiveData)
00486   {
00487     this.hideSensitiveData = hideSensitiveData;
00488   }
00489 
00490   /**
00491    * Sets the reportEnabled value.
00492    * 
00493    * @param reportEnabled The reportEnabled to set.
00494    */
00495   public void setReportEnabled(boolean reportEnabled)
00496   {
00497     this.reportEnabled = reportEnabled;
00498   }
00499 
00500   /**
00501    * Sets the reportLocation value.
00502    * 
00503    * @param reportLocation The reportLocation to set.
00504    */
00505   public void setReportLocation(String reportLocation)
00506   {
00507     this.reportLocation = reportLocation;
00508   }
00509 }

Generated on Mon Apr 11 22:01:34 2005 for C-JDBC by  doxygen 1.3.9.1