All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.httpobjects.servlet.ServletMethodInvoker Maven / Gradle / Ivy

There is a newer version: 0.27.0
Show newest version
/**
 * Copyright (C) 2011, 2012 Commission Junction Inc.
 *
 * This file is part of httpobjects.
 *
 * httpobjects is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2, or (at your option)
 * any later version.
 *
 * httpobjects is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with httpobjects; see the file COPYING.  If not, write to the
 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 * 02110-1301 USA.
 *
 * Linking this library statically or dynamically with other modules is
 * making a combined work based on this library.  Thus, the terms and
 * conditions of the GNU General Public License cover the whole
 * combination.
 *
 * As a special exception, the copyright holders of this library give you
 * permission to link this library with independent modules to produce an
 * executable, regardless of the license terms of these independent
 * modules, and to copy and distribute the resulting executable under
 * terms of your choice, provided that you also meet, for each linked
 * independent module, the terms and conditions of the license of that
 * module.  An independent module is a module which is not derived from
 * or based on this library.  If you modify this library, you may extend
 * this exception to your version of the library, but you are not
 * obligated to do so.  If you do not wish to do so, delete this
 * exception statement from your version.
 */
package org.httpobjects.servlet;

import java.io.IOException;
import java.io.OutputStream;
import java.util.Collections;
import java.util.List;

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

import org.httpobjects.HttpObject;
import org.httpobjects.Request;
import org.httpobjects.Response;
import org.httpobjects.header.GenericHeaderField;
import org.httpobjects.header.HeaderField;
import org.httpobjects.header.HeaderFieldVisitor;
import org.httpobjects.header.request.AuthorizationField;
import org.httpobjects.header.request.CookieField;
import org.httpobjects.header.response.LocationField;
import org.httpobjects.header.response.SetCookieField;
import org.httpobjects.header.response.WWWAuthenticateField;
import org.httpobjects.servlet.impl.LazyRequestImpl;
import org.httpobjects.util.HttpObjectUtil;
import org.httpobjects.util.Method;

public class ServletMethodInvoker {
	private final HttpObject[] objects;
	private final Response notFoundResponse;
	private final List defaultResponseHeaders;
	
	public ServletMethodInvoker(HttpObject[] objects) {
		this(HttpObject.NOT_FOUND(HttpObject.Text("Error: NOT_FOUND")), objects);
	}
  public ServletMethodInvoker(Response notFoundResponse, HttpObject[] objects) {
    this(Collections.emptyList(), notFoundResponse, objects);
  }
	public ServletMethodInvoker(List defaultResponseHeader, Response notFoundResponse, HttpObject[] objects) {
		super();
		this.notFoundResponse = notFoundResponse;
		this.objects = objects;
		this.defaultResponseHeaders = defaultResponseHeader;
	}

	public boolean invokeFirstPathMatchIfAble(String path, HttpServletRequest r, HttpServletResponse httpResponse){
		
		Response lastResponse = null;
		for(HttpObject next : objects){
			if(next.pattern().matches(path)){
				lastResponse = invoke(r, httpResponse, next);
				if(lastResponse!=null){
					returnResponse(lastResponse, httpResponse);
					break;
				}
			}
		}
		
		if(lastResponse!=null){
			return true;
		}else if(notFoundResponse!=null){
			returnResponse(notFoundResponse, httpResponse);
			return true;
		}else{
			return false;
		}
	}

	private Response invoke(HttpServletRequest r, HttpServletResponse httpResponse, HttpObject object) {
		final Method m = Method.fromString(r.getMethod());
		final Request input = new LazyRequestImpl(object.pattern().match(r.getRequestURI()), r);

		return HttpObjectUtil.invokeMethod(object, m, input);
	}


	private void returnResponse(Response r, final HttpServletResponse resp)  {

		try {
			resp.setStatus(r.code().value());
			
			for(HeaderField next : r.header()){
				next.accept(new HeaderFieldVisitor() {
					
					@Override
					public Void visit(CookieField cookieField) {
						resp.setHeader(cookieField.name(), cookieField.value());
						return null;
					}
					
					@Override
					public Void visit(GenericHeaderField other) {
						resp.setHeader(other.name(), other.value());
						return null;
					}
					
					@Override
					public Void visit(LocationField location) {
						resp.setHeader("Location", location.value());
						return null;
					}
					
					@Override
					public Void visit(SetCookieField setCookieField) {
						resp.addCookie(translate(setCookieField));
						return null;
					}
					
					@Override
					public Void visit(WWWAuthenticateField wwwAuthorizationField) {
						resp.setHeader("WWW-Authenticate", wwwAuthorizationField.method().name() + " realm=" + wwwAuthorizationField.realmName());
						return null;
					}
					@Override
					public Void visit(AuthorizationField authorizationField) {
						throw new RuntimeException("Illegal header for request: " + authorizationField.getClass());
					}
					
				});
			}
			
      addDefaultHeadersAsApplicable(r, resp);
			
			if(r.hasRepresentation()){
				resp.setContentType(r.representation().contentType());
				OutputStream out = resp.getOutputStream();
				r.representation().write(out);
				out.close();
			}
			
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
	}
	
  private void addDefaultHeadersAsApplicable(final Response r, final HttpServletResponse resp) {
    for(HeaderField defaultHeader : defaultResponseHeaders){
      boolean exists = false;
      for(HeaderField header : r.header()){
          if(header.name().equals(defaultHeader.name())){
            exists = true;
          }
      }
      
      if(!exists){
          resp.setHeader(defaultHeader.name(), defaultHeader.value());
      }
    }
  }
  
	private Cookie translate(SetCookieField cookie) {
	    Cookie c = new Cookie(cookie.name, cookie.value);
	    
	    if(cookie.domain!=null){
	        c.setDomain(cookie.domain);
	    }
//	    if(cookie.expiration!=null){
//	        c.setMaxAge(Integer.parseInt(cookie.expiration));
//	    }
	    if(cookie.path!=null){
	        c.setPath(cookie.path);
	    }
	    if(cookie.secure!=null) {
	        c.setSecure(cookie.secure);
	    }
	    
	    return c;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy