com.thaiopensource.resolver.catalog.CatalogResolver 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.catalog;
import com.thaiopensource.resolver.AbstractResolver;
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.xml.ExternalDTDSubsetIdentifier;
import com.thaiopensource.resolver.xml.ExternalEntityIdentifier;
import com.thaiopensource.resolver.xml.ExternalIdentifier;
import com.thaiopensource.resolver.xml.sax.SAXResolver;
import org.apache.xml.resolver.Catalog;
import java.io.IOException;
import java.util.List;
/**
* A Resolver that uses OASIS XML catalogs.
*/
public class CatalogResolver extends AbstractResolver {
private final Catalog catalog;
private boolean catalogLoaded = false;
private boolean hadCatalogError = false;
// Allow somebody to customize in a different way, but still use our resolve logic.
public CatalogResolver(Catalog catalog) {
this.catalog = catalog;
}
public CatalogResolver(List catalogUris, SAXResolver resolver) {
this(new OasisCatalog(new SimpleCatalogManager(catalogUris), resolver));
}
public CatalogResolver(List catalogUris, Resolver resolver) {
this(catalogUris, new SAXResolver(resolver));
}
public CatalogResolver(List catalogUris) {
this(catalogUris, new SAXResolver());
}
public synchronized void resolve(Identifier id, Input input) throws IOException, ResolverException {
if (input.isResolved())
return;
if (hadCatalogError)
return;
String absoluteUri = null;
try {
absoluteUri = BasicResolver.resolveUri(id);
if (id.getUriReference().equals(absoluteUri))
absoluteUri = null;
}
catch (ResolverException e) {
// ignore
}
String resolved = null;
boolean isExternalIdentifier = (id instanceof ExternalIdentifier);
try {
if (!catalogLoaded) {
catalogLoaded = true;
catalog.loadSystemCatalogs();
}
if (absoluteUri != null)
resolved = isExternalIdentifier ? catalog.resolveSystem(absoluteUri) : catalog.resolveURI(absoluteUri);
if (resolved == null) {
if (!isExternalIdentifier)
resolved = catalog.resolveURI(id.getUriReference());
else if (id instanceof ExternalEntityIdentifier) {
ExternalEntityIdentifier xid = (ExternalEntityIdentifier)id;
resolved = catalog.resolveEntity(xid.getEntityName(), xid.getPublicId(), xid.getUriReference());
}
else if (id instanceof ExternalDTDSubsetIdentifier) {
ExternalDTDSubsetIdentifier xid = (ExternalDTDSubsetIdentifier)id;
resolved = catalog.resolveDoctype(xid.getDoctypeName(), xid.getPublicId(), xid.getUriReference());
}
else {
ExternalIdentifier xid = (ExternalIdentifier)id;
resolved = catalog.resolvePublic(xid.getPublicId(), xid.getUriReference());
}
}
}
catch (ResolverIOException e) {
hadCatalogError = true;
throw e.getResolverException();
}
if (resolved != null)
input.setUri(resolved);
}
}