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