Revision: 1186
Author:   peterdb
Date:     2006-05-27 16:18:25 -0700 (Sat, 27 May 2006)
ViewCVS:  http://svn.sourceforge.net/spring-rich-c/?rev=1186&view=rev

Log Message:
-----------
added support for removing settings nodes

Modified Paths:
--------------
    
trunk/spring-richclient/sandbox/src/main/java/org/springframework/richclient/settings/AbstractSettings.java
    
trunk/spring-richclient/sandbox/src/main/java/org/springframework/richclient/settings/Settings.java
    
trunk/spring-richclient/sandbox/src/main/java/org/springframework/richclient/settings/TransientSettings.java
    
trunk/spring-richclient/sandbox/src/main/java/org/springframework/richclient/settings/j2seprefs/PreferencesSettings.java
    
trunk/spring-richclient/sandbox/src/main/java/org/springframework/richclient/settings/jdbc/JdbcSettings.java
    
trunk/spring-richclient/sandbox/src/main/java/org/springframework/richclient/settings/xml/XmlSettings.java
    
trunk/spring-richclient/sandbox/src/test/java/org/springframework/richclient/settings/SettingsAbstractTests.java
Modified: 
trunk/spring-richclient/sandbox/src/main/java/org/springframework/richclient/settings/AbstractSettings.java
===================================================================
--- 
trunk/spring-richclient/sandbox/src/main/java/org/springframework/richclient/settings/AbstractSettings.java
 2006-05-27 21:05:45 UTC (rev 1185)
+++ 
trunk/spring-richclient/sandbox/src/main/java/org/springframework/richclient/settings/AbstractSettings.java
 2006-05-27 23:18:25 UTC (rev 1186)
@@ -17,6 +17,7 @@
 
 import java.beans.PropertyChangeListener;
 import java.beans.PropertyChangeSupport;
+import java.util.AbstractSet;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
@@ -94,7 +95,7 @@
 
     private boolean childSettingsLoaded = false;
 
-    private List childSettingNames = new ArrayList();
+    private Set childSettingNames = new HashSet();
 
     public Settings getSettings(String name) {
         if (!children.containsKey(name)) {
@@ -610,4 +611,13 @@
     public boolean isRoot() {
         return getParent() == null;
     }
+    
+    public void removeSettings() {
+        internalRemoveSettings();
+        if(getParent() instanceof AbstractSettings) {
+            
((AbstractSettings)getParent()).childSettingNames.remove(getName());
+        }
+    }
+    
+    protected abstract void internalRemoveSettings();
 }
\ No newline at end of file

Modified: 
trunk/spring-richclient/sandbox/src/main/java/org/springframework/richclient/settings/Settings.java
===================================================================
--- 
trunk/spring-richclient/sandbox/src/main/java/org/springframework/richclient/settings/Settings.java
 2006-05-27 21:05:45 UTC (rev 1185)
+++ 
trunk/spring-richclient/sandbox/src/main/java/org/springframework/richclient/settings/Settings.java
 2006-05-27 23:18:25 UTC (rev 1186)
@@ -108,6 +108,11 @@
        void load() throws IOException;
 
        Settings getSettings(String name);
+    
+    /**
+     * Removes this <code>Settings</code> from the backing store.
+     */
+    void removeSettings();
 
        String getName();
 

Modified: 
trunk/spring-richclient/sandbox/src/main/java/org/springframework/richclient/settings/TransientSettings.java
===================================================================
--- 
trunk/spring-richclient/sandbox/src/main/java/org/springframework/richclient/settings/TransientSettings.java
        2006-05-27 21:05:45 UTC (rev 1185)
+++ 
trunk/spring-richclient/sandbox/src/main/java/org/springframework/richclient/settings/TransientSettings.java
        2006-05-27 23:18:25 UTC (rev 1186)
@@ -71,4 +71,8 @@
     protected String[] internalGetChildSettings() {
         return new String[0];
     }
+
+    public void internalRemoveSettings() {
+        
+    }
 }
\ No newline at end of file

Modified: 
trunk/spring-richclient/sandbox/src/main/java/org/springframework/richclient/settings/j2seprefs/PreferencesSettings.java
===================================================================
--- 
trunk/spring-richclient/sandbox/src/main/java/org/springframework/richclient/settings/j2seprefs/PreferencesSettings.java
    2006-05-27 21:05:45 UTC (rev 1185)
