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.