Added a more generic way to handle cascade action capabilities of the individual platforms which also fixes DDLUTILS-222: ON UPDATE, ON DELETE errors for MS Sql Server - does not implement default "RESTRICT"

git-svn-id: https://svn.apache.org/repos/asf/db/ddlutils/trunk@711776 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/main/java/org/apache/ddlutils/Platform.java b/src/main/java/org/apache/ddlutils/Platform.java
index 79dc610..3653c5f 100644
--- a/src/main/java/org/apache/ddlutils/Platform.java
+++ b/src/main/java/org/apache/ddlutils/Platform.java
@@ -199,6 +199,42 @@
      */

     public void setForeignKeysSorted(boolean foreignKeysSorted);

 

+    /**

+     * Determines whether the default action for ON UPDATE is used if the specified one is not supported by the platform.

+     * If this is set to <code>false</code>, then an exception will be thrown if the action is not supported. By default, this

+     * is set to <code>true</code> meaning that the default action would be used.

+     * 

+     * @return <code>true</code> if the default action is used

+     */

+    public boolean isDefaultOnUpdateActionUsedIfUnsupported();

+

+    /**

+     * Specifies whether the default action for ON UPDATE shall be used if the specified one is not supported by the platform.

+     * If this is set to <code>false</code>, then an exception will be thrown if the action is not supported. By default, this

+     * is set to <code>true</code> meaning that the default action would be used.

+     * 

+     * @param useDefault If <code>true</code> then the default action will be used

+     */

+    public void setDefaultOnUpdateActionUsedIfUnsupported(boolean useDefault);

+

+    /**

+     * Determines whether the default action for ON DELETE is used if the specified one is not supported by the platform.

+     * If this is set to <code>false</code>, then an exception will be thrown if the action is not supported. By default, this

+     * is set to <code>true</code> meaning that the default action would be used.

+     * 

+     * @return <code>true</code> if the default action is used

+     */

+    public boolean isDefaultOnDeleteActionUsedIfUnsupported();

+

+    /**

+     * Specifies whether the default action for ON DELETE shall be used if the specified one is not supported by the platform.

+     * If this is set to <code>false</code>, then an exception will be thrown if the action is not supported. By default, this

+     * is set to <code>true</code> meaning that the default action would be used.

+     * 

+     * @param useDefault If <code>true</code> then the default action will be used

+     */

+    public void setDefaultOnDeleteActionUsedIfUnsupported(boolean useDefault);

+

     // functionality

     

     /**

diff --git a/src/main/java/org/apache/ddlutils/PlatformInfo.java b/src/main/java/org/apache/ddlutils/PlatformInfo.java
index f50d16a..64712da 100644
--- a/src/main/java/org/apache/ddlutils/PlatformInfo.java
+++ b/src/main/java/org/apache/ddlutils/PlatformInfo.java
@@ -21,11 +21,13 @@
 

 import java.lang.reflect.Field;

 import java.sql.Types;

+import java.util.Arrays;

 import java.util.HashMap;

 import java.util.HashSet;

 

 import org.apache.commons.logging.Log;

 import org.apache.commons.logging.LogFactory;

+import org.apache.ddlutils.model.CascadeActionEnum;

 

 /**

  * Conatains information about the database platform such as supported features and native type mappings.

@@ -166,6 +168,18 @@
     /** Contains those JDBC types whose corresponding native types are types that have precision and scale on this platform. */

     private HashSet _typesWithPrecisionAndScale = new HashSet();

 

+    /** The default ON UPDATE action. */

+    private CascadeActionEnum _defaultOnUpdateAction = CascadeActionEnum.NONE;

+

+    /** The default ON DELETE action. */

+    private CascadeActionEnum _defaultOnDeleteAction = CascadeActionEnum.NONE;

+

+    /** Contains the supported ON UPDATE actions. */

+    private HashSet _supportedOnUpdateActions = new HashSet();

+

+    /** Contains the supported ON DELETE actions. */

+    private HashSet _supportedOnDeleteActions = new HashSet();

+

     /**

      * Creates a new platform info object.

      */

@@ -187,6 +201,9 @@
 

         _typesWithPrecisionAndScale.add(new Integer(Types.DECIMAL));

         _typesWithPrecisionAndScale.add(new Integer(Types.NUMERIC));

+

+        _supportedOnUpdateActions.addAll(CascadeActionEnum.getEnumList());

+        _supportedOnDeleteActions.addAll(CascadeActionEnum.getEnumList());

     }

 

     // properties influencing the definition of columns

@@ -201,6 +218,7 @@
     {

         return _nullAsDefaultValueRequired;

     }

+

     /**

      * Specifies whether a NULL needs to be explicitly stated when the column

      * has no specified default value. Default is false.

@@ -1174,4 +1192,88 @@
             _typesWithPrecisionAndScale.remove(new Integer(sqlTypeCode));

         }

     }

+

+    /**

+     * Sets the actions that this platform supports for ON UPDATE.

+     * 

+     * @param actions The actions

+     */

+    public void setSupportedOnUpdateActions(CascadeActionEnum[] actions)

+    {

+        _supportedOnUpdateActions.clear();

+        _supportedOnUpdateActions.addAll(Arrays.asList(actions));

+    }

+    

+    /**

+     * Determines whether the given action is supported for ON UPDATE on this platform.

+     * 

+     * @param action The action

+     * @return <code>true</code> if the action is supported

+     */

+    public boolean isActionSupportedForOnUpdate(CascadeActionEnum action)

+    {

+        return _supportedOnUpdateActions.contains(action);

+    }

+

+    /**

+     * Sets the actions that this platform supports for ON DELETE.

+     * 

+     * @param actions The actions

+     */

+    public void setSupportedOnDeleteActions(CascadeActionEnum[] actions)

+    {

+        _supportedOnDeleteActions.clear();

+        _supportedOnDeleteActions.addAll(Arrays.asList(actions));

+    }

+

+    /**

+     * Determines whether the given action is supported for ON DELETE on this platform.

+     * 

+     * @param action The action

+     * @return <code>true</code> if the action is supported

+     */

+    public boolean isActionSupportedForOnDelete(CascadeActionEnum action)

+    {

+        return _supportedOnDeleteActions.contains(action);

+    }

+

+    /**

+     * Returns the default ON UPDATE action that is used if none is specified.

+     * 

+     * @return The default action

+     */

