KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > continuent > sequoia > controller > core > ReportManager


1 /**
2  * Sequoia: Database clustering technology.
3  * Copyright (C) 2002-2004 French National Institute For Research In Computer
4  * Science And Control (INRIA).
5  * Copyright (C) 2005 AmicoSoft, Inc. dba Emic Networks
6  * Contact: sequoia@continuent.org
7  *
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  * http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  *
20  * Initial developer(s): Emmanuel Cecchet.
21  * Contributor(s): Nicolas Modrzyk, Mathieu Peltier.
22  */

23
24 package org.continuent.sequoia.controller.core;
25
26 import java.io.BufferedReader JavaDoc;
27 import java.io.BufferedWriter JavaDoc;
28 import java.io.File JavaDoc;
29 import java.io.FileReader JavaDoc;
30 import java.io.FileWriter JavaDoc;
31 import java.io.IOException JavaDoc;
32 import java.io.PrintWriter JavaDoc;
33 import java.io.StringWriter JavaDoc;
34 import java.util.Date JavaDoc;
35 import java.util.Enumeration JavaDoc;
36 import java.util.Hashtable JavaDoc;
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 /**
48  * Class to create report from Controller
49  *
50  * @author <a HREF="mailto:Emmanuel.Cecchet@inria.fr">Emmanuel Cecchet </a>
51  * @author <a HREF="mailto:Nicolas.Modrzyk@inrialpes.fr">Nicolas Modrzyk </a>
52  * @author <a HREF="mailto:Mathieu.Peltier@inrialpes.fr">Mathieu Peltier </a>
53  */

54 public class ReportManager
55 {
56   private static final String JavaDoc FILE_APPENDER_NAME = "Filetrace";
57
58   private static final String JavaDoc LINE_SEPARATOR = System
59                                                      .getProperty("line.separator");
60
61   /** Logger instance. */
62   static Trace logger = Trace
63                                                      .getLogger(ReportManager.class
64                                                          .getName());
65
66   /** Settings */
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 JavaDoc reportLocation = System
74                                                      .getProperty("sequoia.log") == null
75                                                      ? "."
76                                                      : System
77                                                          .getProperty("sequoia.log");
78
79   private Controller controller;
80   private BufferedWriter JavaDoc fos;
81
82   /**
83    * Call above and write controller xml information and information
84    *
85    * @param controller to report
86    */

87   public ReportManager(Controller controller)
88   {
89     this.controller = controller;
90   }
91
92   /**
93    * Creates a new <code>ReportManager.java</code> object Report only logs
94    *
95    * @param controller the controller to report logs from
96    * @param showLogsOnly show logs
97    */

98   public ReportManager(Controller controller, boolean showLogsOnly)
99   {
100     this(controller);
101     this.showLogsOnly = showLogsOnly;
102   }
103
104   /**
105    * Create the report file, write the environment settings if asked for, the
106    * log contents (calling writeLogs()) and close the file. The method is
107    * synchronized so that only one report can be generated at a time.
108    *
109    * @param displaySettingsInfo true if the report should include information
110    * about the java properties, controller settings and configuration.
111    */

112   public synchronized void generate(boolean displaySettingsInfo)
113   {
114     try
115     {
116       createFileAndWriteSettings(displaySettingsInfo);
117
118       // Append the logs
119
writeLogs();
120     }
121     catch (Exception JavaDoc 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 JavaDoc ignore)
132       {
133       }
134     }
135   }
136
137   /**
138    * Create the report file, write the environment settings if asked to, append
139    * the given exception stack trace and close the file. The method is
140    * synchronized so that only one report can be generated at a time.
141    *
142    * @param displaySettingsInfo true if the report should include information
143    * about the java properties, controller settings and configutation.
144    * @param e exception to write about
145    */

146   public synchronized void generateAndWriteException(
147       boolean displaySettingsInfo, Exception JavaDoc e)
148   {
149     try
150     {
151       createFileAndWriteSettings(displaySettingsInfo);
152
153       writeException(e);
154     }
155     catch (Exception JavaDoc 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 JavaDoc ignore)
166       {
167       }
168     }
169   }
170
171   private void createFileAndWriteSettings(boolean displaySettingsInfo)
172       throws IOException JavaDoc
173   {
174     File JavaDoc reportFile = new File JavaDoc(reportLocation + File.separator
175         + ControllerConstants.REPORT_FILE);
176     reportFile.getParentFile().mkdirs();
177     fos = new BufferedWriter JavaDoc(new FileWriter JavaDoc(reportFile));
178
179     if (displaySettingsInfo)
180     { // Settings/environment info
181
writeTitle("Sequoia (version:" + Constants.VERSION
182           + ") REPORT generated on " + new Date JavaDoc().toString());
183       writeJavaProperties();
184       writeControllerSettings();
185       writeControllerInfo();
186     }
187   }
188
189   /**
190    * Write Controller info as return by <code>getInformation()</code>
191    */

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 JavaDoc e)
202     {
203       e.printStackTrace();
204     }
205   }
206
207   /** Write all parameters from <code>ControllerConfiguration</code> */
208   private void writeControllerSettings()
209   {
210     writeHeader("CONTROLLER SETTINGS");
211     write(controller.getConfiguration());
212   }
213
214   /**
215    * Write Details of the exception
216    *
217    * @param e exception to write
218    */

