1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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ö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ü 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ü 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ä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ückgegeben und im Cache gespeichert.
136 * Die Datenbanksynchronization woird durch das löschen von Elementen
137 * bei Modifikation gelö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ü 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
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
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ü 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 }