org.mortbay.jetty.servlet.Dispatcher Maven / Gradle / Ivy
// ========================================================================
// Copyright 199-2004 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------
// 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.mortbay.jetty.servlet;
import java.io.IOException;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.mortbay.jetty.Handler;
import org.mortbay.jetty.HttpConnection;
import org.mortbay.jetty.Request;
import org.mortbay.jetty.handler.ContextHandler;
import org.mortbay.util.Attributes;
import org.mortbay.util.LazyList;
import org.mortbay.util.MultiMap;
import org.mortbay.util.UrlEncoded;
/* ------------------------------------------------------------ */
/** Servlet RequestDispatcher.
*
* @author Greg Wilkins (gregw)
*/
public class Dispatcher implements RequestDispatcher
{
/** Dispatch include attribute names */
public final static String __INCLUDE_JETTY="org.mortbay.jetty.included";
public final static String __INCLUDE_PREFIX="javax.servlet.include.";
public final static String __INCLUDE_REQUEST_URI= "javax.servlet.include.request_uri";
public final static String __INCLUDE_CONTEXT_PATH= "javax.servlet.include.context_path";
public final static String __INCLUDE_SERVLET_PATH= "javax.servlet.include.servlet_path";
public final static String __INCLUDE_PATH_INFO= "javax.servlet.include.path_info";
public final static String __INCLUDE_QUERY_STRING= "javax.servlet.include.query_string";
/** Dispatch include attribute names */
public final static String __FORWARD_JETTY="org.mortbay.jetty.forwarded";
public final static String __FORWARD_PREFIX="javax.servlet.forward.";
public final static String __FORWARD_REQUEST_URI= "javax.servlet.forward.request_uri";
public final static String __FORWARD_CONTEXT_PATH= "javax.servlet.forward.context_path";
public final static String __FORWARD_SERVLET_PATH= "javax.servlet.forward.servlet_path";
public final static String __FORWARD_PATH_INFO= "javax.servlet.forward.path_info";
public final static String __FORWARD_QUERY_STRING= "javax.servlet.forward.query_string";
/** JSP attributes */
public final static String __JSP_FILE="org.apache.catalina.jsp_file";
/* ------------------------------------------------------------ */
/** Dispatch type from name
*/
public static int type(String type)
{
if ("request".equalsIgnoreCase(type))
return Handler.REQUEST;
if ("forward".equalsIgnoreCase(type))
return Handler.FORWARD;
if ("include".equalsIgnoreCase(type))
return Handler.INCLUDE;
if ("error".equalsIgnoreCase(type))
return Handler.ERROR;
throw new IllegalArgumentException(type);
}
/* ------------------------------------------------------------ */
private ContextHandler _contextHandler;
private String _uri;
private String _path;
private String _dQuery;
private String _named;
/* ------------------------------------------------------------ */
/**
* @param contextHandler
* @param uriInContext
* @param pathInContext
* @param query
*/
public Dispatcher(ContextHandler contextHandler, String uri, String pathInContext, String query)
{
_contextHandler=contextHandler;
_uri=uri;
_path=pathInContext;
_dQuery=query;
}
/* ------------------------------------------------------------ */
/** Constructor.
* @param servletHandler
* @param name
*/
public Dispatcher(ContextHandler contextHandler,String name)
throws IllegalStateException
{
_contextHandler=contextHandler;
_named=name;
}
/* ------------------------------------------------------------ */
/*
* @see javax.servlet.RequestDispatcher#forward(javax.servlet.ServletRequest, javax.servlet.ServletResponse)
*/
public void forward(ServletRequest request, ServletResponse response) throws ServletException, IOException
{
forward(request, response, Handler.FORWARD);
}
/* ------------------------------------------------------------ */
/*
* @see javax.servlet.RequestDispatcher#forward(javax.servlet.ServletRequest, javax.servlet.ServletResponse)
*/
public void error(ServletRequest request, ServletResponse response) throws ServletException, IOException
{
forward(request, response, Handler.ERROR);
}
/* ------------------------------------------------------------ */
/*
* @see javax.servlet.RequestDispatcher#include(javax.servlet.ServletRequest, javax.servlet.ServletResponse)
*/
public void include(ServletRequest request, ServletResponse response) throws ServletException, IOException
{
Request base_request=(request instanceof Request)?((Request)request):HttpConnection.getCurrentConnection().getRequest();
request.removeAttribute(__JSP_FILE); // TODO remove when glassfish 1044 is fixed
// TODO - allow stream or writer????
Attributes old_attr=base_request.getAttributes();
MultiMap old_params=base_request.getParameters();
try
{
base_request.getConnection().include();
if (_named!=null)
_contextHandler.handle(_named, (HttpServletRequest)request, (HttpServletResponse)response, Handler.INCLUDE);
else
{
String query=_dQuery;
if (query!=null)
{
MultiMap parameters=new MultiMap();
UrlEncoded.decodeTo(query,parameters,request.getCharacterEncoding());
if (old_params!=null && old_params.size()>0)
{
// Merge parameters.
Iterator iter = old_params.entrySet().iterator();
while (iter.hasNext())
{
Map.Entry entry = (Map.Entry)iter.next();
String name=(String)entry.getKey();
Object values=entry.getValue();
for (int i=0;i0)
{
// Merge parameters; new parameters of the same name take precedence.
Iterator iter = old_params.entrySet().iterator();
while (iter.hasNext())
{
Map.Entry entry = (Map.Entry)iter.next();
String name=(String)entry.getKey();
if (parameters.containsKey(name))
{
rewrite_old_query = true;
}
else
{
Object values=entry.getValue();
for (int i=0;i0)
{
if ( rewrite_old_query )
{
StringBuilder overridden_query_string = new StringBuilder();
MultiMap overridden_old_query = new MultiMap();
UrlEncoded.decodeTo(old_query,overridden_old_query,request.getCharacterEncoding());
MultiMap overridden_new_query = new MultiMap();
UrlEncoded.decodeTo(query,overridden_new_query,request.getCharacterEncoding());
Iterator iter = overridden_old_query.entrySet().iterator();
while (iter.hasNext())
{
Map.Entry entry = (Map.Entry)iter.next();
String name=(String)entry.getKey();
if(!overridden_new_query.containsKey(name))
{
Object values=entry.getValue();
for (int i=0;i
© 2015 - 2024 Weber Informatics LLC | Privacy Policy