You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by oh...@apache.org on 2009/06/06 17:27:08 UTC

svn commit: r782274 - in /commons/proper/configuration/branches/configuration2_experimental: src/main/java/org/apache/commons/configuration2/ src/test/java/org/apache/commons/configuration2/ src/test/java/org/apache/commons/configuration2/event/ xdocs/

Author: oheger
Date: Sat Jun  6 15:27:02 2009
New Revision: 782274

URL: http://svn.apache.org/viewvc?rev=782274&view=rev
Log:
CONFIGURATION-385: DatabaseConfiguration now generates correct events for the clear() and clearProperty() methods. (Ported from trunk.)

Added:
    commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/DatabaseConfigurationTestHelper.java   (with props)
    commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/event/TestDatabaseConfigurationEvents.java   (with props)
Modified:
    commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/DatabaseConfiguration.java
    commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/TestDatabaseConfiguration.java
    commons/proper/configuration/branches/configuration2_experimental/xdocs/changes.xml

Modified: commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/DatabaseConfiguration.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/DatabaseConfiguration.java?rev=782274&r1=782273&r2=782274&view=diff
==============================================================================
--- commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/DatabaseConfiguration.java (original)
+++ commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/DatabaseConfiguration.java Sat Jun  6 15:27:02 2009
@@ -347,7 +347,7 @@
      * @param key the key of the property to be removed
      */
     @Override