+++ 
trunk/spring-richclient/sandbox/src/main/java/org/springframework/richclient/settings/j2seprefs/PreferencesSettings.java
    2006-05-27 23:18:25 UTC (rev 1186)
@@ -149,4 +149,12 @@
             throw new RuntimeException(e);
         }
     }
+
+    protected void internalRemoveSettings() {
+        try {
+            prefs.removeNode();
+        } catch( BackingStoreException e ) {
+            throw new RuntimeException(e);
+        }
+    }
 }
\ No newline at end of file

Modified: 
trunk/spring-richclient/sandbox/src/main/java/org/springframework/richclient/settings/jdbc/JdbcSettings.java
===================================================================
--- 
trunk/spring-richclient/sandbox/src/main/java/org/springframework/richclient/settings/jdbc/JdbcSettings.java
        2006-05-27 21:05:45 UTC (rev 1185)
+++ 
trunk/spring-richclient/sandbox/src/main/java/org/springframework/richclient/settings/jdbc/JdbcSettings.java
        2006-05-27 23:18:25 UTC (rev 1186)
@@ -169,10 +169,30 @@
         childKeys = (String[]) keys.toArray( new String[keys.size()] );
     }
 
-    protected void internalRemoveChild( String key ) {
-    }
-
     public String getUser() {
         return user;
     }
+
+    public void internalRemoveSettings() {
+        if( id != null ) {
+            // first delete all children
+            for( int i = 0; i < childKeys.length; i++ ) {
+                getSettings(childKeys[i]).removeSettings();
+            }
+
+            // now delete all values
+            JdbcTemplate template = new JdbcTemplate( dataSource );
+            template.update( "DELETE FROM SETTINGS_VALUES WHERE 
SETTINGS_ID=?", new Object[] { id } );
+
+            // now delete our own record
+            template.update( "DELETE FROM SETTINGS WHERE ID=?", new Object[] { 
id } );
+
+            id = null;
+        }
+
+        values.clear();
+        remove.clear();
+        add.clear();
+        update.clear();
+    }
 }

Modified: 
trunk/spring-richclient/sandbox/src/main/java/org/springframework/richclient/settings/xml/XmlSettings.java
===================================================================
--- 
trunk/spring-richclient/sandbox/src/main/java/org/springframework/richclient/settings/xml/XmlSettings.java
  2006-05-27 21:05:45 UTC (rev 1185)
+++ 
trunk/spring-richclient/sandbox/src/main/java/org/springframework/richclient/settings/xml/XmlSettings.java
  2006-05-27 23:18:25 UTC (rev 1186)
@@ -194,4 +194,8 @@
 
         return (String[]) childSettingsNames.toArray(new 
String[childSettingsNames.size()]);
     }
+
+    public void internalRemoveSettings() {
+        element.getParentNode().removeChild(element);
+    }
 }

Modified: 
trunk/spring-richclient/sandbox/src/test/java/org/springframework/richclient/settings/SettingsAbstractTests.java
===================================================================
--- 
trunk/spring-richclient/sandbox/src/test/java/org/springframework/richclient/settings/SettingsAbstractTests.java
    2006-05-27 21:05:45 UTC (rev 1185)
+++ 
trunk/spring-richclient/sandbox/src/test/java/org/springframework/richclient/settings/SettingsAbstractTests.java
    2006-05-27 23:18:25 UTC (rev 1186)
@@ -15,6 +15,8 @@
  */
 package org.springframework.richclient.settings;
 
+import java.util.Arrays;
+
 import junit.framework.TestCase;
 
 import org.springframework.core.enums.LabeledEnum;
