1 package com.quadcap.http.servlets.jsp; 2 3 40 41 import java.io.BufferedInputStream ; 42 import java.io.BufferedReader ; 43 import java.io.CharArrayWriter ; 44 import java.io.File ; 45 import java.io.FileReader ; 46 import java.io.IOException ; 47 import java.io.InputStream ; 48 import java.io.InputStreamReader ; 49 import java.io.PrintWriter ; 50 import java.io.Reader ; 51 import java.io.Writer ; 52 53 import java.util.Enumeration ; 54 import java.util.Hashtable ; 55 import java.util.Vector ; 56 57 import javax.servlet.ServletContext ; 58 59 import org.xml.sax.AttributeList ; 60 import org.xml.sax.DocumentHandler ; 61 import org.xml.sax.DTDHandler ; 62 import org.xml.sax.EntityResolver ; 63 import org.xml.sax.ErrorHandler ; 64 import org.xml.sax.HandlerBase ; 65 import org.xml.sax.InputSource ; 66 import org.xml.sax.Locator ; 67 import org.xml.sax.Parser ; 68 import org.xml.sax.SAXException ; 69 70 import com.quadcap.util.collections.ArrayQueue; 71 72 import com.quadcap.util.Debug; 73 74 79 public class JspHandler implements DocumentHandler , EntityResolver , TagContext { 80 ServletContext context; 81 JspParser parser; 82 JspObject jsp; 83 Hashtable tagHandlers = new Hashtable (); 84 PrintWriter w; 85 CharArrayWriter cw = null; 86 boolean written = false; 87 ArrayQueue tagStack = new ArrayQueue(0, -1); 88 ArrayQueue wStack = new ArrayQueue(0, -1); 89 Hashtable pageDirectives = new Hashtable (); 90 91 public JspHandler(ServletContext context, JspParser parser, 92 PrintWriter w, JspObject jsp) { 93 this.context = context; 94 this.parser = parser; 95 this.jsp = jsp; 96 this.w = w; 97 addHandler("jsp:root", new TagJspRoot()); 98 addHandler("jsp:useBean", new TagJspUseBean()); 99 addHandler("jsp:expression", new TagJspExpression()); 100 addHandler("jsp:expr", new TagJspExpression()); 101 addHandler("jsp:declaration", new TagJspDeclaration()); 102 addHandler("jsp:decl", new TagJspDeclaration()); 103 addHandler("jsp:scriptlet", new TagJspScriptlet()); 104 addHandler("jsp:directive.page", new TagJspPage()); 105 addHandler("jsp:directive.include", new TagDirInclude()); 106 addHandler("jsp:forward", new TagJspForward()); 107 addHandler("jsp:include", new TagJspInclude()); 108 addHandler("jsp:getProperty", new TagJspGetProperty()); 109 addHandler("jsp:setProperty", new TagJspSetProperty()); 110 } 111 112 public PrintWriter getPrintWriter() { return w; } 113 public String getPackageName() { return jsp.getPackageName(); } 114 public String getClassName() { return jsp.getClassName(); } 115 116 public void includeFile(String file) throws IOException , SAXException { 117 EntityResolver resolver = parser.getEntityResolver(); 118 InputSource in = null; 119 if (resolver != null) { 120 in = resolver.resolveEntity(null, file); 121 } else { 122 FileReader f = new FileReader (file); 123 in = new InputSource (f); 124 } 125 if (in == null) { 126 throw new IOException ("Can't resolve entity: " + file); 127 } 128 parser.pushInputSource(in); 129 } 130 131 public PrintWriter pushPrintWriter(PrintWriter p) { 132 wStack.addBack(w); 133 PrintWriter oldW = w; 134 w = p; 135 return oldW; 136 } 137 138 public PrintWriter popPrintWriter() { 139 w = (PrintWriter )wStack.popBack(); 140 return w; 141 } 142 143 public void addPageDirective(String name, String val) { 144 Vector v = (Vector )pageDirectives.get(name); 145 if (v == null) { 146 v = new Vector (); 147 pageDirectives.put(name, v); 148 } 149 v.addElement(val); 150 } 151 152 public Enumeration getPageDirectives(String name) { 153 Vector v = (Vector )pageDirectives.get(name); 154 if (v == null) v = new Vector (); 155 return v.elements(); 156 } 157 158 public String getPageDirective(String name) { 159 String s = null; 160 Vector v = (Vector )pageDirectives.get(name); 161 if (v != null && v.size() > 0) s = v.elementAt(0).toString(); 162 return s; 163 } 164 165 public String getPageDirective(String name, String dflt) { 166 String s = dflt; 167 Vector v = (Vector )pageDirectives.get(name); 168 if (v != null && v.size() > 0) s = v.elementAt(0).toString(); 169 return s; 170 } 171 172 public boolean isValidTag(String name) { 173 return tagHandlers.get(name) != null; 174 } 175 176 public void addHandler(String name, TagHandler h) { 177 tagHandlers.put(name, h); 178 } 179 180 public void startDocument() { 181 } 182 183 public void endDocument() { 184 } 185 186 public void ignorableWhitespace(char[] ch, int off, int cnt) 187 throws SAXException 188 { 189 characters(ch, off, cnt); 190 } 191 192 public void processingInstruction(String target, String data) { 193 } 194 195 public void setDocumentLocator(Locator locator) { 196 } 197 198 public void startElement(String tag, AttributeList attrs) 199 throws SAXException 200 { 201 try { 203 TagHandler h = (TagHandler)tagHandlers.get(tag); 204 if (h != null) { 205 TagInstance t = h.makeInstance(this); 206 t.doStartTag(tag, attrs); 207 tagStack.addBack(t); 208 } else { 209 CharArrayWriter cw = new CharArrayWriter (); 210 cw.write('<'); 211 cw.write(tag); 212 for (int i = 0; i < attrs.getLength(); i++) { 213 cw.write(' '); 214 cw.write(attrs.getName(i)); 215 cw.write('='); 216 cw.write('"'); 217 cw.write(attrs.getValue(i)); 218 cw.write('"'); 219 } 220 cw.write('>'); 221 char[] ch = cw.toCharArray(); 222 characters(ch, 0, ch.length); 223 } 224 } catch (Exception e) { 225 Debug.print(e); 226 throw new SAXException (e.toString()); 227 } 228 } 229 230 public void characters(char[] ch, int off, int len) throws SAXException { 231 try { 232 TagInstance t = (TagInstance)tagStack.tail(); 233 if (t != null) { 234 t.doCharacters(ch, off, len); 235 } 236 } catch (Exception e) { 237 Debug.print(e); 238 throw new SAXException (e.toString()); 239 } 240 } 241 242 public void endElement(String tag) throws SAXException { 243 try { 245 TagInstance t = (TagInstance)tagStack.tail(); 246 if (t != null && t.getTagName().equals(tag)) { 248 tagStack.popBack(); 249 t.doEndTag(); 250 } else { 251 CharArrayWriter cw = new CharArrayWriter (); 252 cw.write("</"); 253 cw.write(tag); 254 cw.write(">"); 255 char[] ch = cw.toCharArray(); 256 characters(ch, 0, ch.length); 257 } 258 } catch (Exception e) { 259 Debug.print(e); 260 throw new SAXException (e.toString()); 261 } 262 } 263 264 267 public InputSource resolveEntity(String publicId, String systemId) 268 throws IOException 269 { 270 String name = null; 271 if (!systemId.startsWith("/")) { 272 name = jsp.getPackageName() + "/" + systemId; 273 } 274 InputStream in = context.getResourceAsStream(name); 275 InputSource is = null; 276 if (is != null) { 277 BufferedInputStream bin = new BufferedInputStream (in); 278 InputStreamReader r = new InputStreamReader (bin); 279 is = new InputSource (r); 280 } 281 return is; 282 } 283 } 284 285 286 | Popular Tags |