package org.basex.build.xml;
import static org.basex.util.Reflect.*;
import java.lang.reflect.Constructor;
import org.xml.sax.EntityResolver;
import org.xml.sax.XMLReader;
/**
* Wraps the CatalogResolver object.
* Searches for presence of one of the xml resolver packages
* {@code org.apache.xml.resolver.tools.CatalogResolver} or
* {@code code com.sun.org.apache.xml.internal.resolver.tools.CatalogResolver}.
*
* @author BaseX Team 2005-12, BSD License
* @author Michael Seiferle
*/
public final class CatalogWrapper {
/** Package declaration for CatalogManager. */
private static final Class<?> CMP = find(new String[] {
"org.apache.xml.resolver.CatalogManager",
"com.sun.org.apache.xml.internal.resolver.CatalogManager" });
/** Package declaration for CatalogResolver constructor. */
private static final Constructor<?> CRP = find(find(new String[] {
"org.apache.xml.resolver.tools.CatalogResolver",
"com.sun.org.apache.xml.internal.resolver.tools.CatalogResolver" }), CMP);
/** Instance of catalog manager. */
private static final Object CM = get(CMP);
/** Hidden constructor. */
private CatalogWrapper() { }
/**
* Checks if a CatalogResolver is available.
* @return result of check
*/
public static boolean available() {
return CM != null;
}
/**
* Decorates the {@link XMLReader} with the catalog resolver if it is found
* in the classpath. Does nothing otherwise.
* @param reader XML reader
* @param cat path to catalog file
*/
public static void set(final XMLReader reader, final String cat) {
if(CM == null) return;
invoke(method(CMP, "setIgnoreMissingProperties", boolean.class), CM, true);
invoke(method(CMP, "setCatalogFiles", String.class), CM, cat);
invoke(method(CMP, "setPreferPublic", boolean.class), CM, true);
invoke(method(CMP, "setUseStaticCatalog", boolean.class), CM, false);
invoke(method(CMP, "setVerbosity", int.class), CM, 0);
reader.setEntityResolver((EntityResolver) get(CRP, CM));
}
}