1 6 package fr.jayasoft.ivy.util; 7 8 import java.io.IOException ; 9 import java.io.InputStream ; 10 import java.net.URL ; 11 12 import javax.xml.parsers.ParserConfigurationException ; 13 import javax.xml.parsers.SAXParser ; 14 import javax.xml.parsers.SAXParserFactory ; 15 16 import org.xml.sax.SAXException ; 17 import org.xml.sax.SAXNotRecognizedException ; 18 import org.xml.sax.ext.LexicalHandler ; 19 import org.xml.sax.helpers.DefaultHandler ; 20 21 import fr.jayasoft.ivy.url.URLHandlerRegistry; 22 23 public abstract class XMLHelper { 24 private static SAXParserFactory _validatingFactory = SAXParserFactory.newInstance(); 25 26 private static SAXParserFactory _factory = SAXParserFactory.newInstance(); 27 28 static final String JAXP_SCHEMA_LANGUAGE = "http://java.sun.com/xml/jaxp/properties/schemaLanguage"; 29 30 static final String JAXP_SCHEMA_SOURCE = "http://java.sun.com/xml/jaxp/properties/schemaSource"; 31 32 static final String W3C_XML_SCHEMA = "http://www.w3.org/2001/XMLSchema"; 33 34 private static boolean _canUseSchemaValidation = true; 35 36 static { 37 _validatingFactory.setNamespaceAware(true); 38 _validatingFactory.setValidating(true); 39 } 40 41 private static SAXParser newSAXParser(URL schema, InputStream schemaStream) throws ParserConfigurationException , SAXException { 42 if (!_canUseSchemaValidation || schema == null) { 43 return _factory.newSAXParser(); 44 } 45 try { 46 SAXParser parser = _validatingFactory.newSAXParser(); 47 parser.setProperty(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA); 48 parser.setProperty(JAXP_SCHEMA_SOURCE, schemaStream); 49 return parser; 50 } catch (SAXNotRecognizedException ex) { 51 System.err.println("WARNING: problem while setting JAXP validating property on SAXParser... XML validation will not be done: " + ex.getMessage()); 52 _canUseSchemaValidation = false; 53 return _factory.newSAXParser(); 54 } 55 } 56 57 public static void parse(URL xmlURL, URL schema, DefaultHandler handler) throws SAXException , IOException , ParserConfigurationException { 62 parse(xmlURL, schema, handler, null); 63 } 64 65 public static void parse(URL xmlURL, URL schema, DefaultHandler handler, LexicalHandler lHandler) throws SAXException , IOException , ParserConfigurationException { 66 InputStream xmlStream = URLHandlerRegistry.getDefault().openStream(xmlURL); 67 try { 68 parse(xmlStream, schema, handler, lHandler); 69 } finally { 70 try { 71 xmlStream.close(); 72 } catch (IOException e) {} 73 } 74 } 75 76 public static void parse(InputStream xmlStream, URL schema, DefaultHandler handler, LexicalHandler lHandler) throws SAXException , IOException , ParserConfigurationException { 77 InputStream schemaStream = null; 78 try { 79 if (schema != null) { 80 schemaStream = URLHandlerRegistry.getDefault().openStream(schema); 81 } 82 SAXParser parser = XMLHelper.newSAXParser(schema, schemaStream); 83 84 if (lHandler != null) { 85 try { 86 parser.setProperty("http://xml.org/sax/properties/lexical-handler", lHandler); 87 } catch (SAXException ex) { 88 System.err.println("WARNING: problem while setting the lexical handler property on SAXParser: " + ex.getMessage()); 89 } 91 } 92 93 parser.parse(xmlStream, handler); 94 } finally { 95 if (schemaStream != null) { 96 try { 97 schemaStream.close(); 98 } catch (IOException ex) { 99 } 100 } 101 } 102 } 103 104 public static boolean canUseSchemaValidation() { 105 return _canUseSchemaValidation; 106 } 107 108 } 109 | Popular Tags |