[jboss-svn-commits] JBL Code SVN: r14443 - in labs/jbossrules/trunk/drools-jbrms/src: main/java/org/drools/brms/server/selector and 4 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed Aug 22 07:03:04 EDT 2007


Author: michael.neale at jboss.com
Date: 2007-08-22 07:03:04 -0400 (Wed, 22 Aug 2007)
New Revision: 14443

Added:
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/selector/
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/selector/Allow.java
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/selector/AssetSelector.java
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/selector/RuleBasedSelector.java
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/selector/SelectorManager.java
   labs/jbossrules/trunk/drools-jbrms/src/main/resources/selectors.properties
   labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/selector/
   labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/selector/DummyClass.java
   labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/selector/SelectorManagerTest.java
   labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/selector/TestSelector.java
   labs/jbossrules/trunk/drools-jbrms/src/test/resources/TestSelector.drl
   labs/jbossrules/trunk/drools-jbrms/src/test/resources/emptyselectors.properties
   labs/jbossrules/trunk/drools-jbrms/src/test/resources/selectors.properties
Modified:
   labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/ServiceImplementationTest.java
Log:
JBRULES-1020 Custom selectors for package building

Added: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/selector/Allow.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/selector/Allow.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/selector/Allow.java	2007-08-22 11:03:04 UTC (rev 14443)
@@ -0,0 +1,12 @@
+package org.drools.brms.server.selector;
+
+/**
+ * This is a simple named fact for the selectors.
+ * @author michaelneale
+ *
+ */
+public class Allow {
+
+    public Allow() {}
+
+}


Property changes on: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/selector/Allow.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/selector/AssetSelector.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/selector/AssetSelector.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/selector/AssetSelector.java	2007-08-22 11:03:04 UTC (rev 14443)
@@ -0,0 +1,25 @@
+package org.drools.brms.server.selector;
+
+import org.drools.repository.AssetItem;
+
+
+/**
+ *
+ * Asset selectors can be used to choose if an asset is part of a build.
+ *
+ * Asset selectors should be stateless, they will be called multiple times.
+ *
+ * @author Michael Neale
+ *
+ */
+public interface AssetSelector {
+
+
+	/**
+	 *
+	 * @param asset The asset to be tested.
+	 * @return true if asset it allowed.
+	 */
+	boolean isAssetAllowed(AssetItem asset);
+
+}


Property changes on: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/selector/AssetSelector.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/selector/RuleBasedSelector.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/selector/RuleBasedSelector.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/selector/RuleBasedSelector.java	2007-08-22 11:03:04 UTC (rev 14443)
@@ -0,0 +1,67 @@
+package org.drools.brms.server.selector;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+
+import org.apache.log4j.Logger;
+import org.drools.CheckedDroolsException;
+import org.drools.RuleBase;
+import org.drools.RuntimeDroolsException;
+import org.drools.StatelessSession;
+import org.drools.StatelessSessionResult;
+import org.drools.compiler.RuleBaseLoader;
+import org.drools.repository.AssetItem;
+
+/**
+ * This uses rules to decide if an asset is to be included in a build.
+ *
+ * @author Michael Neale
+ *
+ */
+public class RuleBasedSelector implements AssetSelector {
+
+    private static final Logger log = Logger.getLogger( RuleBasedSelector.class );
+
+
+	String ruleFile;
+    private RuleBase ruleBase;
+
+    public RuleBasedSelector(String val) {
+        this.ruleFile = val;
+
+        InputStream ins = this.getClass().getResourceAsStream( ruleFile );
+        InputStreamReader reader = new InputStreamReader(ins);
+
+
+        try {
+            this.ruleBase = RuleBaseLoader.getInstance().loadFromReader( reader );
+        } catch ( CheckedDroolsException e ) {
+            log.error( e );
+            throw new RuntimeDroolsException(e);
+        } catch ( IOException e ) {
+            log.error( e );
+            throw new RuntimeDroolsException(e);
+        }
+
+    }
+
+    public boolean isAssetAllowed(AssetItem asset) {
+        return evalRules( asset );
+	}
+
+    boolean evalRules(Object asset) {
+        StatelessSession session = ruleBase.newStatelessSession();
+        StatelessSessionResult result = session.executeWithResults( asset );
+
+        java.util.Iterator objects = result.iterateObjects();
+		while(objects.hasNext()) {
+		    if (objects.next() instanceof Allow) {
+		        return true;
+            }
+        }
+		return false;
+    }
+
+}


