com.thaiopensource.resolver.xml.ls.LS Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of trang Show documentation
Show all versions of trang Show documentation
Trang, a multi-format schema converter based on RELAX NG.
package com.thaiopensource.resolver.xml.ls;
import com.thaiopensource.resolver.AbstractResolver;
import com.thaiopensource.resolver.Identifier;
import com.thaiopensource.resolver.Input;
import com.thaiopensource.resolver.Resolver;
import com.thaiopensource.resolver.ResolverException;
import com.thaiopensource.resolver.xml.ExternalIdentifier;
import com.thaiopensource.resolver.xml.TargetNamespaceIdentifier;
import com.thaiopensource.resolver.xml.XMLDocumentIdentifier;
import org.w3c.dom.ls.LSInput;
import org.w3c.dom.ls.LSResourceResolver;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.io.StringReader;
/**
*
*/
public class LS {
private static final String XML_TYPE = "http://www.w3.org/TR/REC-xml";
private static final String IANA_MEDIA_TYPE_URI = "http://www.iana.org/assignments/media-types/";
private LS() {
}
public static Resolver createResolver(final LSResourceResolver resourceResolver) {
return new AbstractResolver() {
public void resolve(Identifier id, Input input) throws IOException, ResolverException {
if (input.isResolved())
return;
String base = id.getBase();
String publicId = null;
String type = null;
if (id instanceof ExternalIdentifier) {
publicId = ((ExternalIdentifier)id).getPublicId();
type = XML_TYPE;
}
else if (id instanceof XMLDocumentIdentifier)
type = ((XMLDocumentIdentifier)id).getNamespaceUri();
if (type == null) {
String mediaType = id.getMediaType();
if (mediaType.indexOf('*') < 0)
type = IANA_MEDIA_TYPE_URI + mediaType;
}
String targetNamespace = null;
if (id instanceof TargetNamespaceIdentifier)
targetNamespace = ((TargetNamespaceIdentifier)id).getTargetNamespace();
LSInput lsInput = resourceResolver.resolveResource(type, targetNamespace, publicId, id.getUriReference(), base);
if (lsInput == null)
return;
input.setEncoding(lsInput.getEncoding());
input.setUri(lsInput.getSystemId());
final Reader characterStream = lsInput.getCharacterStream();
if (characterStream != null) {
input.setCharacterStream(characterStream);
return;
}
final InputStream byteStream = lsInput.getByteStream();
if (byteStream != null) {
input.setByteStream(byteStream);
return;
}
final String stringData = lsInput.getStringData();
if (stringData != null) {
input.setCharacterStream(new StringReader(stringData));
return;
}
// we don't support redirecting to a public ID
}
};
}
}