219   private void writeException(Exception JavaDoc e)
220   {
221     writeHeader("EXCEPTION DESCRIPTION");
222     write(e.getClass().toString());
223     write(e.getMessage());
224     write(e.toString());
225     StringWriter JavaDoc sw = new StringWriter JavaDoc();
226     PrintWriter JavaDoc pw = new PrintWriter JavaDoc(sw);
227     e.printStackTrace(pw);
228     write(sw.toString());
229   }
230
231   /** Write All Java Properties */
232   private void writeJavaProperties()
233   {
234     writeHeader("JAVA SETTINGS");
235     write(System.getProperties());
236   }
237
238   /**
239    * Write Log4j log files that go to the Filetrace appender
240    */

241   private void writeLogs()
242   {
243     writeHeader("LOG CONFIGURATION");
244     String JavaDoc 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 JavaDoc string)
259   {
260     try
261     {
262       fos.write(string);
263     }
264     catch (Exception JavaDoc e)
265     {
266       e.printStackTrace();
267     }
268   }
269
270   private void write(Hashtable JavaDoc table)
271   {
272     write(ReadWrite.write(table, true));
273   }
274
275   private void writeFile(String JavaDoc filename)
276   {
277     try
278     {
279       File JavaDoc f = new File JavaDoc(filename);
280       BufferedReader JavaDoc input = new BufferedReader JavaDoc(new FileReader JavaDoc(f));
281       String JavaDoc line = null;
282       while ((line = input.readLine()) != null)
283         write(line + LINE_SEPARATOR);
284     }
285     catch (Exception JavaDoc e)
286     {
287       e.printStackTrace();
288     }
289   }
290
291   private void writeHeader(String JavaDoc 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 JavaDoc 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 JavaDoc logFile = new File JavaDoc(appender.getFile());
322       logFile.deleteOnExit();
323     }
324     catch (Exception JavaDoc e)
325     {
326       // appender has been removed or is not defined.
327
logger.debug("Failed to set deleteOnExit on log file", e);
328     }
329   }
330
331   /**
332    * @param settings hashtable of settings
333    */

334   public final void setSettings(Hashtable JavaDoc settings)
335   {
336     // listLoggers();
337
if (settings == null)
338     {
339       reportEnabled = false;
340     }
341     else if (settings.containsKey(ControllerXmlTags.ATT_REPORT_ENABLED))
342     {
343       reportEnabled = new Boolean JavaDoc((String JavaDoc) 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       // removeFileTraceAppender();
353
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 JavaDoc((String JavaDoc) settings
366             .get(ControllerXmlTags.ATT_REPORT_ENABLE_FILE_LOGGING))
367             .booleanValue();
368         if (!enableFileLogging)
369         {
370           // removeFileTraceAppender();
371
}
372       }
373       if (settings.containsKey(ControllerXmlTags.ATT_REPORT_GENERATE_ON_FATAL))
374       {
375         generateOnFatal = new Boolean JavaDoc((String JavaDoc) 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 JavaDoc((String JavaDoc) 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 JavaDoc((String JavaDoc) 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 JavaDoc) 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 JavaDoc 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   /**
415    * @return Returns the enableFileLogging.
416    */

417   public boolean isEnableFileLogging()
418   {
419     return enableFileLogging;
420   }
421
422   /**
423    * @return Returns the generateOnFatal.
424    */

425   public boolean isGenerateOnFatal()
426   {
427     return reportEnabled && generateOnFatal;
428   }
429
430   /**
431    * @return Returns the generateOnShutdown.
432    */

433   public boolean isGenerateOnShutdown()
434   {
435     return reportEnabled && generateOnShutdown;
436   }
437
438   /**
439    * @return Returns the hideSensitiveData.
440    */

441   public boolean isHideSensitiveData()
442   {
443     return hideSensitiveData;
444   }
445
446   /**
447    * @return Returns the reportEnabled.
448    */

449   public boolean isReportEnabled()
450   {
451     return reportEnabled;
452   }
453
454   /**
455    * @return Returns the reportLocation.
456    */

457   public String JavaDoc getReportLocation()
458   {
459     return reportLocation;
460   }
461
462   /**
463    * Sets the enableFileLogging value.
464    *
465    * @param enableFileLogging The enableFileLogging to set.
466    */

467   public void setEnableFileLogging(boolean enableFileLogging)
468   {
469     this.enableFileLogging = enableFileLogging;
470   }
471
472   /**
473    * Sets the generateOnFatal value.
474    *
475    * @param generateOnFatal The generateOnFatal to set.
476    */

477   public void setGenerateOnFatal(boolean generateOnFatal)
478   {
479     this.generateOnFatal = generateOnFatal;
480   }
481
482   /**
483    * Sets the generateOnShutdown value.
484    *
485    * @param generateOnShutdown The generateOnShutdown to set.
486    */

487   public void setGenerateOnShutdown(boolean generateOnShutdown)
488   {
489     this.generateOnShutdown = generateOnShutdown;
490   }
491
492   /**
493    * Sets the hideSensitiveData value.
494    *
495    * @param hideSensitiveData The hideSensitiveData to set.
496    */

497   public void setHideSensitiveData(boolean hideSensitiveData)
498   {
499     this.hideSensitiveData = hideSensitiveData;
500   }
501
502   /**
503    * Sets the reportEnabled value.
504    *
505    * @param reportEnabled The reportEnabled to set.
506    */

507   public void setReportEnabled(boolean reportEnabled)
508   {
509     this.reportEnabled = reportEnabled;
510   }
511
512   /**
513    * Sets the reportLocation value.
514    *
515    * @param reportLocation The reportLocation to set.
516    */

517   public void setReportLocation(String JavaDoc reportLocation)
518   {
519     this.reportLocation = reportLocation;
520   }
521 }
Popular Tags