-    public void clearProperty(final String key)
+    protected void clearPropertyDirect(final String key)
     {
         new JdbcOperation(EVENT_CLEAR_PROPERTY, key, null)
         {
@@ -370,6 +370,7 @@
     @Override
     public void clear()
     {
+        fireEvent(EVENT_CLEAR, null, null, true);
         new JdbcOperation(EVENT_CLEAR, null, null)
         {
             @Override
@@ -380,6 +381,7 @@
                 return ps.executeUpdate();
             }
         }.execute();
+        fireEvent(EVENT_CLEAR, null, null, false);
     }
 
     /**

Added: commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/DatabaseConfigurationTestHelper.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/DatabaseConfigurationTestHelper.java?rev=782274&view=auto
==============================================================================
--- commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/DatabaseConfigurationTestHelper.java (added)
+++ commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/DatabaseConfigurationTestHelper.java Sat Jun  6 15:27:02 2009
@@ -0,0 +1,204 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.configuration2;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.sql.Connection;
+import java.sql.SQLException;
+
+import org.apache.commons.configuration2.test.HsqlDB;
+import org.apache.commons.dbcp.BasicDataSource;
+import org.dbunit.database.DatabaseConnection;
+import org.dbunit.database.IDatabaseConnection;
+import org.dbunit.dataset.IDataSet;
+import org.dbunit.dataset.xml.XmlDataSet;
+import org.dbunit.operation.DatabaseOperation;
+
+/**
+ * A helper class for performing tests for {@link DatabaseConfiguration}. This
+ * class maintains an in-process database that stores configuration data and can
+ * be accessed from a {@link DatabaseConfiguration} instance. Constants for
+ * table and column names and database connection settings are provided, too.
+ *
+ * @version $Id$
+ */
+public class DatabaseConfigurationTestHelper
+{
+    /** Constant for the JDBC driver class. */
+    public final String DATABASE_DRIVER = "org.hsqldb.jdbcDriver";
+
+    /** Constant for the connection URL. */
+    public final String DATABASE_URL = "jdbc:hsqldb:mem:testdb";
+
+    /** Constant for the DB user name. */
+    public final String DATABASE_USERNAME = "sa";
+
+    /** Constant for the DB password. */
+    public final String DATABASE_PASSWORD = "";
+
+    /** Constant for the configuration table. */
+    public static final String TABLE = "configuration";
+
+    /** Constant for the multi configuration table. */
+    public static final String TABLE_MULTI = "configurations";
+
+    /** Constant for the column with the keys. */
+    public static final String COL_KEY = "key";
+
+    /** Constant for the column with the values. */
+    public static final String COL_VALUE = "value";
+
+    /** Constant for the column with the configuration name. */
+    public static final String COL_NAME = "name";
+
+    /** Constant for the name of the test configuration. */
+    public static final String CONFIG_NAME = "test";
+
+    /** Stores the in-process database. */
+    private static HsqlDB hsqlDB = null;
+
+    /** The data source. */
+    private PotentialErrorDataSource datasource;
+
+    /**
+     * Initializes this helper object. This method can be called from a
+     * <code>setUp()</code> method of a unit test class. It creates the database
+     * instance if necessary and populates it with test data.
+     *
+     * @throws Exception if an error occurs
+     */
+    public void setUp() throws Exception
+    {
+        if (hsqlDB == null)
+        {
+            File script = ConfigurationAssert.getTestFile("testdb.script");
+            hsqlDB = new HsqlDB(DATABASE_URL, DATABASE_DRIVER, script
+                    .getAbsolutePath());
+        }
+
+        PotentialErrorDataSource datasource = new PotentialErrorDataSource();
+        datasource.setDriverClassName(DATABASE_DRIVER);
+        datasource.setUrl(DATABASE_URL);
+        datasource.setUsername(DATABASE_USERNAME);
+        datasource.setPassword(DATABASE_PASSWORD);
+
+        this.datasource = datasource;
+
+        // prepare the database
+        IDatabaseConnection connection = new DatabaseConnection(datasource
+                .getConnection());
+        IDataSet dataSet = new XmlDataSet(new FileInputStream(
+                ConfigurationAssert.getTestFile("dataset.xml")));
+
+        try
+        {
+            DatabaseOperation.CLEAN_INSERT.execute(connection, dataSet);
+        }
+        finally
+        {
+            connection.close();
+        }
+    }
+
+    /**
+     * Frees the resources used by this helper class. This method can be called
+     * by a <code>tearDown()</code> method of a unit test class.
+     *
+     * @throws Exception if an error occurs
+     */
+    public void tearDown() throws Exception
+    {
+        datasource.getConnection().commit();
+        datasource.getConnection().close();
+    }
+
+    /**
+     * Creates a database configuration with default values.
+     *
+     * @return the configuration
+     */
+    public DatabaseConfiguration setUpConfig()
+    {
+        return new DatabaseConfiguration(datasource, TABLE, COL_KEY, COL_VALUE);
+    }
+
+    /**
+     * Creates a database configuration that supports multiple configurations in
+     * a table with default values.
+     *
+     * @return the configuration
+     */
+    public DatabaseConfiguration setUpMultiConfig()
+    {
+        return new DatabaseConfiguration(datasource, TABLE_MULTI, COL_NAME,
+                COL_KEY, COL_VALUE, CONFIG_NAME);
+    }
+
+    /**
+     * Returns the <code>DataSource</code> managed by this class.
+     *
+     * @return the <code>DataSource</code>
+     */
+    public PotentialErrorDataSource getDatasource()
+    {
+        return datasource;
+    }
+
+    /**
+     * A specialized DataSource implementation that can be configured to throw
+     * an exception when obtaining a connection. This way database exceptions
+     * can be simulated.
+     */
+    public static class PotentialErrorDataSource extends BasicDataSource
+    {
+        /** A flag whether a getConnection() call should fail. */
+        private boolean failOnConnect;
+
+        /**
+         * Returns the fail on connect flag.
+         *
+         * @return the fail on connect flag
+         */
+        public boolean isFailOnConnect()
+        {
+            return failOnConnect;
+        }
+
+        /**
+         * Sets the fail on connect flag. If set to <b>true</b>, the next call
+         * to {@link #getConnection()} will throw an exception.
+         *
+         * @param failOnConnect the fail on connect flag
+         */
+        public void setFailOnConnect(boolean failOnConnect)
+        {
+            this.failOnConnect = failOnConnect;
+        }
+
+        @Override
+        public Connection getConnection() throws SQLException
+        {
+            if (failOnConnect)
+            {
+                failOnConnect = false; // fail only once
+                throw new SQLException("Simulated DB error");
+            }
+            return super.getConnection();
+        }
+    }
+}

Propchange: commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/DatabaseConfigurationTestHelper.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/DatabaseConfigurationTestHelper.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/DatabaseConfigurationTestHelper.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/TestDatabaseConfiguration.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/TestDatabaseConfiguration.java?rev=782274&r1=782273&r2=782274&view=diff
==============================================================================
--- commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/TestDatabaseConfiguration.java (original)
+++ commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/TestDatabaseConfiguration.java Sat Jun  6 15:27:02 2009
@@ -18,8 +18,6 @@
 package org.apache.commons.configuration2;
 
 import java.io.File;
-import java.io.FileInputStream;
-import java.sql.Connection;
 import java.sql.SQLException;
 import java.util.Hashtable;
 import java.util.Iterator;
@@ -33,16 +31,9 @@
 import junit.framework.TestCase;
 
 import org.apache.commons.configuration2.event.ConfigurationErrorListener;
-import org.apache.commons.configuration2.test.HsqlDB;
-import org.apache.commons.dbcp.BasicDataSource;
 import org.codehaus.spice.jndikit.DefaultNameParser;
 import org.codehaus.spice.jndikit.DefaultNamespace;
 import org.codehaus.spice.jndikit.memory.MemoryContext;
-import org.dbunit.database.DatabaseConnection;
-import org.dbunit.database.IDatabaseConnection;
-import org.dbunit.dataset.IDataSet;
-import org.dbunit.dataset.xml.XmlDataSet;
-import org.dbunit.operation.DatabaseOperation;
 
 /**
  * Test for database stored configurations.  Note, when running this Unit
@@ -53,36 +44,12 @@
  */
 public class TestDatabaseConfiguration extends TestCase
 {
-    public final String DATABASE_DRIVER = "org.hsqldb.jdbcDriver";
-    public final String DATABASE_URL = "jdbc:hsqldb:mem:testdb";
-    public final String DATABASE_USERNAME = "sa";
-    public final String DATABASE_PASSWORD = "";
-
-    /** Constant for the configuration table.*/
-    private static final String TABLE = "configuration";
-
-    /** Constant for the multi configuration table.*/
-    private static final String TABLE_MULTI = "configurations";
-
-    /** Constant for the column with the keys.*/
-    private static final String COL_KEY = "key";
-
-    /** Constant for the column with the values.*/
-    private static final String COL_VALUE = "value";
-
-    /** Constant for the column with the configuration name.*/
-    private static final String COL_NAME = "name";
-
-    /** Constant for the name of the test configuration.*/
-    private static final String CONFIG_NAME = "test";
-
-    private static HsqlDB hsqlDB = null;
-
-    private PotentialErrorDataSource datasource;
-
     /** An error listener for testing whether internal errors occurred.*/
     private ConfigurationErrorListenerImpl listener;
 
+    /** The test helper. */
+    private DatabaseConfigurationTestHelper helper;
+
     @Override
     protected void setUp() throws Exception
     {
@@ -92,46 +59,19 @@
          */
         //Thread.sleep(1000);
 
-        // set up the datasource
-
-        if (hsqlDB == null)
-        {
-            File script = ConfigurationAssert.getTestFile("testdb.script");
-            hsqlDB = new HsqlDB(DATABASE_URL, DATABASE_DRIVER, script.getAbsolutePath());
-        }
-
-        PotentialErrorDataSource datasource = new PotentialErrorDataSource();
-        datasource.setDriverClassName(DATABASE_DRIVER);
-        datasource.setUrl(DATABASE_URL);
-        datasource.setUsername(DATABASE_USERNAME);
-        datasource.setPassword(DATABASE_PASSWORD);
-
-        this.datasource = datasource;
-
-        // prepare the database
-        IDatabaseConnection connection = new DatabaseConnection(datasource.getConnection());
-        IDataSet dataSet = new XmlDataSet(new FileInputStream(ConfigurationAssert.getTestFile("dataset.xml")));
-
-        try
-        {
-            DatabaseOperation.CLEAN_INSERT.execute(connection, dataSet);
-        }
-        finally
-        {
-            connection.close();
-        }
+        helper = new DatabaseConfigurationTestHelper();
+        helper.setUp();
     }
 
     @Override
     protected void tearDown() throws Exception{
-        datasource.getConnection().commit();
-        datasource.getConnection().close();
-
         // if an error listener is defined, we check whether an error occurred
         if(listener != null)
         {
             assertEquals("An internal error occurred", 0, listener.getErrorCount());
         }
+        helper.tearDown();
+
         super.tearDown();
     }
 
@@ -142,7 +82,7 @@
      */
     private DatabaseConfiguration setUpConfig()
     {
-        return new DatabaseConfiguration(datasource, TABLE, COL_KEY, COL_VALUE);
+        return helper.setUpConfig();
     }
 
     /**
@@ -153,7 +93,7 @@
      */
     private DatabaseConfiguration setUpMultiConfig()
     {
-        return new DatabaseConfiguration(datasource, TABLE_MULTI, COL_NAME, COL_KEY, COL_VALUE, CONFIG_NAME);
+        return helper.setUpMultiConfig();
     }
 
     /**
@@ -167,7 +107,7 @@
         config.removeErrorListener((ConfigurationErrorListener) config.getErrorListeners().iterator().next());
         listener = new ConfigurationErrorListenerImpl();
         config.addErrorListener(listener);
-        datasource.failOnConnect = true;
+        helper.getDatasource().setFailOnConnect(true);
     }
 
     /**
@@ -314,26 +254,38 @@
     public void testIsEmptyMultiple()
     {
         Configuration config1 = setUpMultiConfig();
-        assertFalse("The configuration named 'test' is empty", config1.isEmpty());
+        assertFalse("The configuration named 'test' is empty", config1
+                .isEmpty());
 
-        Configuration config2 = new DatabaseConfiguration(datasource, TABLE_MULTI, COL_NAME, COL_KEY, COL_VALUE, "testIsEmpty");
-        assertTrue("The configuration named 'testIsEmpty' is not empty", config2.isEmpty());
+        Configuration config2 = new DatabaseConfiguration(helper
+                .getDatasource(), DatabaseConfigurationTestHelper.TABLE_MULTI,
+                DatabaseConfigurationTestHelper.COL_NAME,
+                DatabaseConfigurationTestHelper.COL_KEY,
+                DatabaseConfigurationTestHelper.COL_VALUE, "testIsEmpty");
+        assertTrue("The configuration named 'testIsEmpty' is not empty",
+                config2.isEmpty());
     }
 
     public void testGetList()
     {
-        Configuration config1 = new DatabaseConfiguration(datasource, "configurationList", COL_KEY, COL_VALUE);
+        Configuration config1 = new DatabaseConfiguration(helper
+                .getDatasource(), "configurationList",
+                DatabaseConfigurationTestHelper.COL_KEY,
+                DatabaseConfigurationTestHelper.COL_VALUE);
         List<?> list = config1.getList("key3");
-        assertEquals(3,list.size());
+        assertEquals(3, list.size());
     }
 
     public void testGetKeys()
     {
-        Configuration config1 = new DatabaseConfiguration(datasource, "configurationList", COL_KEY, COL_VALUE);
+        Configuration config1 = new DatabaseConfiguration(helper
+                .getDatasource(), "configurationList",
+                DatabaseConfigurationTestHelper.COL_KEY,
+                DatabaseConfigurationTestHelper.COL_VALUE);
         Iterator<?> i = config1.getKeys();
         assertTrue(i.hasNext());
         Object key = i.next();
-        assertEquals("key3",key.toString());
+        assertEquals("key3", key.toString());
         assertFalse(i.hasNext());
     }
 
@@ -354,8 +306,12 @@
      */
     public void testLogErrorListener()
     {
-        DatabaseConfiguration config = new DatabaseConfiguration(datasource, TABLE, COL_KEY, COL_VALUE);
-        assertEquals("No error listener registered", 1, config.getErrorListeners().size());
+        DatabaseConfiguration config = new DatabaseConfiguration(helper
+                .getDatasource(), DatabaseConfigurationTestHelper.TABLE,
+                DatabaseConfigurationTestHelper.COL_KEY,
+                DatabaseConfigurationTestHelper.COL_VALUE);
+        assertEquals("No error listener registered", 1, config
+                .getErrorListeners().size());
     }
 
     /**
@@ -463,12 +419,12 @@
     }
 
     /**
-     * Test instanciating a DatabaseConfiguration from a configuration descriptor.
+     * Test instantiating a DatabaseConfiguration from a configuration descriptor.
      */
     public void testConfigurationBuilder() throws Exception
     {
         // bind the datasource in the JNDI context
-        TestInitialContextFactory.datasource = datasource;
+        TestInitialContextFactory.datasource = helper.getDatasource();
         System.setProperty("java.naming.factory.initial", TestInitialContextFactory.class.getName());
 
         File testFile = ConfigurationAssert.getTestFile("testDatabaseConfiguration.xml");
@@ -503,26 +459,4 @@
             return context;
         }
     }
-
-    /**
-     * A specialized DataSource implementation that can be configured to throw
-     * an exception when obtaining a connection. This way database exceptions
-     * can be simulated.
-     */
-    private static class PotentialErrorDataSource extends BasicDataSource
-    {
-        /** A flag whether a getConnection() call should fail. */
-        boolean failOnConnect;
-
-        @Override
-        public Connection getConnection() throws SQLException
-        {
-            if (failOnConnect)
-            {
-                failOnConnect = false; // fail only once
-                throw new SQLException("Simulated DB error");
-            }
-            return super.getConnection();
-        }
-    }
 }

