package org.apache.maven.j2ee;

/* ====================================================================
 * The Apache Software License, Version 1.1
 *
 * Copyright (c) 2002 The Apache Software Foundation.  All rights
 * reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. The end-user documentation included with the redistribution,
 *    if any, must include the following acknowledgment:
 *       "This product includes software developed by the
 *        Apache Software Foundation (http://www.apache.org/)."
 *    Alternately, this acknowledgment may appear in the software itself,
 *    if and wherever such third-party acknowledgments normally appear.
 *
 * 4. The names "Apache" and "Apache Software Foundation" and
 *    "Apache Maven" must not be used to endorse or promote products
 *    derived from this software without prior written permission. For
 *    written permission, please contact apache@apache.org.
 *
 * 5. Products derived from this software may not be called "Apache",
 *    "Apache Maven", nor may "Apache" appear in their name, without
 *    prior written permission of the Apache Software Foundation.
 *
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * ====================================================================
 *
 * This software consists of voluntary contributions made by many
 * individuals on behalf of the Apache Software Foundation.  For more
 * information on the Apache Software Foundation, please see
 * <http://www.apache.org/>.
 *
 * ====================================================================
 */

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

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

/**
 * A class to resolve external entity definitions for j2ee artifacts.
 *
 * @author  dion
 * @version $Id: J2EEEntityResolver.java,v 1.4 2003/03/31 03:02:07 dion Exp $
 */
public class J2EEEntityResolver implements EntityResolver
{
    /** map of ids to resource names */
    private Map idToResource = new HashMap();
    
    /** log for debug output */
    private static final Log LOG = LogFactory.getLog(J2EEEntityResolver.class);
    
    /** list of j2ee dtds that are being made available */
    public static final String[] J2EE_DTDS = new String[] {
        "-//Sun Microsystems, Inc.//DTD J2EE Application Client 1.3//EN",
        "-//Sun Microsystems, Inc.//DTD J2EE Application 1.3//EN",
        "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN",
        "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN",
        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN",
        "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
        };
    public static final String[] J2EE_RESOURCES = new String[] {
        "/plugin-resources/application-client_1_3.dtd",
        "/plugin-resources/application_1_3.dtd",
        "/plugin-resources/ejb-jar_2_0.dtd",
        "/plugin-resources/web-app_2.2.dtd",
        "/plugin-resources/web-app_2_3.dtd",
        "/plugin-resources/web-jsptaglibrary_1_2.dtd"
        };
    
    /** Creates a new instance of EntityResolver */
    public J2EEEntityResolver()
    {
        for (int i = 0; i < J2EE_DTDS.length; i++) {
            idToResource.put(J2EE_DTDS[i], J2EE_RESOURCES[i]);
        }
    }
    
    /** resolve the entity given by the provided Ids
     * @param publicId the public id of the entity
     * @param systemId the 'system location' (typically a URL) of the entity
     * @return an {@link InputSource input source} for retrieval of the entity
     * @throws IOException when an I/O error occurs retrieving the entity
     * @throws SAXException if there are any problems
     */
    public InputSource resolveEntity(String publicId, String systemId) throws 
        SAXException, IOException
    {
        LOG.debug("resolving entity with publicId='" + publicId + ", systemId='" + systemId + "'");
        if (publicId != null)
        {
            String resource = (String) idToResource.get(publicId);
            LOG.debug("resource found in map ='" + resource + "'" );
            if (resource != null)
            {
                InputStream in = getClass().getResourceAsStream(resource);
                LOG.debug("input stream ='" + in + "'" );
                if (in != null) 
                {
                    return new InputSource(in);
                }
            }
        }
        return null;
    }
    
    /** Getter for publicId to resource name map.
     * @return Value of property idToResource.
     */
    protected Map getIdToResource()
    {
        return idToResource;
    }
    
    /** Setter for publicId to resource name map.
     * @param idToResource New value of property idToResource.
     */
    protected void setIdToResource(Map idToResource)
    {
        this.idToResource = idToResource;
    }
    
}
