Author: michiel
Date: 2010-01-23 11:56:03 +0100 (Sat, 23 Jan 2010)
New Revision: 40708

Added:
   mmbase/trunk/core/src/main/config/utils/resourceloader_CONFIG
Modified:
   mmbase/trunk/core/src/main/java/org/mmbase/util/ResourceLoader.java
Log:
MMB-1917. Resourceloader strategies are now read from a resource, so can now be 
plugged. Unavalable strategeis can be left away. It should be possbible now to 
move ResourceLoader to a bridge-less jar.

Added: mmbase/trunk/core/src/main/config/utils/resourceloader_CONFIG
===================================================================
--- mmbase/trunk/core/src/main/config/utils/resourceloader_CONFIG               
                (rev 0)
+++ mmbase/trunk/core/src/main/config/utils/resourceloader_CONFIG       
2010-01-23 10:56:03 UTC (rev 40708)
@@ -0,0 +1,7 @@
+100:org.mmbase.util.NodeURLStreamHandlerFactory
+200:org.mmbase.util.ResourceLoader$ApplicationContextFileURLStreamHandlerFactory
+300:org.mmbase.util.ResourceLoader$MMBaseConfigSettingFileURLStreamHandlerFactory
+400:org.mmbase.util.ResourceLoader$ConfigServletResourceURLStreamHandlerFactory
+500:org.mmbase.util.ResourceLoader$ClassesFileURLStreamHandlerFactory
+600:org.mmbase.util.ResourceLoader$ConfigClassLoaderURLStreamHandlerFactory
+700:org.mmbase.util.ResourceLoader$FullyClassifiedClassLoaderURLStreamHandlerFactory

Modified: mmbase/trunk/core/src/main/java/org/mmbase/util/ResourceLoader.java
===================================================================
--- mmbase/trunk/core/src/main/java/org/mmbase/util/ResourceLoader.java 
2010-01-22 16:47:55 UTC (rev 40707)
+++ mmbase/trunk/core/src/main/java/org/mmbase/util/ResourceLoader.java 
2010-01-23 10:56:03 UTC (rev 40708)
@@ -291,14 +291,52 @@
             configRootNeedsInit = false;
             configRoot.roots.clear();
 
-            configRoot.roots.addAll(Arrays.asList(new 
NodeURLStreamHandlerFactory().createURLStreamHandler(configRoot, Type.CONFIG)));
-            configRoot.roots.addAll(Arrays.asList(new 
ApplicationContextFileURLStreamHandlerFactory().createURLStreamHandler(configRoot,
 Type.CONFIG)));
-            configRoot.roots.addAll(Arrays.asList(new 
MMBaseConfigSettingFileURLStreamHandlerFactory().createURLStreamHandler(configRoot,
 Type.CONFIG)));
-            configRoot.roots.addAll(Arrays.asList(new 
ConfigServletResourceURLStreamHandlerFactory().createURLStreamHandler(configRoot,
 Type.CONFIG)));
-            configRoot.roots.addAll(Arrays.asList(new 
ClassesFileURLStreamHandlerFactory().createURLStreamHandler(configRoot, 
Type.CONFIG)));
-            configRoot.roots.addAll(Arrays.asList(new 
ConfigClassLoaderURLStreamHandlerFactory().createURLStreamHandler(configRoot, 
Type.CONFIG)));
-            configRoot.roots.addAll(Arrays.asList(new 
FullyClassifiedClassLoaderURLStreamHandlerFactory().createURLStreamHandler(configRoot,
 Type.CONFIG)));
+            try {
+                final String name = "org/mmbase/config/utils/resourceloader_" 
+ Type.CONFIG;
+                final List<URL> urls = 
Collections.list(ResourceLoader.class.getClassLoader().getResources(name));
+                log.service("Configuration root not yet defined. Using '" + 
name + "' (" + urls + ") to do that.");
 
+                for (URL url : urls) {
+                    InputStream inputStream = url.openStream();
+                    if (inputStream != null) {
+                        BufferedReader reader = new BufferedReader(new 
InputStreamReader(inputStream, "UTF-8"));
+                        int weight = 0;
+                        while (true) {
+                            String line = reader.readLine();
+                            if (line == null) break;
+                            if (line.startsWith("#")) continue; // support for 
comments
+                            line = line.trim();
+                            String[] parts = line.split(":");
+                            String className;
+                            if (parts.length == 2) {
+                                className = parts[1];
+                                weight = Integer.parseInt(parts[0]);
+                            } else {
+                                className = parts[0];
+                            }
+                            try {
+                                Class<URLStreamHandlerFactory> clazz = 
(Class<URLStreamHandlerFactory>) Class.forName(className);
+                                URLStreamHandlerFactory fact = 
clazz.newInstance();
+                                PathURLStreamHandler[] handlers = 
fact.createURLStreamHandler(configRoot, Type.CONFIG);
+                                for (PathURLStreamHandler handler : handlers) {
+                                    handler.setWeight(weight);
+                                    configRoot.roots.add(handler);
+                                    weight++;
+                                }
+
+                            } catch (Exception e) {
+                                log.error(url + ":" + line + ":" + 
e.getClass().getName() + ":" + e.getMessage());
+                            }
+                        }
+                        reader.close();
+
+                    }
+                }
+            } catch (IOException ioe) {
+                log.error(ioe.getMessage(), ioe);
+            }
+            Collections.sort(configRoot.roots);
+            //System.out.println("CONFIG: " + configRoot.roots);
         }
         return configRoot;
     }
@@ -1017,7 +1055,7 @@
 
         protected final ResourceLoader parent;
 
-        protected final int weight = 0;
+        protected int weight = 0;
 
         PathURLStreamHandler(ResourceLoader p) {
             this.parent = p;
@@ -1065,8 +1103,15 @@
 
         abstract Set<String> getPaths(Set<String> results, Pattern pattern,  
boolean recursive,  boolean directories);
 
+        /**
+         * @MMBase-2.0
+         */
+        public void setWeight(int w) {
+            weight = w;
+        }
+
         public int compareTo(PathURLStreamHandler o) {
-            return o.weight - weight;
+            return weight - o.weight;
         }
         /**
          * @since MBase-2.0
@@ -1074,6 +1119,10 @@
         public Integer getResourceNode(String name) {
             return null;
         }
+        @Override
+        public String toString() {
+            return "" + weight + ":" + super.toString();
+        }
     }
 
 

_______________________________________________
Cvs mailing list
[email protected]
http://lists.mmbase.org/mailman/listinfo/cvs

Reply via email to