Title: [466] trunk/rails-integration/src: Allow FileServlet to fall back to RailsServlet
Revision
466
Author
tantalon
Date
2007-04-18 20:16:03 -0400 (Wed, 18 Apr 2007)

Log Message

Allow FileServlet to fall back to RailsServlet

Modified Paths


Diff

Modified: trunk/rails-integration/src/main/java/org/jruby/webapp/FileServlet.java (465 => 466)


--- trunk/rails-integration/src/main/java/org/jruby/webapp/FileServlet.java	2007-04-19 00:15:46 UTC (rev 465)
+++ trunk/rails-integration/src/main/java/org/jruby/webapp/FileServlet.java	2007-04-19 00:16:03 UTC (rev 466)
@@ -13,6 +13,7 @@
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.ServletException;
 import javax.servlet.ServletContext;
+import javax.servlet.RequestDispatcher;
 
 /**
  * This servlet returns a static file.
@@ -21,6 +22,8 @@
  */
 public class FileServlet extends HttpServlet {
 
+	public static final String FALLBACK_SERVLET_PROPERTY = "files.default";
+
 	private static final String[] DEFAULT_WELCOME_FILES = { "index.jsp", "index.html", "index.htm" };
 
 	private int bufferSize = 1024;
@@ -29,6 +32,8 @@
 
 	private String prefix = File.separator + "public";
 
+	private RequestDispatcher defaultServletDispatcher;
+
 	/**
 	 * Initialize the servlet, and determine the webapp root.
 	 */
@@ -43,6 +48,11 @@
 		if (rootPath.endsWith("/")) {
 			rootPath = rootPath.substring(0, rootPath.length() - 1);
 		}
+		// check for default fallback servlet
+		String defaultServletName = context.getInitParameter(FileServlet.FALLBACK_SERVLET_PROPERTY);
+		if (defaultServletName != null && defaultServletName.length() != 0) {
+			defaultServletDispatcher = context.getNamedDispatcher(defaultServletName);
+		}
 	}
 
 	public String[] getWelcomeFiles() {
@@ -85,7 +95,14 @@
 				}
 			}
 
-			if (!file.isFile()) {
+			if (file.isFile()) {
+				// file was found, all good
+			} else if (defaultServletDispatcher != null) {
+				// forward request to the default servlet
+				defaultServletDispatcher.forward(request, response);
+				return;
+			} else {
+				// file not found
 				log("File not found: " + realPath);
 				throw new FileNotFoundException(realPath);
 			}

Modified: trunk/rails-integration/src/test/java/org/jruby/webapp/FileServletTest.java (465 => 466)


--- trunk/rails-integration/src/test/java/org/jruby/webapp/FileServletTest.java	2007-04-19 00:15:46 UTC (rev 465)
+++ trunk/rails-integration/src/test/java/org/jruby/webapp/FileServletTest.java	2007-04-19 00:16:03 UTC (rev 466)
@@ -10,6 +10,7 @@
 import javax.servlet.ServletContext;
 import javax.servlet.ServletException;
 import javax.servlet.ServletOutputStream;
+import javax.servlet.RequestDispatcher;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
@@ -34,6 +35,7 @@
 		// setup expectations
 		EasyMock.expect(config.getServletName()).andStubReturn("Rails");
 		EasyMock.expect(config.getServletContext()).andStubReturn(context);
+		EasyMock.expect(context.getInitParameter(FileServlet.FALLBACK_SERVLET_PROPERTY)).andReturn(null);
 		EasyMock.expect(request.getMethod()).andReturn("GET");
 		EasyMock.expect(request.getContextPath()).andReturn("/context");
 		EasyMock.expect(request.getRequestURI()).andReturn("/context/no_such_file.txt");
@@ -51,6 +53,38 @@
 		mockControl.verify();
 	}
 