Property changes on: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/selector/RuleBasedSelector.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/selector/SelectorManager.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/selector/SelectorManager.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/selector/SelectorManager.java	2007-08-22 11:03:04 UTC (rev 14443)
@@ -0,0 +1,103 @@
+package org.drools.brms.server.selector;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Properties;
+
+import org.apache.log4j.Logger;
+import org.drools.repository.AssetItem;
+
+
+public class SelectorManager {
+
+	private static final Logger log = Logger.getLogger( SelectorManager.class );
+	public static String SELECTOR_CONFIG_PROPERTIES = "/selectors.properties";
+	private static final SelectorManager INSTANCE = new SelectorManager(SELECTOR_CONFIG_PROPERTIES);
+
+	public Map<String, AssetSelector> selectors = new HashMap<String, AssetSelector>();
+
+
+
+	SelectorManager(String configPath) {
+		log.debug("Loading selectors");
+		Properties props = new Properties();
+		try {
+			props.load(this.getClass().getResourceAsStream(configPath));
+			for (Iterator iter = props.keySet().iterator(); iter.hasNext();) {
+				String selectorName = (String) iter.next();
+				String val = props.getProperty(selectorName);
+				if (val.endsWith("drl")) {
+					selectors.put(selectorName ,loadRuleSelector( val) );
+				} else {
+					selectors.put(selectorName, loadSelectorImplementation( val ));
+				}
+			}
+		} catch (IOException e) {
+			log.error("Unable to load selectors.", e);
+		}
+	}
+
+    /**
+     * Return a selector. If the name is null or empty it will return a nil/default selector
+     * (one that lets everything through). If the selector iis not found, it will return null;
+     */
+    public AssetSelector getSelector(String name) {
+        if (name == null || "".equals(name.trim())) {
+            return nilSelector();
+        } else {
+            if (this.selectors.containsKey( name )) {
+
+                return this.selectors.get( name );
+            } else {
+                log.debug( "No selector found by the name of " + name );
+                return null;
+            }
+        }
+    }
+
+
+
+	private AssetSelector nilSelector() {
+        return new AssetSelector() {
+            public boolean isAssetAllowed(AssetItem asset) {
+                return true;
+            }
+        };
+    }
+
+    private AssetSelector loadSelectorImplementation(String val) throws IOException {
+
+		try {
+            return (AssetSelector) Thread.currentThread().getContextClassLoader().loadClass( val ).newInstance();
+
+        } catch ( InstantiationException e ) {
+            log.error( e );
+            return null;
+        } catch ( IllegalAccessException e ) {
+            log.error( e );
+            return null;
+        } catch ( ClassNotFoundException e ) {
+            log.error( e );
+            return null;
+        }
+
+	}
+
+
+
+
+	private AssetSelector loadRuleSelector(String val) {
+
+		return new RuleBasedSelector(val);
+	}
+
+
+
+
+	public static SelectorManager getInstance() {
+		return INSTANCE;
+	}
+
+}


