package org.mmbase.servlet;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.mmbase.bridge.Cloud;
import org.mmbase.bridge.LocalContext;
import org.mmbase.bridge.Node;
import org.mmbase.util.logging.Logger;
import org.mmbase.util.logging.Logging;

/** This Servlet redirects the old image servlet request to
 * the new image servlet
 * 
 * This servlet requires the img.db mapping
 * The new image servlet should get another one eg. imgnew.db 
 * 
 * @author Nico Klasens (Finalist IT Group)
 */
public class ImageMovedServlet extends HttpServlet {

   /** MMbase logging system */
   private static Logger log = Logging.getLoggerInstance(ImageMovedServlet.class.getName());


   /** process image redirect request
    * 
    * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
    * or
    * @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) 
    *  
    */
   protected void process(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
     
      String query = request.getQueryString();

      log.debug("Query string: " + query);

      String nodeNumber = null;
      String cache = null;

      int plusIndex = query.indexOf("+");
      if (plusIndex == -1) {
         nodeNumber = query;
      }
      else {
         nodeNumber = query.substring(0,plusIndex);
         cache = query.substring(plusIndex+1);
      }

      if (nodeNumber == null || "".equals(nodeNumber)) {
         log.debug("Node number not found in request: " + nodeNumber);
         response.sendError(HttpServletResponse.SC_NOT_FOUND, "Node number not found in request");
      }
      else {
         Cloud cloud = LocalContext.getCloudContext().getCloud("mmbase");
         Node node = cloud.getNode(nodeNumber);

         if (cache != null && !"".equals(cache)) {
            log.debug("Cache template: " + cache);
            // the cached image
            List args = new ArrayList();
            args.add(cache);
            nodeNumber = node.getFunctionValue("cache", args).toString();
         }
         
         String host = request.getServerName();
         int port = request.getServerPort();  
         String context = request.getContextPath();
         
         List args = new ArrayList();
         args.add("");
         args.add("");
         args.add(context);
         String servletPath = node.getFunctionValue("servletpath", args).toString();

         String url;
         String fileName = node.getStringValue("filename");
         if (servletPath.endsWith("?") ||  "".equals(fileName)) {
             url = servletPath + nodeNumber;
         } else {
             url = servletPath + fileName + "?" + nodeNumber;
         }
         url =  response.encodeURL("http://" + host + ":" + port + url);
         
         log.debug("Redirect to: " + url);
  
         response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
         response.setHeader("Location", url);
      }
   }

   /**
    * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
    */
   protected void doGet(HttpServletRequest arg0, HttpServletResponse arg1)
      throws ServletException, IOException {
      process(arg0, arg1);
   }

   /**
    * @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
    */
   protected void doPost(HttpServletRequest arg0, HttpServletResponse arg1)
      throws ServletException, IOException {
      process(arg0, arg1);
   }

}