/* ======================================================================
   Parts Copyright 2006 University of Leeds, Oxford University, University of the Highlands and Islands.

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.

====================================================================== */

package org.bodington.servlet;

import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Enumeration;
import java.util.Set;

import javax.servlet.RequestDispatcher;
import javax.servlet.Servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;

import org.apache.log4j.Logger;
import org.bodington.database.PrimaryKey;
import org.bodington.server.BuildingContext;
import org.bodington.server.realm.Group;
import org.bodington.server.realm.User;

/**
 * Class that contains some Bodington configuration.
 * @see Request
 * @author buckett
 */
public class BuildingServletContext implements ServletContext
	{
    private static Logger log = Logger.getLogger(BuildingServletContext.class);
    
	private ServletContext context;
	
	private String url_character_encoding, container_url_character_encoding, plus, percent; 
	private boolean container_url_plus=true;
	private	boolean container_url_percent=true;

	private User anonuser = null;
	
	public BuildingServletContext( ServletContext c )
		 throws ServletException
		{
		context=c;
        }

		
	public User getAnonymousUser()
	{
        if (anonuser == null)
        {
            try
            {
                Group anon_group = Group.findGroup( "name = 'anonymous'" );
                Enumeration enumeration = User.findUserPrimaryKeys( anon_group.whereMembers(), "name" );
                if ( enumeration.hasMoreElements() )
                {
                PrimaryKey anonuser_id = (PrimaryKey)enumeration.nextElement();
                anonuser = User.findUser( anonuser_id );
                }
                if ( enumeration.hasMoreElements())
                    log.warn("Anonymouse group container more than one user.");
            }
            catch ( Exception e )
            {
                log.error( "Coulnd't load anonymous user", e );
            }
        }
	    return anonuser;
	}
		
	public boolean isContainerEncodingPlus()
	{
        if (plus == null)
        {
            plus = BuildingContext.getProperty( "container.extrapathencoded.plus" );
            container_url_plus = !"false".equalsIgnoreCase(plus);
        }
	    return container_url_plus;
	}
		
	public boolean isContainerEncodingPercent()
	{
        if (percent == null)
        {
            percent = BuildingContext.getProperty( "container.extrapathencoded.percent" );
            container_url_percent = ! "false".equalsIgnoreCase(percent);
        }
	    return container_url_percent;
	}
		
	public String getUrlCharacterEncoding()
	    {
        if (url_character_encoding == null)
            url_character_encoding = BuildingContext.getProperty(
                "webpublish.url.charencoding", "bodington_underscore");
        return url_character_encoding;
	    }

	public String getContainerUrlCharacterEncoding()
	    {
        if (container_url_character_encoding == null)
            container_url_character_encoding = BuildingContext.getProperty(
                "container.extrapathencoded.encoding", "UTF-8");
        return container_url_character_encoding;
	    }

    public ServletContext getContext(String name)
    {
        return context.getContext(name);
    }

    public int getMajorVersion()
    {
        return context.getMajorVersion();
    }

    public int getMinorVersion()
    {
        return context.getMinorVersion();
    }

    public String getMimeType(String type)
    {
        return context.getMimeType(type);
    }

    public Set getResourcePaths(String paths)
    {
        return context.getResourcePaths(paths);
    }

    public URL getResource(String url) throws MalformedURLException
    {
        return context.getResource(url);
    }

    public InputStream getResourceAsStream(String url)
    {
        return context.getResourceAsStream(url);
    }

    public RequestDispatcher getRequestDispatcher(String url)
    {
        return context.getRequestDispatcher(url);
    }

    public RequestDispatcher getNamedDispatcher(String url)
    {
        return context.getNamedDispatcher(url);
    }

    /**
     * @deprecated
     */
    public Servlet getServlet(String url) throws ServletException
    {
        return context.getServlet(url);
    }

    /**
     * @deprecated
     */
    public Enumeration getServlets()
    {
        return context.getServlets();
    }

    /**
     * @deprecated
     */
    public Enumeration getServletNames()
    {
        return context.getServletNames();
    }

    public void log(String message)
    {
        context.log(message);
    }

    /**
     * @deprecated
     */
    public void log(Exception exception, String message)
    {
        context.log(exception, message);
    }

    public void log(String message, Throwable throwable)
    {
        context.log(message, throwable);
    }

    public String getRealPath(String url)
    {
        return context.getRealPath(url);
    }

    public String getServerInfo()
    {
        return context.getServerInfo();
    }

    public String getInitParameter(String parameter)
    {
        return context.getInitParameter(parameter);
    }

    public Enumeration getInitParameterNames()
    {
        return context.getInitParameterNames();
    }

    public Object getAttribute(String attribute)
    {
        return context.getAttribute(attribute);
    }

    public Enumeration getAttributeNames()
    {
        return context.getAttributeNames();
    }

    public void setAttribute(String attribute, Object value)
    {
        context.setAttribute(attribute, value);
    }

    public void removeAttribute(String attribute)
    {
        context.removeAttribute(attribute);
    }

    public String getServletContextName()
    {
        return context.getServletContextName();
    }
	    
	    
	}
