r9594 - in helma-ng/trunk/src/org/helma: jack repository tools web

[email protected]
Newsgroups gmane.comp.java.helma.cvs
Message-ID <20090409080150.732ED3D0D6@mia>
Author: hannes
Date: 2009-04-09 10:01:50 +0200 (Thu, 09 Apr 2009)
New Revision: 9594

Modified:
   helma-ng/trunk/src/org/helma/jack/JackServlet.java
   helma-ng/trunk/src/org/helma/repository/Trackable.java
   helma-ng/trunk/src/org/helma/repository/WebappRepository.java
   helma-ng/trunk/src/org/helma/repository/WebappResource.java
   helma-ng/trunk/src/org/helma/tools/HelmaConfiguration.java
   helma-ng/trunk/src/org/helma/web/HelmaServlet.java
Log:
Fixes and enhancements in WebappRepository and WebappResource
- Override toString(), hashCode(), and equals() in webapp repositories, the latter two being required to avoid infinite loops in cyclic module dependencies.
- Cache return value for exists() in webapp repositories and resources.
- Tweak repository lookup in HelmaServlet, JackServlet and HelmaConfiguration to avoid stomping on SecurityExceptions in restricted environments such as Google App Engine.

Details at http://dev.helma.org/trac/helma/changeset/9594

Modified: helma-ng/trunk/src/org/helma/jack/JackServlet.java
===================================================================
--- helma-ng/trunk/src/org/helma/jack/JackServlet.java	2009-04-09 08:01:48 UTC (rev 9593)
+++ helma-ng/trunk/src/org/helma/jack/JackServlet.java	2009-04-09 08:01:50 UTC (rev 9594)
@@ -42,9 +42,9 @@
         String helmaHome = getInitParam(config, "home", "WEB-INF");
         String modulePath = getInitParam(config, "modulePath", "modules");
 
-        Repository home = new FileRepository(helmaHome);
+        Repository home = new WebappRepository(config.getServletContext(), helmaHome);
         if (!home.exists()) {
-            home = new WebappRepository(config.getServletContext(), helmaHome);
+            home = new FileRepository(helmaHome);
         }
         try {
             HelmaConfiguration helmaConfig = new HelmaConfiguration(home, modulePath, null);

Modified: helma-ng/trunk/src/org/helma/repository/Trackable.java
===================================================================
--- helma-ng/trunk/src/org/helma/repository/Trackable.java	2009-04-09 08:01:48 UTC (rev 9593)
+++ helma-ng/trunk/src/org/helma/repository/Trackable.java	2009-04-09 08:01:50 UTC (rev 9594)
@@ -41,7 +41,7 @@
      */
     public String getName();
 
-        /**
+    /**
      * Returns an url to the resource if the repository of this resource is
      * able to provide urls
      * @return url to the resource

Modified: helma-ng/trunk/src/org/helma/repository/WebappRepository.java
===================================================================
--- helma-ng/trunk/src/org/helma/repository/WebappRepository.java	2009-04-09 08:01:48 UTC (rev 9593)
+++ helma-ng/trunk/src/org/helma/repository/WebappRepository.java	2009-04-09 08:01:50 UTC (rev 9594)
@@ -12,6 +12,7 @@
     ServletContext context;
 
     long timestamp;
+    private int exists = -1;
 
     public WebappRepository(ServletContext context, String path) {
         this.context = context;
@@ -43,11 +44,15 @@
     }
 
     public boolean exists() {
-        if ("/".equals(path)) {
-            return true;
+        if (exists < 0) {
+            if ("/".equals(path)) {
+                exists = 1;
+            } else {
+                Set paths = context.getResourcePaths(path);
+                exists = (paths != null && !paths.isEmpty()) ? 1 : 0;
+            }
         }
-        Set paths = context.getResourcePaths(path);
-        return (paths != null && !paths.isEmpty());
+        return exists == 1;
     }
 
     public Repository getChildRepository(String name) {
@@ -92,4 +97,21 @@
     protected Resource createResource(String name) {
         return new WebappResource(context, this, name);
     }
+
+    @Override
+    public String toString() {
+        return "WebappRepository[" + path + "]";
+    }
+
+
+    @Override
+    public int hashCode() {
+        return 5 + path.hashCode();
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        return obj instanceof WebappRepository && path.equals(((WebappRepository)obj).path);
+    }
+
 }

Modified: helma-ng/trunk/src/org/helma/repository/WebappResource.java
===================================================================
--- helma-ng/trunk/src/org/helma/repository/WebappResource.java	2009-04-09 08:01:48 UTC (rev 9593)
+++ helma-ng/trunk/src/org/helma/repository/WebappResource.java	2009-04-09 08:01:50 UTC (rev 9594)
@@ -9,6 +9,7 @@
 public class WebappResource extends AbstractResource {
 
     ServletContext context;
+    private int exists = -1;
 
     protected WebappResource(ServletContext context, WebappRepository repository, String name) {
         this.context = context;
@@ -23,11 +24,14 @@
     }
 
     public boolean exists() {
-        try {
-            return context.getResource(path) != null;
-        } catch (MalformedURLException mux) {
-            return false;
+        if (exists < 0) {
+            try {
+                exists = context.getResource(path) != null ? 1 : 0;
+            } catch (MalformedURLException mux) {
+                exists = 0;
+            }
         }
+        return exists == 1;
     }
 
     public long getLength() {
@@ -45,4 +49,20 @@
     public Repository getParentRepository() {
         return repository;
     }
+
+    @Override
+    public String toString() {
+        return "WebappResource[" + path + "]";
+    }
+
+
+    @Override
+    public int hashCode() {
+        return 37 + path.hashCode();
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        return obj instanceof WebappResource && path.equals(((WebappResource)obj).path);
+    }
 }

Modified: helma-ng/trunk/src/org/helma/tools/HelmaConfiguration.java
===================================================================
--- helma-ng/trunk/src/org/helma/tools/HelmaConfiguration.java	2009-04-09 08:01:48 UTC (rev 9593)
+++ helma-ng/trunk/src/org/helma/tools/HelmaConfiguration.java	2009-04-09 08:01:50 UTC (rev 9594)
@@ -69,6 +69,11 @@
             String[] paths = StringUtils.split(modulePath, ",");
             for (int i = 0; i < paths.length; i++) {
                 String path = paths[i].trim();
+                Repository repo = home.getChildRepository(path);
+                if (repo.exists()) {
+                    repositories.add(repo);
+                    continue;
+                }
                 File file = new File(path);
                 if (!file.isAbsolute()) {
                     // if path is relative, try to resolve against current directory first,

Modified: helma-ng/trunk/src/org/helma/web/HelmaServlet.java
===================================================================
--- helma-ng/trunk/src/org/helma/web/HelmaServlet.java	2009-04-09 08:01:48 UTC (rev 9593)
+++ helma-ng/trunk/src/org/helma/web/HelmaServlet.java	2009-04-09 08:01:50 UTC (rev 9594)
@@ -88,9 +88,9 @@
                 }
                 String helmaHome = servletConfig.getInitParameter("helmaHome");
                 String modulePath = servletConfig.getInitParameter("modulePath");
-                Repository home = new FileRepository(helmaHome);
+                Repository home = new WebappRepository(servletConfig.getServletContext(), helmaHome);
                 if (!home.exists()) {
-                    home = new WebappRepository(servletConfig.getServletContext(), helmaHome);
+                    home = new FileRepository(helmaHome);
                 }
                 HelmaConfiguration config =
                         new HelmaConfiguration(home, modulePath, "modules");
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.