Property changes on: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/selector/SelectorManager.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-jbrms/src/main/resources/selectors.properties
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/resources/selectors.properties	                        (rev 0)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/resources/selectors.properties	2007-08-22 11:03:04 UTC (rev 14443)
@@ -0,0 +1,44 @@
+#############################################################################################
+#	SELECTOR CONFIGURATION FILE
+#
+# Selectors are used when building packages to filter assets based on arbitary criteria.
+# Selectors can either be a class that implements the AssetSelector interface, or a path to a drl file with
+# rules as to what is to be included (the rule file must be on the class path as indicated by that path).
+#
+#############################################################################################
+
+#<name>=</Path to drl> OR <className of a class that implements AssetSelector>
+
+#############################################################################################
+#example:
+#testServer=com.yourcompany.YourSelector
+#prodServer=/SomeRules.drl
+#############################################################################################
+
+#############################################################################################
+#it knows its a rule file if it ends in .drl
+#the names are what you use in the GUI when building a package.
+#############################################################################################
+
+#############################################################################################
+#The contents of SomeRules.drl should follow the pattern of:
+
+#package org.drools.brms.server.selector
+#
+#dialect "mvel"
+#
+#import org.drools.repository.AssetItem
+#import org.drools.brms.server.selector.Allow
+#
+#rule "rule1"
+#	when
+#		AssetItem()
+#	then
+#		insert(new Allow())
+#end
+
+#NOTE: to allow an asset, use "insert (new Allow())"
+#      the fields that are available are the properties of AssetItem -
+#	    eg, statusDescription, lastModified, creator etc etc...
+
+#############################################################################################
\ No newline at end of file