+    public CascadeActionEnum getDefaultOnUpdateAction()

+    {

+        return _defaultOnUpdateAction;

+    }

+

+    /**

+     * Sets the default ON UPDATE action that is used if none is specified.

+     * 

+     * @return The default action

+     */

+    public void setDefaultOnUpdateAction(CascadeActionEnum defaultOnUpdateAction)

+    {

+        _defaultOnUpdateAction = defaultOnUpdateAction;

+    }

+

+    /**

+     * Returns the default ON DELETE action that is used if none is specified.

+     * 

+     * @return The default action

+     */

+    public CascadeActionEnum getDefaultOnDeleteAction()

+    {

+        return _defaultOnDeleteAction;

+    }

+

+    /**

+     * Sets the default ON DELETE action that is used if none is specified.

+     * 

+     * @return The default action

+     */

+    public void setDefaultOnDeleteAction(CascadeActionEnum defaultOnDeleteAction)

+    {

+        _defaultOnDeleteAction = defaultOnDeleteAction;

+    }

 }

diff --git a/src/main/java/org/apache/ddlutils/platform/JdbcModelReader.java b/src/main/java/org/apache/ddlutils/platform/JdbcModelReader.java
index 66661dd..06a5607 100644
--- a/src/main/java/org/apache/ddlutils/platform/JdbcModelReader.java
+++ b/src/main/java/org/apache/ddlutils/platform/JdbcModelReader.java
@@ -929,8 +929,8 @@
         {
             fk = new ForeignKey(fkName);
             fk.setForeignTableName((String)values.get("PKTABLE_NAME"));
-            fk.setOnUpdate(convertAction((Short)values.get("UPDATE_RULE")));
-            fk.setOnDelete(convertAction((Short)values.get("DELETE_RULE")));
+            fk.setOnUpdate(convertAction((Short)values.get("UPDATE_RULE"), getPlatformInfo().getDefaultOnUpdateAction()));
+            fk.setOnDelete(convertAction((Short)values.get("DELETE_RULE"), getPlatformInfo().getDefaultOnDeleteAction()));
             knownFks.put(fkName, fk);
         }
 
@@ -950,11 +950,12 @@
      * {@link DatabaseMetaData} class) to a {@link CascadeActionEnum}.
      * 
      * @param jdbcActionValue The jdbc action value
+     * @param defaultAction   The default action
      * @return The enum value
      */
