View Javadoc

1   ////////////////////////////////////////////////////////////////////////////////
2   //CabaWeb
3   //Copyright (C) 2004  Thomas Vogt <Thomas.Vogt@TVC-Software.com>
4   //
5   //This library is free software; you can redistribute it and/or
6   //modify it under the terms of the GNU Lesser General Public
7   //License as published by the Free Software Foundation; either//version 2.1 of the License, or (at your option) any later version.
8   //
9   //This library is distributed in the hope that it will be useful,
10  //but WITHOUT ANY WARRANTY; without even the implied warranty of
11  //MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  //Lesser General Public License for more details.
13  //
14  //You should have received a copy of the GNU Lesser General Public
15  //License along with this library; if not, write to the Free Software
16  //Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17  ////////////////////////////////////////////////////////////////////////////////
18  package org.fhw.cabaweb.export.caching;
19  
20  import java.util.Properties;
21  
22  import org.apache.commons.logging.Log;
23  import org.apache.commons.logging.LogFactory;
24  import org.apache.jcs.JCS;
25  import org.apache.jcs.access.exception.CacheException;
26  import org.dom4j.Document;
27  import org.fhw.cabaweb.data.DataInterfaceReportnamen;
28  import org.fhw.cabaweb.export.databojects.CachableByteArrayOutputStream;
29  import org.fhw.cabaweb.export.transform.ReportTransform;
30  import org.fhw.cabaweb.export.xml.ExportReport;
31  import org.fhw.cabaweb.ojb.dataobjects.Reportnamen;
32  import org.fhw.cabaweb.tools.StringUtilities;
33  
34  /***
35   * Identisch mit ByteArrayOutputStream implementiert jedoch das Interface Serializable.
36   * Das erm&ouml;glicht es diese Klasse zu cachen.
37   *
38   * @author  <a href="mailto:thomas.vogt@tvc-software.com">Thomas Vogt</a>
39   * @version Version 1.0 15.09.2004
40   */
41  public class CachableByteArrayOutputStreamManager
42  {
43      /*** Commons Logging Instanz */
44      private static Log log = LogFactory.getLog("org.fhw.cabaweb.export.caching.CachableByteArrayOutputStreamManager");
45  
46      /*** Instanz des Managers */
47      private static CachableByteArrayOutputStreamManager instance;
48      /*** CheckOut Counter */
49      private static int checkedOut = 0;
50      /*** JCS Instanz (Cache) */
51      private static JCS outputCache;
52  
53      /***
54       *  Default Konstruktor
55       */
56      private CachableByteArrayOutputStreamManager()
57      {
58          try
59          {
60              outputCache = JCS.getInstance("outputCache");
61          }
62          catch (Exception e)
63          {
64              log.error(e.getMessage(), e);
65          }
66      }
67  
68      /***
69       * Singleton Zugriffspunkt auf den Manager.
70       *
71       * @return Die CachableByteArrayOutputStreamManager Instanz
72       */
73      public static synchronized CachableByteArrayOutputStreamManager getInstance()
74      {
75          synchronized (CachableByteArrayOutputStreamManager.class)
76          {
77              if (instance == null)
78              {
79                  instance = new CachableByteArrayOutputStreamManager();
80              }
81          }
82  
83          synchronized (instance)
84          {
85              instance.checkedOut++;
86          }
87  
88          return instance;
89      }
90  
91      /***
92       * Bestimmtes Element aus dem Cache leeren.
93       * 
94       * @param projektnummer Die Projektnummer
95       * @param gruppennummer Die Gruppennummer
96       * @param quartal       Das Quartal
97       * @param reportnummer  Die Reportnummer
98       * @param sprachnummer  Die Sprachnummer
99       * @param typ           Zusatz f&uuml; die Identifizerieung ob XML / PDF / RTF / HTML Output Stream
100      */
101     public void purgeCache(Integer projektnummer, Integer gruppennummer, Integer quartal, Integer reportnummer, Integer sprachnummer, String typ)
102     {
103         String id = typ + projektnummer + gruppennummer + quartal + reportnummer + sprachnummer;
104 
105         try 
106         {
107             outputCache.remove(id);
108         } 
109         catch (CacheException e) 
110         {
111             log.error(e.getMessage(), e);
112         }
113     }
114 
115     /***
116      * Lädt einen CachableByteArrayOutputStream. Default ist ein Cache Lookup.
117      *
118      * @param projektnummer Die Projektnummer
119      * @param gruppennummer Die Gruppennummer
120      * @param quartal       Das Quartal
121      * @param reportnummer  Die Reportnummer
122      * @param sprachnummer  Die Sprachnummer
123      * @param typ           Zusatz f&uuml; die Identifizerieung ob XML / PDF / RTF / HTML Output Stream
124      * @return Ein CachableByteArrayOutputStream
125      */
126     public CachableByteArrayOutputStream getCachableByteArrayOutputStream(Integer projektnummer, Integer gruppennummer, Integer quartal, Integer reportnummer, Integer sprachnummer, String typ)
127     {
128         return getCachableByteArrayOutputStream(projektnummer, gruppennummer, quartal, reportnummer, sprachnummer, typ, true);
129     }
130 
131     /***
132      * L&auml;dt einen CachableByteArrayOutputStream.
133      * Anhand des 2. Arguments wird entschieden ob ein Cache Lookup erfolgt.
134      * Gibt falls kein Element im Cache gefunden wird, wird ein neues Element
135      * zur&uuml;ckgegeben und im Cache gespeichert.
136      * Die Datenbanksynchronization woird durch das l&ouml;schen von Elementen
137      * bei Modifikation gel&ouml;st.
138      *
139      * @param projektnummer Die Projektnummer
140      * @param gruppennummer Die Gruppennummer
141      * @param quartal       Das Quartal
142      * @param reportnummer  Die Reportnummer
143      * @param sprachnummer  Die Sprachnummer
144      * @param typ           Zusatz f&uuml; die Identifizerieung ob XML / PDF / RTF / HTML Output Stream
145      * @param fromCache Aus dem Cache laden (true|false)?
146      * @return Ein CachableByteArrayOutputStream
147      */
148     public CachableByteArrayOutputStream getCachableByteArrayOutputStream(Integer projektnummer, Integer gruppennummer, Integer quartal, Integer reportnummer, Integer sprachnummer, String typ, boolean fromCache)
149     {
150         CachableByteArrayOutputStream cObj = null;
151 
152         String id = typ + projektnummer + gruppennummer + quartal + reportnummer + sprachnummer;
153 
154         // Falls gew&uuml;nscht Element aus dem Cache laden.
155 
156         if (fromCache)
157         {
158             try
159             {
160                 cObj = (CachableByteArrayOutputStream) outputCache.get("CBAOS" + id);
161             }
162             catch (Exception e)
163             {
164                 log.error(e.getMessage());
165             }
166         }
167 
168         // Anderenfalls oder falls nicht im Cache loadCachableByteArrayOutputStream aufrufen um eines anzulegen
169         if (cObj == null)
170         {
171             cObj = loadCachableByteArrayOutputStream(projektnummer, gruppennummer, quartal, reportnummer, sprachnummer, typ);
172         }
173 
174         return cObj;
175     }
176 
177     /***
178      * Creates a BookVObj based on the id of the BOOK table.  Data
179      * access could be direct JDBC, some or mapping tool, or an EJB.
180 
181      * @param projektnummer Die Projektnummer
182      * @param gruppennummer Die Gruppennummer
183      * @param quartal       Das Quartal
184      * @param reportnummer  Die Reportnummer
185      * @param sprachnummer  Die Sprachnummer
186      * @param typ           Zusatz f&uuml; die Identifizerieung ob XML / PDF / RTF / HTML Output Stream
187      * @return Ein CachableByteArrayOutputStream
188      */
189     private CachableByteArrayOutputStream loadCachableByteArrayOutputStream(Integer projektnummer, Integer gruppennummer, Integer quartal, Integer reportnummer, Integer sprachnummer, String typ)
190     {
191         /*** Data Interface (indirekter Zugriff auf die OJB Ebene) initialisieren */
192         DataInterfaceReportnamen dirn = new DataInterfaceReportnamen();
193         Reportnamen reportname = (Reportnamen) dirn.sucheReportnummer(reportnummer);
194 
195         CachableByteArrayOutputStream cObj = null;
196         CachableByteArrayOutputStream xmlObj = null;
197 
198         String id = typ + projektnummer + gruppennummer + quartal + reportnummer + sprachnummer;
199         String idXML = "XML" + projektnummer + gruppennummer + quartal + reportnummer + sprachnummer;
200 
201         try
202         {
203             xmlObj = (CachableByteArrayOutputStream) outputCache.get("CBAOS" + idXML);
204         }
205         catch (Exception e)
206         {
207             log.error(e.getMessage());
208         }
209 
210         Properties properties = StringUtilities.getPropertiesFromFile("cabaweb.properties");
211         String xslPDF = null;
212         String xslHTML = null;
213         if(reportname.getReporttyp().compareTo("Quartal") == 0)
214         {
215         	xslPDF = properties.getProperty("URLReportXSLPDF");
216         	xslHTML = properties.getProperty("URLReportXSLHTML");
217         }
218         else if(reportname.getReporttyp().compareTo("Bewertung") == 0)
219         {
220         	xslPDF = properties.getProperty("URLBewertungXSLPDF");
221         	xslHTML = properties.getProperty("URLBewertungXSLHTML");
222         }
223         
224         try
225         {
226             if (xmlObj == null)
227             {
228                 if (log.isDebugEnabled())
229                 {
230                     log.debug(" Erzeuge XML Dokument");
231                 }
232 
233                 Document xml = ExportReport.createDocument(projektnummer, gruppennummer, quartal, reportnummer, sprachnummer);
234 
235                 xmlObj = ReportTransform.writeXML(xml);
236 
237                 if (log.isDebugEnabled())
238                 {
239                     log.debug(" Formatiere XML Ausgabe");
240                 }
241 
242                 if (outputCache.get("CBAOS" + idXML) != null)
243                 {
244                     outputCache.remove("CBAOS" + idXML);
245                 }
246                 outputCache.put("CBAOS" + idXML, xmlObj);
247             }
248 
249             if (xmlObj != null)
250             {
251                 if (typ.compareTo("XML") == 0)
252                 {
253                     if (log.isDebugEnabled())
254                     {
255                         log.debug("XML Erzeugung - Bereits erfolgt");
256                     }
257 
258                     cObj = xmlObj;
259                 }
260                 else if (typ.compareTo("PDF") == 0)
261                 {
262                     if (log.isDebugEnabled())
263                     {
264                         log.debug(" Erzeuge PDF Dokument");
265                     }
266 
267                     cObj = ReportTransform.writePDF(xmlObj, xslPDF);
268 
269                     if (outputCache.get("CBAOS" + id) != null)
270                     {
271                         outputCache.remove("CBAOS" + id);
272                     }
273                     outputCache.put("CBAOS" + id, cObj);
274                 }
275                 else if (typ.compareTo("RTF") == 0)
276                 {
277                     if (log.isDebugEnabled())
278                     {
279                         log.debug(" Erzeuge RTF Dokument");
280                     }
281 
282                     cObj = ReportTransform.writeRTF(xmlObj, xslPDF);
283 
284                     if (outputCache.get("CBAOS" + id) != null)
285                     {
286                         outputCache.remove("CBAOS" + id);
287                     }
288                     outputCache.put("CBAOS" + id, cObj);
289                 }
290                 else if (typ.compareTo("HTML") == 0)
291                 {
292                     if (log.isDebugEnabled())
293                     {
294                         log.debug(" Erzeuge HTML Dokument");
295                     }
296 
297                     cObj = ReportTransform.writeHTML(xmlObj, xslHTML);
298 
299                     if (outputCache.get("CBAOS" + id) != null)
300                     {
301                         outputCache.remove("CBAOS" + id);
302                     }
303                     outputCache.put("CBAOS" + id, cObj);
304                 }
305                 else if (typ.compareTo("XSLFO") == 0)
306                 {
307                     if (log.isDebugEnabled())
308                     {
309                         log.debug(" Erzeuge XSL-FO Dokument");
310                     }
311 
312                     cObj = ReportTransform.writeXSLFO(xmlObj, xslPDF);
313 
314                     if (outputCache.get("CBAOS" + id) != null)
315                     {
316                         outputCache.remove("CBAOS" + id);
317                     }
318                     outputCache.put("CBAOS" + id, cObj);
319                 }
320             }
321             else
322             {
323                 throw new Exception("NO XML OBJECT FOUND/CREATED !!!");
324             }
325         }
326         catch (Exception e)
327         {
328             log.error(e.getMessage(), e);
329         }
330 
331         return cObj;
332     }
333 }