You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by bd...@apache.org on 2009/09/07 16:48:47 UTC

svn commit: r812166 - in /sling/trunk/installer/jcr/jcrinstall/src: main/java/org/apache/sling/jcr/jcrinstall/impl/ main/resources/OSGI-INF/metatype/ test/java/org/apache/sling/jcr/jcrinstall/impl/

Author: bdelacretaz
Date: Mon Sep  7 14:48:47 2009
New Revision: 812166

URL: http://svn.apache.org/viewvc?rev=812166&view=rev
Log:
SLING-1078 - more robust definition of root folders priorities

Modified:
    sling/trunk/installer/jcr/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/impl/FolderNameFilter.java
    sling/trunk/installer/jcr/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/impl/JcrInstaller.java
    sling/trunk/installer/jcr/jcrinstall/src/main/resources/OSGI-INF/metatype/metatype.properties
    sling/trunk/installer/jcr/jcrinstall/src/test/java/org/apache/sling/jcr/jcrinstall/impl/FolderNameFilterTest.java

Modified: sling/trunk/installer/jcr/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/impl/FolderNameFilter.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/jcr/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/impl/FolderNameFilter.java?rev=812166&r1=812165&r2=812166&view=diff
==============================================================================
--- sling/trunk/installer/jcr/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/impl/FolderNameFilter.java (original)
+++ sling/trunk/installer/jcr/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/impl/FolderNameFilter.java Mon Sep  7 14:48:47 2009
@@ -39,27 +39,57 @@
     private final Pattern pattern;
     private final String regexp;
     private final RunMode runMode;
+    private final String [] rootPaths;
     private Map<String, Integer> rootPriorities = new HashMap<String, Integer>();
     private final Logger log = LoggerFactory.getLogger(getClass());
     
-    /** getPriority computes priorities as follows: each root gets (N+1) * ROOT_PRIORITY_FACTOR,
-     * 	where N is the index in the roots array, and paths that match one or several
-     * 	run level get an additional RUNMODE_PRIORITY_OFFSET per matched run level
+    /** getPriority computes priorities as follows: each root gets its own base priority,
+     * 	and paths that match one or several run levels get an additional RUNMODE_PRIORITY_OFFSET 
+     *  per matched run level
      */
-    public static final int ROOT_PRIORITY_FACTOR = 100;
     public static final int RUNMODE_PRIORITY_BOOST = 1;
+    public static final int DEFAULT_ROOT_PRIORITY = 99;
     