-    protected CascadeActionEnum convertAction(Short jdbcActionValue)
+    protected CascadeActionEnum convertAction(Short jdbcActionValue, CascadeActionEnum defaultAction)
     {
-        CascadeActionEnum action = CascadeActionEnum.NONE;
+        CascadeActionEnum action = defaultAction;
 
         if (jdbcActionValue != null)
         {
diff --git a/src/main/java/org/apache/ddlutils/platform/PlatformImplBase.java b/src/main/java/org/apache/ddlutils/platform/PlatformImplBase.java
index ca67ff3..a3c9453 100644
--- a/src/main/java/org/apache/ddlutils/platform/PlatformImplBase.java
+++ b/src/main/java/org/apache/ddlutils/platform/PlatformImplBase.java
@@ -116,6 +116,10 @@
     private boolean _identityOverrideOn;

     /** Whether read foreign keys shall be sorted alphabetically. */

     private boolean _foreignKeysSorted;

+    /** Whether to use the default ON UPDATE action if the specified one is unsupported. */

+    private boolean _useDefaultOnUpdateActionIfUnsupported = true;

+    /** Whether to use the default ON DELETE action if the specified one is unsupported. */

+    private boolean _useDefaultOnDeleteActionIfUnsupported = true;

 

     /**

      * {@inheritDoc}

@@ -254,6 +258,38 @@
     }

 

     /**

+     * {@inheritDoc}

+     */

+    public boolean isDefaultOnUpdateActionUsedIfUnsupported()

+    {

+        return _useDefaultOnUpdateActionIfUnsupported;

+    }

+

+    /**

+     * {@inheritDoc}

+     */

+    public void setDefaultOnUpdateActionUsedIfUnsupported(boolean useDefault)

+    {

+        _useDefaultOnUpdateActionIfUnsupported = useDefault;

+    }

+

+    /**

+     * {@inheritDoc}

+     */

+    public boolean isDefaultOnDeleteActionUsedIfUnsupported()

+    {

+        return _useDefaultOnDeleteActionIfUnsupported;

+    }

+

+    /**

+     * {@inheritDoc}

+     */

+    public void setDefaultOnDeleteActionUsedIfUnsupported(boolean useDefault)

+    {

+        _useDefaultOnDeleteActionIfUnsupported = useDefault;

+    }

+

+    /**

      * Returns the log for this platform.

      * 

      * @return The log

diff --git a/src/main/java/org/apache/ddlutils/platform/SqlBuilder.java b/src/main/java/org/apache/ddlutils/platform/SqlBuilder.java
index 33f8d2a..1c8eb70 100644
--- a/src/main/java/org/apache/ddlutils/platform/SqlBuilder.java
+++ b/src/main/java/org/apache/ddlutils/platform/SqlBuilder.java
@@ -1957,10 +1957,25 @@
      */
     private void writeForeignKeyOnDeleteAction(Table table, ForeignKey foreignKey) throws IOException
     {
-        if (foreignKey.getOnDelete() != CascadeActionEnum.NONE)
+        CascadeActionEnum action = foreignKey.getOnDelete();
+
+        if (!getPlatformInfo().isActionSupportedForOnDelete(action))
+        {
+            if (getPlatform().isDefaultOnDeleteActionUsedIfUnsupported())
+            {
+                _log.info("The platform does not support the " + action + " action for onDelete; using " + getPlatformInfo().getDefaultOnDeleteAction() + " instead");
+                action = getPlatformInfo().getDefaultOnDeleteAction();
+            }
+            else
+            {
+                throw new ModelException("The platform does not support the action '" + action +
+                                         "' for onDelete in foreign key in table " + table.getName());
+            }
+        }
+        if (action != getPlatformInfo().getDefaultOnDeleteAction())
         {
             print(" ON DELETE ");
-            switch (foreignKey.getOnDelete().getValue())
+            switch (action.getValue())
             {
                 case CascadeActionEnum.VALUE_CASCADE:
                     print("CASCADE");
@@ -1978,7 +1993,7 @@
                     print("NO ACTION");
                     break;
                 default:
-                    throw new ModelException("Unsupported cascade value '" + foreignKey.getOnDelete().getValue() +
+                    throw new ModelException("Unsupported cascade value '" + action +
                                              "' for onDelete in foreign key in table " + table.getName());
             }
         }
@@ -1992,10 +2007,25 @@
      */
     private void writeForeignKeyOnUpdateAction(Table table, ForeignKey foreignKey) throws IOException
     {
-        if (foreignKey.getOnUpdate() != CascadeActionEnum.NONE)
+        CascadeActionEnum action = foreignKey.getOnUpdate();
+
+        if (!getPlatformInfo().isActionSupportedForOnUpdate(action))
+        {
+            if (getPlatform().isDefaultOnUpdateActionUsedIfUnsupported())
+            {
+                _log.info("The platform does not support the " + action + " action for onUpdate; using " + getPlatformInfo().getDefaultOnUpdateAction() + " instead");
+                action = getPlatformInfo().getDefaultOnUpdateAction();
+            }
+            else
+            {
+                throw new ModelException("The platform does not support the action '" + action +
+                                         "' for onUpdate in foreign key in table " + table.getName());
+            }
+        }
+        if (action != getPlatformInfo().getDefaultOnUpdateAction())
         {
             print(" ON UPDATE ");
-            switch (foreignKey.getOnUpdate().getValue())
+            switch (action.getValue())
             {
                 case CascadeActionEnum.VALUE_CASCADE:
                     print("CASCADE");
@@ -2013,7 +2043,7 @@
                     print("NO ACTION");
                     break;
                 default:
-                    throw new ModelException("Unsupported cascade value '" + foreignKey.getOnUpdate().getValue() +
+                    throw new ModelException("Unsupported cascade value '" + action +
                                              "' for onUpdate in foreign key in table " + table.getName());
             }
         }
diff --git a/src/main/java/org/apache/ddlutils/platform/derby/DerbyPlatform.java b/src/main/java/org/apache/ddlutils/platform/derby/DerbyPlatform.java
index 91ee0e4..1f7e09a 100644
--- a/src/main/java/org/apache/ddlutils/platform/derby/DerbyPlatform.java
+++ b/src/main/java/org/apache/ddlutils/platform/derby/DerbyPlatform.java
@@ -27,9 +27,11 @@
 import java.util.Map;

 

 import org.apache.ddlutils.DatabaseOperationException;

+import org.apache.ddlutils.PlatformInfo;

 import org.apache.ddlutils.alteration.AddColumnChange;

 import org.apache.ddlutils.alteration.TableChange;

 import org.apache.ddlutils.alteration.TableDefinitionChangesPredicate;

+import org.apache.ddlutils.model.CascadeActionEnum;

 import org.apache.ddlutils.model.Table;

 import org.apache.ddlutils.platform.DefaultTableDefinitionChangesPredicate;

 import org.apache.ddlutils.platform.cloudscape.CloudscapePlatform;

@@ -56,8 +58,15 @@
     public DerbyPlatform()

     {

         super();

-        getPlatformInfo().addNativeTypeMapping(Types.DOUBLE, "DOUBLE");

-        getPlatformInfo().addNativeTypeMapping(Types.FLOAT,  "DOUBLE", Types.DOUBLE);

+

+        PlatformInfo info = getPlatformInfo();

+

+        info.addNativeTypeMapping(Types.DOUBLE, "DOUBLE");

+        info.addNativeTypeMapping(Types.FLOAT,  "DOUBLE", Types.DOUBLE);

+        info.setSupportedOnUpdateActions(new CascadeActionEnum[] { CascadeActionEnum.NONE, CascadeActionEnum.RESTRICT });

+        info.setSupportedOnDeleteActions(new CascadeActionEnum[] { CascadeActionEnum.NONE, CascadeActionEnum.RESTRICT,

+                                                                   CascadeActionEnum.CASCADE, CascadeActionEnum.SET_NULL });

+

         setSqlBuilder(new DerbyBuilder(this));

         setModelReader(new DerbyModelReader(this));

     }

diff --git a/src/main/java/org/apache/ddlutils/platform/mssql/MSSqlModelReader.java b/src/main/java/org/apache/ddlutils/platform/mssql/MSSqlModelReader.java
index c4aa27b..9dbd80c 100644
--- a/src/main/java/org/apache/ddlutils/platform/mssql/MSSqlModelReader.java
+++ b/src/main/java/org/apache/ddlutils/platform/mssql/MSSqlModelReader.java
@@ -19,6 +19,7 @@
  * under the License.

  */

 

+import java.sql.DatabaseMetaData;

 import java.sql.Date;

 import java.sql.ResultSet;

 import java.sql.SQLException;

@@ -32,6 +33,7 @@
 

 import org.apache.ddlutils.DdlUtilsException;

 import org.apache.ddlutils.Platform;

+import org.apache.ddlutils.model.CascadeActionEnum;

 import org.apache.ddlutils.model.Column;

 import org.apache.ddlutils.model.Index;

 import org.apache.ddlutils.model.Table;

@@ -228,4 +230,19 @@
 

 		return column;

 	}

+

+    /**

+     * {@inheritDoc}

+     */

+    protected CascadeActionEnum convertAction(Short jdbcActionValue, CascadeActionEnum defaultAction)

+    {

+        CascadeActionEnum action = defaultAction;

+

+        // for whatever reason, the sql server jdbc driver returns restrict even though the DB does not support RESTRICT

+        if ((jdbcActionValue != null) && (jdbcActionValue.shortValue() == DatabaseMetaData.importedKeyCascade))

+        {

+            action = CascadeActionEnum.CASCADE;

+        }

+        return action;

+    }

 }

diff --git a/src/main/java/org/apache/ddlutils/platform/mssql/MSSqlPlatform.java b/src/main/java/org/apache/ddlutils/platform/mssql/MSSqlPlatform.java
index 354487c..ada4af1 100644
--- a/src/main/java/org/apache/ddlutils/platform/mssql/MSSqlPlatform.java
+++ b/src/main/java/org/apache/ddlutils/platform/mssql/MSSqlPlatform.java
@@ -37,6 +37,7 @@
 import org.apache.ddlutils.alteration.RemovePrimaryKeyChange;

 import org.apache.ddlutils.alteration.TableChange;

 import org.apache.ddlutils.alteration.TableDefinitionChangesPredicate;

+import org.apache.ddlutils.model.CascadeActionEnum;

 import org.apache.ddlutils.model.Column;

 import org.apache.ddlutils.model.Database;

 import org.apache.ddlutils.model.Table;

@@ -75,6 +76,8 @@
         info.setPrimaryKeyColumnAutomaticallyRequired(true);

         info.setIdentityColumnAutomaticallyRequired(true);

         info.setMultipleIdentityColumnsSupported(false);

+        info.setSupportedOnUpdateActions(new CascadeActionEnum[] { CascadeActionEnum.CASCADE, CascadeActionEnum.NONE });

+        info.setSupportedOnDeleteActions(new CascadeActionEnum[] { CascadeActionEnum.CASCADE, CascadeActionEnum.NONE });

 

         info.addNativeTypeMapping(Types.ARRAY,         "IMAGE",         Types.LONGVARBINARY);

         // BIGINT will be mapped back to BIGINT by the model reader 

diff --git a/src/main/java/org/apache/ddlutils/platform/mysql/MySqlPlatform.java b/src/main/java/org/apache/ddlutils/platform/mysql/MySqlPlatform.java
index f01c166..dd135ae 100644
--- a/src/main/java/org/apache/ddlutils/platform/mysql/MySqlPlatform.java
+++ b/src/main/java/org/apache/ddlutils/platform/mysql/MySqlPlatform.java
@@ -32,6 +32,7 @@
 import org.apache.ddlutils.alteration.RemovePrimaryKeyChange;

 import org.apache.ddlutils.alteration.TableChange;

 import org.apache.ddlutils.alteration.TableDefinitionChangesPredicate;

+import org.apache.ddlutils.model.CascadeActionEnum;

 import org.apache.ddlutils.model.Column;

 import org.apache.ddlutils.model.Database;

 import org.apache.ddlutils.model.Table;

@@ -75,6 +76,10 @@
         info.setCommentPrefix("#");

         // Double quotes are only allowed for delimiting identifiers if the server SQL mode includes ANSI_QUOTES 

         info.setDelimiterToken("`");

+        info.setSupportedOnUpdateActions(new CascadeActionEnum[] { CascadeActionEnum.NONE, CascadeActionEnum.RESTRICT,

+                                                                   CascadeActionEnum.CASCADE, CascadeActionEnum.SET_NULL });

+        info.setSupportedOnDeleteActions(new CascadeActionEnum[] { CascadeActionEnum.NONE, CascadeActionEnum.RESTRICT,

+                                                                   CascadeActionEnum.CASCADE, CascadeActionEnum.SET_NULL });

 

         info.addNativeTypeMapping(Types.ARRAY,         "LONGBLOB",   Types.LONGVARBINARY);

         info.addNativeTypeMapping(Types.BIT,           "TINYINT(1)");

diff --git a/src/test/java/org/apache/ddlutils/TestAgainstLiveDatabaseBase.java b/src/test/java/org/apache/ddlutils/TestAgainstLiveDatabaseBase.java
index f008a87..545ce1d 100644
--- a/src/test/java/org/apache/ddlutils/TestAgainstLiveDatabaseBase.java
+++ b/src/test/java/org/apache/ddlutils/TestAgainstLiveDatabaseBase.java
@@ -1308,28 +1308,27 @@
                          getPlatform().getSqlBuilder().shortenName(expected.getForeignTableName().toUpperCase(), getSqlBuilder().getMaxTableNameLength()),

                          getPlatform().getSqlBuilder().shortenName(actual.getForeignTableName().toUpperCase(), getSqlBuilder().getMaxTableNameLength()));

         }

-        if ((expected.getOnUpdate() == CascadeActionEnum.NONE) || (expected.getOnUpdate() == CascadeActionEnum.RESTRICT))

+

+        CascadeActionEnum realExpectedOnUpdateAction = expected.getOnUpdate();

+

+        if (!getPlatformInfo().isActionSupportedForOnUpdate(realExpectedOnUpdateAction))

         {

-            assertTrue("Not the same onUpdate setting in foreign key "+actual.getName()+".",

-                       (actual.getOnUpdate() == CascadeActionEnum.NONE) || (actual.getOnUpdate() == CascadeActionEnum.RESTRICT));

+            realExpectedOnUpdateAction = getPlatformInfo().getDefaultOnUpdateAction();

         }

-        else

+        assertEquals("Not the same onUpdate setting in foreign key "+actual.getName()+".",

+                     realExpectedOnUpdateAction,

+                     actual.getOnUpdate());

+

+        CascadeActionEnum realExpectedOnDeleteAction = expected.getOnDelete();

+

+        if (!getPlatformInfo().isActionSupportedForOnDelete(realExpectedOnDeleteAction))

         {

-            assertEquals("Not the same onUpdate setting in foreign key "+actual.getName()+".",

-                         expected.getOnUpdate(),

-                         actual.getOnUpdate());

+            realExpectedOnDeleteAction = getPlatformInfo().getDefaultOnDeleteAction();

         }

-        if ((expected.getOnDelete() == CascadeActionEnum.NONE) || (expected.getOnDelete() == CascadeActionEnum.RESTRICT))

-        {

-            assertTrue("Not the same onDelete setting in foreign key "+actual.getName()+".",

-                       (actual.getOnDelete() == CascadeActionEnum.NONE) || (actual.getOnDelete() == CascadeActionEnum.RESTRICT));

-        }

-        else

-        {

-            assertEquals("Not the same onDelete setting in foreign key "+actual.getName()+".",

-                         expected.getOnDelete(),

-                         actual.getOnDelete());

-        }

+        assertEquals("Not the same onDelete setting in foreign key "+actual.getName()+".",

+                     realExpectedOnDeleteAction,

+                     actual.getOnDelete());

+

         assertEquals("Not the same number of references in foreign key "+actual.getName()+".",

                      expected.getReferenceCount(),

                      actual.getReferenceCount());

diff --git a/src/test/java/org/apache/ddlutils/io/TestConstraints.java b/src/test/java/org/apache/ddlutils/io/TestConstraints.java
index 2af6c91..e66ea20 100644
--- a/src/test/java/org/apache/ddlutils/io/TestConstraints.java
+++ b/src/test/java/org/apache/ddlutils/io/TestConstraints.java
@@ -27,11 +27,8 @@
 import org.apache.commons.lang.StringUtils;

 import org.apache.ddlutils.DdlUtilsException;

 import org.apache.ddlutils.TestAgainstLiveDatabaseBase;

+import org.apache.ddlutils.model.CascadeActionEnum;

 import org.apache.ddlutils.model.Database;

-import org.apache.ddlutils.platform.derby.DerbyPlatform;

-import org.apache.ddlutils.platform.firebird.FirebirdPlatform;

-import org.apache.ddlutils.platform.mysql.MySql50Platform;

-import org.apache.ddlutils.platform.mysql.MySqlPlatform;

 import org.apache.ddlutils.platform.sybase.SybasePlatform;

 

 /**

@@ -485,45 +482,47 @@
      */

     public void testForeignKeyWithOnDeleteRestrict()

     {

-        if (!FirebirdPlatform.DATABASENAME.equals(getPlatform().getName()))

+        if (!getPlatformInfo().isActionSupportedForOnDelete(CascadeActionEnum.RESTRICT))

         {

-            final String modelXml = 

-                "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

-                "<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n"+

-                "  <table name='roundtrip_1'>\n"+

-                "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

-                "  </table>\n"+

-                "  <table name='roundtrip_2'>\n"+

-                "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

-                "    <column name='avalue' type='INTEGER' required='true'/>\n"+

-                "    <foreign-key foreignTable='roundtrip_1' onDelete='restrict'>\n"+

-                "      <reference local='avalue' foreign='pk'/>\n"+

-                "    </foreign-key>\n"+

-                "  </table>\n"+

-                "</database>";

-    

-            performConstraintsTest(modelXml, true);

-    

-            insertRow("roundtrip_1", new Object[] { new Integer(1) });

-            insertRow("roundtrip_2", new Object[] { new Integer(5), new Integer(1) });

-    

-            List beansTable1 = getRows("roundtrip_1");

-            List beansTable2 = getRows("roundtrip_2");

-    

-            assertEquals(1, beansTable1.size());

-            assertEquals(1, beansTable2.size());

-            assertEquals(new Integer(1), beansTable1.get(0), "pk");

-            assertEquals(new Integer(5), beansTable2.get(0), "pk");

-            assertEquals(new Integer(1), beansTable2.get(0), "avalue");

-    

-            try

-            {

-                deleteRow("roundtrip_1", new Object[] { new Integer(1) });

-                fail();

-            }

-            catch (DdlUtilsException ex)

-            {}

+            return;

         }

+

+        final String modelXml = 

+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

+            "<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n"+

+            "  <table name='roundtrip_1'>\n"+

+            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

+            "  </table>\n"+

+            "  <table name='roundtrip_2'>\n"+

+            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

+            "    <column name='avalue' type='INTEGER' required='true'/>\n"+

+            "    <foreign-key foreignTable='roundtrip_1' onDelete='restrict'>\n"+

+            "      <reference local='avalue' foreign='pk'/>\n"+

+            "    </foreign-key>\n"+

+            "  </table>\n"+

+            "</database>";

+

+        performConstraintsTest(modelXml, true);

+

+        insertRow("roundtrip_1", new Object[] { new Integer(1) });

+        insertRow("roundtrip_2", new Object[] { new Integer(5), new Integer(1) });

+

+        List beansTable1 = getRows("roundtrip_1");

+        List beansTable2 = getRows("roundtrip_2");

+

+        assertEquals(1, beansTable1.size());

+        assertEquals(1, beansTable2.size());

+        assertEquals(new Integer(1), beansTable1.get(0), "pk");

+        assertEquals(new Integer(5), beansTable2.get(0), "pk");

+        assertEquals(new Integer(1), beansTable2.get(0), "avalue");

+

+        try

+        {

+            deleteRow("roundtrip_1", new Object[] { new Integer(1) });

+            fail();

+        }

+        catch (DdlUtilsException ex)

+        {}

     }

 

     /**

@@ -531,6 +530,11 @@
      */

     public void testForeignKeyWithOnDeleteCascade()

     {

+        if (!getPlatformInfo().isActionSupportedForOnDelete(CascadeActionEnum.CASCADE))

+        {

+            return;

+        }

+

         final String modelXml = 

             "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

             "<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n"+

@@ -574,6 +578,11 @@
      */

     public void testForeignKeyWithOnDeleteSetNull()

     {

+        if (!getPlatformInfo().isActionSupportedForOnDelete(CascadeActionEnum.SET_NULL))

+        {

+            return;

+        }

+

         final String modelXml = 

             "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

             "<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n"+

@@ -615,56 +624,56 @@
     }

 

     /**

-     * Tests two tables with a foreign key with a det-default onDelete action. 

+     * Tests two tables with a foreign key with a set-default onDelete action. 

      */

     public void testForeignKeyWithOnDeleteSetDefault()

     {

-        if (!DerbyPlatform.DATABASENAME.equals(getPlatform().getName()) &&

-            !MySqlPlatform.DATABASENAME.equals(getPlatform().getName()) &&

-            !MySql50Platform.DATABASENAME.equals(getPlatform().getName()))

+        if (!getPlatformInfo().isActionSupportedForOnDelete(CascadeActionEnum.SET_DEFAULT))

         {

-            final String modelXml = 

-                "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

-                "<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n"+

-                "  <table name='roundtrip_1'>\n"+

-                "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

-                "  </table>\n"+

-                "  <table name='roundtrip_2'>\n"+

-                "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

-                "    <column name='avalue' type='INTEGER' required='false' default='2'/>\n"+

-                "    <foreign-key foreignTable='roundtrip_1' onDelete='setdefault'>\n"+

-                "      <reference local='avalue' foreign='pk'/>\n"+

-                "    </foreign-key>\n"+

-                "  </table>\n"+

-                "</database>";

-    

-            performConstraintsTest(modelXml, true);

-    

-            insertRow("roundtrip_1", new Object[] { new Integer(1) });

-            insertRow("roundtrip_1", new Object[] { new Integer(2) });

-            insertRow("roundtrip_2", new Object[] { new Integer(5), new Integer(1) });

-    

-            List beansTable1 = getRows("roundtrip_1");

-            List beansTable2 = getRows("roundtrip_2");

-    

-            assertEquals(2, beansTable1.size());

-            assertEquals(1, beansTable2.size());

-            assertEquals(new Integer(1), beansTable1.get(0), "pk");

-            assertEquals(new Integer(2), beansTable1.get(1), "pk");

-            assertEquals(new Integer(5), beansTable2.get(0), "pk");

-            assertEquals(new Integer(1), beansTable2.get(0), "avalue");

-    

-            deleteRow("roundtrip_1", new Object[] { new Integer(1) });

-    

-            beansTable1 = getRows("roundtrip_1");

-            beansTable2 = getRows("roundtrip_2");

-    

-            assertEquals(1, beansTable1.size());

-            assertEquals(1, beansTable2.size());

-            assertEquals(new Integer(2), beansTable1.get(0), "pk");

-            assertEquals(new Integer(5), beansTable2.get(0), "pk");

-            assertEquals(new Integer(2), beansTable2.get(0), "avalue");

+            return;

         }

+

+        final String modelXml = 

+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

+            "<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n"+

+            "  <table name='roundtrip_1'>\n"+

+            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

+            "  </table>\n"+

+            "  <table name='roundtrip_2'>\n"+

+            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

+            "    <column name='avalue' type='INTEGER' required='false' default='2'/>\n"+

+            "    <foreign-key foreignTable='roundtrip_1' onDelete='setdefault'>\n"+

+            "      <reference local='avalue' foreign='pk'/>\n"+

+            "    </foreign-key>\n"+

+            "  </table>\n"+

+            "</database>";

+

+        performConstraintsTest(modelXml, true);

+

+        insertRow("roundtrip_1", new Object[] { new Integer(1) });

+        insertRow("roundtrip_1", new Object[] { new Integer(2) });

+        insertRow("roundtrip_2", new Object[] { new Integer(5), new Integer(1) });

+

+        List beansTable1 = getRows("roundtrip_1");

+        List beansTable2 = getRows("roundtrip_2");

+

+        assertEquals(2, beansTable1.size());

+        assertEquals(1, beansTable2.size());

+        assertEquals(new Integer(1), beansTable1.get(0), "pk");

+        assertEquals(new Integer(2), beansTable1.get(1), "pk");

+        assertEquals(new Integer(5), beansTable2.get(0), "pk");

+        assertEquals(new Integer(1), beansTable2.get(0), "avalue");

+

+        deleteRow("roundtrip_1", new Object[] { new Integer(1) });

+

+        beansTable1 = getRows("roundtrip_1");

+        beansTable2 = getRows("roundtrip_2");

+

+        assertEquals(1, beansTable1.size());

+        assertEquals(1, beansTable2.size());

+        assertEquals(new Integer(2), beansTable1.get(0), "pk");

+        assertEquals(new Integer(5), beansTable2.get(0), "pk");

+        assertEquals(new Integer(2), beansTable2.get(0), "avalue");

     }

 

     /**

@@ -672,45 +681,47 @@
      */

     public void testForeignKeyWithOnUpdateRestrict()

     {

-        if (!FirebirdPlatform.DATABASENAME.equals(getPlatform().getName()))

+        if (!getPlatformInfo().isActionSupportedForOnUpdate(CascadeActionEnum.RESTRICT))

         {

-            final String modelXml = 

-                "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

-                "<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n"+

-                "  <table name='roundtrip_1'>\n"+

-                "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

-                "  </table>\n"+

-                "  <table name='roundtrip_2'>\n"+

-                "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

-                "    <column name='avalue' type='INTEGER' required='true'/>\n"+

-                "    <foreign-key foreignTable='roundtrip_1' onUpdate='restrict'>\n"+

-                "      <reference local='avalue' foreign='pk'/>\n"+

-                "    </foreign-key>\n"+

-                "  </table>\n"+

-                "</database>";

-    

-            performConstraintsTest(modelXml, true);

-    

-            insertRow("roundtrip_1", new Object[] { new Integer(1) });

-            insertRow("roundtrip_2", new Object[] { new Integer(5), new Integer(1) });

-    

-            List beansTable1 = getRows("roundtrip_1");

-            List beansTable2 = getRows("roundtrip_2");

-    

-            assertEquals(1, beansTable1.size());

-            assertEquals(1, beansTable2.size());

-            assertEquals(new Integer(1), beansTable1.get(0), "pk");

-            assertEquals(new Integer(5), beansTable2.get(0), "pk");

-            assertEquals(new Integer(1), beansTable2.get(0), "avalue");

-    

-            try

-            {

-                updateRow("roundtrip_1", (DynaBean)beansTable1.get(0), new Object[] { new Integer(5) });

-                fail();

-            }

-            catch (DdlUtilsException ex)

-            {}

+            return;

         }

+

+        final String modelXml = 

+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

+            "<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n"+

+            "  <table name='roundtrip_1'>\n"+

+            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

+            "  </table>\n"+

+            "  <table name='roundtrip_2'>\n"+

+            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

+            "    <column name='avalue' type='INTEGER' required='true'/>\n"+

+            "    <foreign-key foreignTable='roundtrip_1' onUpdate='restrict'>\n"+

+            "      <reference local='avalue' foreign='pk'/>\n"+

+            "    </foreign-key>\n"+

+            "  </table>\n"+

+            "</database>";

+

+        performConstraintsTest(modelXml, true);

+

+        insertRow("roundtrip_1", new Object[] { new Integer(1) });

+        insertRow("roundtrip_2", new Object[] { new Integer(5), new Integer(1) });

+

+        List beansTable1 = getRows("roundtrip_1");

+        List beansTable2 = getRows("roundtrip_2");

+

+        assertEquals(1, beansTable1.size());

+        assertEquals(1, beansTable2.size());

+        assertEquals(new Integer(1), beansTable1.get(0), "pk");

+        assertEquals(new Integer(5), beansTable2.get(0), "pk");

+        assertEquals(new Integer(1), beansTable2.get(0), "avalue");

+

+        try

+        {

+            updateRow("roundtrip_1", (DynaBean)beansTable1.get(0), new Object[] { new Integer(5) });

+            fail();

+        }

+        catch (DdlUtilsException ex)

+        {}

     }

 

     /**

@@ -718,48 +729,50 @@
      */

     public void testForeignKeyWithOnUpdateCascade()

     {

-        if (!DerbyPlatform.DATABASENAME.equals(getPlatform().getName()))

+        if (!getPlatformInfo().isActionSupportedForOnUpdate(CascadeActionEnum.CASCADE))

         {

-            final String modelXml = 

-                "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

-                "<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n"+

-                "  <table name='roundtrip_1'>\n"+

-                "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

-                "  </table>\n"+

-                "  <table name='roundtrip_2'>\n"+

-                "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

-                "    <column name='avalue' type='INTEGER' required='true'/>\n"+

-                "    <foreign-key foreignTable='roundtrip_1' onUpdate='cascade'>\n"+

-                "      <reference local='avalue' foreign='pk'/>\n"+

-                "    </foreign-key>\n"+

-                "  </table>\n"+

-                "</database>";

-    

-            performConstraintsTest(modelXml, true);

-    

-            insertRow("roundtrip_1", new Object[] { new Integer(1) });

-            insertRow("roundtrip_2", new Object[] { new Integer(5), new Integer(1) });

-    

-            List beansTable1 = getRows("roundtrip_1");

-            List beansTable2 = getRows("roundtrip_2");

-    

-            assertEquals(1, beansTable1.size());

-            assertEquals(1, beansTable2.size());

-            assertEquals(new Integer(1), beansTable1.get(0), "pk");

-            assertEquals(new Integer(5), beansTable2.get(0), "pk");

-            assertEquals(new Integer(1), beansTable2.get(0), "avalue");

-    

-            updateRow("roundtrip_1", (DynaBean)beansTable1.get(0), new Object[] { new Integer(2) });

-    

-            beansTable1 = getRows("roundtrip_1");

-            beansTable2 = getRows("roundtrip_2");

-    

-            assertEquals(1, beansTable1.size());

-            assertEquals(1, beansTable2.size());

-            assertEquals(new Integer(2), beansTable1.get(0), "pk");

-            assertEquals(new Integer(5), beansTable2.get(0), "pk");

-            assertEquals(new Integer(2), beansTable2.get(0), "avalue");

+            return;

         }

+

+        final String modelXml = 

+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

+            "<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n"+

+            "  <table name='roundtrip_1'>\n"+

+            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

+            "  </table>\n"+

+            "  <table name='roundtrip_2'>\n"+

+            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

+            "    <column name='avalue' type='INTEGER' required='true'/>\n"+

+            "    <foreign-key foreignTable='roundtrip_1' onUpdate='cascade'>\n"+

+            "      <reference local='avalue' foreign='pk'/>\n"+

+            "    </foreign-key>\n"+

+            "  </table>\n"+

+            "</database>";

+

+        performConstraintsTest(modelXml, true);

+

+        insertRow("roundtrip_1", new Object[] { new Integer(1) });

+        insertRow("roundtrip_2", new Object[] { new Integer(5), new Integer(1) });

+

+        List beansTable1 = getRows("roundtrip_1");

+        List beansTable2 = getRows("roundtrip_2");

+

+        assertEquals(1, beansTable1.size());

+        assertEquals(1, beansTable2.size());

+        assertEquals(new Integer(1), beansTable1.get(0), "pk");

+        assertEquals(new Integer(5), beansTable2.get(0), "pk");

+        assertEquals(new Integer(1), beansTable2.get(0), "avalue");

+

+        updateRow("roundtrip_1", (DynaBean)beansTable1.get(0), new Object[] { new Integer(2) });

+

+        beansTable1 = getRows("roundtrip_1");

+        beansTable2 = getRows("roundtrip_2");

+

+        assertEquals(1, beansTable1.size());

+        assertEquals(1, beansTable2.size());

+        assertEquals(new Integer(2), beansTable1.get(0), "pk");

+        assertEquals(new Integer(5), beansTable2.get(0), "pk");

+        assertEquals(new Integer(2), beansTable2.get(0), "avalue");

     }

 

     /**

@@ -767,48 +780,50 @@
      */

     public void testForeignKeyWithOnUpdateSetNull()

     {

-        if (!DerbyPlatform.DATABASENAME.equals(getPlatform().getName()))

+        if (!getPlatformInfo().isActionSupportedForOnUpdate(CascadeActionEnum.SET_NULL))

         {

-            final String modelXml = 

-                "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

-                "<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n"+

-                "  <table name='roundtrip_1'>\n"+

-                "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

-                "  </table>\n"+

-                "  <table name='roundtrip_2'>\n"+

-                "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

-                "    <column name='avalue' type='INTEGER' required='false'/>\n"+

-                "    <foreign-key foreignTable='roundtrip_1' onUpdate='setnull'>\n"+

-                "      <reference local='avalue' foreign='pk'/>\n"+

-                "    </foreign-key>\n"+

-                "  </table>\n"+

-                "</database>";

-    

-            performConstraintsTest(modelXml, true);

-    

-            insertRow("roundtrip_1", new Object[] { new Integer(1) });

-            insertRow("roundtrip_2", new Object[] { new Integer(5), new Integer(1) });

-    

-            List beansTable1 = getRows("roundtrip_1");

-            List beansTable2 = getRows("roundtrip_2");

-    

-            assertEquals(1, beansTable1.size());

-            assertEquals(1, beansTable2.size());

-            assertEquals(new Integer(1), beansTable1.get(0), "pk");

-            assertEquals(new Integer(5), beansTable2.get(0), "pk");

-            assertEquals(new Integer(1), beansTable2.get(0), "avalue");

-    

-            updateRow("roundtrip_1", (DynaBean)beansTable1.get(0), new Object[] { new Integer(2) });

-    

-            beansTable1 = getRows("roundtrip_1");

-            beansTable2 = getRows("roundtrip_2");

-    

-            assertEquals(1, beansTable1.size());

-            assertEquals(1, beansTable2.size());

-            assertEquals(new Integer(2), beansTable1.get(0), "pk");

-            assertEquals(new Integer(5), beansTable2.get(0), "pk");

-            assertEquals((Object)null, beansTable2.get(0), "avalue");

+            return;

         }

+

+        final String modelXml = 

+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

+            "<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n"+

+            "  <table name='roundtrip_1'>\n"+

+            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

+            "  </table>\n"+

+            "  <table name='roundtrip_2'>\n"+

+            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

+            "    <column name='avalue' type='INTEGER' required='false'/>\n"+

+            "    <foreign-key foreignTable='roundtrip_1' onUpdate='setnull'>\n"+

+            "      <reference local='avalue' foreign='pk'/>\n"+

+            "    </foreign-key>\n"+

+            "  </table>\n"+

+            "</database>";

+

+        performConstraintsTest(modelXml, true);

+

+        insertRow("roundtrip_1", new Object[] { new Integer(1) });

+        insertRow("roundtrip_2", new Object[] { new Integer(5), new Integer(1) });

+

+        List beansTable1 = getRows("roundtrip_1");

+        List beansTable2 = getRows("roundtrip_2");

+

+        assertEquals(1, beansTable1.size());

+        assertEquals(1, beansTable2.size());

+        assertEquals(new Integer(1), beansTable1.get(0), "pk");

+        assertEquals(new Integer(5), beansTable2.get(0), "pk");

+        assertEquals(new Integer(1), beansTable2.get(0), "avalue");

+

+        updateRow("roundtrip_1", (DynaBean)beansTable1.get(0), new Object[] { new Integer(2) });

+

+        beansTable1 = getRows("roundtrip_1");

+        beansTable2 = getRows("roundtrip_2");

+

+        assertEquals(1, beansTable1.size());

+        assertEquals(1, beansTable2.size());

+        assertEquals(new Integer(2), beansTable1.get(0), "pk");

+        assertEquals(new Integer(5), beansTable2.get(0), "pk");

+        assertEquals((Object)null, beansTable2.get(0), "avalue");

     }

 

     /**

@@ -816,52 +831,52 @@
      */

     public void testForeignKeyWithOnUpdateSetDefault()

     {

-        if (!DerbyPlatform.DATABASENAME.equals(getPlatform().getName()) &&

-            !MySqlPlatform.DATABASENAME.equals(getPlatform().getName()) &&

-            !MySql50Platform.DATABASENAME.equals(getPlatform().getName()))

+        if (!getPlatformInfo().isActionSupportedForOnUpdate(CascadeActionEnum.SET_DEFAULT))

         {

-            final String modelXml =

-                "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

-                "<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n"+

-                "  <table name='roundtrip_1'>\n"+

-                "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

-                "  </table>\n"+

-                "  <table name='roundtrip_2'>\n"+

-                "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

-                "    <column name='avalue' type='INTEGER' required='false' default='1'/>\n"+

-                "    <foreign-key foreignTable='roundtrip_1' onUpdate='setdefault'>\n"+

-                "      <reference local='avalue' foreign='pk'/>\n"+

-                "    </foreign-key>\n"+

-                "  </table>\n"+

-                "</database>";

-

-            performConstraintsTest(modelXml, true);

-    

-            insertRow("roundtrip_1", new Object[] { new Integer(1) });

-            insertRow("roundtrip_1", new Object[] { new Integer(2) });

-            insertRow("roundtrip_2", new Object[] { new Integer(5), new Integer(2) });

-    

-            List beansTable1 = getRows("roundtrip_1");

-            List beansTable2 = getRows("roundtrip_2");

-    

-            assertEquals(2, beansTable1.size());

-            assertEquals(1, beansTable2.size());

-            assertEquals(new Integer(1), beansTable1.get(0), "pk");

-            assertEquals(new Integer(2), beansTable1.get(1), "pk");

-            assertEquals(new Integer(5), beansTable2.get(0), "pk");

-            assertEquals(new Integer(2), beansTable2.get(0), "avalue");

-    

-            updateRow("roundtrip_1", (DynaBean)beansTable1.get(1), new Object[] { new Integer(0) });

-    

-            beansTable1 = getRows("roundtrip_1", "pk");

-            beansTable2 = getRows("roundtrip_2", "pk");

-    

-            assertEquals(2, beansTable1.size());

-            assertEquals(1, beansTable2.size());

-            assertEquals(new Integer(0), beansTable1.get(0), "pk");

-            assertEquals(new Integer(1), beansTable1.get(1), "pk");

-            assertEquals(new Integer(5), beansTable2.get(0), "pk");

-            assertEquals(new Integer(1), beansTable2.get(0), "avalue");

+            return;

         }

+

+        final String modelXml =

+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

+            "<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='roundtriptest'>\n"+

+            "  <table name='roundtrip_1'>\n"+

+            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

+            "  </table>\n"+

+            "  <table name='roundtrip_2'>\n"+

+            "    <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+

+            "    <column name='avalue' type='INTEGER' required='false' default='1'/>\n"+

+            "    <foreign-key foreignTable='roundtrip_1' onUpdate='setdefault'>\n"+

+            "      <reference local='avalue' foreign='pk'/>\n"+

+            "    </foreign-key>\n"+

+            "  </table>\n"+

+            "</database>";

+

+        performConstraintsTest(modelXml, true);

+

+        insertRow("roundtrip_1", new Object[] { new Integer(1) });

+        insertRow("roundtrip_1", new Object[] { new Integer(2) });

+        insertRow("roundtrip_2", new Object[] { new Integer(5), new Integer(2) });

+

+        List beansTable1 = getRows("roundtrip_1");

+        List beansTable2 = getRows("roundtrip_2");

+

+        assertEquals(2, beansTable1.size());

+        assertEquals(1, beansTable2.size());

+        assertEquals(new Integer(1), beansTable1.get(0), "pk");

+        assertEquals(new Integer(2), beansTable1.get(1), "pk");

+        assertEquals(new Integer(5), beansTable2.get(0), "pk");

+        assertEquals(new Integer(2), beansTable2.get(0), "avalue");

+

+        updateRow("roundtrip_1", (DynaBean)beansTable1.get(1), new Object[] { new Integer(0) });

+

+        beansTable1 = getRows("roundtrip_1", "pk");

+        beansTable2 = getRows("roundtrip_2", "pk");

+

+        assertEquals(2, beansTable1.size());

+        assertEquals(1, beansTable2.size());

+        assertEquals(new Integer(0), beansTable1.get(0), "pk");

+        assertEquals(new Integer(1), beansTable1.get(1), "pk");

+        assertEquals(new Integer(5), beansTable2.get(0), "pk");

+        assertEquals(new Integer(1), beansTable2.get(0), "avalue");

     }

 }