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/05/24 17:50:04 UTC

svn commit: r778179 - in /incubator/click/trunk/click: documentation/docs/roadmap-changes.html framework/src/org/apache/click/service/XmlConfigService.java

Author: sabob
Date: Sun May 24 15:50:04 2009
New Revision: 778179

URL: http://svn.apache.org/viewvc?rev=778179&view=rev
Log:
improved XmlConfigService to deploy resources from folders on classpath. CLK-552

Modified:
    incubator/click/trunk/click/documentation/docs/roadmap-changes.html
    incubator/click/trunk/click/framework/src/org/apache/click/service/XmlConfigService.java

Modified: incubator/click/trunk/click/documentation/docs/roadmap-changes.html
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/documentation/docs/roadmap-changes.html?rev=778179&r1=778178&r2=778179&view=diff
==============================================================================
--- incubator/click/trunk/click/documentation/docs/roadmap-changes.html (original)
+++ incubator/click/trunk/click/documentation/docs/roadmap-changes.html Sun May 24 15:50:04 2009
@@ -141,9 +141,9 @@
     </div>
     <ul style="padding: 0em; margin-left:0em;margin-bottom: 2em">
       <li class="change">
-          Added new Calendar popup to DateField. This Calendar popup is based on
+          Added new Calendar popup to DateField. This Calendar popup uses
           <a target="_blank" class="external" href="http://code.google.com/p/calendardateselect/">Calendar Date Select</a>
-          which is built on top of the Prototype JavaScript library.
+          which is based on the Prototype JavaScript library.
           <p/>
           Please note if you don't want a dependency on the Prototype library
           you can use the third-party
@@ -245,6 +245,11 @@
           [<a target='_blank' href="https://issues.apache.org/click/browse/CLK-498">498</a>].
       </li>
       <li class="change">
+          Improved XmlConfigService to scan for deployable resources inside folders
+          on the classpath
+          [<a target='_blank' href="https://issues.apache.org/click/browse/CLK-552">552</a>].
+      </li>
+      <li class="change">
           <a class="external" target="_blank" href="http://code.google.com/p/click-calendar/">Click Calendar</a>
           version 1.0.1 has been released which fixes a memory leak in the calendar popup
           [<a target='_blank' href="https://issues.apache.org/jira/browse/CLK-499">499</a>].

Modified: incubator/click/trunk/click/framework/src/org/apache/click/service/XmlConfigService.java
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/framework/src/org/apache/click/service/XmlConfigService.java?rev=778179&r1=778178&r2=778179&view=diff
==============================================================================
--- incubator/click/trunk/click/framework/src/org/apache/click/service/XmlConfigService.java (original)
+++ incubator/click/trunk/click/framework/src/org/apache/click/service/XmlConfigService.java Sun May 24 15:50:04 2009
@@ -49,6 +49,8 @@
 import org.apache.click.util.HtmlStringBuffer;
 import ognl.Ognl;
 
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.filefilter.TrueFileFilter;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.Validate;
 import org.w3c.dom.Document;
@@ -814,7 +816,7 @@
 
     /**
      * Build the {@link #pageByClassMap} from the {@link #pageByPathMap} and
-     * delegate to {@link #buildClassMap(PageElm)}.
+     * delegate to {@link #addToClassMap(PageElm)}.
      */
     void buildClassMap() {
         // Build pages by class map
@@ -1114,7 +1116,7 @@
             deployControls(rootElm);
             deployControlSets(rootElm);
 
-            deployFilesInJars();
+            deployAutoFiles();
         } else {
             String msg = "Could not auto deploy files to 'click' web folder."
                 + " You may need to manually include click resources in your"
@@ -1124,13 +1126,14 @@
     }
 
     /**
-     * Deploy from jars, files that are specified in the folder 'META-INF/web'.
+     * Deploy from jars and directories all files that are specified in the
+     * folder 'META-INF/web'.
      * <p/>
-     * Only jars available on the classpath are scanned.
+     * Only jars and folders available on the classpath are scanned.
      *
      * @throws java.lang.Exception if the files cannot be deployed
      */
