001 package com.thaiopensource.relaxng.parse.sax;
002
003 import com.thaiopensource.relaxng.parse.SubParser;
004 import com.thaiopensource.relaxng.parse.ParsedPattern;
005 import com.thaiopensource.relaxng.parse.SchemaBuilder;
006 import com.thaiopensource.relaxng.parse.IncludedGrammar;
007 import com.thaiopensource.relaxng.parse.BuildException;
008 import com.thaiopensource.relaxng.parse.IllegalSchemaException;
009 import com.thaiopensource.relaxng.parse.Scope;
010 import com.thaiopensource.xml.sax.XMLReaderCreator;
011 import org.xml.sax.XMLReader;
012 import org.xml.sax.SAXException;
013 import org.xml.sax.InputSource;
014 import org.xml.sax.EntityResolver;
015 import org.xml.sax.ErrorHandler;
016
017 import java.io.IOException;
018
019 public class SAXSubParser implements SubParser {
020 final XMLReaderCreator xrc;
021 final ErrorHandler eh;
022 final EntityResolver er;
023
024 SAXSubParser(XMLReaderCreator xrc, ErrorHandler eh, EntityResolver er) {
025 this.xrc = xrc;
026 this.eh = eh;
027 this.er = er;
028 }
029
030 public ParsedPattern parseInclude(String uri, SchemaBuilder schemaBuilder, IncludedGrammar g)
031 throws BuildException, IllegalSchemaException {
032 try {
033 XMLReader xr = xrc.createXMLReader();
034 SchemaParser sp = new SchemaParser(xr, eh, er, schemaBuilder, g, g);
035 xr.parse(makeInputSource(xr, uri));
036 return sp.getParsedPattern();
037 }
038 catch (SAXException e) {
039 throw SAXParseable.toBuildException(e);
040 }
041 catch (IOException e) {
042 throw new BuildException(e);
043 }
044 }
045
046 public ParsedPattern parseExternal(String uri, SchemaBuilder schemaBuilder, Scope s)
047 throws BuildException, IllegalSchemaException {
048 try {
049 XMLReader xr = xrc.createXMLReader();
050 SchemaParser sp = new SchemaParser(xr, eh, er, schemaBuilder, null, s);
051 xr.parse(makeInputSource(xr, uri));
052 return sp.getParsedPattern();
053 }
054 catch (SAXException e) {
055 throw SAXParseable.toBuildException(e);
056 }
057 catch (IOException e) {
058 throw new BuildException(e);
059 }
060 }
061
062 private static InputSource makeInputSource(XMLReader xr, String systemId) throws IOException, SAXException {
063 EntityResolver er = xr.getEntityResolver();
064 if (er != null) {
065 InputSource inputSource = er.resolveEntity(null, systemId);
066 if (inputSource != null)
067 return inputSource;
068 }
069 return new InputSource(systemId);
070 }
071
072 static BuildException toBuildException(SAXException e) {
073 Exception inner = e.getException();
074 if (inner instanceof BuildException)
075 throw (BuildException)inner;
076 throw new BuildException(e);
077 }
078 }