Added: commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/event/TestDatabaseConfigurationEvents.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/event/TestDatabaseConfigurationEvents.java?rev=782274&view=auto
==============================================================================
--- commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/event/TestDatabaseConfigurationEvents.java (added)
+++ commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/event/TestDatabaseConfigurationEvents.java Sat Jun  6 15:27:02 2009
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.configuration2.event;
+
+import org.apache.commons.configuration2.AbstractConfiguration;
+import org.apache.commons.configuration2.DatabaseConfigurationTestHelper;
+
+/**
+ * A test class for the events generated by DatabaseConfiguration.
+ *
+ * @version $Id$
+ */
+public class TestDatabaseConfigurationEvents extends
+        AbstractTestConfigurationEvents
+{
+    /** The test helper. */
+    private DatabaseConfigurationTestHelper helper;
+
+    @Override
+    protected void setUp() throws Exception
+    {
+        helper = new DatabaseConfigurationTestHelper();
+        helper.setUp();
+
+        super.setUp();
+    }
+
+    @Override
+    protected void tearDown() throws Exception
+    {
+        helper.tearDown();
+        super.tearDown();
+    }
+
+    @Override
+    protected AbstractConfiguration createConfiguration()
+    {
+        return helper.setUpConfig();
+    }
+}

Propchange: commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/event/TestDatabaseConfigurationEvents.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/event/TestDatabaseConfigurationEvents.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/event/TestDatabaseConfigurationEvents.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: commons/proper/configuration/branches/configuration2_experimental/xdocs/changes.xml
URL: http://svn.apache.org/viewvc/commons/proper/configuration/branches/configuration2_experimental/xdocs/changes.xml?rev=782274&r1=782273&r2=782274&view=diff
==============================================================================
--- commons/proper/configuration/branches/configuration2_experimental/xdocs/changes.xml (original)
+++ commons/proper/configuration/branches/configuration2_experimental/xdocs/changes.xml Sat Jun  6 15:27:02 2009
@@ -85,6 +85,10 @@
     </release>
 
     <release version="1.7" date="in SVN" description="">
+      <action dev="oheger" type="fix" issue="CONFIGURATION-385">
+        DatabaseConfiguration now generates correct events for the clear() and
+        clearProperty() methods.
+      </action>
       <action dev="rgoers" type="add" issue="CONFIGURATION-380">
         Add ExprLookup to allow expressions to be evaluated in configurations. When
         used, this requires that Apache Commons Jexl be added as a dependency to