You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@click.apache.org by sa...@apache.org on 2009/07/26 23:16:25 UTC

svn commit: r797989 - /incubator/click/trunk/click/framework/src/org/apache/click/service/ClickResourceService.java

Author: sabob
Date: Sun Jul 26 21:16:21 2009
New Revision: 797989

URL: http://svn.apache.org/viewvc?rev=797989&view=rev
Log:
deploy resources from META-INF/resources instead of META-INF/web. CLK-570

Modified:
    incubator/click/trunk/click/framework/src/org/apache/click/service/ClickResourceService.java

Modified: incubator/click/trunk/click/framework/src/org/apache/click/service/ClickResourceService.java
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/framework/src/org/apache/click/service/ClickResourceService.java?rev=797989&r1=797988&r2=797989&view=diff
==============================================================================
--- incubator/click/trunk/click/framework/src/org/apache/click/service/ClickResourceService.java (original)
+++ incubator/click/trunk/click/framework/src/org/apache/click/service/ClickResourceService.java Sun Jul 26 21:16:21 2009
@@ -44,8 +44,8 @@
 /**
  * Provides a default Click static resource service class. This class will
  * serve static resources contained in the web applications JARs, under the
- * resource path META-INF/web and which are contained under the WAR file web
- * root.
+ * resource path META-INF/resources and which are contained under the WAR file
+ * web root.
  * <p/>
  * This service is useful for application servers which do not allow Click to
  * automatically deploy resources to the web root /click/ directory.
@@ -134,55 +134,72 @@
 
     private void loadAllJarResources() throws IOException {
 
-        // Find all jars under WEB-INF/lib and deploy all resources from these jars
         long startTime = System.currentTimeMillis();
 
         ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
 
-        Enumeration<URL> en = classLoader.getResources("META-INF/web");
+        // Find all jars and directories on the classpath that contains the
+        // directory "META-INF/resources/", and deploy those resources
+        String resourceDirectory = "META-INF/resources/";
+        Enumeration<URL> en = classLoader.getResources(resourceDirectory);
         while (en.hasMoreElements()) {
             URL url = en.nextElement();
-            String path = url.getFile();
+            loadResourcesOnClasspath(url, resourceDirectory);
+        }
 
-            // Decode the url, esp on Windows where file paths can have their
-            // spaces encoded. decodeURL will convert C:\Program%20Files\project
-            // to C:\Program Files\project
-            path = ClickUtils.decodeURL(path);
-
-            // Strip file prefix
-            if (path.startsWith("file:")) {
-                path = path.substring(5);
-            }
+        if (logService.isTraceEnabled()) {
+            logService.trace("loaded files from jars and folders - "
+                + (System.currentTimeMillis() - startTime) + " ms");
+        }
+    }
 
-            String jarPath = null;
+    /**
+     * Deploy from the url all resources found under the prefix.
+     *
+     * @param url the url of the jar or folder which resources to deploy
+     * @param resourceDirectory the directory under which resources are found
+     * @throws IOException if resources from the url cannot be deployed
+     */
+    private void loadResourcesOnClasspath(URL url, String resourceDirectory)
+        throws IOException {
 
-            // Check if path represents a jar
-            if (path.indexOf('!') > 0) {
-                jarPath = path.substring(0, path.indexOf('!'));
+        String path = url.getFile();
 
-                File jar = new File(jarPath);
+        // Decode the url, esp on Windows where file paths can have their
+        // spaces encoded. decodeURL will convert C:\Program%20Files\project
+        // to C:\Program Files\project
+        path = ClickUtils.decodeURL(path);
 
-                if (jar.exists()) {
-                    loadFilesInJar(jar);
+        // Strip file prefix
+        if (path.startsWith("file:")) {
+            path = path.substring(5);
+        }
+
+        String jarPath = null;
+
+        // Check if path represents a jar
+        if (path.indexOf('!') > 0) {
+            jarPath = path.substring(0, path.indexOf('!'));
+
+            File jar = new File(jarPath);
+
+            if (jar.exists()) {
+                loadFilesInJar(jar, resourceDirectory);
 
-                } else {
-                    logService.error("Could not load the jar '" + jarPath
-                        + "'. Please ensure this file exists in the specified"
-                        + " location.");
-                }
             } else {
-                File dir = new File(path);
-                loadFilesInJarDir(dir);
+                logService.error("Could not load the jar '" + jarPath +
+                    "'. Please ensure this file exists in the specified" +
+                    " location.");
             }
-        }
-
-        if (logService.isTraceEnabled()) {
-            logService.trace("loaded files from jars and folders - "
-                + (System.currentTimeMillis() - startTime) + " ms");
+        } else {
+            File dir = new File(path);
+            loadFilesInJarDir(dir, resourceDirectory);
         }
     }
 
-    private void loadFilesInJar(File jar) throws IOException {
+    private void loadFilesInJar(File jar, String resourceDirectory)
+        throws IOException {
+
         if (jar == null) {
             throw new IllegalArgumentException("Jar cannot be null");
         }
@@ -201,16 +218,16 @@
             boolean logFeedback = true;
             while ((jarEntry = jarInputStream.getNextJarEntry()) != null) {
 
-                // Guard against loading folders -> META-INF/web/click/
+                // Guard against loading folders -> META-INF/resources/click/
                 if (jarEntry.isDirectory()) {
                     continue;
                 }
 
-                // jarEntryName example -> META-INF/web/click/table.css
+                // jarEntryName example -> META-INF/resources/click/table.css
                 String jarEntryName = jarEntry.getName();
 
-                // Only deploy resources from "META-INF/web/"
-                int pathIndex = jarEntryName.indexOf("META-INF/web/");
+                // Only deploy resources from "META-INF/resources/"
+                int pathIndex = jarEntryName.indexOf(resourceDirectory);
                 if (pathIndex == 0) {
                     if (logFeedback && logService.isTraceEnabled()) {
                         logService.trace("loaded files from jar -> "
@@ -219,7 +236,7 @@
                         // Only provide feedback once per jar
                         logFeedback = false;
                     }
-                    loadJarFile(jarEntryName, "META-INF/web/");
+                    loadJarFile(jarEntryName, resourceDirectory);
                 }
             }
         } finally {
@@ -229,7 +246,9 @@
     }
 
     @SuppressWarnings("unchecked")
-    private void loadFilesInJarDir(File dir) throws IOException {
+    private void loadFilesInJarDir(File dir, String resourceDirectory)
+        throws IOException {
+
         if (dir == null) {
             throw new IllegalArgumentException("Dir cannot be null");
         }
@@ -246,18 +265,18 @@
 
         boolean logFeedback = true;
         while (files.hasNext()) {
-            // file example -> META-INF/web/click/table.css
+            // file example -> META-INF/resources/click/table.css
             File file = (File) files.next();
 
-            // Guard against loading folders -> META-INF/web/click/
+            // Guard against loading folders -> META-INF/resources/click/
             if (file.isDirectory()) {
                 continue;
             }
 
             String fileName = file.getCanonicalPath().replace('\\', '/');
 
-            // Only deploy resources from "META-INF/web/"
-            int pathIndex = fileName.indexOf("META-INF/web/");
+            // Only deploy resources from "META-INF/resources/"
+            int pathIndex = fileName.indexOf(resourceDirectory);
             if (pathIndex != -1) {
                 if (logFeedback && logService.isTraceEnabled()) {
                     logService.trace("load files from folder -> "
@@ -267,7 +286,7 @@
                     logFeedback = false;
                 }
                 fileName = fileName.substring(pathIndex);
-                loadJarFile(fileName, "META-INF/web/");
+                loadJarFile(fileName, resourceDirectory);
             }
         }
     }