/*
 * RedirectionFilter.java,v 1.0 26/06/2004
 * Copyright (c) 2004 Esup Portail (www.esup-portail.org)
 * Classes: RedirectionFilter
 * Original Author: Raymond Bourges
*/


package org.esupportail.portal.utils.injac.redirectionFilter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


/**
 * Redirects an URL like /~user to the user homedir.<br/>
 * Two redirections are possible : direct and http<br/>
 * direct : the URL in the client navigator does not change - the redirection is invisible<br/>
 * http : the URL in the client navigator changes<br/>
 * 
 * Homedirs are built with a hash method (to improve access). The hash method can be :<br/>
 * with_hash : /u/us/user<br/>
 * with_hash_reverse : /r/re/user<br/>
 * 
 * The configuration of the redirection type and hash method is specified in the web.xml file of Slide<br/>
 * 
 * @author Raymond Bourges
 * date : 28/06/2004 
 */
public class RedirectionFilter implements Filter {
	private javax.servlet.FilterConfig filterConfig;
	
	/* (non-Javadoc)
	 * @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
	 */
	public void init(FilterConfig arg0) throws ServletException {
		filterConfig = arg0;
	}

	/* (non-Javadoc)
	 * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)
	 */
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
				
		// Getting the current URI and the contextPath in the request
        HttpServletRequest hreq = (HttpServletRequest)request;
        HttpServletResponse hres = (HttpServletResponse)response;
        String servletPath = hreq.getServletPath();
        String requestUri = hreq.getRequestURI(); // ex: /context/~user
        String contextPath = hreq.getContextPath(); // ex: /context
        String newPath = new String("");
        String newUri = new String("");
		
        String forwardMethod = filterConfig.getInitParameter("forwardMethod");
        
        int contextLength = contextPath.length();
		if (requestUri.length() > contextLength+4) {
			// If there is something after /context, looking for the username in the URL /context/~username
			if (requestUri.substring(contextLength+1, contextLength+2).equals("~")) {
				
				// There are two kinds of URL :
				// /context/~user
				// /context/~user/subdirectory/..
				String username = "";
				int slashPos = requestUri.indexOf("/", contextLength+2);
				if (slashPos < 0) {
					username = requestUri.substring(contextLength+2);					
				}
				else {
					username = requestUri.substring(contextLength+2, requestUri.indexOf("/", contextLength+2));										
				}
				
				int usernameLength = username.length();
	    		// Looking for hashType (filter parameter in web.xml)
	        	String hashType = filterConfig.getInitParameter("hashType");
	        	String homedirsRootDirectory = filterConfig.getInitParameter("homedirsRootDirectory");
	        	
	        	System.out.println("hashType > "+hashType);
	        	System.out.println("homedirsRootDirectory > "+homedirsRootDirectory);
	        	
	        	if (hashType.equals("with_hash")) {
					newPath = "/"+homedirsRootDirectory+"/"+username.substring(0,1)+"/"+username.substring(0,2)+
					"/"+username+requestUri.substring(contextLength+2+usernameLength);
	    			
					if(forwardMethod.equals("direct")){
						filterConfig.getServletContext().getRequestDispatcher(newPath).forward(request, response);
					}
					else if(forwardMethod.equals("http")){
						//hres.sendRedirect(contextPath+newPath);
						request.getRequestDispatcher(servletPath).forward(request,response);
					}
	        	}
	    		else if (hashType.equals("with_hash_reverse")) {
	    			newPath = "/"+homedirsRootDirectory+"/"+username.substring(usernameLength-1)+"/"+username.substring(usernameLength-1)+username.substring(usernameLength-2,usernameLength-1)+
					"/"+username+requestUri.substring(contextLength+2+username.length());
	    			
	    			if(forwardMethod.equals("direct")){
						filterConfig.getServletContext().getRequestDispatcher(newPath).forward(request, response);
					}
					else if(forwardMethod.equals("http")){
						//hres.sendRedirect(contextPath+newPath);
						request.getRequestDispatcher(servletPath).forward(request,response);
					}
					
	    		}
	    		else {
	    			chain.doFilter(request, response);
	    		}
			}
			else {
				chain.doFilter(request, response);
			}
		}
		else {
			chain.doFilter(request, response);
		}
		System.out.println("Redirection : "+requestUri+" > "+newPath);
	}

	/* (non-Javadoc)
	 * @see javax.servlet.Filter#destroy()
	 */
	
	public void destroy() {
	}

}