Property changes on: labs/jbossrules/trunk/drools-jbrms/src/main/resources/selectors.properties
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/ServiceImplementationTest.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/ServiceImplementationTest.java	2007-08-22 09:03:28 UTC (rev 14442)
+++ labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/ServiceImplementationTest.java	2007-08-22 11:03:04 UTC (rev 14443)
@@ -2,13 +2,13 @@
 
 /*
  * Copyright 2005 JBoss Inc
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -18,6 +18,7 @@
 
 import java.io.ByteArrayInputStream;
 import java.io.ObjectInputStream;
+import java.io.StringReader;
 import java.util.Calendar;
 import java.util.Date;
 
@@ -48,6 +49,7 @@
 import org.drools.brms.server.util.TableDisplayHandler;
 import org.drools.brms.server.util.TestEnvironmentSessionHelper;
 import org.drools.common.DroolsObjectInputStream;
+import org.drools.compiler.RuleBaseLoader;
 import org.drools.repository.AssetItem;
 import org.drools.repository.CategoryItem;
 import org.drools.repository.PackageItem;
@@ -113,6 +115,12 @@
         assertFalse( "".equals( uuid ) );
 
         AssetItem localItem = impl.repository.loadAssetByUUID( uuid );
+
+//        String drl = "package org.drools.repository\n\ndialect 'mvel'\n\n" +
+//        		"rule Rule1 \n when \n AssetItem(description != null) \n then \n System.out.println(\"yeah\");\nend";
+//        RuleBase rb = RuleBaseLoader.getInstance().loadFromReader(new StringReader(drl));
+//        rb.newStatelessSession().execute(localItem);
+
         assertEquals( "test Delete Unversioned",
                       localItem.getName() );
 
@@ -162,9 +170,9 @@
         assertFalse( packages[0].uuid == null );
         assertFalse( packages[0].uuid.equals( "" ) );
 
-        //just for performance testing with scaling up numbers of rules      
+        //just for performance testing with scaling up numbers of rules
         //      for (int i=1; i <= 1000; i++) {
-        //          impl.createNewRule( "somerule_" + i, "description", 
+        //          impl.createNewRule( "somerule_" + i, "description",
         //                              "testAddRule", "another", "drl" );
         //      }
 
@@ -342,7 +350,7 @@
         asset = impl.loadRuleAsset( uuid );
         impl.checkinVersion( asset ); //2
         asset = impl.loadRuleAsset( uuid );
-        impl.checkinVersion( asset ); //HEAD   
+        impl.checkinVersion( asset ); //HEAD
 
         TableDataResult result = impl.loadAssetHistory( uuid );
         assertNotNull( result );
@@ -447,7 +455,7 @@
         assertEquals( "testCheckinCategory/deeper",
                       asset2.metaData.categories[2] );
 
-        //now lets try a concurrent edit of an asset. 
+        //now lets try a concurrent edit of an asset.
         //asset3 will be loaded and edited, and then asset2 will try to clobber, it, which should fail.
         //as it is optimistically locked.
         RuleAsset asset3 = serv.loadRuleAsset( asset2.uuid );
@@ -974,7 +982,7 @@
                       res.data.length );
 
         impl.removeAsset( uuid4 );
-        
+
         res = impl.listAssets( pkgUUID,
                                arr( "testRemoveAsset" ),
                                -1,
@@ -982,12 +990,12 @@
         assertEquals( 3,
                       res.data.length );
     }
-    
-    
+
+
     public void testArchiveAsset() throws Exception {
         RepositoryService impl = getService();
         String cat = "testArchiveAsset";
-        impl.createCategory( "/", 
+        impl.createCategory( "/",
                              cat,
                              "ya" );
         String pkgUUID = impl.createPackage( "testArchiveAsset",
@@ -1024,27 +1032,27 @@
                       res.data.length );
 
         impl.archiveAsset( uuid4, true );
-        
+
         res = impl.listAssets( pkgUUID,
                                arr( "testArchiveAsset" ),
                                -1,
                                0 );
         assertEquals( 3,
                       res.data.length );
-        
+
         impl.archiveAsset( uuid4, false );
-        
+
         res = impl.listAssets( pkgUUID,
                                arr( "testArchiveAsset" ),
                                -1,
                                0 );
         assertEquals( 4,
                       res.data.length );
-        
+
     }
 
-    
 
+
     public void testLoadSuggestionCompletionEngine() throws Exception {
         RepositoryService impl = getService();
         String uuid = impl.createPackage( "testSuggestionComp",
@@ -1058,8 +1066,8 @@
     }
 
     /**
-     * This will test creating a package, check it compiles, and can exectute rules, 
-     * then take a snapshot, and check that it reports errors. 
+     * This will test creating a package, check it compiles, and can exectute rules,
+     * then take a snapshot, and check that it reports errors.
      */
     public void testBinaryPackageCompileAndExecute() throws Exception {
         ServiceImplementation impl = getService();
@@ -1130,8 +1138,8 @@
     }
 
     /**
-     * This will test creating a package with a BRL rule, check it compiles, and can exectute rules, 
-     * then take a snapshot, and check that it reports errors. 
+     * This will test creating a package with a BRL rule, check it compiles, and can exectute rules,
+     * then take a snapshot, and check that it reports errors.
      */
     public void testBinaryPackageCompileAndExecuteWithBRXML() throws Exception {
         ServiceImplementation impl = getService();
@@ -1249,7 +1257,7 @@
     }
 
     /**
-     * this loads up a precompile binary package. If this fails, 
+     * this loads up a precompile binary package. If this fails,
      * then it means it needs to be updated. It gets the package form the BRL example above.
      */
     public void testLoadAndExecBinary() throws Exception {

Added: labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/selector/DummyClass.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/selector/DummyClass.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/selector/DummyClass.java	2007-08-22 11:03:04 UTC (rev 14443)
@@ -0,0 +1,5 @@
+package org.drools.brms.server.selector;
+
+public class DummyClass {
+
+}


Property changes on: labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/selector/DummyClass.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/selector/SelectorManagerTest.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/selector/SelectorManagerTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/selector/SelectorManagerTest.java	2007-08-22 11:03:04 UTC (rev 14443)
@@ -0,0 +1,50 @@
+package org.drools.brms.server.selector;
+
+import junit.framework.TestCase;
+
+public class SelectorManagerTest extends TestCase {
+
+    public void testSelectorMangerConfig() {
+        SelectorManager sm = SelectorManager.getInstance();
+        assertNotNull(sm);
+        assertNotNull(sm.selectors);
+
+        assertNull(sm.getSelector( "goo" ));
+        assertNotNull(sm.getSelector( "selector1" ));
+        assertTrue(sm.getSelector( "selector1" ) instanceof TestSelector);
+        assertNotNull(sm.getSelector( "selector2" ));
+        assertTrue(sm.getSelector( "selector2" ) instanceof RuleBasedSelector);
+
+        RuleBasedSelector sel = (RuleBasedSelector) sm.getSelector( "selector2" );
+        assertEquals("/TestSelector.drl", sel.ruleFile);
+
+        assertFalse(sel.evalRules( new DummyClass() ));
+        assertTrue(sel.evalRules( new Allow() ));
+        assertFalse(sel.evalRules( new DummyClass() ));
+        assertTrue(sel.evalRules( new Allow() ));
+
+
+        assertNull(sm.getSelector( "selector3" ));
+
+        assertNotNull(sm.getSelector( "" ));
+        assertNotNull(sm.getSelector( null ));
+        AssetSelector nil = sm.getSelector( null );
+        assertTrue(nil.isAssetAllowed( null ));
+
+
+        sm = new SelectorManager("/emptyselectors.properties");
+
+        assertNull(sm.getSelector( "XX" ));
+        assertNotNull(sm.getSelector( null ));
+
+        nil = sm.getSelector( " " );
+        assertTrue(nil.isAssetAllowed( null ));
+
+
+        assertSame( SelectorManager.getInstance(), SelectorManager.getInstance());
+
+
+
+    }
+
+}


Property changes on: labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/selector/SelectorManagerTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/selector/TestSelector.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/selector/TestSelector.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/selector/TestSelector.java	2007-08-22 11:03:04 UTC (rev 14443)
@@ -0,0 +1,14 @@
+package org.drools.brms.server.selector;
+
+import org.drools.repository.AssetItem;
+
+public class TestSelector
+    implements
+    AssetSelector {
+
+    public boolean isAssetAllowed(AssetItem asset) {
+
+        return true;
+    }
+
+}


Property changes on: labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/selector/TestSelector.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-jbrms/src/test/resources/TestSelector.drl
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/test/resources/TestSelector.drl	                        (rev 0)
+++ labs/jbossrules/trunk/drools-jbrms/src/test/resources/TestSelector.drl	2007-08-22 11:03:04 UTC (rev 14443)
@@ -0,0 +1,14 @@
+package org.drools.brms.server.selector
+
+dialect "mvel"
+
+import org.drools.repository.AssetItem
+import org.drools.brms.server.selector.Allow
+
+rule "rule1"
+	when
+		AssetItem()
+	then
+		insert(new Allow())
+end
+


Property changes on: labs/jbossrules/trunk/drools-jbrms/src/test/resources/TestSelector.drl
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-jbrms/src/test/resources/emptyselectors.properties
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/test/resources/emptyselectors.properties	                        (rev 0)
+++ labs/jbossrules/trunk/drools-jbrms/src/test/resources/emptyselectors.properties	2007-08-22 11:03:04 UTC (rev 14443)
@@ -0,0 +1 @@
+#this is deliberately empty to test the default state of the system
\ No newline at end of file


Property changes on: labs/jbossrules/trunk/drools-jbrms/src/test/resources/emptyselectors.properties
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-jbrms/src/test/resources/selectors.properties
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/test/resources/selectors.properties	                        (rev 0)
+++ labs/jbossrules/trunk/drools-jbrms/src/test/resources/selectors.properties	2007-08-22 11:03:04 UTC (rev 14443)
@@ -0,0 +1,3 @@
+selector1=org.drools.brms.server.selector.TestSelector
+selector2=/TestSelector.drl
+selector3=XXX
\ No newline at end of file


Property changes on: labs/jbossrules/trunk/drools-jbrms/src/test/resources/selectors.properties
___________________________________________________________________
Name: svn:eol-style
   + native




More information about the jboss-svn-commits mailing list