-    private void deployFilesInJars() throws Exception {
+    private void deployAutoFiles() throws Exception {
 
         // Find all jars under WEB-INF/lib and deploy all resources from these jars
         long startTime = System.currentTimeMillis();
@@ -1154,33 +1157,78 @@
 
             String jarPath = null;
 
-            // Extract the jar name from the entry
+            // Check if path represents a jar
             if (path.indexOf('!') > 0) {
                 jarPath = path.substring(0, path.indexOf('!'));
-            } else {
-                // If jar name cannot be extracted, skip the resource
-                logService.trace("Path does not represent a Jar -> '" + path + "'");
-                continue;
-            }
 
-            File jar = new File(jarPath);
+                File jar = new File(jarPath);
 
-            if (jar.exists()) {
-                deployFilesInJar(jar);
+                if (jar.exists()) {
+                    deployFilesInJar(jar);
 
+                } else {
+                    logService.error("Could not deploy the jar '" + jarPath +
+                        "'. Please ensure this file exists in the specified" +
+                        " location.");
+                }
             } else {
-                logService.error("Could not deploy the jar '" + jarPath
-                    + "'. Please ensure this file exists in the specified"
-                    + " location.");
+                File dir = new File(path);
+                deployFilesInDir(dir);
             }
         }
 
         if (logService.isTraceEnabled()) {
-            logService.trace("deployed files from jars - "
+            logService.trace("deployed files from jars and folders - "
                 + (System.currentTimeMillis() - startTime) + " ms");
         }
     }
 
+
+    /**
+     * Deploy files from the specified directory.
+     * <p/>
+     * Only files specified in the folder 'META-INF/web' will be deployed.
+     *
+     * @param dir the directory which resources will be deployed
+     * @throws java.lang.Exception if for some reason the files cannot be
+     * deployed
+     */
+    private void deployFilesInDir(File dir) throws Exception {
+        if (dir == null) {
+            throw new IllegalArgumentException("Dir cannot be null");
+        }
+
+        if (!dir.exists()) {
+            logService.trace("There are no files in the folder '"
+                + dir.getAbsolutePath() + "'");
+            return;
+        }
+
+        Iterator files = FileUtils.iterateFiles(dir, TrueFileFilter.INSTANCE,
+            TrueFileFilter.INSTANCE);
+
+        boolean logFeedback = true;
+        while (files.hasNext()) {
+            // file example -> META-INF/web/click/table.css
+            File file = (File) files.next();
+            String fileName = file.getCanonicalPath().replace('\\', '/');
+
+            // Only deploy resources from "META-INF/web/"
+            int pathIndex = fileName.indexOf("META-INF/web/");
+            if (pathIndex != -1) {
+                if (logFeedback && logService.isTraceEnabled()) {
+                    logService.trace("deploy files from folder -> " +
+                        dir.getAbsolutePath());
+
+                    // Only provide feedback once per dir
+                    logFeedback = false;
+                }
+                fileName = fileName.substring(pathIndex);
+                deployFile(fileName, "META-INF/web/");
+            }
+        }
+    }
+
     /**
      * Deploy files from the specified jar.
      * <p/>
@@ -1211,7 +1259,7 @@
                 // jarEntryName example -> META-INF/web/click/table.css
                 String jarEntryName = jarEntry.getName();
 
-                // Deploy all resources under "META-INF/web/"
+                // Only deploy resources from "META-INF/web/"
                 int pathIndex = jarEntryName.indexOf("META-INF/web/");
                 if (pathIndex == 0) {
                     if (logFeedback && logService.isTraceEnabled()) {
@@ -1221,24 +1269,7 @@
                         // Only provide feedback once per jar
                         logFeedback = false;
                     }
-                    pathIndex += "META-INF/web/".length();
-
-                    // By default deploy to the web root dir
-                    String targetDir = "";
-
-                    // resourceName example -> click/table.css
-                    String resourceName = jarEntryName.substring(pathIndex);
-                    int index = resourceName.lastIndexOf('/');
-
-                    if (index != -1) {
-                        // targetDir example -> click
-                        targetDir = resourceName.substring(0, index);
-                    }
-
-                    // Copy resources to web folder
-                    ClickUtils.deployFile(servletContext,
-                        jarEntryName,
-                        targetDir);
+                    deployFile(jarEntryName, "META-INF/web/");
                 }
             }
         } finally {
@@ -1247,6 +1278,38 @@
         }
     }
 
+    /**
+     * Deploy the specified file.
+     *
+     * @param file the file to deploy
+     * @param prefix the file prefix that must be removed when the file is
+     * deployed
+     */
+    private void deployFile(String file, String prefix) {
+        // Only deploy resources containing the prefix
+        int pathIndex = file.indexOf(prefix);
+        if (pathIndex == 0) {
+            pathIndex += prefix.length();
+
+            // By default deploy to the web root dir
+            String targetDir = "";
+
+            // resourceName example -> click/table.css
+            String resourceName = file.substring(pathIndex);
+            int index = resourceName.lastIndexOf('/');
+
+            if (index != -1) {
+                // targetDir example -> click
+                targetDir = resourceName.substring(0, index);
+            }
+
+            // Copy resources to web folder
+            ClickUtils.deployFile(servletContext,
+                                  file,
+                                  targetDir);
+        }
+    }
+
     private void loadMode(Element rootElm) {
         Element modeElm = ClickUtils.getChild(rootElm, "mode");