-    FolderNameFilter(String [] roots, String regexp, RunMode runMode) {
+    FolderNameFilter(String [] rootsConfig, String regexp, RunMode runMode) {
         this.regexp = regexp;
         this.pattern = Pattern.compile(regexp);
         this.runMode = runMode;
         
-        // Assign priorities to our root folders
-        for(int i = 0; i < roots.length; i++) {
-        	rootPriorities.put(roots[i], new Integer((i + 1) * ROOT_PRIORITY_FACTOR));
+        // Each entry in rootsConfig is like /libs:100, where 100
+        // is the priority.
+        // Break that up into paths and priorities
+        rootPaths = new String[rootsConfig.length];
+        for(int i = 0; i < rootsConfig.length; i++) {
+        	final String [] parts = rootsConfig[i].split(":");
+        	rootPaths[i] = cleanupRootPath(parts[0]);
+        	Integer priority = new Integer(DEFAULT_ROOT_PRIORITY);
+        	if(parts.length > 1) {
+        		try {
+        			priority = Integer.parseInt(parts[1].trim());
+        		} catch(NumberFormatException nfe) {
+        			log.warn("Invalid priority in path definition '{}'", rootsConfig[i]);
+        		}
+        	}
+        	rootPriorities.put(rootPaths[i], priority);
+        	log.debug("Root path {} has priority {}", rootPaths[i], priority);
         }
     }
     
+    String [] getRootPaths() {
+    	return rootPaths;
+    }
+    
+    static String cleanupRootPath(final String str) {
+    	String result = str.trim();
+    	if(!result.startsWith("/")) {
+    		result = "/" + result;
+    	}
+    	if(result.endsWith("/")) {
+    		result = result.substring(0, result.length() - 1);
+    	}
+    	return result;
+    }
+    
     /** If a folder at given path can contain installable resources
      * 	(according to our regexp and current RunMode), return the
      * 	priority to use for InstallableResource found in that folder.
@@ -110,6 +140,10 @@
         return result;
     }
     
+    public String toString() {
+        return getClass().getSimpleName() + " (" + regexp + "), RunMode=" + runMode;
+    }
+    
     int getRootPriority(String path) {
     	for(Map.Entry<String, Integer> e : rootPriorities.entrySet()) {
     		if(path.startsWith(e.getKey())) {
@@ -118,8 +152,4 @@
     	}
     	return 0;
     }
-
-    public String toString() {
-        return getClass().getSimpleName() + " (" + regexp + "), RunMode=" + runMode;
-    }
 }
\ No newline at end of file

Modified: sling/trunk/installer/jcr/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/impl/JcrInstaller.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/jcr/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/impl/JcrInstaller.java?rev=812166&r1=812165&r2=812166&view=diff
==============================================================================
--- sling/trunk/installer/jcr/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/impl/JcrInstaller.java (original)
+++ sling/trunk/installer/jcr/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/impl/JcrInstaller.java Mon Sep  7 14:48:47 2009
@@ -102,14 +102,14 @@
      */
     public static final String PROP_INSTALL_FOLDER_MAX_DEPTH = "sling.jcrinstall.folder.max.depth";
     
-    /**	Configurable search path. We could get it from the ResourceResolver, but
-     * 	introducing a dependency on this just to get those values is too much
-     * 	for this module that's meant to bootstrap other services.
+    /**	Configurable search path, with per-path priorities. 
+     *  We could get it from the ResourceResolver, but introducing a dependency on this just to get those 
+     *  values is too much for this module that's meant to bootstrap other services.
      * 
-     * 	@scr.property values.1="/apps" values.2="/libs"
+     * 	@scr.property values.1="/libs:100" values.2="/apps:200"
      */
     public static final String PROP_SEARCH_PATH = "sling.jcrinstall.search.path";
-    public static final String [] DEFAULT_SEARCH_PATH = { "/apps/", "/libs/" };
+    public static final String [] DEFAULT_SEARCH_PATH = { "/libs:100", "/apps:200" };
 
     public static final int DEFAULT_FOLDER_MAX_DEPTH = 4;
     private int maxWatchedFolderDepth;
@@ -157,32 +157,6 @@
     	converters.add(new FileNodeConverter());
     	converters.add(new ConfigNodeConverter());
     	
-    	// Get search paths, and make sure each part starts and ends with a /
-        roots = OsgiUtil.toStringArray(context.getProperties().get(PROP_SEARCH_PATH));
-        if (roots == null) {
-        	roots = DEFAULT_SEARCH_PATH;
-        }
-        for (int i = 0; i < roots.length; i++) {
-            if (!roots[i].startsWith("/")) {
-            	roots[i] = "/" + roots[i];
-            }
-            if (!roots[i].endsWith("/")) {
-            	roots[i] += "/";
-            }
-        }
-        for(int i = 0; i < roots.length; i++) {
-    		log.info("Configured root folder: {}", roots[i]);
-    	}
-        
-        // Watch for DELETE events on the root - that might be one of our root folders
-        int eventTypes = Event.NODE_ADDED | Event.NODE_REMOVED;
-        boolean isDeep = false;
-        boolean noLocal = true;
-        session.getWorkspace().getObservationManager().addEventListener(this, eventTypes, "/",
-                isDeep, null, null, noLocal);
-        log.info("Watching for NODE_REMOVED events on / to detect removal of our root folders");
-
-    	
     	// Configurable max depth, system property (via bundle context) overrides default value
     	Object obj = getPropertyValue(context, PROP_INSTALL_FOLDER_MAX_DEPTH);
     	if(obj != null) {
@@ -204,11 +178,40 @@
     	}
     	
     	// Setup folder filtering and watching
-        folderNameFilter = new FolderNameFilter(roots, folderNameRegexp, runMode);
+    	String [] rootsConfig = OsgiUtil.toStringArray(context.getProperties().get(PROP_SEARCH_PATH));
+    	if(rootsConfig == null) {
+    		rootsConfig = DEFAULT_SEARCH_PATH;
+    	}
+        folderNameFilter = new FolderNameFilter(rootsConfig, folderNameRegexp, runMode);
+        roots = folderNameFilter.getRootPaths();
         for (String path : roots) {
             listeners.add(new RootFolderListener(session, folderNameFilter, path, updateFoldersListTimer));
         }
         
+    	// Get search paths, and make sure each part starts and ends with a /
+        if (roots == null) {
+        }
+        for (int i = 0; i < roots.length; i++) {
+            if (!roots[i].startsWith("/")) {
+            	roots[i] = "/" + roots[i];
+            }
+            if (!roots[i].endsWith("/")) {
+            	roots[i] += "/";
+            }
+        }
+        for(int i = 0; i < roots.length; i++) {
+    		log.info("Configured root folder: {}", roots[i]);
+    	}
+        
+        // Watch for DELETE events on the root - that might be one of our root folders
+        int eventTypes = Event.NODE_ADDED | Event.NODE_REMOVED;
+        boolean isDeep = false;
+        boolean noLocal = true;
+        session.getWorkspace().getObservationManager().addEventListener(this, eventTypes, "/",
+                isDeep, null, null, noLocal);
+        log.info("Watching for NODE_REMOVED events on / to detect removal of our root folders");
+
+    	
     	// Find paths to watch and create WatchedFolders to manage them
     	watchedFolders = new LinkedList<WatchedFolder>();
     	for(String root : roots) {
@@ -471,4 +474,5 @@
     long [] getCounters() {
         return counters;
     }
+    
 }
\ No newline at end of file

Modified: sling/trunk/installer/jcr/jcrinstall/src/main/resources/OSGI-INF/metatype/metatype.properties
URL: http://svn.apache.org/viewvc/sling/trunk/installer/jcr/jcrinstall/src/main/resources/OSGI-INF/metatype/metatype.properties?rev=812166&r1=812165&r2=812166&view=diff
==============================================================================
--- sling/trunk/installer/jcr/jcrinstall/src/main/resources/OSGI-INF/metatype/metatype.properties (original)
+++ sling/trunk/installer/jcr/jcrinstall/src/main/resources/OSGI-INF/metatype/metatype.properties Mon Sep  7 14:48:47 2009
@@ -41,4 +41,6 @@
 sling.jcrinstall.search.path.name = Search Path
 sling.jcrinstall.search.path.description = List of paths under which jcrinstall looks \
   for installable resources. Combined with the installations folders name regexp \
-  to select folders for scanning. 
\ No newline at end of file
+  to select folders for scanning. Each path is followed by a colon and the priority \
+  of resources found under that path, resources with higher values override resources \
+  with lower values which represent the same OSGi entity (configuration, bundle, etc). 
\ No newline at end of file

Modified: sling/trunk/installer/jcr/jcrinstall/src/test/java/org/apache/sling/jcr/jcrinstall/impl/FolderNameFilterTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/jcr/jcrinstall/src/test/java/org/apache/sling/jcr/jcrinstall/impl/FolderNameFilterTest.java?rev=812166&r1=812165&r2=812166&view=diff
==============================================================================
--- sling/trunk/installer/jcr/jcrinstall/src/test/java/org/apache/sling/jcr/jcrinstall/impl/FolderNameFilterTest.java (original)
+++ sling/trunk/installer/jcr/jcrinstall/src/test/java/org/apache/sling/jcr/jcrinstall/impl/FolderNameFilterTest.java Mon Sep  7 14:48:47 2009
@@ -25,9 +25,38 @@
 
 public class FolderNameFilterTest {
     public static final String DEFAULT_REGEXP =  ".*/install$";
-    public static final String [] ROOTS = { "/libs", "/apps" };
+    public static final String [] ROOTS = JcrInstaller.DEFAULT_SEARCH_PATH;
 
     @Test
+    public void testParseRootPaths() {
+    	{
+    		final String [] paths = { "a", "b/" };
+            final FolderNameFilter f = new FolderNameFilter(paths, DEFAULT_REGEXP, new MockRunMode(new String[0]));
+            assertEquals("/a", f.getRootPaths()[0]);
+            assertEquals("/b", f.getRootPaths()[1]);
+            assertEquals(FolderNameFilter.DEFAULT_ROOT_PRIORITY, f.getRootPriority("/a/foo"));
+            assertEquals(FolderNameFilter.DEFAULT_ROOT_PRIORITY, f.getRootPriority("/b/foo"));
+            assertEquals(0, f.getRootPriority("/notInThoseRoots"));
+    	}
+    	{
+    		final String [] paths = { "a:100", "/b/: 200 " };
+            final FolderNameFilter f = new FolderNameFilter(paths, DEFAULT_REGEXP, new MockRunMode(new String[0]));
+            assertEquals("/a", f.getRootPaths()[0]);
+            assertEquals("/b", f.getRootPaths()[1]);
+            assertEquals(100, f.getRootPriority("/a/foo"));
+            assertEquals(200, f.getRootPriority("/b/foo"));
+    	}
+    	{
+    		final String [] paths = { "a/:NOT_AN_INTEGER", "/b/: 200 " };
+            final FolderNameFilter f = new FolderNameFilter(paths, DEFAULT_REGEXP, new MockRunMode(new String[0]));
+            assertEquals("/a", f.getRootPaths()[0]);
+            assertEquals("/b", f.getRootPaths()[1]);
+            assertEquals(FolderNameFilter.DEFAULT_ROOT_PRIORITY, f.getRootPriority("/a/foo"));
+            assertEquals(200, f.getRootPriority("/b/foo"));
+    	}
+    }
+    
+    @Test
     public void testNoRunMode() {
         final FolderNameFilter f = new FolderNameFilter(ROOTS, DEFAULT_REGEXP, new MockRunMode(new String[0]));
         assertTrue("Test 1", f.getPriority("/libs/install") > 0);