// Copyright 2000-2003, SLAC, Stanford, California, U.S.A.
package org.freehep.xml.util;
import java.io.InputStream;
import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
/**
* An implementation of an EntityResolver which can be used to locate
* DTD files located on the current java class path
*
* @author Tony Johnson (tonyj@slac.stanford.edu)
* @version $Id: ClassPathEntityResolver.java 8584 2006-08-10 23:06:37Z duns $
*/
public class ClassPathEntityResolver implements EntityResolver
{
private Class root;
private String name;
private String prefix;
/**
* Create a ClassPathEntityResolver that will handle a single DTD.
* @param DTDName The DTDName to resolve (e.g. myStuff.dtd)
* @param root A class in the same package as the DTD
*/
public ClassPathEntityResolver(String DTDName, Class root)
{
this.name = DTDName;
this.root = root;
}
/**
* Create a ClassPathEntityResolver that can handle a collection of DTD's
* @param root A class in the package to be used as the root of the DTD path
* @param DTDPrefix A string containing the prefix for the DTD to match
*/
public ClassPathEntityResolver(Class root, String DTDPrefix)
{
this.prefix = DTDPrefix;
this.root = root;
}
/*
* Implementation of resolveEntity method
*/
public InputSource resolveEntity(String publicId, String systemId) throws SAXException
{
if (name != null && systemId.endsWith(name))
{
InputStream in = root.getResourceAsStream(name);
if (in == null) throw new SAXException(systemId+" not found");
return new InputSource(in);
}
if (prefix != null && systemId.startsWith(prefix))
{
String postfix = systemId.substring(prefix.length());
InputStream in = root.getResourceAsStream(postfix);
if (in == null) throw new SAXException(systemId+" not found");
return new InputSource(in);
}
return null;
}
}