1 16 package org.outerj.daisy.frontend; 17 18 import org.xml.sax.ContentHandler ; 19 import org.xml.sax.SAXException ; 20 import org.xml.sax.Locator ; 21 import org.xml.sax.Attributes ; 22 import org.xml.sax.helpers.AttributesImpl ; 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 ; 28 29 35 public class PreparedDocumentsHandler implements ContentHandler { 36 private static final String PUBLISHER_NS = "http://outerx.org/daisy/1.0#publisher"; 37 private ContentHandler consumer; 38 private int elementNesting = 0; 39 private PreparedDocInfo preparedDocInfo; 40 private Stack preparedDocumentStack = new Stack (); 41 private DocumentTypeSpecificStyler documentTypeSpecificStyler; 42 private Request request; 43 44 public PreparedDocumentsHandler(ContentHandler consumer, Request request, DocumentTypeSpecificStyler documentTypeSpecificStyler) { 45 this.request = request; 46 this.consumer = consumer; 47 this.documentTypeSpecificStyler = documentTypeSpecificStyler; 48 } 49 50 public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException { 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 namespaceURI, String localName, String qName) throws SAXException { 78 if (preparedDocInfo != null && preparedDocInfo.prepDocsNesting == elementNesting) { 79 80 try { 81 documentTypeSpecificStyler.transformPreparedDocuments(preparedDocInfo.preparedDocuments); 82 } catch (Exception e) { 83 throw new SAXException (e); 84 } 85 86 Long styledResultIdCounter = (Long )request.getAttribute("styledResultIdCounter"); 87 if (styledResultIdCounter == null) 88 styledResultIdCounter = new Long (1); 89 else 90 styledResultIdCounter = new Long (styledResultIdCounter.longValue() + 1); 91 request.setAttribute("styledResultIdCounter", styledResultIdCounter); 92 String styledResultId = "styledResult-" + String.valueOf(styledResultIdCounter.longValue()); 93 94 request.setAttribute(styledResultId, preparedDocInfo.preparedDocuments); 95 96 if (preparedDocumentStack.size() > 0) { 98 preparedDocInfo = (PreparedDocInfo)preparedDocumentStack.pop(); 99 } else { 100 preparedDocInfo = null; 101 } 102 103 AttributesImpl attrs = new AttributesImpl (); 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 { 122 consumer.endDocument(); 123 } 124 125 public void startDocument() throws SAXException { 126 consumer.startDocument(); 127 } 128 129 public void characters(char ch[], int start, int length) throws SAXException { 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 { 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 prefix) throws SAXException { 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 name) throws SAXException { 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 locator) { 162 } 164 165 public void processingInstruction(String target, String data) throws SAXException { 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 prefix, String uri) throws SAXException { 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 |