1 19 package org.java.plugin.registry.xml; 20 21 import java.io.IOException ; 22 import java.io.InputStream ; 23 import java.io.InputStreamReader ; 24 import java.io.Reader ; 25 import java.io.StringReader ; 26 import java.net.URL ; 27 28 import javax.xml.parsers.ParserConfigurationException ; 29 import javax.xml.parsers.SAXParserFactory ; 30 31 import org.apache.commons.logging.Log; 32 import org.apache.commons.logging.LogFactory; 33 import org.java.plugin.util.IoUtil; 34 import org.xml.sax.EntityResolver ; 35 import org.xml.sax.InputSource ; 36 import org.xml.sax.SAXException ; 37 38 41 final class ManifestParser { 42 static Log log = LogFactory.getLog(ManifestParser.class); 43 44 static final String PLUGIN_DTD_1_0 = loadPluginDtd("1_0"); 46 private static String loadPluginDtd(final String version) { 47 try { 48 Reader in = new InputStreamReader ( 49 PluginRegistryImpl.class.getResourceAsStream("plugin_" + version + ".dtd"), "UTF-8"); try { 52 StringBuffer sBuf = new StringBuffer (); 53 char[] cBuf = new char[64]; 54 int read; 55 while ((read = in.read(cBuf)) != -1) { 56 sBuf.append(cBuf, 0, read); 57 } 58 return sBuf.toString(); 59 } finally { 60 in.close(); 61 } 62 } catch (IOException ioe) { 63 log.error("can't read plug-in DTD file of version " + version, ioe); } 65 return null; 66 } 67 68 private static EntityResolver getDtdEntityResolver() { 69 return new EntityResolver () { 70 public InputSource resolveEntity(final String publicId, 71 final String systemId) { 72 if (publicId == null) { 73 log.debug("can't resolve entity, public ID is NULL, systemId=" + systemId); return null; 75 } 76 if (PLUGIN_DTD_1_0 == null) { 77 return null; 78 } 79 if (publicId.equals("-//JPF//Java Plug-in Manifest 1.0") || publicId.equals("-//JPF//Java Plug-in Manifest 0.7") || publicId.equals("-//JPF//Java Plug-in Manifest 0.6") || publicId.equals("-//JPF//Java Plug-in Manifest 0.5") || publicId.equals("-//JPF//Java Plug-in Manifest 0.4") || publicId.equals("-//JPF//Java Plug-in Manifest 0.3") || publicId.equals("-//JPF//Java Plug-in Manifest 0.2")) { if (log.isDebugEnabled()) { 87 log.debug("entity resolved to plug-in manifest DTD, publicId=" + publicId + ", systemId=" + systemId); } 90 return new InputSource (new StringReader (PLUGIN_DTD_1_0)); 91 } 92 if (log.isDebugEnabled()) { 93 log.debug("entity not resolved, publicId=" + publicId + ", systemId=" + systemId); } 96 return null; 97 } 98 }; 99 } 100 101 private final SAXParserFactory parserFactory; 102 private final EntityResolver entityResolver; 103 104 ManifestParser(final boolean isValidating) { 105 parserFactory = SAXParserFactory.newInstance(); 106 parserFactory.setValidating(isValidating); 107 entityResolver = isValidating ? getDtdEntityResolver() : null; 108 log.info("got SAX parser factory - " + parserFactory); } 110 111 ModelPluginManifest parseManifest(final URL url) 112 throws ParserConfigurationException , SAXException , IOException { 113 ManifestHandler handler = 114 new ManifestHandler(entityResolver); 115 InputStream strm = IoUtil.getResourceInputStream(url); 117 try { 118 parserFactory.newSAXParser().parse(strm, handler); 119 } finally { 120 strm.close(); 121 } 122 return handler.getResult(); 123 } 124 125 ModelManifestInfo parseManifestInfo(final URL url) 126 throws ParserConfigurationException , SAXException , IOException { 127 ManifestInfoHandler handler = 128 new ManifestInfoHandler(entityResolver); 129 InputStream strm = IoUtil.getResourceInputStream(url); 131 try { 132 parserFactory.newSAXParser().parse(strm, handler); 133 } finally { 134 strm.close(); 135 } 136 return handler.getResult(); 137 } 138 } 139 | Popular Tags |