package at.gv.egovernment.moa.util;

import java.io.IOException;
import java.io.InputStream;
import java.util.Map;

import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

/**
 * An <code>EntityResolver</code> that maps system IDs to 
 * <code>InputStream</code>s.
 * 
 * @author Patrick Peck
 * @version $Id$
 */
public class StreamEntityResolver implements EntityResolver {
  
  /** A mapping from Public ID or System ID to an <code>InputStream</code>
   * containing the entity. */
  private Map mappedEntities;
  
  /**
   * Create a <code>StreamEntityResolver</code>.
   * 
   * @param mappedEntities A mapping from public or system IDs 
   * (<code>String</code> objects) to <code>InputStream</code>s. 
   */
  public StreamEntityResolver(Map mappedEntities) {
    this.mappedEntities = mappedEntities;
  }

  /**
   * Resolve an entity by looking it up in the mapped entities.
   * 
   * First, the public ID is looked up in the mapping, then the system ID.
   * 
   * @param publicId The public ID of the entity.
   * @param systemId The system ID of the entity.
   * @return An <code>InputStream</code> containing the entity or 
   * <code>null</code> if no entity could be found. 
   * @throws SAXException Signalling a parsing exception.
   * @throws IOException Error reading the entity.
   */
  public InputSource resolveEntity(String publicId, String systemId) 
    throws SAXException, IOException {
      
    InputSource src = null;
      
    if (publicId != null && mappedEntities.get(publicId) != null) {
      src = new InputSource((InputStream) mappedEntities.get(publicId));
    } else if (systemId != null && mappedEntities.get(systemId) != null) {
      src = new InputSource((InputStream) mappedEntities.get(systemId));
    }
    
    if (src != null) {
      src.setPublicId(publicId);
      src.setSystemId(systemId);
    }
    
    return src;
  }
}