com.thaiopensource.resolver.xml.sax.SAXResolver Maven / Gradle / Ivy
package com.thaiopensource.resolver.xml.sax;
import com.thaiopensource.resolver.BasicResolver;
import com.thaiopensource.resolver.Identifier;
import com.thaiopensource.resolver.Input;
import com.thaiopensource.resolver.Resolver;
import com.thaiopensource.resolver.ResolverException;
import com.thaiopensource.resolver.SequenceResolver;
import com.thaiopensource.resolver.xml.XMLDocumentIdentifier;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.transform.sax.SAXSource;
import java.io.IOException;
/**
*
*/
public class SAXResolver {
private final Resolver resolver;
private final SAXParserFactory parserFactory;
public SAXResolver(Resolver resolver) {
Resolver tem = BasicResolver.getInstance();
if (resolver != null)
tem = new SequenceResolver(resolver, tem);
this.resolver = tem;
parserFactory = SAXParserFactory.newInstance();
parserFactory.setNamespaceAware(true);
parserFactory.setValidating(false);
}
public SAXResolver() {
this(null);
}
public Resolver getResolver() {
return resolver;
}
public SAXSource resolve(String href, String base) throws SAXException, IOException {
return resolve(new Identifier(href, base));
}
public SAXSource resolve(String href, String base, String rootNamespaceUri) throws SAXException, IOException {
return resolve(new XMLDocumentIdentifier(href, base, rootNamespaceUri));
}
public SAXSource resolve(Identifier id) throws SAXException, IOException {
SAXInput input = new SAXInput();
try {
resolver.resolve(id, input);
if (!input.isResolved())
input.setUri(BasicResolver.resolveUri(id));
InputSource inputSource = SAX.createInputSource(id, input);
XMLReader xr = input.getXMLReader();
if (xr == null)
xr = createXMLReader();
return new SAXSource(xr, inputSource);
}
catch (ResolverException e) {
throw SAX.toSAXException(e);
}
}
public SAXSource createSAXSource(Input input) throws SAXException {
InputSource inputSource = SAX.createInputSource(input);
XMLReader xr = null;
if (input instanceof SAXInput)
xr = ((SAXInput)input).getXMLReader();
if (xr == null)
xr = createXMLReader();
return new SAXSource(xr, inputSource);
}
public XMLReader createXMLReader() throws SAXException {
XMLReader xr = createXMLReaderWithoutResolver();
xr.setEntityResolver(SAX.createEntityResolver(resolver));
return xr;
}
protected XMLReader createXMLReaderWithoutResolver() throws SAXException {
try {
return parserFactory.newSAXParser().getXMLReader();
}
catch (ParserConfigurationException e) {
throw new SAXException(e);
}
}
public InputSource open(InputSource inputSource) throws SAXException, IOException {
if (inputSource.getByteStream() != null || inputSource.getCharacterStream() != null)
return inputSource;
Input input = SAX.createInput(inputSource);
try {
resolver.open(input);
}
catch (ResolverException e) {
throw SAX.toSAXException(e);
}
String publicId = inputSource.getPublicId();
inputSource = SAX.createInputSource(input);
inputSource.setPublicId(publicId);
return inputSource;
}
}