+	/**
+	 * Files that are not found are passed on to the default servlet.
+	 */
+	public void testDefaultServlet() throws IOException, ServletException {
+		IMocksControl mockControl = EasyMock.createControl();
+		ServletConfig config = (ServletConfig)mockControl.createMock(ServletConfig.class);
+		ServletContext context = (ServletContext)mockControl.createMock(ServletContext.class);
+		HttpServletRequest request = (HttpServletRequest)mockControl.createMock(HttpServletRequest.class);
+		HttpServletResponse response = (HttpServletResponse)mockControl.createMock(HttpServletResponse.class);
+		RequestDispatcher dispatcher = (RequestDispatcher)mockControl.createMock(RequestDispatcher.class);
+		// setup expectations
+		EasyMock.expect(config.getServletName()).andStubReturn("Rails");
+		EasyMock.expect(config.getServletContext()).andStubReturn(context);
+		EasyMock.expect(context.getInitParameter(FileServlet.FALLBACK_SERVLET_PROPERTY)).andReturn("default-servlet");
+		EasyMock.expect(context.getNamedDispatcher("default-servlet")).andReturn(dispatcher);
+		EasyMock.expect(request.getMethod()).andReturn("GET");
+		EasyMock.expect(request.getContextPath()).andReturn("/context");
+		EasyMock.expect(request.getRequestURI()).andReturn("/context/no_such_file.txt");
+		EasyMock.expect(context.getRealPath("/")).andReturn(getRoot());
+		dispatcher.forward(request, response);
+		EasyMock.expectLastCall().once();
+		// logging
+		context.log((String)EasyMock.anyObject());
+		EasyMock.expectLastCall().atLeastOnce();
+		// run the test
+		mockControl.replay();
+		FileServlet servlet = new FileServlet();
+		servlet.init(config);
+		servlet.service(request, response);
+		mockControl.verify();
+	}
+
 	public void testFound() throws ServletException, IOException {
 		IMocksControl mockControl = EasyMock.createControl();
 		ServletConfig config = (ServletConfig)mockControl.createMock(ServletConfig.class);
@@ -60,6 +94,7 @@
 		// setup expectations
 		EasyMock.expect(config.getServletName()).andStubReturn("Rails");
 		EasyMock.expect(config.getServletContext()).andStubReturn(context);
+		EasyMock.expect(context.getInitParameter(FileServlet.FALLBACK_SERVLET_PROPERTY)).andReturn(null);
 		EasyMock.expect(request.getMethod()).andReturn("GET");
 		EasyMock.expect(request.getContextPath()).andReturn("/context");
 		EasyMock.expect(request.getRequestURI()).andReturn("/context/file.txt");
@@ -87,6 +122,7 @@
 		// setup expectations
 		EasyMock.expect(config.getServletName()).andStubReturn("Rails");
 		EasyMock.expect(config.getServletContext()).andStubReturn(context);
+		EasyMock.expect(context.getInitParameter(FileServlet.FALLBACK_SERVLET_PROPERTY)).andReturn(null);
 		EasyMock.expect(request.getMethod()).andReturn("GET");
 		EasyMock.expect(request.getContextPath()).andReturn("/context");
 		EasyMock.expect(request.getRequestURI()).andReturn("/context/file.txt");
@@ -127,6 +163,7 @@
 		EasyMock.expect(config.getServletName()).andStubReturn("Rails");
 		EasyMock.expect(config.getServletContext()).andStubReturn(context);
 		EasyMock.expect(context.getAttribute("org.apache.catalina.WELCOME_FILES")).andReturn(new String[] { "file.txt" });
+		EasyMock.expect(context.getInitParameter(FileServlet.FALLBACK_SERVLET_PROPERTY)).andReturn(null);
 		EasyMock.expect(request.getMethod()).andReturn("GET");
 		EasyMock.expect(request.getContextPath()).andReturn("/context");
 		EasyMock.expect(request.getRequestURI()).andReturn("/context/");
_______________________________________________
Jruby-extras-devel mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/jruby-extras-devel

Reply via email to