Title: [677] trunk/rails-integration/src/main/java/org/jruby/webapp: configurable support for caching, by Li Xiao
Revision
677
Author
tirsen
Date
2007-07-23 21:32:33 -0400 (Mon, 23 Jul 2007)

Log Message

configurable support for caching, by Li Xiao

Modified Paths


Diff

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


--- trunk/rails-integration/src/main/java/org/jruby/webapp/FileServlet.java	2007-07-21 05:28:47 UTC (rev 676)
+++ trunk/rails-integration/src/main/java/org/jruby/webapp/FileServlet.java	2007-07-24 01:32:33 UTC (rev 677)
@@ -10,6 +10,9 @@
 import java.io.*;
 import java.nio.ByteBuffer;
 import java.nio.channels.FileChannel;
+import java.util.Calendar;
+import java.util.Date;
+import java.text.SimpleDateFormat;
 
 /**
  * This servlet returns a static file.
@@ -20,10 +23,17 @@
 
     public static final String FALLBACK_SERVLET_PROPERTY = "files.default";
 
+    public final static String CACHE_CONTROL_HEADER = "Cache-Control";
+    public final static String EXPIRES_HEADER = "Expires";
+    public final static String DATE_HEADER = "Date";
+
     private static final String[] DEFAULT_WELCOME_FILES = {"index.jsp", "index.html", "index.htm"};
 
     private int bufferSize = 1024;
 
+    private boolean setCacheHeaders;
+    private int maxAge;
+
     private String rootPath;
 
     private String directory;
@@ -49,6 +59,11 @@
             directory = "public";
         }
 
+        setCacheHeaders = getServletConfig().getInitParameter("maxAge") != null;
+        if (setCacheHeaders) {
+            maxAge = Integer.parseInt(getServletConfig().getInitParameter("maxAge"));
+        }
+
         // check for default fallback servlet
         String defaultServletName = getServletConfig().getInitParameter("defaultServlet");
         if (defaultServletName == null) {
@@ -132,7 +147,17 @@
                 throw new NotModifiedException();
             }
 
+            // set cache headers
+            if (setCacheHeaders) {
+                response.setHeader(CACHE_CONTROL_HEADER, "max-age=" + maxAge);
+                response.setHeader(DATE_HEADER, formatDateForHeader(Calendar.getInstance().getTime()));
+                Calendar now = Calendar.getInstance();
+                now.add(Calendar.SECOND, maxAge);
+                response.setHeader(EXPIRES_HEADER, formatDateForHeader(now.getTime()));
+            }
+
             // setup IO streams
+            System.out.println("sending file: " + file);
             ByteBuffer buffer = ByteBuffer.allocate(bufferSize);
             in = new FileInputStream(file).getChannel();
 
@@ -185,6 +210,11 @@
         return typeMap.getContentType(fileName);
     }
 
+    private String formatDateForHeader(Date date) {
+      String safari3OnlyAccessThisStyleDataFormat = "EEE, d MMM yyyy HH:mm:ss z";
+      return new SimpleDateFormat(safari3OnlyAccessThisStyleDataFormat).format(date);
+    }
+
     /**
      * An exception when the source object has not been modified. While this
      * condition is not a failure, it is a break from the normal flow of

Modified: trunk/rails-integration/src/main/java/org/jruby/webapp/RailsTaskServlet.java (676 => 677)


--- trunk/rails-integration/src/main/java/org/jruby/webapp/RailsTaskServlet.java	2007-07-21 05:28:47 UTC (rev 676)
+++ trunk/rails-integration/src/main/java/org/jruby/webapp/RailsTaskServlet.java	2007-07-24 01:32:33 UTC (rev 677)
@@ -35,17 +35,20 @@
 						Ruby runtime = (Ruby) getRuntimePool().borrowObject();
 						servletConfig.getServletContext().log("Starting " + script);
 						try {
-							// can this be used instead?
-							// runtime.getLoadService().load(script);
 							runtime.evalScript("load(File.join(RAILS_ROOT, '" + script + "'))");
 						} catch (Exception e) {
 							getRuntimePool().invalidateObject(runtime);
-							try {
+                            runtime = null;
+                            try {
 								Thread.sleep(10 * 1000); // wait for 10s
 							} catch (InterruptedException ignore) {
 							}
 							servletConfig.getServletContext().log("Script died, restarting: " + script, e);
-						}
+						} finally {
+                            if (runtime != null) {
+                                getRuntimePool().returnObject(runtime);
+                            }
+                        }
 					}
 				} catch (Exception e) {
 					servletConfig.getServletContext().log("Could not start " + script, e);
_______________________________________________
Jruby-extras-devel mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/jruby-extras-devel

Reply via email to