[Httpunit-commit] CVS: httpunit/src/com/meterware/servletunit HttpServletRequestWrapper.java,NONE,1.
Brought to you by:
russgold
|
From: Russell G. <rus...@us...> - 2003-02-13 20:25:59
|
Update of /cvsroot/httpunit/httpunit/src/com/meterware/servletunit
In directory sc8-pr-cvs1:/tmp/cvs-serv7442/src/com/meterware/servletunit
Modified Files:
InvocationContext.java InvocationContextImpl.java
RequestContext.java RequestDispatcherImpl.java
ServletUnitHttpRequest.java WebApplication.java
Added Files:
HttpServletRequestWrapper.java ServletMetaData.java
Removed Files:
ServletRequest.java
Log Message:
Implemented request property changes for RequestDispatcher calls
***** Error reading new file[Errno 2] No such file or directory: 'HttpServletRequestWrapper.java'
***** Error reading new file[Errno 2] No such file or directory: 'ServletMetaData.java'
Index: InvocationContext.java
===================================================================
RCS file: /cvsroot/httpunit/httpunit/src/com/meterware/servletunit/InvocationContext.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- InvocationContext.java 11 Feb 2003 04:32:00 -0000 1.6
+++ InvocationContext.java 13 Feb 2003 20:25:55 -0000 1.7
@@ -1,9 +1,8 @@
package com.meterware.servletunit;
-
/********************************************************************************************************************
* $Id$
*
- * Copyright (c) 2001-2002, Russell Gold
+ * Copyright (c) 2001-2003, Russell Gold
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
* documentation files (the "Software"), to deal in the Software without restriction, including without limitation
@@ -34,7 +33,7 @@
/**
* An interface which represents the invocation of a servlet.
*
- * @author <a href="mailto:rus...@ac...">Russell Gold</a>
+ * @author <a href="mailto:rus...@ht...">Russell Gold</a>
**/
public interface InvocationContext {
@@ -72,14 +71,20 @@
/**
- * Adds a request dispatcher to this context.
+ * Adds a request dispatcher to this context to simulate an include request.
+ */
+ void pushIncludeRequest( RequestDispatcher rd, HttpServletRequest request, HttpServletResponse response ) throws ServletException;
+
+
+ /**
+ * Adds a request dispatcher to this context to simulate a forward request.
*/
- void pushIncludedContext( RequestDispatcher rd );
+ void pushForwardRequest( RequestDispatcher rd, HttpServletRequest request, HttpServletResponse response ) throws ServletException;
/**
* Removes the top request dispatcher from this context.
*/
- void popContext();
+ void popRequest();
}
Index: InvocationContextImpl.java
===================================================================
RCS file: /cvsroot/httpunit/httpunit/src/com/meterware/servletunit/InvocationContextImpl.java,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- InvocationContextImpl.java 11 Feb 2003 04:32:00 -0000 1.10
+++ InvocationContextImpl.java 13 Feb 2003 20:25:55 -0000 1.11
@@ -2,7 +2,7 @@
/********************************************************************************************************************
* $Id$
*
-* Copyright (c) 2001-2002, Russell Gold
+* Copyright (c) 2001-2003, Russell Gold
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
* documentation files (the "Software"), to deal in the Software without restriction, including without limitation
@@ -26,13 +26,9 @@
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
-import java.util.Dictionary;
-import java.util.StringTokenizer;
-import java.util.Vector;
-
-import javax.servlet.Servlet;
-import javax.servlet.ServletException;
-import javax.servlet.RequestDispatcher;
+import java.util.*;
+
+import javax.servlet.*;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@@ -110,20 +106,33 @@
}
- public void pushIncludedContext( RequestDispatcher rd ) {
- _request.pushRequestContext( (RequestContext) rd );
+ public void pushIncludeRequest( RequestDispatcher rd, HttpServletRequest request, HttpServletResponse response ) throws ServletException {
+ if (_servlet == null) throw new IllegalStateException( "Get the servlet for this context before pushing a request" );
+ _request = new IncludeRequestWrapper( request, rd );
+ _servletStack.push( _servlet );
+ _servlet = ((RequestDispatcherImpl) rd).getServletMetaData().getServlet();
+ }
+
+
+ public void pushForwardRequest( RequestDispatcher rd, HttpServletRequest request, HttpServletResponse response ) throws ServletException {
+ if (_servlet == null) throw new IllegalStateException( "Get the servlet for this context before pushing a request" );
+ _request = new ForwardRequestWrapper( request, rd );
+ _servletStack.push( _servlet );
+ _servlet = ((RequestDispatcherImpl) rd).getServletMetaData().getServlet();
}
- public void popContext() {
- _request.popRequestContext();
+ public void popRequest() {
+ if (!( _request instanceof HttpServletRequestWrapper)) throw new IllegalStateException( "May not pop the initial request" );
+ _request = ((HttpServletRequestWrapper) _request).getBaseRequest();
+ _servlet = (Servlet) _servletStack.pop();
}
private boolean userIsAuthorized() {
- final String[] roles = _request.getRoles();
+ String[] roles = _application.getPermittedRoles( _requestURL );
for (int i = 0; i < roles.length; i++) {
- if (_application.roleMayAccess( roles[i], _requestURL )) return true;
+ if (_request.isUserInRole( roles[i] )) return true;
}
return false;
}
@@ -149,13 +158,14 @@
_requestURL = request.getURL();
_target = request.getTarget();
- _request = new ServletUnitHttpRequest( _application.getServletRequest( _requestURL ), request, runner.getContext(),
- clientHeaders, messageBody );
+ final ServletUnitHttpRequest suhr = new ServletUnitHttpRequest( _application.getServletRequest( _requestURL ), request, runner.getContext(),
+ clientHeaders, messageBody );
+ _request = suhr;
Cookie[] cookies = getCookies( clientHeaders );
- for (int i = 0; i < cookies.length; i++) _request.addCookie( cookies[i] );
+ for (int i = 0; i < cookies.length; i++) suhr.addCookie( cookies[i] );
- if (_application.usesBasicAuthentication()) _request.readBasicAuthentication();
- else if (_application.usesFormAuthentication()) _request.readFormAuthentication();
+ if (_application.usesBasicAuthentication()) suhr.readBasicAuthentication();
+ else if (_application.usesFormAuthentication()) suhr.readFormAuthentication();
HttpSession session = _request.getSession( /* create */ false );
if (session != null) ((ServletUnitHttpSession) session).access();
@@ -171,9 +181,10 @@
private ServletUnitClient _client;
private WebApplication _application;
- private ServletUnitHttpRequest _request;
+ private HttpServletRequest _request;
private ServletUnitHttpResponse _response = new ServletUnitHttpResponse();
private URL _requestURL;
+ private Stack _servletStack = new Stack();
private String _target;
private Servlet _servlet;
@@ -196,6 +207,99 @@
Cookie[] results = new Cookie[ cookies.size() ];
cookies.copyInto( results );
return results;
+ }
+}
+
+
+class DispatchedRequestWrapper extends HttpServletRequestWrapper {
+
+ RequestContext _requestContext;
+
+ public DispatchedRequestWrapper( HttpServletRequest request, RequestDispatcher dispatcher ) {
+ super( request );
+ _requestContext = (RequestContext) dispatcher;
+ _requestContext.setParentRequest( request );
+ }
+
+
+ public String getParameter( String s ) {
+ return _requestContext.getParameter( s );
+ }
+
+
+ public Enumeration getParameterNames() {
+ return _requestContext.getParameterNames();
+ }
+
+
+ public String[] getParameterValues( String s ) {
+ return _requestContext.getParameterValues( s );
+ }
+
+
+ public Map getParameterMap() {
+ return _requestContext.getParameterMap();
+ }
+
+}
+
+
+class IncludeRequestWrapper extends DispatchedRequestWrapper {
+
+ final static String REQUEST_URI = "javax.servlet.include.request_uri";
+ final static String CONTEXT_PATH = "javax.servlet.include.context_path";
+ final static String SERVLET_PATH = "javax.servlet.include.servlet_path";
+ final static String PATH_INFO = "javax.servlet.include.path_info";
+ final static String QUERY_STRING = "javax.servlet.include.query_string";
+
+ private Hashtable _attributes = new Hashtable();
+
+
+ public IncludeRequestWrapper( HttpServletRequest request, RequestDispatcher dispatcher ) {
+ super( request, dispatcher );
+ _attributes.put( REQUEST_URI, ((RequestDispatcherImpl) dispatcher ).getRequestURI() );
+ _attributes.put( CONTEXT_PATH, request.getContextPath() );
+ _attributes.put( SERVLET_PATH, ((RequestDispatcherImpl) dispatcher ).getServletMetaData().getServletPath() );
+ final String pathInfo = ((RequestDispatcherImpl) dispatcher ).getServletMetaData().getPathInfo();
+ if (pathInfo != null) _attributes.put( PATH_INFO, pathInfo );
+ }
+
+
+ public Object getAttribute( String s ) {
+ Object result = _attributes.get( s );
+ return (result != null) ? result : super.getAttribute( s );
+ }
+
+}
+
+
+class ForwardRequestWrapper extends DispatchedRequestWrapper {
+
+ private RequestDispatcherImpl _requestContext;
+
+ public ForwardRequestWrapper( HttpServletRequest request, RequestDispatcher dispatcher ) {
+ super( request, dispatcher );
+ _requestContext = (RequestDispatcherImpl) dispatcher;
+ }
+
+
+ public String getRequestURI() {
+ return _requestContext.getRequestURI();
+ }
+
+
+ public String getQueryString() {
+ return super.getQueryString();
+ }
+
+
+ public String getServletPath() {
+ return _requestContext.getServletMetaData().getServletPath();
+ }
+
+
+ public String getPathInfo() {
+ return _requestContext.getServletMetaData().getPathInfo();
}
}
Index: RequestContext.java
===================================================================
RCS file: /cvsroot/httpunit/httpunit/src/com/meterware/servletunit/RequestContext.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- RequestContext.java 11 Feb 2003 04:32:00 -0000 1.1
+++ RequestContext.java 13 Feb 2003 20:25:55 -0000 1.2
@@ -21,12 +21,11 @@
*******************************************************************************************************************/
import com.meterware.httpunit.HttpUnitUtils;
-import java.util.Hashtable;
-import java.util.Enumeration;
-import java.util.Map;
-import java.util.StringTokenizer;
+import java.util.*;
import java.net.URL;
+import javax.servlet.http.HttpServletRequest;
+
/**
*
@@ -36,7 +35,7 @@
private Hashtable _parameters = new Hashtable();
private Hashtable _visibleParameters;
- private RequestContext _parentContext;
+ private HttpServletRequest _parentRequest;
private URL _url;
@@ -47,19 +46,20 @@
}
- void setParentContext( RequestContext parentContext ) {
- _parentContext = parentContext;
+ void setParentRequest( HttpServletRequest parentRequest ) {
+ _parentRequest = parentRequest;
_visibleParameters = null;
}
- RequestContext getParentContext() {
- return _parentContext;
+ String getRequestURI() {
+ return _url.getPath();
}
- String getRequestURI() {
- return _url.getPath();
+ String getParameter( String name ) {
+ String[] parameters = (String[]) getParameters().get( name );
+ return parameters == null ? null : parameters[0];
}
@@ -149,10 +149,15 @@
private Hashtable getParameters() {
if (_visibleParameters == null) {
- if (_parentContext == null) {
+ if (_parentRequest == null) {
_visibleParameters = _parameters;
} else {
- _visibleParameters = (Hashtable) _parentContext.getParameters().clone();
+ _visibleParameters = new Hashtable();
+ final Map parameterMap = _parentRequest.getParameterMap();
+ for (Iterator i = parameterMap.keySet().iterator(); i.hasNext();) {
+ Object key = i.next();
+ _visibleParameters.put( key, parameterMap.get( key ) );
+ }
for (Enumeration e = _parameters.keys(); e.hasMoreElements();) {
Object key = e.nextElement();
_visibleParameters.put( key, _parameters.get( key ) );
Index: RequestDispatcherImpl.java
===================================================================
RCS file: /cvsroot/httpunit/httpunit/src/com/meterware/servletunit/RequestDispatcherImpl.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- RequestDispatcherImpl.java 11 Feb 2003 04:32:00 -0000 1.2
+++ RequestDispatcherImpl.java 13 Feb 2003 20:25:55 -0000 1.3
@@ -26,7 +26,7 @@
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.ServletException;
-import javax.servlet.Servlet;
+import javax.servlet.http.HttpServletRequest;
/**
@@ -35,22 +35,27 @@
**/
class RequestDispatcherImpl extends RequestContext implements RequestDispatcher {
- private Servlet _servlet;
+ private ServletMetaData _servletMetaData;
- public RequestDispatcherImpl( WebApplication application, URL url ) throws ServletException {
+ RequestDispatcherImpl( WebApplication application, URL url ) throws ServletException {
super( url );
- _servlet = application.getServletRequest( url ).getServlet();
+ _servletMetaData = application.getServletRequest( url );
+ }
+
+
+ public ServletMetaData getServletMetaData() {
+ return _servletMetaData;
}
public void forward( ServletRequest request, ServletResponse response ) throws ServletException, IOException {
((ServletUnitHttpResponse) response).restartResponse();
- _servlet.service( request, response );
+ _servletMetaData.getServlet().service( new ForwardRequestWrapper( (HttpServletRequest) request, this ), response );
}
public void include( ServletRequest request, ServletResponse response ) throws ServletException, IOException {
- _servlet.service( request, response );
+ _servletMetaData.getServlet().service( new IncludeRequestWrapper( (HttpServletRequest) request, this ), response );
}
}
Index: ServletUnitHttpRequest.java
===================================================================
RCS file: /cvsroot/httpunit/httpunit/src/com/meterware/servletunit/ServletUnitHttpRequest.java,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -r1.23 -r1.24
--- ServletUnitHttpRequest.java 13 Feb 2003 15:37:00 -0000 1.23
+++ ServletUnitHttpRequest.java 13 Feb 2003 20:25:56 -0000 1.24
@@ -52,7 +52,7 @@
/**
* Constructs a ServletUnitHttpRequest from a WebRequest object.
**/
- ServletUnitHttpRequest( ServletRequest servletRequest, WebRequest request, ServletUnitContext context, Dictionary clientHeaders, byte[] messageBody ) throws MalformedURLException {
+ ServletUnitHttpRequest( ServletMetaData servletRequest, WebRequest request, ServletUnitContext context, Dictionary clientHeaders, byte[] messageBody ) throws MalformedURLException {
if (context == null) throw new IllegalArgumentException( "Context must not be null" );
_servletRequest = servletRequest;
@@ -720,31 +720,12 @@
}
- String[] getRoles() {
- return _roles == null ? NO_ROLES : _roles;
- }
-
-
- void pushRequestContext( RequestContext requestContext ) {
- requestContext.setParentContext( _requestContext );
- _requestContext = requestContext;
- }
-
-
- void popRequestContext() {
- _requestContext = _requestContext.getParentContext();
- }
-
-
-
//--------------------------------------------- private members ----------------------------------------------
final static private String LOOPBACK_ADDRESS = "127.0.0.1";
- final static private String[] NO_ROLES = new String[0];
-
private WebRequest _request;
- private ServletRequest _servletRequest;
+ private ServletMetaData _servletRequest;
private WebClient.HeaderDictionary _headers;
private ServletUnitContext _context;
private ServletUnitHttpSession _session;
Index: WebApplication.java
===================================================================
RCS file: /cvsroot/httpunit/httpunit/src/com/meterware/servletunit/WebApplication.java,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -r1.16 -r1.17
--- WebApplication.java 3 Jan 2003 16:12:35 -0000 1.16
+++ WebApplication.java 13 Feb 2003 20:25:56 -0000 1.17
@@ -26,12 +26,7 @@
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
-import java.util.ArrayList;
-import java.util.Dictionary;
-import java.util.HashMap;
-import java.util.Hashtable;
-import java.util.Iterator;
-import java.util.Map;
+import java.util.*;
import javax.servlet.Servlet;
import javax.servlet.ServletException;
@@ -134,7 +129,7 @@
}
- ServletRequest getServletRequest( URL url ) {
+ ServletMetaData getServletRequest( URL url ) {
return _servletMapping.get( url );
}
@@ -189,9 +184,9 @@
/**
- * Returns true of the specified role may access the desired URL path.
+ * Returns an array containing the roles permitted to access the specified URL.
*/
- boolean roleMayAccess( String roleName, URL url ) {
+ String[] getPermittedRoles( URL url ) {
String result;
String file = url.getFile();
if (_contextPath.equals( "" )) {
@@ -201,7 +196,7 @@
} else {
result = null;
}
- return getControllingConstraint( result ).hasRole( roleName );
+ return getControllingConstraint( result ).getPermittedRoles();
}
@@ -429,19 +424,22 @@
boolean controlsPath( String urlPath );
- boolean hasRole( String roleName );
+ String[] getPermittedRoles();
}
static class NullSecurityConstraint implements SecurityConstraint {
+ private static final String[] NO_ROLES = new String[0];
+
+
public boolean controlsPath( String urlPath ) {
return false;
}
- public boolean hasRole( String roleName ) {
- return true;
+ public String[] getPermittedRoles() {
+ return NO_ROLES;
}
}
@@ -450,7 +448,7 @@
SecurityConstraintImpl( Element root ) throws SAXException {
final NodeList roleNames = root.getElementsByTagName( "role-name" );
- for (int i = 0; i < roleNames.getLength(); i++) _roles.add( getTextValue( roleNames.item( i ) ) );
+ for (int i = 0; i < roleNames.getLength(); i++) _roleList.add( getTextValue( roleNames.item( i ) ) );
final NodeList resources = root.getElementsByTagName( "web-resource-collection" );
for (int i = 0; i < resources.getLength(); i++) _resources.add( new WebResourceCollection( (Element) resources.item( i ) ) );
@@ -462,12 +460,16 @@
}
- public boolean hasRole( String roleName ) {
- return _roles.contains( roleName );
+ public String[] getPermittedRoles() {
+ if (_roles == null) {
+ _roles = (String[]) _roleList.toArray( new String[ _roleList.size() ] );
+ }
+ return _roles;
}
- private ArrayList _roles = new ArrayList();
+ private String[] _roles;
+ private ArrayList _roleList = new ArrayList();
private ArrayList _resources = new ArrayList();
@@ -502,7 +504,7 @@
}
- static class ServletRequestImpl implements ServletRequest {
+ static class ServletRequestImpl implements ServletMetaData {
private URL _url;
private String _servletName;
@@ -641,7 +643,7 @@
}
- ServletRequest get( URL url ) {
+ ServletMetaData get( URL url ) {
String file = url.getFile();
if (!file.startsWith( _contextPath )) throw new HttpNotFoundException( "File path does not begin with '" + _contextPath + "'", url );
|