Open Source Repository

Home /hibernate/hibernate-3.2.6.ga | Repository Home



org/hibernate/util/DTDEntityResolver.java
//$Id: DTDEntityResolver.java 10033 2006-06-21 06:23:30Z [email protected] $
//Contributed by Markus Meissner
package org.hibernate.util;

import java.io.InputStream;
import java.io.Serializable;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;

/**
 * An {@link EntityResolver} implementation which attempts to resolve
 * various systemId URLs to local classpath lookups<ol>
 <li>Any systemId URL beginning with <tt>http://hibernate.sourceforge.net/</tt> is
 * searched for as a classpath resource in the classloader which loaded the
 * Hibernate classes.</li>
 <li>Any systemId URL using <tt>classpath</tt> as the scheme (i.e. starting
 * with <tt>classpath://</tt> is searched for as a classpath resource using first
 * the current thread context classloader and then the classloader which loaded
 * the Hibernate classes.
 </ol>
 <p/>
 * Any entity references which cannot be resolved in relation to the above
 * rules result in returning null, which should force the SAX reader to
 * handle the entity reference in its default manner.
 */
public class DTDEntityResolver implements EntityResolver, Serializable {

  private static final Log log = LogFactory.getLogDTDEntityResolver.class );

  private static final String HIBERNATE_NAMESPACE = "http://hibernate.sourceforge.net/";
  private static final String USER_NAMESPACE = "classpath://";

  public InputSource resolveEntity(String publicId, String systemId) {
    if systemId != null ) {
      log.debug"trying to resolve system-id [" + systemId + "]" );
      if systemId.startsWithHIBERNATE_NAMESPACE ) ) {
        log.debug"recognized hibernate namespace; attempting to resolve on classpath under org/hibernate/" );
        String path = "org/hibernate/" + systemId.substringHIBERNATE_NAMESPACE.length() );
        InputStream dtdStream = resolveInHibernateNamespacepath );
        if dtdStream == null ) {
          log.debug"unable to locate [" + systemId + "] on classpath" );
          if systemId.substringHIBERNATE_NAMESPACE.length() ).indexOf"2.0" > -) {
            log.error"Don't use old DTDs, read the Hibernate 3.x Migration Guide!" );
          }
        }
        else {
          log.debug"located [" + systemId + "] in classpath" );
          InputSource source = new InputSourcedtdStream );
          source.setPublicIdpublicId );
          source.setSystemIdsystemId );
          return source;
        }
      }
      else if systemId.startsWithUSER_NAMESPACE ) ) {
        log.debug"recognized local namespace; attempting to resolve on classpath" );
        String path = systemId.substringUSER_NAMESPACE.length() );
        InputStream stream = resolveInLocalNamespacepath );
        if stream == null ) {
          log.debug"unable to locate [" + systemId + "] on classpath" );
        }
        else {
          log.debug"located [" + systemId + "] in classpath" );
          InputSource source = new InputSourcestream );
          source.setPublicIdpublicId );
          source.setSystemIdsystemId );
          return source;
        }
      }
    }
    // use default behavior
    return null;
  }

  protected InputStream resolveInHibernateNamespace(String path) {
    return this.getClass().getClassLoader().getResourceAsStreampath );
  }

  protected InputStream resolveInLocalNamespace(String path) {
    try {
      return ConfigHelper.getUserResourceAsStreampath );
    }
    catchThrowable t ) {
      return null;
    }
  }
}