1 44 45 package org.jfree.xml; 46 47 import java.io.BufferedInputStream ; 48 import java.io.IOException ; 49 import java.net.URL ; 50 import javax.xml.parsers.ParserConfigurationException ; 51 import javax.xml.parsers.SAXParser ; 52 import javax.xml.parsers.SAXParserFactory ; 53 54 import org.jfree.util.Log; 55 import org.xml.sax.EntityResolver ; 56 import org.xml.sax.InputSource ; 57 import org.xml.sax.SAXException ; 58 import org.xml.sax.XMLReader ; 59 60 71 public class ParserFrontend { 72 73 74 private FrontendDefaultHandler defaulthandler; 75 76 77 private SAXParserFactory factory; 78 79 80 private EntityResolver entityResolver; 81 82 83 private boolean validateDTD; 84 85 91 protected ParserFrontend(final FrontendDefaultHandler parser) { 92 if (parser == null) { 93 throw new NullPointerException (); 94 } 95 this.defaulthandler = parser; 96 } 97 98 104 public boolean isValidateDTD() { 105 return this.validateDTD; 106 } 107 108 114 public void setValidateDTD(final boolean validateDTD) { 115 this.validateDTD = validateDTD; 116 } 117 118 123 public EntityResolver getEntityResolver() { 124 return this.entityResolver; 125 } 126 127 132 public void setEntityResolver(final EntityResolver entityResolver) { 133 this.entityResolver = entityResolver; 134 } 135 136 144 protected SAXParser getParser() throws ParserConfigurationException , SAXException { 145 if (this.factory == null) { 146 this.factory = SAXParserFactory.newInstance(); 147 if (isValidateDTD()) { 148 try { 149 this.factory.setValidating(true); 151 } 152 catch (Exception ex) { 153 Log.debug("The parser will not validate the xml document.", ex); 155 } 156 } 157 } 158 return this.factory.newSAXParser(); 159 } 160 161 167 public void setDefaultHandler(final FrontendDefaultHandler handler) { 168 if (handler == null) { 169 throw new NullPointerException (); 170 } 171 this.defaulthandler = handler; 172 } 173 174 179 public FrontendDefaultHandler getDefaultHandler() { 180 return this.defaulthandler; 181 } 182 183 191 protected FrontendDefaultHandler createDefaultHandler(final URL contentBase) { 192 final FrontendDefaultHandler handler = getDefaultHandler().newInstance(); 193 if (contentBase != null) { 194 handler.setConfigProperty(Parser.CONTENTBASE_KEY, contentBase.toExternalForm()); 195 } 196 return handler; 197 } 198 199 209 protected Object parse(final InputSource input, final URL contentBase) 210 throws ElementDefinitionException { 211 try { 212 final SAXParser parser = getParser(); 213 final XMLReader reader = parser.getXMLReader(); 214 215 try { 216 reader.setFeature("http://xml.org/sax/features/validation", isValidateDTD()); 217 } 218 catch (SAXException se) { 219 Log.debug("The XMLReader will not validate the xml document.", se); 220 } 221 final FrontendDefaultHandler handler = createDefaultHandler(contentBase); 222 configureReader(reader, handler); 223 try { 224 reader.setContentHandler(handler); 225 reader.setDTDHandler(handler); 226 if (getEntityResolver() != null) { 227 reader.setEntityResolver(getEntityResolver()); 228 } 229 reader.setErrorHandler(handler); 230 reader.parse(input); 231 return handler.getResult(); 232 } 233 catch (IOException e) { 234 throw new ElementDefinitionException(e); 235 } 236 } 237 catch (ParserConfigurationException e) { 238 throw new ElementDefinitionException(e); 239 } 240 catch (SAXException e) { 241 throw new ElementDefinitionException(e); 242 } 243 } 244 245 252 protected void configureReader(final XMLReader reader, final FrontendDefaultHandler handler) { 253 try { 254 reader.setProperty 255 ("http://xml.org/sax/properties/lexical-handler", handler.getCommentHandler()); 256 } 257 catch (SAXException se) { 258 Log.debug("Comments are not supported by this SAX implementation."); 259 } 260 } 261 262 278 public Object parse(final URL file, final URL contentBase) 279 throws ElementDefinitionException, IOException { 280 if (file == null) { 281 throw new NullPointerException ("File may not be null"); 282 } 283 284 final BufferedInputStream bin = new BufferedInputStream (file.openStream()); 285 final InputSource in = new InputSource (bin); 286 in.setSystemId(file.toString()); 287 final Object result = parse(in, contentBase); 288 bin.close(); 289 return result; 290 } 291 292 } 293
| Popular Tags
|