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 EntityResolver that maps system IDs to 
 * InputStreams.
 * 
 * @author Patrick Peck
 * @version $Id$
 */
public class StreamEntityResolver implements EntityResolver {
  
  /** A mapping from Public ID or System ID to an InputStream
   * containing the entity. */
  private Map mappedEntities;
  
  /**
   * Create a StreamEntityResolver.
   * 
   * @param mappedEntities A mapping from public or system IDs 
   * (String objects) to InputStreams. 
   */
  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 InputStream containing the entity or 
   * null 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;
  }
}