Author: lryan
Date: Thu Jan 10 13:52:40 2008
New Revision: 610945

URL: http://svn.apache.org/viewvc?rev=610945&view=rev
Log:
Add recursive loading support from classpath JARs

Modified:
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/JsFeatureLoader.java

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/JsFeatureLoader.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/JsFeatureLoader.java?rev=610945&r1=610944&r2=610945&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/JsFeatureLoader.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/JsFeatureLoader.java
 Thu Jan 10 13:52:40 2008
@@ -25,12 +25,19 @@
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.net.JarURLConnection;
+import java.net.URL;
+import java.net.URLConnection;
+import java.net.URISyntaxException;
+import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
 import java.util.logging.Logger;
 
 import javax.xml.parsers.DocumentBuilderFactory;
@@ -71,10 +78,12 @@
       GadgetFeatureRegistry registry) throws GadgetException {
     Map<String, ParsedFeature> deps = new HashMap<String, ParsedFeature>();
     if (path.startsWith("res://")) {
-      loadResources(path.substring(6), deps);
+      logger.info("Loading resources from: " + path);
+      loadResources(new String[]{path.substring(6)}, deps);
     } else {
+      logger.info("Loading files from: " + path);
       File file = new File(path);
-      loadFiles(file, deps);
+      loadFiles(new File[]{file}, deps);
     }
 
     List<GadgetFeatureRegistry.Entry> entries
@@ -95,55 +104,76 @@
 
   /**
    * Loads features from directories recursively.
-   * @param dir The directory to examine.
+   * @param files The files to examine.
    * @param features The set of all loaded features
    * @throws GadgetException
    */
-  private void loadFiles(File dir, Map<String, ParsedFeature> features)
+  private void loadFiles(File[] files, Map<String, ParsedFeature> features)
       throws GadgetException {
-    logger.info("Loading files from: " + dir.getAbsolutePath());
-    if (dir.isDirectory()) {
-      for (File file : dir.listFiles()) {
-        if (file.isDirectory()) {
-          loadFiles(file, features);
-        } else if (file.getName().equals("feature.xml")) {
-          ParsedFeature feature = processFile(file);
-          if (feature != null) {
-            features.put(feature.name, feature);
-          }
+    for (File file : files) {
+      if (file.isDirectory()) {
+        loadFiles(file.listFiles(), features);
+      } else if (file.getName().equals("feature.xml")) {
+        ParsedFeature feature = processFile(file);
+        if (feature != null) {
+          features.put(feature.name, feature);
         }
       }
-    } else {
-      ParsedFeature feature = processFile(dir);
-      if (feature != null) {
-        features.put(feature.name, feature);
-      }
     }
   }
 
   /**
    * Loads resources recursively.
-   * @param file The location of the resource, either feature.xml or
-   *    features.txt
+   * @param files The base paths to look for feature.xml
    * @param features The set of all loaded features
    * @throws GadgetException
    */
-  private void loadResources(String file, Map<String, ParsedFeature> features)
+  private void loadResources(String[] files, Map<String, ParsedFeature> 
features)
       throws GadgetException {
-    logger.info("Loading resource from: " + file);
-    if (file.endsWith(".txt")) {
-      String[] names = readResourceList(file);
-      for (String name : names) {
-        loadResources(name, features);
-      }
-    }
-    else if (file.endsWith("feature.xml")) {
-      ParsedFeature feature = processResource(file);
-      if (feature != null) {
-        features.put(feature.name, feature);
+    ClassLoader cl = JsFeatureLoader.class.getClassLoader();
+    try {
+      for (String file : files) {
+        file = file.trim();
+        if (file.endsWith(".txt")) {
+          loadResources(readResourceList(file), features);
+        } else if (file.endsWith("feature.xml")) {
+          ParsedFeature feature = processResource(file);
+          if (feature != null) {
+            features.put(feature.name, feature);
+          }
+        } else {
+          Enumeration<URL> mappedResources = cl.getResources(file);
+          while (mappedResources.hasMoreElements()) {
+            URL resourceUrl =  mappedResources.nextElement();
+            if (resourceUrl.getProtocol().equals("file")) {
+              File f = new File(resourceUrl.toURI());
+              loadFiles(new File[]{f}, features);
+            } else {
+              URLConnection urlConnection = resourceUrl.openConnection();
+              if (urlConnection instanceof JarURLConnection) {
+                JarURLConnection jarUrlConn = (JarURLConnection)urlConnection;
+                JarFile jar = jarUrlConn.getJarFile();
+
+                Enumeration<JarEntry> jarEntries = jar.entries();
+                while (jarEntries.hasMoreElements()) {
+                  JarEntry jarEntry =  jarEntries.nextElement();
+                  if (jarEntry.getName().startsWith(file) &&
+                      jarEntry.getName().endsWith("feature.xml")) {
+                    ParsedFeature feature = 
processResource(jarEntry.getName());
+                    if (feature != null) {
+                      features.put(feature.name, feature);
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
       }
-    } else {
-      logger.warning("Unknown resource file: " + file);
+    } catch (IOException ioe) {
+      throw new GadgetException(GadgetException.Code.INVALID_PATH, ioe);
+    } catch (URISyntaxException use) {
+      throw new GadgetException(GadgetException.Code.INVALID_PATH, use);
     }
   }
 


Reply via email to