/* ======================================================================
   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.File;
import java.util.Properties;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Level;
import org.apache.log4j.Logger;

/**
 * Utility methods for working in a Servlet enviroment.
 * @author buckett
 */
public class ServletUtils
{
    private static Logger log = Logger.getLogger(ServletUtils.class);
    
    private ServletUtils(){}
    
    /**
     * This method checks to see if we should be returning a not modified response.
     * It looks for a If-Modified-Since header in the HTTP request and uses that to determine
     * if new response is needed. If the header is badly formatted we generate a new response
     * and log the error at WARN level.
     * @param request The HttpServletRequest.
     * @param response The HttpServletResponse.
     * @param last The last time this page was modified.
     * @param expire How many seconds until the response should expire.
     * @return True if we should return a not modified response.
     */
    public static boolean isModified(HttpServletRequest request,
        HttpServletResponse response, long last, int expire)
    {

        long ifModifiedSince = 0;
        
        // HTTP header doesn't allow milliseconds so we should do
        // timestamp comparisons on rounded figures
        last = (last/1000)*1000;
        
        try
        {
            ifModifiedSince = request.getDateHeader( "If-Modified-Since" );
        }
        catch (IllegalArgumentException iae)
        {
            if (log.isEnabledFor(Level.WARN))
            {
                log.warn("Corrupt header (If-Modified-Since: "
                    + request.getHeader("If-Modified-Since") + ") from "
                    + request.getRemoteHost());
            }
        }
        response.setDateHeader( "Last-Modified", last );
        if (expire > 0)
        {
            response.setDateHeader( "Expires", System.currentTimeMillis() + (expire * 1000));
        }
        
        return last <= ifModifiedSince; 
    }

    /**
     * This fixes up some properties. Currently it looks for properties that
     * should have the servlet context prefixed to them, and for directories
     * that should be prefixed with the location of the installation.
     * @param props The properties that will be used to start Bodington.
     * @param context The ServletContext that Bodington is running in.
     */
    public static void adaptConfiguration(Properties props, ServletContext context)
    {
        final int PROP = 0, DEFAULT = 1;
        final String[][] fileProperties = {
            {"buildingservlet.templatedirectory", "templates"},
            {"buildingservlet.templates.classes", "WEB-INF/template_classes"},
            {"webpublish.filestore", "files"},
            {"filegeneration.filestore", "generated"},
            {"buildingservlet.context.root", ""}
        };
    
        for (int count = 0; count < fileProperties.length; count++)
        {
            String value = props.getProperty(fileProperties[count][PROP], fileProperties[count][DEFAULT]);
            File file = new File(value);
            if (!file.isAbsolute())
            {
                value = context.getRealPath(file.getPath());
                props.setProperty(fileProperties[count][PROP], value);
            }
        }
        
    }

}
