KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > outerj > daisy > frontend > PreparedDocumentsHandler


1 /*
2  * Copyright 2004 Outerthought bvba and Schaubroeck nv
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */

16 package org.outerj.daisy.frontend;
17
18 import org.xml.sax.ContentHandler JavaDoc;
19 import org.xml.sax.SAXException JavaDoc;
20 import org.xml.sax.Locator JavaDoc;
21 import org.xml.sax.Attributes JavaDoc;
22 import org.xml.sax.helpers.AttributesImpl JavaDoc;
23 import org.apache.cocoon.xml.SaxBuffer;
24 import org.apache.cocoon.environment.Request;
25 import org.outerj.daisy.repository.VariantKey;
26
27 import java.util.Stack JavaDoc;
28
29 /**
30  * Handles preparedDocuments (resulting from a publisher request). If the applyDocumentTypeStyling
31  * attribute of the preparedDocuments element is true, this will apply document type specific styling
32  * to the prepared documents and store the result in a request attribute (for later merging
33  * by the {@link IncludePreparedDocumentsTransformer}.
34  */

35 public class PreparedDocumentsHandler implements ContentHandler JavaDoc {
36     private static final String JavaDoc PUBLISHER_NS = "http://outerx.org/daisy/1.0#publisher";
37     private ContentHandler JavaDoc consumer;
38     private int elementNesting = 0;
39     private PreparedDocInfo preparedDocInfo;
40     private Stack JavaDoc preparedDocumentStack = new Stack JavaDoc();
41     private DocumentTypeSpecificStyler documentTypeSpecificStyler;
42     private Request request;
43
44     public PreparedDocumentsHandler(ContentHandler JavaDoc consumer, Request request, DocumentTypeSpecificStyler documentTypeSpecificStyler) {
45         this.request = request;
46         this.consumer = consumer;
47         this.documentTypeSpecificStyler = documentTypeSpecificStyler;
48     }
49
50     public void startElement(String JavaDoc namespaceURI, String JavaDoc localName, String JavaDoc qName, Attributes JavaDoc atts) throws SAXException JavaDoc {
51         elementNesting++;
52
53         if (namespaceURI.equals(PUBLISHER_NS) && localName.equals("preparedDocuments")
54                 && atts.getValue("styledResultsId") == null && "true".equals(atts.getValue("applyDocumentTypeStyling"))) {
55             if (preparedDocInfo != null) {
56                 preparedDocumentStack.push(preparedDocInfo);
57             }
58             preparedDocInfo = new PreparedDocInfo();
59             preparedDocInfo.prepDocsNesting = elementNesting;
60         } else if (preparedDocInfo != null && preparedDocInfo.prepDocNesting == 0
61                 && namespaceURI.equals(PUBLISHER_NS) && localName.equals("preparedDocument")) {
62             preparedDocInfo.prepDocNesting = elementNesting;
63             int id = Integer.parseInt(atts.getValue("id"));
64             long documentId = Long.parseLong(atts.getValue("documentId"));
65             long branchId = Long.parseLong(atts.getValue("branchId"));
66             long languageId = Long.parseLong(atts.getValue("languageId"));
67             VariantKey documentKey = new VariantKey(documentId, branchId, languageId);
68             preparedDocInfo.buffer = new SaxBuffer();
69             preparedDocInfo.preparedDocuments.putPreparedDocument(id, documentKey, preparedDocInfo.buffer);
70         } else if (preparedDocInfo != null && preparedDocInfo.prepDocNesting > 0) {
71             preparedDocInfo.buffer.startElement(namespaceURI, localName, qName, atts);
72         } else if (preparedDocInfo == null) {
73             consumer.startElement(namespaceURI, localName, qName, atts);
74         }
75     }
76
77     public void endElement(String JavaDoc namespaceURI, String JavaDoc localName, String JavaDoc qName) throws SAXException JavaDoc {
78         if (preparedDocInfo != null && preparedDocInfo.prepDocsNesting == elementNesting) {
79
80             try {
81                 documentTypeSpecificStyler.transformPreparedDocuments(preparedDocInfo.preparedDocuments);
82             } catch (Exception JavaDoc e) {
83                 throw new SAXException JavaDoc(e);
84             }
85
86             Long JavaDoc styledResultIdCounter = (Long JavaDoc)request.getAttribute("styledResultIdCounter");
87             if (styledResultIdCounter == null)
88                 styledResultIdCounter = new Long JavaDoc(1);
89             else
90                 styledResultIdCounter = new Long JavaDoc(styledResultIdCounter.longValue() + 1);
91             request.setAttribute("styledResultIdCounter", styledResultIdCounter);
92             String JavaDoc styledResultId = "styledResult-" + String.valueOf(styledResultIdCounter.longValue());
93
94             request.setAttribute(styledResultId, preparedDocInfo.preparedDocuments);
95
96             // Leave this prepared document first (required to work correctly for nested preparedDocuments)
97
if (preparedDocumentStack.size() > 0) {
98                 preparedDocInfo = (PreparedDocInfo)preparedDocumentStack.pop();
99             } else {
100                 preparedDocInfo = null;
101             }
102
103             // And now generate preparedDocuemnts tag
104
AttributesImpl JavaDoc attrs = new AttributesImpl JavaDoc();
105             attrs.addAttribute("", "styledResultsId", "styledResultsId", "CDATA", styledResultId);
106             startElement(PUBLISHER_NS, "preparedDocuments", "p:preparedDocuments", attrs);
107             endElement(PUBLISHER_NS, "preparedDocuments", "p:preparedDocuments");
108
109         } else if (preparedDocInfo != null && preparedDocInfo.prepDocNesting == elementNesting) {
110             preparedDocInfo.prepDocNesting = 0;
111             preparedDocInfo.buffer = null;
112         } else if (preparedDocInfo != null && preparedDocInfo.prepDocNesting > 0) {
113             preparedDocInfo.buffer.endElement(namespaceURI, localName, qName);
114         } else if (preparedDocInfo == null) {
115             consumer.endElement(namespaceURI, localName, qName);
116         }
117
118         elementNesting--;
119     }
120
121     public void endDocument() throws SAXException JavaDoc {
122         consumer.endDocument();
123     }
124
125     public void startDocument() throws SAXException JavaDoc {
126         consumer.startDocument();
127     }
128
129     public void characters(char ch[], int start, int length) throws SAXException JavaDoc {
130         if (preparedDocInfo != null && preparedDocInfo.prepDocNesting > 0) {
131             preparedDocInfo.buffer.characters(ch, start, length);
132         } else if (preparedDocInfo == null) {
133             consumer.characters(ch, start, length);
134         }
135     }
136
137     public void ignorableWhitespace(char ch[], int start, int length) throws SAXException JavaDoc {
138         if (preparedDocInfo != null && preparedDocInfo.prepDocNesting > 0) {
139             preparedDocInfo.buffer.ignorableWhitespace(ch, start, length);
140         } else if (preparedDocInfo == null) {
141             consumer.ignorableWhitespace(ch, start, length);
142         }
143     }
144
145     public void endPrefixMapping(String JavaDoc prefix) throws SAXException JavaDoc {
146         if (preparedDocInfo != null && preparedDocInfo.prepDocNesting > 0) {
147             preparedDocInfo.buffer.endPrefixMapping(prefix);
148         } else if (preparedDocInfo == null) {
149             consumer.endPrefixMapping(prefix);
150         }
151     }
152
153     public void skippedEntity(String JavaDoc name) throws SAXException JavaDoc {
154         if (preparedDocInfo != null && preparedDocInfo.prepDocNesting > 0) {
155             preparedDocInfo.buffer.skippedEntity(name);
156         } else if (preparedDocInfo == null) {
157             consumer.skippedEntity(name);
158         }
159     }
160
161     public void setDocumentLocator(Locator JavaDoc locator) {
162         // ignore
163
}
164
165     public void processingInstruction(String JavaDoc target, String JavaDoc data) throws SAXException JavaDoc {
166         if (preparedDocInfo != null && preparedDocInfo.prepDocNesting > 0) {
167             preparedDocInfo.buffer.processingInstruction(target, data);
168         } else if (preparedDocInfo == null) {
169             consumer.processingInstruction(target, data);
170         }
171     }
172
173     public void startPrefixMapping(String JavaDoc prefix, String JavaDoc uri) throws SAXException JavaDoc {
174         if (preparedDocInfo != null && preparedDocInfo.prepDocNesting > 0) {
175             preparedDocInfo.buffer.startPrefixMapping(prefix, uri);
176         } else if (preparedDocInfo == null) {
177             consumer.startPrefixMapping(prefix, uri);
178         }
179     }
180
181     static class PreparedDocInfo {
182         PreparedDocuments preparedDocuments = new PreparedDocuments();
183         SaxBuffer buffer;
184         int prepDocNesting = 0;
185         int prepDocsNesting;
186     }
187
188 }
189
Popular Tags