@@ -23,240 +25,251 @@
  * @author Peter De Bruycker
  */
 public abstract class SettingsAbstractTests extends TestCase {
-       private Settings settings;
+    private Settings settings;
 
-       private TestablePropertyChangeListener propertyChangeListener;
+    private TestablePropertyChangeListener propertyChangeListener;
 
-       protected final void setUp() throws Exception {
-               doSetUp();
-               
-               settings = createSettings();
-               propertyChangeListener = new TestablePropertyChangeListener();
-               settings.addPropertyChangeListener(propertyChangeListener);
+    protected final void setUp() throws Exception {
+        doSetUp();
 
-               assertNotNull("settings cannot be null", settings);
-       }
-       
-       protected void doSetUp() throws Exception{
-               
-       }
+        settings = createSettings();
+        propertyChangeListener = new TestablePropertyChangeListener();
+        settings.addPropertyChangeListener( propertyChangeListener );
 
-       public final void testGetSettings() {
-               Settings childSettings = settings.getSettings("child");
-               assertNotNull(childSettings);
-               assertEquals("child", childSettings.getName());
-               assertEquals(settings, childSettings.getParent());
-       }
-    
-       public final void testRemove() {
-               settings.setString("key", "value");
-               assertTrue(settings.contains("key"));
-               settings.remove("key");
-               assertFalse(settings.contains("key"));
-       }
+        assertNotNull( "settings cannot be null", settings );
+    }
 
-       public final void testBoolean() {
-               String key = "boolean-value";
-               Boolean defaultValue = Boolean.FALSE;
-               Boolean newValue = Boolean.TRUE;
+    protected void doSetUp() throws Exception {
 
-               // default value
-               assertEquals(defaultValue.booleanValue(), 
settings.getBoolean(key));
-               assertEquals(defaultValue.booleanValue(), 
settings.getDefaultBoolean(key));
-               assertTrue(settings.isDefault(key));
-               assertFalse(settings.contains(key));
+    }
 
-               // change the value
-               settings.setBoolean(key, newValue.booleanValue());
+    public final void testGetSettings() {
+        Settings childSettings = settings.getSettings( "child" );
+        assertTrue( Arrays.asList( settings.getChildSettings() ).contains( 
"child" ) );
 
-               assertEquals(newValue.booleanValue(), settings.getBoolean(key));
-               assertFalse(settings.isDefault(key));
-               assertTrue(settings.contains(key));
+        assertNotNull( childSettings );
+        assertEquals( "child", childSettings.getName() );
+        assertEquals( settings, childSettings.getParent() );
+    }
 
-               // check property change event
-               assertPropertyChangeEventFired(key, defaultValue, newValue);
-               propertyChangeListener.reset();
+    public final void testRemove() {
+        settings.setString( "key", "value" );
+        assertTrue( settings.contains( "key" ) );
+        settings.remove( "key" );
+        assertFalse( settings.contains( "key" ) );
+    }
 
-               // change the value to the same value, no property change event 
should
-               // be fired
-               settings.setBoolean(key, newValue.booleanValue());
-               assertEquals(0, propertyChangeListener.getCount());
-       }
+    public final void testRemoveSettings() {
+        Settings childSettings = settings.getSettings( "child" );
+        assertTrue( Arrays.asList( settings.getChildSettings() ).contains( 
"child" ) );
 
-       public final void testInt() {
-               String key = "int-value";
-               Integer defaultValue = new Integer(0);
-               Integer newValue = new Integer(5);
+        childSettings.removeSettings();
 
-               // default value
-               assertEquals(defaultValue.intValue(), settings.getInt(key));
-               assertEquals(defaultValue.intValue(), 
settings.getDefaultInt(key));
-               assertTrue(settings.isDefault(key));
-               assertFalse(settings.contains(key));
+        assertFalse( Arrays.asList( settings.getChildSettings() ).contains( 
"child" ) );
+    }
 
-               // change the value
-               settings.setInt(key, newValue.intValue());
+    public final void testBoolean() {
+        String key = "boolean-value";
+        Boolean defaultValue = Boolean.FALSE;
+        Boolean newValue = Boolean.TRUE;
 
-               assertEquals(newValue.intValue(), settings.getInt(key));
-               assertFalse(settings.isDefault(key));
-               assertTrue(settings.contains(key));
+        // default value
+        assertEquals( defaultValue.booleanValue(), settings.getBoolean( key ) 
);
+        assertEquals( defaultValue.booleanValue(), settings.getDefaultBoolean( 
key ) );
+        assertTrue( settings.isDefault( key ) );
+        assertFalse( settings.contains( key ) );
 
-               // check property change event
-               assertPropertyChangeEventFired(key, defaultValue, newValue);
-               propertyChangeListener.reset();
+        // change the value
+        settings.setBoolean( key, newValue.booleanValue() );
 
-               // change the value to the same value, no property change event 
should
-               // be fired
-               settings.setInt(key, newValue.intValue());
-               assertEquals(0, propertyChangeListener.getCount());
-       }
+        assertEquals( newValue.booleanValue(), settings.getBoolean( key ) );
+        assertFalse( settings.isDefault( key ) );
+        assertTrue( settings.contains( key ) );
 
-       public final void testLong() {
-               String key = "long-value";
-               Long defaultValue = new Long(0);
-               Long newValue = new Long(555L);
+        // check property change event
+        assertPropertyChangeEventFired( key, defaultValue, newValue );
+        propertyChangeListener.reset();
 
-               // default value
-               assertEquals(defaultValue.longValue(), settings.getLong(key));
-               assertEquals(defaultValue.longValue(), 
settings.getDefaultLong(key));
-               assertTrue(settings.isDefault(key));
-               assertFalse(settings.contains(key));
+        // change the value to the same value, no property change event should
+        // be fired
+        settings.setBoolean( key, newValue.booleanValue() );
+        assertEquals( 0, propertyChangeListener.getCount() );
+    }
 
-               // change the value
-               settings.setLong(key, newValue.longValue());
+    public final void testInt() {
+        String key = "int-value";
+        Integer defaultValue = new Integer( 0 );
+        Integer newValue = new Integer( 5 );
 
-               assertEquals(newValue.longValue(), settings.getLong(key));
-               assertFalse(settings.isDefault(key));
-               assertTrue(settings.contains(key));
+        // default value
+        assertEquals( defaultValue.intValue(), settings.getInt( key ) );
+        assertEquals( defaultValue.intValue(), settings.getDefaultInt( key ) );
+        assertTrue( settings.isDefault( key ) );
+        assertFalse( settings.contains( key ) );
 
-               // check property change event
-               assertPropertyChangeEventFired(key, defaultValue, newValue);
-               propertyChangeListener.reset();
+        // change the value
+        settings.setInt( key, newValue.intValue() );
 
-               // change the value to the same value, no property change event 
should
-               // be fired
-               settings.setLong(key, newValue.longValue());
-               assertEquals(0, propertyChangeListener.getCount());
-       }
+        assertEquals( newValue.intValue(), settings.getInt( key ) );
+        assertFalse( settings.isDefault( key ) );
+        assertTrue( settings.contains( key ) );
 
-       public final void testFloat() {
-               String key = "float-value";
-               Float defaultValue = new Float(0.0f);
-               Float newValue = new Float(1.23f);
+        // check property change event
+        assertPropertyChangeEventFired( key, defaultValue, newValue );
+        propertyChangeListener.reset();
 
-               // default value
-               assertEquals(defaultValue.floatValue(), settings.getFloat(key), 
0.0f);
-               assertEquals(defaultValue.floatValue(), 
settings.getDefaultFloat(key), 0.0f);
-               assertTrue(settings.isDefault(key));
-               assertFalse(settings.contains(key));
+        // change the value to the same value, no property change event should
+        // be fired
+        settings.setInt( key, newValue.intValue() );
+        assertEquals( 0, propertyChangeListener.getCount() );
+    }
 
-               // change the value
-               settings.setFloat(key, newValue.floatValue());
+    public final void testLong() {
+        String key = "long-value";
+        Long defaultValue = new Long( 0 );
+        Long newValue = new Long( 555L );
 
-               assertEquals(newValue.floatValue(), settings.getFloat(key), 
0.0f);
-               assertFalse(settings.isDefault(key));
-               assertTrue(settings.contains(key));
+        // default value
+        assertEquals( defaultValue.longValue(), settings.getLong( key ) );
+        assertEquals( defaultValue.longValue(), settings.getDefaultLong( key ) 
);
+        assertTrue( settings.isDefault( key ) );
+        assertFalse( settings.contains( key ) );
 
-               // check property change event
-               assertPropertyChangeEventFired(key, defaultValue, newValue);
-               propertyChangeListener.reset();
+        // change the value
+        settings.setLong( key, newValue.longValue() );
 
-               // change the value to the same value, no property change event 
should
-               // be fired
-               settings.setFloat(key, newValue.floatValue());
-               assertEquals(0, propertyChangeListener.getCount());
-       }
+        assertEquals( newValue.longValue(), settings.getLong( key ) );
+        assertFalse( settings.isDefault( key ) );
+        assertTrue( settings.contains( key ) );
 
-       public final void testDouble() {
-               String key = "double-value";
-               Double defaultValue = new Double(0.0);
-               Double newValue = new Double(1.23);
+        // check property change event
+        assertPropertyChangeEventFired( key, defaultValue, newValue );
+        propertyChangeListener.reset();
 
-               // default value
-               assertEquals(defaultValue.doubleValue(), 
settings.getDouble(key), 0.0);
-               assertEquals(defaultValue.doubleValue(), 
settings.getDefaultDouble(key), 0.0);
-               assertTrue(settings.isDefault(key));
-               assertFalse(settings.contains(key));
+        // change the value to the same value, no property change event should
+        // be fired
+        settings.setLong( key, newValue.longValue() );
+        assertEquals( 0, propertyChangeListener.getCount() );
+    }
 
-               // change the value
-               settings.setDouble(key, newValue.doubleValue());
+    public final void testFloat() {
+        String key = "float-value";
+        Float defaultValue = new Float( 0.0f );
+        Float newValue = new Float( 1.23f );
 
-               assertEquals(newValue.doubleValue(), settings.getDouble(key), 
0.0);
-               assertFalse(settings.isDefault(key));
-               assertTrue(settings.contains(key));
+        // default value
+        assertEquals( defaultValue.floatValue(), settings.getFloat( key ), 
0.0f );
+        assertEquals( defaultValue.floatValue(), settings.getDefaultFloat( key 
), 0.0f );
+        assertTrue( settings.isDefault( key ) );
+        assertFalse( settings.contains( key ) );
 
-               // check property change event
-               assertPropertyChangeEventFired(key, defaultValue, newValue);
-               propertyChangeListener.reset();
+        // change the value
+        settings.setFloat( key, newValue.floatValue() );
 
-               // change the value to the same value, no property change event 
should
-               // be fired
-               settings.setDouble(key, newValue.doubleValue());
-               assertEquals(0, propertyChangeListener.getCount());
-       }
+        assertEquals( newValue.floatValue(), settings.getFloat( key ), 0.0f );
+        assertFalse( settings.isDefault( key ) );
+        assertTrue( settings.contains( key ) );
 
-       public final void testString() {
-               String key = "string-value";
-               String defaultValue = "";
-               String newValue = "value";
+        // check property change event
+        assertPropertyChangeEventFired( key, defaultValue, newValue );
+        propertyChangeListener.reset();
 
-               // default value
-               assertEquals(defaultValue, settings.getString(key));
-               assertEquals(defaultValue, settings.getDefaultString(key));
-               assertTrue(settings.isDefault(key));
-               assertFalse(settings.contains(key));
+        // change the value to the same value, no property change event should
+        // be fired
+        settings.setFloat( key, newValue.floatValue() );
+        assertEquals( 0, propertyChangeListener.getCount() );
+    }
 
-               // change the value
-               settings.setString(key, newValue);
+    public final void testDouble() {
+        String key = "double-value";
+        Double defaultValue = new Double( 0.0 );
+        Double newValue = new Double( 1.23 );
 
-               assertEquals(newValue, settings.getString(key));
-               assertFalse(settings.isDefault(key));
-               assertTrue(settings.contains(key));
+        // default value
+        assertEquals( defaultValue.doubleValue(), settings.getDouble( key ), 
0.0 );
+        assertEquals( defaultValue.doubleValue(), settings.getDefaultDouble( 
key ), 0.0 );
+        assertTrue( settings.isDefault( key ) );
+        assertFalse( settings.contains( key ) );
 
-               // check property change event
-               assertPropertyChangeEventFired(key, defaultValue, newValue);
-               propertyChangeListener.reset();
+        // change the value
+        settings.setDouble( key, newValue.doubleValue() );
 
-               // change the value to the same value, no property change event 
should
-               // be fired
-               settings.setString(key, newValue);
-               assertEquals(0, propertyChangeListener.getCount());
-       }
+        assertEquals( newValue.doubleValue(), settings.getDouble( key ), 0.0 );
+        assertFalse( settings.isDefault( key ) );
+        assertTrue( settings.contains( key ) );
 
-       public final void testEnum() {
-               String key = "enum-value";
-               LabeledEnum defaultValue = null;
-               LabeledEnum newValue = TestEnum.ENUM2;
+        // check property change event
+        assertPropertyChangeEventFired( key, defaultValue, newValue );
+        propertyChangeListener.reset();
 
-               // default value
-               assertEquals(defaultValue, settings.getLabeledEnum(key));
-               assertEquals(defaultValue, settings.getDefaultLabeledEnum(key));
-               assertTrue(settings.isDefault(key));
-               assertFalse(settings.contains(key));
+        // change the value to the same value, no property change event should
+        // be fired
+        settings.setDouble( key, newValue.doubleValue() );
+        assertEquals( 0, propertyChangeListener.getCount() );
+    }
 
-               // change the value
-               settings.setLabeledEnum(key, newValue);
+    public final void testString() {
+        String key = "string-value";
+        String defaultValue = "";
+        String newValue = "value";
 
-               assertEquals(newValue, settings.getLabeledEnum(key));
-               assertFalse(settings.isDefault(key));
-               assertTrue(settings.contains(key));
+        // default value
+        assertEquals( defaultValue, settings.getString( key ) );
+        assertEquals( defaultValue, settings.getDefaultString( key ) );
+        assertTrue( settings.isDefault( key ) );
+        assertFalse( settings.contains( key ) );
 
-               // check property change event
-               assertPropertyChangeEventFired(key, defaultValue, newValue);
-               propertyChangeListener.reset();
+        // change the value
+        settings.setString( key, newValue );
 
-               // change the value to the same value, no property change event 
should
-               // be fired
-               settings.setLabeledEnum(key, newValue);
-               assertEquals(0, propertyChangeListener.getCount());
-       }
+        assertEquals( newValue, settings.getString( key ) );
+        assertFalse( settings.isDefault( key ) );
+        assertTrue( settings.contains( key ) );
 
-       private void assertPropertyChangeEventFired(String key, Object 
oldValue, Object newValue) {
-               assertEquals(1, propertyChangeListener.getCount());
-               assertEquals(key, 
propertyChangeListener.getEvent().getPropertyName());
-               assertEquals(newValue, 
propertyChangeListener.getEvent().getNewValue());
-               assertEquals(oldValue, 
propertyChangeListener.getEvent().getOldValue());
-       }
+        // check property change event
+        assertPropertyChangeEventFired( key, defaultValue, newValue );
+        propertyChangeListener.reset();
 
-       protected abstract Settings createSettings() throws Exception;
+        // change the value to the same value, no property change event should
+        // be fired
+        settings.setString( key, newValue );
+        assertEquals( 0, propertyChangeListener.getCount() );
+    }
+
+    public final void testEnum() {
+        String key = "enum-value";
+        LabeledEnum defaultValue = null;
+        LabeledEnum newValue = TestEnum.ENUM2;
+
+        // default value
+        assertEquals( defaultValue, settings.getLabeledEnum( key ) );
+        assertEquals( defaultValue, settings.getDefaultLabeledEnum( key ) );
+        assertTrue( settings.isDefault( key ) );
+        assertFalse( settings.contains( key ) );
+
+        // change the value
+        settings.setLabeledEnum( key, newValue );
+
+        assertEquals( newValue, settings.getLabeledEnum( key ) );
+        assertFalse( settings.isDefault( key ) );
+        assertTrue( settings.contains( key ) );
+
+        // check property change event
+        assertPropertyChangeEventFired( key, defaultValue, newValue );
+        propertyChangeListener.reset();
+
+        // change the value to the same value, no property change event should
+        // be fired
+        settings.setLabeledEnum( key, newValue );
+        assertEquals( 0, propertyChangeListener.getCount() );
+    }
+
+    private void assertPropertyChangeEventFired( String key, Object oldValue, 
Object newValue ) {
+        assertEquals( 1, propertyChangeListener.getCount() );
+        assertEquals( key, propertyChangeListener.getEvent().getPropertyName() 
);
+        assertEquals( newValue, 
propertyChangeListener.getEvent().getNewValue() );
+        assertEquals( oldValue, 
propertyChangeListener.getEvent().getOldValue() );
+    }
+
+    protected abstract Settings createSettings() throws Exception;
 }


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.



-------------------------------------------------------
All the advantages of Linux Managed Hosting--Without the Cost and Risk!
Fully trained technicians. The highest number of Red Hat certifications in
the hosting industry. Fanatical Support. Click to learn more
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=107521&bid=248729&dat=121642
_______________________________________________
spring-rich-c-cvs mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/spring-rich-c-cvs

Reply via email to