You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tuscany.apache.org by Brent Daniel <br...@gmail.com> on 2006/07/24 21:43:26 UTC

[PATCH] Improve DAS test coverage

The attached patch has three changes in response to coverage data:

1) Some dead internal code has been removed
2) Test cases have been updated to test some corner cases that weren't
being covered
3) A fix to operation sorting for deletes (this was not being tested
previously.)

Brent

Re: [PATCH] Improve DAS test coverage

Posted by Jim Marino <jm...@myromatours.com>.
I've found it helpful for exactly too and you can get a free open  
source license.  At times it is too strict (e.g. flagging getter/ 
setters) but overall it is great for seeing untested portions of code  
and is simple to setup.

Jim


On Jul 24, 2006, at 7:26 PM, Brent Daniel wrote:

> Kevin,
>
>  The data came from the Clover tool mentioned on the dev list
> recently (www.cenqua.com/clover). I'm using the eclipse plugin. I have
> some minor issues with it (for example, any refactoring will
> immediately flag every line of code as not executed, producing a ton
> of warnings in eclipse.) Overall, it's pretty nice, and is a lot
> lighter weight than some other tools I've used.
>
> Brent
>
>
> On 7/24/06, Kevin Williams <ke...@qwest.net> wrote:
>> Brent,
>> This looks good.  What tool provided the coverage data?
>> Thanks,
>> --Kevin
>>
>>
>> Brent Daniel wrote:
>>
>> > The attached patch has three changes in response to coverage data:
>> >
>> > 1) Some dead internal code has been removed
>> > 2) Test cases have been updated to test some corner cases that  
>> weren't
>> > being covered
>> > 3) A fix to operation sorting for deletes (this was not being  
>> tested
>> > previously.)
>> >
>> > Brent
>> >
>> >-------------------------------------------------------------------- 
>> ----
>> >
>> >Index: src/test/java/org/apache/tuscany/das/rdb/test/ 
>> OperationOrderingTests.java
>> >===================================================================
>> >--- src/test/java/org/apache/tuscany/das/rdb/test/ 
>> OperationOrderingTests.java  (revision 425121)
>> >+++ src/test/java/org/apache/tuscany/das/rdb/test/ 
>> OperationOrderingTests.java  (working copy)
>> >@@ -16,6 +16,9 @@
>> >  */
>> > package org.apache.tuscany.das.rdb.test;
>> >
>> >+import java.util.ArrayList;
>> >+import java.util.Iterator;
>> >+
>> > import org.apache.tuscany.das.rdb.Command;
>> > import org.apache.tuscany.das.rdb.DAS;
>> > import org.apache.tuscany.das.rdb.test.data.CityData;
>> >@@ -75,4 +78,44 @@
>> >               assertEquals(numberOfStates + 1, root.getList 
>> ("STATES").size());
>> >       }
>> >
>> >+      public void testDeletes() throws Exception {
>> >+              DAS das = DAS.FACTORY.createDAS(getConfig 
>> ("cityStates.xml"), getConnection());
>> >+              Command select = das
>> >+                              .createCommand(
>> >+                                              "Select * from  
>> STATES inner join CITIES on STATES.ID = CITIES.STATE_ID");
>> >+              DataObject root = select.executeQuery();
>> >+
>> >+
>> >+              DataObject firstState = root.getDataObject("STATES 
>> [1]");
>> >+              String stateName = firstState.getString("NAME");
>> >+
>> >+              ArrayList cityNames = new ArrayList();
>> >+              Iterator i = firstState.getList("cities").iterator();
>> >+              while ( i.hasNext()) {
>> >+                      DataObject firstCity = (DataObject) i.next();
>> >+                      cityNames.add(firstCity.getString("NAME"));
>> >+                      firstCity.delete();
>> >+              }
>> >+              firstState.delete();
>> >+
>> >+
>> >+
>> >+
>> >+              das.applyChanges(root);
>> >+
>> >+              root = select.executeQuery();
>> >+
>> >+              Iterator iter = root.getList("STATES").iterator();
>> >+              while ( iter.hasNext()) {
>> >+                      DataObject state = (DataObject)iter.next();
>> >+                      assertFalse(state.getString("NAME").equals 
>> (stateName));
>> >+              }
>> >+
>> >+              iter = root.getList("CITIES").iterator();
>> >+              while ( iter.hasNext()) {
>> >+                      DataObject city = (DataObject)iter.next();
>> >+                      assertFalse(cityNames.contains 
>> (city.getString("NAME")));
>> >+              }
>> >+
>> >+      }
>> > }
>> >Index: src/test/java/org/apache/tuscany/das/rdb/test/ 
>> ExceptionTests.java
>> >===================================================================
>> >--- src/test/java/org/apache/tuscany/das/rdb/test/ 
>> ExceptionTests.java  (revision 425121)
>> >+++ src/test/java/org/apache/tuscany/das/rdb/test/ 
>> ExceptionTests.java  (working copy)
>> >@@ -16,6 +16,7 @@
>> >  */
>> > package org.apache.tuscany.das.rdb.test;
>> >
>> >+import java.io.FileInputStream;
>> > import java.sql.Connection;
>> >
>> > import org.apache.tuscany.das.rdb.Command;
>> >@@ -26,6 +27,7 @@
>> > import org.apache.tuscany.das.rdb.test.data.OrderData;
>> > import org.apache.tuscany.das.rdb.test.data.OrderDetailsData;
>> > import org.apache.tuscany.das.rdb.test.framework.DasTest;
>> >+import org.apache.tuscany.das.rdb.util.ConfigUtil;
>> > import org.apache.tuscany.sdo.util.SDOUtil;
>> >
>> > public class ExceptionTests extends DasTest {
>> >@@ -133,5 +135,6 @@
>> >
>> >     }
>> >
>> >+
>> >
>> > }
>> >Index: src/test/java/org/apache/tuscany/das/rdb/test/ 
>> CrudWithChangeHistory.java
>> >===================================================================
>> >--- src/test/java/org/apache/tuscany/das/rdb/test/ 
>> CrudWithChangeHistory.java   (revision 425121)
>> >+++ src/test/java/org/apache/tuscany/das/rdb/test/ 
>> CrudWithChangeHistory.java   (working copy)
>> >@@ -48,6 +48,41 @@
>> >         super.tearDown();
>> >     }
>> >
>> >+    public void testDeleteAndCreate() throws Exception {
>> >+              DAS das = DAS.FACTORY.createDAS(
>> >+                              getConfig 
>> ("basicCustomerMappingWithCUD2.xml"), getConnection());
>> >+              // Read customer 1
>> >+              Command select = das
>> >+                              .createCommand("Select * from  
>> CUSTOMER");
>> >+              DataObject root = select.executeQuery();
>> >+
>> >+              DataObject customer = (DataObject) root.get 
>> ("CUSTOMER[1]");
>> >+
>> >+              int customerId = customer.getInt("ID");
>> >+              // Modify customer
>> >+              customer.delete();
>> >+
>> >+              DataObject newCustomer = root.createDataObject 
>> ("CUSTOMER");
>> >+              newCustomer.setInt("ID", 9999);
>> >+              newCustomer.setString("LASTNAME", "Jones");
>> >+
>> >+              // Build apply changes command
>> >+              das.applyChanges(root);
>> >+
>> >+              // Verify changes
>> >+              root = select.executeQuery();
>> >+              boolean found = false;
>> >+              Iterator i = root.getList("CUSTOMER").iterator();
>> >+              while ( i.hasNext()) {
>> >+                      customer = (DataObject)i.next();
>> >+                      assertFalse(customerId == customer.getInt 
>> ("ID"));
>> >+                      if ( customer.getInt("ID") == 9999 )
>> >+                              found = true;
>> >+              }
>> >+
>> >+              assertTrue(found);
>> >+
>> >+      }
>> >     /**
>> >      * Read and modify a customer. Provide needed Create/Update/ 
>> Delete
>> >      * statements programatically
>> >Index: src/test/java/org/apache/tuscany/das/rdb/test/OCCTests.java
>> >===================================================================
>> >--- src/test/java/org/apache/tuscany/das/rdb/test/ 
>> OCCTests.java        (revision 425121)
>> >+++ src/test/java/org/apache/tuscany/das/rdb/test/ 
>> OCCTests.java        (working copy)
>> >@@ -17,7 +17,10 @@
>> > package org.apache.tuscany.das.rdb.test;
>> >
>> > import org.apache.tuscany.das.rdb.Command;
>> >+import org.apache.tuscany.das.rdb.ConfigHelper;
>> > import org.apache.tuscany.das.rdb.DAS;
>> >+import org.apache.tuscany.das.rdb.config.Config;
>> >+import org.apache.tuscany.das.rdb.config.ConfigFactory;
>> > import org.apache.tuscany.das.rdb.test.data.BookData;
>> > import org.apache.tuscany.das.rdb.test.framework.DasTest;
>> >
>> >@@ -99,4 +102,29 @@
>> >                               throw ex;
>> >               }
>> >       }
>> >+
>> >+      public void testProvidedConfig() throws Exception {
>> >+              // Create config programmatically
>> >+              Config config = ConfigFactory.INSTANCE.createConfig 
>> ();
>> >+              ConfigHelper helper = new ConfigHelper(config);
>> >+              helper.addPrimaryKey("BOOK.BOOK_ID");
>> >+              DAS das = DAS.FACTORY.createDAS(helper.getConfig 
>> (), getConnection());
>> >+
>> >+              // Read a book instance
>> >+              Command select = das
>> >+                              .createCommand("SELECT * FROM BOOK  
>> WHERE BOOK_ID = 1");
>> >+              DataObject root = select.executeQuery();
>> >+              DataObject book = root.getDataObject("BOOK[1]");
>> >+              // Change a field to mark the instance 'dirty'
>> >+              book.setInt("QUANTITY", 2);
>> >+
>> >+              // Flush the change
>> >+
>> >+              das.applyChanges(root);
>> >+
>> >+              // Verify
>> >+              root = select.executeQuery();
>> >+              book = root.getDataObject("BOOK[1]");
>> >+              assertEquals(2, book.getInt("QUANTITY"));
>> >+      }
>> > }
>> >Index: src/test/java/org/apache/tuscany/das/rdb/test/ 
>> ConverterTests.java
>> >===================================================================
>> >--- src/test/java/org/apache/tuscany/das/rdb/test/ 
>> ConverterTests.java  (revision 425121)
>> >+++ src/test/java/org/apache/tuscany/das/rdb/test/ 
>> ConverterTests.java  (working copy)
>> >@@ -23,8 +23,11 @@
>> >
>> > import org.apache.tuscany.das.rdb.Command;
>> > import org.apache.tuscany.das.rdb.DAS;
>> >+import org.apache.tuscany.das.rdb.test.customer.Customer;
>> >+import org.apache.tuscany.das.rdb.test.customer.CustomerFactory;
>> > import org.apache.tuscany.das.rdb.test.data.CustomerData;
>> > import org.apache.tuscany.das.rdb.test.framework.DasTest;
>> >+import org.apache.tuscany.sdo.util.SDOUtil;
>> >
>> > import commonj.sdo.DataObject;
>> >
>> >@@ -99,4 +102,59 @@
>> >
>> >       }
>> >
>> >+      public void testInvalidConverter1() throws Exception {
>> >+
>> >+              DAS das = DAS.FACTORY.createDAS(getConfig 
>> ("InvalidConverter.xml"), getConnection());
>> >+
>> >+              // Build the select command to read a specific  
>> customer and related
>> >+              // orders
>> >+              Command select = das
>> >+                              .createCommand(
>> >+                                              "SELECT * FROM  
>> CUSTOMER LEFT JOIN ANORDER ON CUSTOMER.ID = ANORDER.CUSTOMER_ID  
>> where CUSTOMER.ID = ?");
>> >+
>> >+              // Parameterize the command
>> >+              select.setParameter(1, new Integer(1));
>> >+
>> >+              // Get the graph
>> >+              try {
>> >+                      select.executeQuery();
>> >+              } catch (Exception ex) {
>> >+                      assertEquals 
>> ("java.lang.ClassNotFoundException: not.a.valid.class",  
>> ex.getMessage());
>> >+              }
>> >+
>> >+
>> >+      }
>> >+
>> >+      public void testInvalidConverter2() throws Exception {
>> >+
>> >+              SDOUtil.registerStaticTypes(CustomerFactory.class);
>> >+              DAS das = DAS.FACTORY.createDAS(getConfig 
>> ("InvalidConverter.xml"), getConnection());
>> >+
>> >+              // Build the select command to read a specific  
>> customer and related
>> >+              // orders
>> >+              Command select = das
>> >+                              .createCommand(
>> >+                                              "SELECT * FROM  
>> ANORDER");
>> >+
>> >+              // Get the graph
>> >+
>> >+              DataObject root = select.executeQuery();
>> >+              DataObject order = root.getDataObject("AnOrder[1]");
>> >+
>> >+              Customer customer = (Customer)  
>> root.createDataObject("Customer");
>> >+              customer.setID(700);
>> >+              customer.setLastName("Daniel");
>> >+              customer.setAddress("an address");
>> >+
>> >+              customer.getOrders().add(order);
>> >+
>> >+              try {
>> >+                      das.applyChanges(root);
>> >+              } catch (Exception ex) {
>> >+                      assertEquals 
>> ("java.lang.ClassNotFoundException: not.a.valid.class",  
>> ex.getMessage());
>> >+              }
>> >+
>> >+
>> >+      }
>> >+
>> > }
>> >Index: src/test/java/org/apache/tuscany/das/rdb/test/ 
>> GeneratedId.java
>> >===================================================================
>> >--- src/test/java/org/apache/tuscany/das/rdb/test/ 
>> GeneratedId.java     (revision 425121)
>> >+++ src/test/java/org/apache/tuscany/das/rdb/test/ 
>> GeneratedId.java     (working copy)
>> >@@ -22,6 +22,8 @@
>> >  *
>> >  */
>> >
>> >+import java.util.Iterator;
>> >+
>> > import org.apache.tuscany.das.rdb.Command;
>> > import org.apache.tuscany.das.rdb.DAS;
>> > import org.apache.tuscany.das.rdb.test.data.CompanyData;
>> >@@ -100,6 +102,31 @@
>> >
>> >     }
>> >
>> >+    // Test insert into row with generated ID and generated insert
>> >+    public void testInsert4() throws Exception {
>> >+
>> >+      DAS das = DAS.FACTORY.createDAS(getConfig 
>> ("CompanyConfig.xml"),getConnection());
>> >+        Command select = das.getCommand("all companies");
>> >+        DataObject root = select.executeQuery();
>> >+
>> >+        DataObject company = root.createDataObject("COMPANY");
>> >+        company.setString("NAME", "Phil's Tires");
>> >+        // This shouldn't do anything
>> >+        company.setInt("ID", 999);
>> >+
>> >+        das.applyChanges(root);
>> >+
>> >+        // Verify insert
>> >+        root = select.executeQuery();
>> >+
>> >+        assertEquals(4, root.getList("COMPANY").size());
>> >+        Iterator i = root.getList("COMPANY").iterator();
>> >+        while ( i.hasNext()) {
>> >+              DataObject comp = (DataObject)i.next();
>> >+              assertFalse( comp.getInt("ID") == 999);
>> >+        }
>> >+
>> >+    }
>> >     // Test ability to propogate generated values back to owning  
>> data objects
>> >     public void testPropagateIds() throws Exception {
>> >
>> >Index: src/test/java/org/apache/tuscany/das/rdb/test/ 
>> CompoundKeyTests.java
>> >===================================================================
>> >--- src/test/java/org/apache/tuscany/das/rdb/test/ 
>> CompoundKeyTests.java        (revision 425121)
>> >+++ src/test/java/org/apache/tuscany/das/rdb/test/ 
>> CompoundKeyTests.java        (working copy)
>> >@@ -92,4 +92,21 @@
>> >         assertEquals(2, firstOrder.getList("ORDERDETAILS").size());
>> >
>> >     }
>> >+
>> >+    public void testReadAndDelete() throws Exception {
>> >+      DAS das = DAS.FACTORY.createDAS(getConfig 
>> ("OrdersOrderDetailsConfig.xml"), getConnection());
>> >+        Command getOrderDetails = das
>> >+                .createCommand("Select * from ORDERDETAILS where  
>> ORDERID = ? AND PRODUCTID = ?");
>> >+
>> >+
>> >+        getOrderDetails.setParameter(1, new Integer(1));
>> >+        getOrderDetails.setParameter(2, new Integer(1));
>> >+
>> >+        DataObject root = getOrderDetails.executeQuery();
>> >+
>> >+        DataObject orderDetail = (DataObject) root.get 
>> ("ORDERDETAILS[1]");
>> >+        orderDetail.delete();
>> >+        das.applyChanges(root);
>> >+
>> >+    }
>> > }
>> >Index: src/test/resources/BooksConfig.xml
>> >===================================================================
>> >--- src/test/resources/BooksConfig.xml (revision 425121)
>> >+++ src/test/resources/BooksConfig.xml (working copy)
>> >@@ -21,7 +21,7 @@
>> >
>> >       <Table tableName="BOOK">
>> >         <Column columnName="BOOK_ID" primaryKey="true"/>
>> >-          <Column columnName="OCC" collision="true"/>
>> >+          <Column columnName="OCC" collision="true"  
>> propertyName="anOccColumn"/>
>> >     </Table>
>> >
>> > </Config>
>> >Index: src/test/resources/InvalidConverter.xml
>> >===================================================================
>> >--- /dev/null  (revision 0)
>> >+++ src/test/resources/InvalidConverter.xml    (revision 0)
>> >@@ -0,0 +1,35 @@
>> >+<?xml version="1.0" encoding="ASCII"?>
>> >+<!--
>> >+  Copyright (c) 2005 The Apache Software Foundation or its  
>> licensors, as applicable.
>> >+
>> >+  Licensed under the Apache License, Version 2.0 (the "License");
>> >+  you may not use this file except in compliance with the License.
>> >+  You may obtain a copy of the License at
>> >+
>> >+     http://www.apache.org/licenses/LICENSE-2.0
>> >+
>> >+  Unless required by applicable law or agreed to in writing,  
>> software
>> >+  distributed under the License is distributed on an "AS IS" BASIS,
>> >+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express  
>> or implied.
>> >+  See the License for the specific language governing  
>> permissions and
>> >+  limitations under the License.
>> >+ -->
>> >+<Config xsi:noNamespaceSchemaLocation="http:/// 
>> org.apache.tuscany.das.rdb/config.xsd"
>> >+xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>> >+dataObjectModel="http:///org.apache.tuscany.das.rdb.test/ 
>> customer.xsd">
>> >+
>> >+  <Table tableName="CUSTOMER" typeName="Customer">
>> >+    <Column columnName="ID"  primaryKey="true"  
>> converterClassName="not.a.valid.class"/>
>> >+  </Table>
>> >+
>> >+  <Table tableName="ANORDER" typeName="AnOrder">
>> >+      <Column columnName="CUSTOMER_ID"/>
>> >+    <Column columnName="ID"  primaryKey="true"/>
>> >+  </Table>
>> >+
>> >+  <Relationship name="orders" primaryKeyTable="CUSTOMER"  
>> foreignKeyTable="ANORDER" many="true">
>> >+     <KeyPair primaryKeyColumn="ID"  
>> foreignKeyColumn="CUSTOMER_ID"/>
>> >+  </Relationship>
>> >+
>> >+</Config>
>> >+
>> >Index: src/main/java/org/apache/tuscany/das/rdb/impl/ 
>> ApplyChangesCommandImpl.java
>> >===================================================================
>> >--- src/main/java/org/apache/tuscany/das/rdb/impl/ 
>> ApplyChangesCommandImpl.java (revision 425121)
>> >+++ src/main/java/org/apache/tuscany/das/rdb/impl/ 
>> ApplyChangesCommandImpl.java (working copy)
>> >@@ -34,13 +34,6 @@
>> >     private static final boolean debug = false;
>> >
>> >     private ChangeSummarizer summarizer = new ChangeSummarizer();
>> >-
>> >-    public ApplyChangesCommandImpl() {
>> >-    }
>> >-
>> >-    public ApplyChangesCommandImpl(Config config){
>> >-      this.configWrapper = new MappingWrapper(config);
>> >-    }
>> >
>> >     public ApplyChangesCommandImpl(Config config, Connection  
>> connection){
>> >         this.configWrapper = new MappingWrapper(config);
>> >@@ -53,18 +46,7 @@
>> >               summarizer.setConnection(connection);
>> >       }
>> >
>> >-    public void addCreateCommand(Type type, Command cmd) {
>> >-        summarizer.addCreateCommand(type, cmd);
>> >-    }
>> >
>> >-    public void addUpdateCommand(Type type, Command cmd) {
>> >-        summarizer.addUpdateCommand(type, cmd);
>> >-    }
>> >-
>> >-    public void addDeleteCommand(Type type, Command cmd) {
>> >-        summarizer.addDeleteCommand(type, cmd);
>> >-    }
>> >-
>> >     public void execute(DataObject root) {
>> >         DebugUtil.debugln(getClass(), debug, "Executing  
>> ApplyChangesCmd");
>> >
>> >Index: src/main/java/org/apache/tuscany/das/rdb/impl/ 
>> FactoryRegistry.java
>> >===================================================================
>> >--- src/main/java/org/apache/tuscany/das/rdb/impl/ 
>> FactoryRegistry.java (revision 425121)
>> >+++ src/main/java/org/apache/tuscany/das/rdb/impl/ 
>> FactoryRegistry.java (working copy)
>> >@@ -39,7 +39,7 @@
>> >               ChangeFactory factory = (ChangeFactory)registry.get 
>> (type);
>> >               if ( factory == null )  {
>> >                       DebugUtil.debugln(getClass(), debug,  
>> "Creating new ChangeFactory for type " + type.getName());
>> >-                      factory = new ChangeFactory(type, mapping,  
>> connection);
>> >+                      factory = new ChangeFactory(mapping,  
>> connection);
>> >                       registry.put(type, factory);
>> >               }
>> >               return factory;
>> >Index: src/main/java/org/apache/tuscany/das/rdb/impl/ 
>> ParameterImpl.java
>> >===================================================================
>> >--- src/main/java/org/apache/tuscany/das/rdb/impl/ 
>> ParameterImpl.java   (revision 425121)
>> >+++ src/main/java/org/apache/tuscany/das/rdb/impl/ 
>> ParameterImpl.java   (working copy)
>> >@@ -50,10 +50,6 @@
>> >               super();
>> >       }
>> >
>> >-      public ParameterImpl(String name) {
>> >-              this.name = name;
>> >-      }
>> >-
>> >       public ParameterImpl(int index) {
>> >               this.index = index;
>> >       }
>> >@@ -113,14 +109,6 @@
>> >               return this.converter;
>> >       }
>> >
>> >-
>> >-      public String toString() {
>> >-              StringBuffer buffer = new StringBuffer();
>> >-              buffer.append("Index: " + getIndex());
>> >-              buffer.append("\nName: " + getName());
>> >-              buffer.append("\nValue: " + getValue());
>> >-              return buffer.toString();
>> >-      }
>> >
>> >
>> > }
>> >Index: src/main/java/org/apache/tuscany/das/rdb/impl/ 
>> InsertCommandImpl.java
>> >===================================================================
>> >--- src/main/java/org/apache/tuscany/das/rdb/impl/ 
>> InsertCommandImpl.java       (revision 425121)
>> >+++ src/main/java/org/apache/tuscany/das/rdb/impl/ 
>> InsertCommandImpl.java       (working copy)
>> >@@ -35,9 +35,6 @@
>> >               addParameters(create.getParameters());
>> >       }
>> >
>> >-      protected boolean isInsert() {
>> >-              return true;
>> >-      }
>> >
>> >       public int getGeneratedKey() {
>> >
>> >@@ -60,16 +57,5 @@
>> >
>> >       }
>> >
>> >-      public String toString() {
>> >
>> >-              String superString = super.toString();
>> >-              StringBuffer buffer = new StringBuffer(superString);
>> >-
>> >-              buffer.append("\nGenerating key: " +  
>> hasGeneratedKey);
>> >-              if (hasGeneratedKey)
>> >-                      buffer.append("\nGenerated key: " +  
>> generatedKey);
>> >-
>> >-              return buffer.toString();
>> >-      }
>> >-
>> > }
>> >Index: src/main/java/org/apache/tuscany/das/rdb/impl/ 
>> WriteCommandImpl.java
>> >===================================================================
>> >--- src/main/java/org/apache/tuscany/das/rdb/impl/ 
>> WriteCommandImpl.java        (revision 425121)
>> >+++ src/main/java/org/apache/tuscany/das/rdb/impl/ 
>> WriteCommandImpl.java        (working copy)
>> >@@ -17,8 +17,6 @@
>> > package org.apache.tuscany.das.rdb.impl;
>> >
>> > import java.sql.SQLException;
>> >-import java.util.Collection;
>> >-import java.util.Iterator;
>> > import java.util.StringTokenizer;
>> >
>> > import org.apache.tuscany.das.rdb.config.Config;
>> >@@ -89,13 +87,7 @@
>> >                       addParameter(p);
>> >               }
>> >       }
>> >-      public void addParameters(Collection updateParameters) {
>> >-              Iterator i = updateParameters.iterator();
>> >-              while ( i.hasNext()) {
>> >-                      ParameterImpl p = (ParameterImpl) i.next();
>> >-                      addParameter(p);
>> >-              }
>> >-      }
>> >+
>> >
>> >
>> > }
>> >Index: src/main/java/org/apache/tuscany/das/rdb/impl/ 
>> ChangeFactory.java
>> >===================================================================
>> >--- src/main/java/org/apache/tuscany/das/rdb/impl/ 
>> ChangeFactory.java   (revision 425121)
>> >+++ src/main/java/org/apache/tuscany/das/rdb/impl/ 
>> ChangeFactory.java   (working copy)
>> >@@ -28,11 +28,8 @@
>> > import org.apache.tuscany.das.rdb.util.DebugUtil;
>> >
>> > import commonj.sdo.DataObject;
>> >-import commonj.sdo.Type;
>> >
>> > public class ChangeFactory {
>> >-
>> >-      private final Type type;
>> >
>> >       private InsertCommandImpl createCommand;
>> >
>> >@@ -46,15 +43,10 @@
>> >
>> >       private final ConnectionImpl connection;
>> >
>> >-      public ChangeFactory(Type type, MappingWrapper mapping,  
>> ConnectionImpl connection) {
>> >-              this.type = type;
>> >+      public ChangeFactory(MappingWrapper mapping,  
>> ConnectionImpl connection) {
>> >               this.mapping = mapping;
>> >               this.connection = connection;
>> >       }
>> >-
>> >-      public Type getType() {
>> >-              return this.type;
>> >-      }
>> >
>> >       public void setCreateCommand(InsertCommandImpl cmd) {
>> >               createCommand = cmd;
>> >@@ -138,6 +130,7 @@
>> >                               deleteCommand = new  
>> DeleteCommandImpl(delete);
>> >                       }
>> >                       deleteCommand.setConnection(connection);
>> >+                      deleteCommand.configWrapper = mapping;
>> >               }
>> >               return deleteCommand;
>> >       }
>> >Index: src/main/java/org/apache/tuscany/das/rdb/impl/ 
>> QueryString.java
>> >===================================================================
>> >--- src/main/java/org/apache/tuscany/das/rdb/impl/ 
>> QueryString.java     (revision 425121)
>> >+++ src/main/java/org/apache/tuscany/das/rdb/impl/ 
>> QueryString.java     (working copy)
>> >@@ -1,86 +0,0 @@
>> >-/**
>> >- *
>> >- *  Copyright 2005 The Apache Software Foundation or its  
>> licensors, as applicable.
>> >- *
>> >- *  Licensed under the Apache License, Version 2.0 (the "License");
>> >- *  you may not use this file except in compliance with the  
>> License.
>> >- *  You may obtain a copy of the License at
>> >- *
>> >- *     http://www.apache.org/licenses/LICENSE-2.0
>> >- *
>> >- *  Unless required by applicable law or agreed to in writing,  
>> software
>> >- *  distributed under the License is distributed on an "AS IS"  
>> BASIS,
>> >- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express  
>> or implied.
>> >- *  See the License for the specific language governing  
>> permissions and
>> >- *  limitations under the License.
>> >- */
>> >-package org.apache.tuscany.das.rdb.impl;
>> >-
>> >-import java.util.HashMap;
>> >-import java.util.Iterator;
>> >-import java.util.regex.Matcher;
>> >-import java.util.regex.Pattern;
>> >-
>> >-import org.apache.tuscany.das.rdb.util.DebugUtil;
>> >-
>> >-
>> >-public class QueryString {
>> >-
>> >-      private final String unmodifiedQueryString;
>> >-      private final String preparedString;
>> >-      private HashMap parameters = new HashMap();
>> >-      private static final boolean debug = false;
>> >-
>> >-      public QueryString(String originalString) {
>> >-              this.unmodifiedQueryString = originalString;
>> >-              this.preparedString = replaceNamesAndSetIndexes 
>> (originalString);
>> >-      }
>> >-
>> >-      public String getPreparedString() {
>> >-              return this.preparedString;
>> >-      }
>> >-
>> >-      public String getUnmodifiedString() {
>> >-              return this.unmodifiedQueryString;
>> >-      }
>> >-
>> >-      public int getParameterIndex(String name) {
>> >-              DebugUtil.debugln(getClass(), debug, "Looking for  
>> parameter index for: " + name);
>> >-              return ((Integer)parameters.get(name)).intValue();
>> >-      }
>> >-
>> >-      private String replaceNamesAndSetIndexes(String query) {
>> >-              DebugUtil.debugln(getClass(), debug,  
>> "Parameterizing query: " + query);
>> >-              Pattern p = Pattern.compile(":[\\S&&[^,()]]*");
>> >-              Matcher m = p.matcher(query);
>> >-
>> >-              int index = 1;
>> >-              while (m.find()) {
>> >-                      parameters.put(m.group().substring(1), new  
>> Integer(index));
>> >-                      query = m.replaceFirst("?");
>> >-                      m = p.matcher(query);
>> >-                      index++;
>> >-              }
>> >-
>> >-              DebugUtil.debugln(getClass(), debug,  
>> "Parameterized query: " + query);
>> >-              return query;
>> >-      }
>> >-
>> >-
>> >-      public String toString() {
>> >-              StringBuffer buffer = new StringBuffer();
>> >-              buffer.append("\nOriginal SQL: ");
>> >-              buffer.append(unmodifiedQueryString);
>> >-              buffer.append("\nPrepared SQL: ");
>> >-              buffer.append(preparedString);
>> >-              buffer.append("\nParameters: ");
>> >-              Iterator i = parameters.keySet().iterator();
>> >-              while ( i.hasNext() ) {
>> >-                      String key = (String)i.next();
>> >-                      buffer.append("\n");
>> >-                      buffer.append(key);
>> >-              }
>> >-              return buffer.toString();
>> >-      }
>> >-
>> >-}
>> >Index: src/main/java/org/apache/tuscany/das/rdb/impl/DeleteList.java
>> >===================================================================
>> >--- src/main/java/org/apache/tuscany/das/rdb/impl/ 
>> DeleteList.java      (revision 425121)
>> >+++ src/main/java/org/apache/tuscany/das/rdb/impl/ 
>> DeleteList.java      (working copy)
>> >@@ -21,6 +21,8 @@
>> > import java.util.HashMap;
>> > import java.util.Iterator;
>> >
>> >+import org.apache.tuscany.das.rdb.util.DebugUtil;
>> >+
>> > /**
>> >  * DeleteList will sort delete operations so that child objects  
>> are deleted
>> >  * before their parents
>> >@@ -40,7 +42,7 @@
>> >       }
>> >
>> >       public void add(ChangeOperation op) {
>> >-              if (( order == null  ) || ( op.getTableName() ==  
>> null ) ) {
>> >+              if (( order.size() == 0  ) || ( op.getTableName()  
>> == null ) ) {
>> >                       deleteOperations.add(op);
>> >               } else {
>> >                       String name = op.getTableName();
>> >@@ -54,11 +56,12 @@
>> >       }
>> >
>> >       public Collection getSortedList() {
>> >-              if  (( order != null  ) && ( opsByTableName.keySet 
>> ().size() > 0) ) {
>> >+              if  (( order.size() > 0  ) &&  
>> ( opsByTableName.keySet().size() > 0) ) {
>> >                       Iterator i = this.order.iterator();
>> >                       while (i.hasNext()) {
>> >                               String name = (String) i.next();
>> >-                              deleteOperations.addAll 
>> ((Collection) opsByTableName.get(name));
>> >+                              if ( opsByTableName.get(name) !=  
>> null)
>> >+                                      deleteOperations.addAll 
>> ((Collection) opsByTableName.get(name));
>> >                       }
>> >               }
>> >
>> >Index: src/main/java/org/apache/tuscany/das/rdb/ConfigHelper.java
>> >===================================================================
>> >--- src/main/java/org/apache/tuscany/das/rdb/ConfigHelper.java  
>> (revision 425121)
>> >+++ src/main/java/org/apache/tuscany/das/rdb/ConfigHelper.java  
>> (working copy)
>> >@@ -44,9 +44,6 @@
>> >         configWrapper = new MappingWrapper(config);
>> >     }
>> >
>> >-    public Config newInstance() {
>> >-        return factory.createConfig();
>> >-    }
>> >
>> >     public void addPrimaryKey(String columnName) {
>> >         configWrapper.addPrimaryKey(columnName);
>> >Index: src/main/java/org/apache/tuscany/das/rdb/config/wrapper/ 
>> MappingWrapper.java
>> >===================================================================
>> >--- src/main/java/org/apache/tuscany/das/rdb/config/wrapper/ 
>> MappingWrapper.java        (revision 425121)
>> >+++ src/main/java/org/apache/tuscany/das/rdb/config/wrapper/ 
>> MappingWrapper.java        (working copy)
>> >@@ -190,19 +190,6 @@
>> >         return propertyName;
>> >     }
>> >
>> >-    public void addCollisionColumn(String columnName) {
>> >-
>> >-        if (config == null)
>> >-            config = factory.createConfig();
>> >-
>> >-        QualifiedColumn occColumn = new QualifiedColumn 
>> (columnName);
>> >-        Table t = findOrCreateTable(occColumn.getTableName());
>> >-        Column c = findOrCreateColumn(t, occColumn.getColumnName 
>> ());
>> >-        c.setCollision(true);
>> >-
>> >-        config.getTable().add(t);
>> >-    }
>> >-
>> >     public void addTable(String tableName, String typeName) {
>> >         Table table = getTable(tableName);
>> >         if (table != null)
>> >Index: src/main/java/org/apache/tuscany/das/rdb/generator/impl/ 
>> InsertGenerator.java
>> >===================================================================
>> >--- src/main/java/org/apache/tuscany/das/rdb/generator/impl/ 
>> InsertGenerator.java       (revision 425121)
>> >+++ src/main/java/org/apache/tuscany/das/rdb/generator/impl/ 
>> InsertGenerator.java       (working copy)
>> >@@ -111,7 +111,7 @@
>> >                       } else {
>> >                               if ( obj.isSet(p) ) {
>> >                                       Relationship relationship  
>> = config.getRelationshipByReference(p);
>> >-                                      if ( p.getOpposite().isMany 
>> () || (hasState(config, relationship, obj))) {
>> >+                                      if ((p.getOpposite() !=  
>> null && p.getOpposite().isMany()) || (hasState(config,  
>> relationship, obj))) {
>> >                                                
>> RelationshipWrapper r = new RelationshipWrapper(
>> >                                                        
>> relationship);
>> >                                               Iterator keys =  
>> r.getForeignKeys().iterator();
>> >Index: pom.xml
>> >===================================================================
>> >--- pom.xml    (revision 425121)
>> >+++ pom.xml    (working copy)
>> >@@ -63,8 +63,6 @@
>> >                         <id>config</id>
>> >                         <configuration>
>> >                             <schemaFile>${basedir}/src/main/ 
>> resources/config.xsd</schemaFile>
>> >-                            <generateLoader>true</generateLoader>
>> >-                            <generateSwitch>true</generateSwitch>
>> >                             <noNotification>true</noNotification>
>> >                             <noUnsettable>true</noUnsettable>
>> >                         </configuration>
>> >@@ -76,8 +74,6 @@
>> >                         <id>company</id>
>> >                         <configuration>
>> >                             <schemaFile>${basedir}/src/test/ 
>> resources/company.xsd</schemaFile>
>> >-                            <generateLoader>true</generateLoader>
>> >-                            <generateSwitch>true</generateSwitch>
>> >                             <noUnsettable>true</noUnsettable>
>> >                         </configuration>
>> >                         <goals>
>> >@@ -88,8 +84,6 @@
>> >                         <id>customer</id>
>> >                         <configuration>
>> >                             <schemaFile>${basedir}/src/test/ 
>> resources/customer.xsd</schemaFile>
>> >-                            <generateLoader>true</generateLoader>
>> >-                            <generateSwitch>true</generateSwitch>
>> >                             <noUnsettable>true</noUnsettable>
>> >                         </configuration>
>> >                         <goals>
>> >
>> >
>> >-------------------------------------------------------------------- 
>> ----
>> >
>> >-------------------------------------------------------------------- 
>> -
>> >To unsubscribe, e-mail: tuscany-dev-unsubscribe@ws.apache.org
>> >For additional commands, e-mail: tuscany-dev-help@ws.apache.org
>> >
>>
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: tuscany-dev-unsubscribe@ws.apache.org
>> For additional commands, e-mail: tuscany-dev-help@ws.apache.org
>>
>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: tuscany-dev-unsubscribe@ws.apache.org
> For additional commands, e-mail: tuscany-dev-help@ws.apache.org
>


---------------------------------------------------------------------
To unsubscribe, e-mail: tuscany-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: tuscany-dev-help@ws.apache.org


Re: [PATCH] Improve DAS test coverage

Posted by Brent Daniel <br...@gmail.com>.
Kevin,

  The data came from the Clover tool mentioned on the dev list
recently (www.cenqua.com/clover). I'm using the eclipse plugin. I have
some minor issues with it (for example, any refactoring will
immediately flag every line of code as not executed, producing a ton
of warnings in eclipse.) Overall, it's pretty nice, and is a lot
lighter weight than some other tools I've used.

Brent


On 7/24/06, Kevin Williams <ke...@qwest.net> wrote:
> Brent,
> This looks good.  What tool provided the coverage data?
> Thanks,
> --Kevin
>
>
> Brent Daniel wrote:
>
> > The attached patch has three changes in response to coverage data:
> >
> > 1) Some dead internal code has been removed
> > 2) Test cases have been updated to test some corner cases that weren't
> > being covered
> > 3) A fix to operation sorting for deletes (this was not being tested
> > previously.)
> >
> > Brent
> >
> >------------------------------------------------------------------------
> >
> >Index: src/test/java/org/apache/tuscany/das/rdb/test/OperationOrderingTests.java
> >===================================================================
> >--- src/test/java/org/apache/tuscany/das/rdb/test/OperationOrderingTests.java  (revision 425121)
> >+++ src/test/java/org/apache/tuscany/das/rdb/test/OperationOrderingTests.java  (working copy)
> >@@ -16,6 +16,9 @@
> >  */
> > package org.apache.tuscany.das.rdb.test;
> >
> >+import java.util.ArrayList;
> >+import java.util.Iterator;
> >+
> > import org.apache.tuscany.das.rdb.Command;
> > import org.apache.tuscany.das.rdb.DAS;
> > import org.apache.tuscany.das.rdb.test.data.CityData;
> >@@ -75,4 +78,44 @@
> >               assertEquals(numberOfStates + 1, root.getList("STATES").size());
> >       }
> >
> >+      public void testDeletes() throws Exception {
> >+              DAS das = DAS.FACTORY.createDAS(getConfig("cityStates.xml"), getConnection());
> >+              Command select = das
> >+                              .createCommand(
> >+                                              "Select * from STATES inner join CITIES on STATES.ID = CITIES.STATE_ID");
> >+              DataObject root = select.executeQuery();
> >+
> >+
> >+              DataObject firstState = root.getDataObject("STATES[1]");
> >+              String stateName = firstState.getString("NAME");
> >+
> >+              ArrayList cityNames = new ArrayList();
> >+              Iterator i = firstState.getList("cities").iterator();
> >+              while ( i.hasNext()) {
> >+                      DataObject firstCity = (DataObject) i.next();
> >+                      cityNames.add(firstCity.getString("NAME"));
> >+                      firstCity.delete();
> >+              }
> >+              firstState.delete();
> >+
> >+
> >+
> >+
> >+              das.applyChanges(root);
> >+
> >+              root = select.executeQuery();
> >+
> >+              Iterator iter = root.getList("STATES").iterator();
> >+              while ( iter.hasNext()) {
> >+                      DataObject state = (DataObject)iter.next();
> >+                      assertFalse(state.getString("NAME").equals(stateName));
> >+              }
> >+
> >+              iter = root.getList("CITIES").iterator();
> >+              while ( iter.hasNext()) {
> >+                      DataObject city = (DataObject)iter.next();
> >+                      assertFalse(cityNames.contains(city.getString("NAME")));
> >+              }
> >+
> >+      }
> > }
> >Index: src/test/java/org/apache/tuscany/das/rdb/test/ExceptionTests.java
> >===================================================================
> >--- src/test/java/org/apache/tuscany/das/rdb/test/ExceptionTests.java  (revision 425121)
> >+++ src/test/java/org/apache/tuscany/das/rdb/test/ExceptionTests.java  (working copy)
> >@@ -16,6 +16,7 @@
> >  */
> > package org.apache.tuscany.das.rdb.test;
> >
> >+import java.io.FileInputStream;
> > import java.sql.Connection;
> >
> > import org.apache.tuscany.das.rdb.Command;
> >@@ -26,6 +27,7 @@
> > import org.apache.tuscany.das.rdb.test.data.OrderData;
> > import org.apache.tuscany.das.rdb.test.data.OrderDetailsData;
> > import org.apache.tuscany.das.rdb.test.framework.DasTest;
> >+import org.apache.tuscany.das.rdb.util.ConfigUtil;
> > import org.apache.tuscany.sdo.util.SDOUtil;
> >
> > public class ExceptionTests extends DasTest {
> >@@ -133,5 +135,6 @@
> >
> >     }
> >
> >+
> >
> > }
> >Index: src/test/java/org/apache/tuscany/das/rdb/test/CrudWithChangeHistory.java
> >===================================================================
> >--- src/test/java/org/apache/tuscany/das/rdb/test/CrudWithChangeHistory.java   (revision 425121)
> >+++ src/test/java/org/apache/tuscany/das/rdb/test/CrudWithChangeHistory.java   (working copy)
> >@@ -48,6 +48,41 @@
> >         super.tearDown();
> >     }
> >
> >+    public void testDeleteAndCreate() throws Exception {
> >+              DAS das = DAS.FACTORY.createDAS(
> >+                              getConfig("basicCustomerMappingWithCUD2.xml"), getConnection());
> >+              // Read customer 1
> >+              Command select = das
> >+                              .createCommand("Select * from CUSTOMER");
> >+              DataObject root = select.executeQuery();
> >+
> >+              DataObject customer = (DataObject) root.get("CUSTOMER[1]");
> >+
> >+              int customerId = customer.getInt("ID");
> >+              // Modify customer
> >+              customer.delete();
> >+
> >+              DataObject newCustomer = root.createDataObject("CUSTOMER");
> >+              newCustomer.setInt("ID", 9999);
> >+              newCustomer.setString("LASTNAME", "Jones");
> >+
> >+              // Build apply changes command
> >+              das.applyChanges(root);
> >+
> >+              // Verify changes
> >+              root = select.executeQuery();
> >+              boolean found = false;
> >+              Iterator i = root.getList("CUSTOMER").iterator();
> >+              while ( i.hasNext()) {
> >+                      customer = (DataObject)i.next();
> >+                      assertFalse(customerId == customer.getInt("ID"));
> >+                      if ( customer.getInt("ID") == 9999 )
> >+                              found = true;
> >+              }
> >+
> >+              assertTrue(found);
> >+
> >+      }
> >     /**
> >      * Read and modify a customer. Provide needed Create/Update/Delete
> >      * statements programatically
> >Index: src/test/java/org/apache/tuscany/das/rdb/test/OCCTests.java
> >===================================================================
> >--- src/test/java/org/apache/tuscany/das/rdb/test/OCCTests.java        (revision 425121)
> >+++ src/test/java/org/apache/tuscany/das/rdb/test/OCCTests.java        (working copy)
> >@@ -17,7 +17,10 @@
> > package org.apache.tuscany.das.rdb.test;
> >
> > import org.apache.tuscany.das.rdb.Command;
> >+import org.apache.tuscany.das.rdb.ConfigHelper;
> > import org.apache.tuscany.das.rdb.DAS;
> >+import org.apache.tuscany.das.rdb.config.Config;
> >+import org.apache.tuscany.das.rdb.config.ConfigFactory;
> > import org.apache.tuscany.das.rdb.test.data.BookData;
> > import org.apache.tuscany.das.rdb.test.framework.DasTest;
> >
> >@@ -99,4 +102,29 @@
> >                               throw ex;
> >               }
> >       }
> >+
> >+      public void testProvidedConfig() throws Exception {
> >+              // Create config programmatically
> >+              Config config = ConfigFactory.INSTANCE.createConfig();
> >+              ConfigHelper helper = new ConfigHelper(config);
> >+              helper.addPrimaryKey("BOOK.BOOK_ID");
> >+              DAS das = DAS.FACTORY.createDAS(helper.getConfig(), getConnection());
> >+
> >+              // Read a book instance
> >+              Command select = das
> >+                              .createCommand("SELECT * FROM BOOK WHERE BOOK_ID = 1");
> >+              DataObject root = select.executeQuery();
> >+              DataObject book = root.getDataObject("BOOK[1]");
> >+              // Change a field to mark the instance 'dirty'
> >+              book.setInt("QUANTITY", 2);
> >+
> >+              // Flush the change
> >+
> >+              das.applyChanges(root);
> >+
> >+              // Verify
> >+              root = select.executeQuery();
> >+              book = root.getDataObject("BOOK[1]");
> >+              assertEquals(2, book.getInt("QUANTITY"));
> >+      }
> > }
> >Index: src/test/java/org/apache/tuscany/das/rdb/test/ConverterTests.java
> >===================================================================
> >--- src/test/java/org/apache/tuscany/das/rdb/test/ConverterTests.java  (revision 425121)
> >+++ src/test/java/org/apache/tuscany/das/rdb/test/ConverterTests.java  (working copy)
> >@@ -23,8 +23,11 @@
> >
> > import org.apache.tuscany.das.rdb.Command;
> > import org.apache.tuscany.das.rdb.DAS;
> >+import org.apache.tuscany.das.rdb.test.customer.Customer;
> >+import org.apache.tuscany.das.rdb.test.customer.CustomerFactory;
> > import org.apache.tuscany.das.rdb.test.data.CustomerData;
> > import org.apache.tuscany.das.rdb.test.framework.DasTest;
> >+import org.apache.tuscany.sdo.util.SDOUtil;
> >
> > import commonj.sdo.DataObject;
> >
> >@@ -99,4 +102,59 @@
> >
> >       }
> >
> >+      public void testInvalidConverter1() throws Exception {
> >+
> >+              DAS das = DAS.FACTORY.createDAS(getConfig("InvalidConverter.xml"), getConnection());
> >+
> >+              // Build the select command to read a specific customer and related
> >+              // orders
> >+              Command select = das
> >+                              .createCommand(
> >+                                              "SELECT * FROM CUSTOMER LEFT JOIN ANORDER ON CUSTOMER.ID = ANORDER.CUSTOMER_ID where CUSTOMER.ID = ?");
> >+
> >+              // Parameterize the command
> >+              select.setParameter(1, new Integer(1));
> >+
> >+              // Get the graph
> >+              try {
> >+                      select.executeQuery();
> >+              } catch (Exception ex) {
> >+                      assertEquals("java.lang.ClassNotFoundException: not.a.valid.class", ex.getMessage());
> >+              }
> >+
> >+
> >+      }
> >+
> >+      public void testInvalidConverter2() throws Exception {
> >+
> >+              SDOUtil.registerStaticTypes(CustomerFactory.class);
> >+              DAS das = DAS.FACTORY.createDAS(getConfig("InvalidConverter.xml"), getConnection());
> >+
> >+              // Build the select command to read a specific customer and related
> >+              // orders
> >+              Command select = das
> >+                              .createCommand(
> >+                                              "SELECT * FROM ANORDER");
> >+
> >+              // Get the graph
> >+
> >+              DataObject root = select.executeQuery();
> >+              DataObject order = root.getDataObject("AnOrder[1]");
> >+
> >+              Customer customer = (Customer) root.createDataObject("Customer");
> >+              customer.setID(700);
> >+              customer.setLastName("Daniel");
> >+              customer.setAddress("an address");
> >+
> >+              customer.getOrders().add(order);
> >+
> >+              try {
> >+                      das.applyChanges(root);
> >+              } catch (Exception ex) {
> >+                      assertEquals("java.lang.ClassNotFoundException: not.a.valid.class", ex.getMessage());
> >+              }
> >+
> >+
> >+      }
> >+
> > }
> >Index: src/test/java/org/apache/tuscany/das/rdb/test/GeneratedId.java
> >===================================================================
> >--- src/test/java/org/apache/tuscany/das/rdb/test/GeneratedId.java     (revision 425121)
> >+++ src/test/java/org/apache/tuscany/das/rdb/test/GeneratedId.java     (working copy)
> >@@ -22,6 +22,8 @@
> >  *
> >  */
> >
> >+import java.util.Iterator;
> >+
> > import org.apache.tuscany.das.rdb.Command;
> > import org.apache.tuscany.das.rdb.DAS;
> > import org.apache.tuscany.das.rdb.test.data.CompanyData;
> >@@ -100,6 +102,31 @@
> >
> >     }
> >
> >+    // Test insert into row with generated ID and generated insert
> >+    public void testInsert4() throws Exception {
> >+
> >+      DAS das = DAS.FACTORY.createDAS(getConfig("CompanyConfig.xml"),getConnection());
> >+        Command select = das.getCommand("all companies");
> >+        DataObject root = select.executeQuery();
> >+
> >+        DataObject company = root.createDataObject("COMPANY");
> >+        company.setString("NAME", "Phil's Tires");
> >+        // This shouldn't do anything
> >+        company.setInt("ID", 999);
> >+
> >+        das.applyChanges(root);
> >+
> >+        // Verify insert
> >+        root = select.executeQuery();
> >+
> >+        assertEquals(4, root.getList("COMPANY").size());
> >+        Iterator i = root.getList("COMPANY").iterator();
> >+        while ( i.hasNext()) {
> >+              DataObject comp = (DataObject)i.next();
> >+              assertFalse( comp.getInt("ID") == 999);
> >+        }
> >+
> >+    }
> >     // Test ability to propogate generated values back to owning data objects
> >     public void testPropagateIds() throws Exception {
> >
> >Index: src/test/java/org/apache/tuscany/das/rdb/test/CompoundKeyTests.java
> >===================================================================
> >--- src/test/java/org/apache/tuscany/das/rdb/test/CompoundKeyTests.java        (revision 425121)
> >+++ src/test/java/org/apache/tuscany/das/rdb/test/CompoundKeyTests.java        (working copy)
> >@@ -92,4 +92,21 @@
> >         assertEquals(2, firstOrder.getList("ORDERDETAILS").size());
> >
> >     }
> >+
> >+    public void testReadAndDelete() throws Exception {
> >+      DAS das = DAS.FACTORY.createDAS(getConfig("OrdersOrderDetailsConfig.xml"), getConnection());
> >+        Command getOrderDetails = das
> >+                .createCommand("Select * from ORDERDETAILS where ORDERID = ? AND PRODUCTID = ?");
> >+
> >+
> >+        getOrderDetails.setParameter(1, new Integer(1));
> >+        getOrderDetails.setParameter(2, new Integer(1));
> >+
> >+        DataObject root = getOrderDetails.executeQuery();
> >+
> >+        DataObject orderDetail = (DataObject) root.get("ORDERDETAILS[1]");
> >+        orderDetail.delete();
> >+        das.applyChanges(root);
> >+
> >+    }
> > }
> >Index: src/test/resources/BooksConfig.xml
> >===================================================================
> >--- src/test/resources/BooksConfig.xml (revision 425121)
> >+++ src/test/resources/BooksConfig.xml (working copy)
> >@@ -21,7 +21,7 @@
> >
> >       <Table tableName="BOOK">
> >         <Column columnName="BOOK_ID" primaryKey="true"/>
> >-          <Column columnName="OCC" collision="true"/>
> >+          <Column columnName="OCC" collision="true" propertyName="anOccColumn"/>
> >     </Table>
> >
> > </Config>
> >Index: src/test/resources/InvalidConverter.xml
> >===================================================================
> >--- /dev/null  (revision 0)
> >+++ src/test/resources/InvalidConverter.xml    (revision 0)
> >@@ -0,0 +1,35 @@
> >+<?xml version="1.0" encoding="ASCII"?>
> >+<!--
> >+  Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable.
> >+
> >+  Licensed under the Apache License, Version 2.0 (the "License");
> >+  you may not use this file except in compliance with the License.
> >+  You may obtain a copy of the License at
> >+
> >+     http://www.apache.org/licenses/LICENSE-2.0
> >+
> >+  Unless required by applicable law or agreed to in writing, software
> >+  distributed under the License is distributed on an "AS IS" BASIS,
> >+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> >+  See the License for the specific language governing permissions and
> >+  limitations under the License.
> >+ -->
> >+<Config xsi:noNamespaceSchemaLocation="http:///org.apache.tuscany.das.rdb/config.xsd"
> >+xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> >+dataObjectModel="http:///org.apache.tuscany.das.rdb.test/customer.xsd">
> >+
> >+  <Table tableName="CUSTOMER" typeName="Customer">
> >+    <Column columnName="ID"  primaryKey="true" converterClassName="not.a.valid.class"/>
> >+  </Table>
> >+
> >+  <Table tableName="ANORDER" typeName="AnOrder">
> >+      <Column columnName="CUSTOMER_ID"/>
> >+    <Column columnName="ID"  primaryKey="true"/>
> >+  </Table>
> >+
> >+  <Relationship name="orders" primaryKeyTable="CUSTOMER" foreignKeyTable="ANORDER" many="true">
> >+     <KeyPair primaryKeyColumn="ID" foreignKeyColumn="CUSTOMER_ID"/>
> >+  </Relationship>
> >+
> >+</Config>
> >+
> >Index: src/main/java/org/apache/tuscany/das/rdb/impl/ApplyChangesCommandImpl.java
> >===================================================================
> >--- src/main/java/org/apache/tuscany/das/rdb/impl/ApplyChangesCommandImpl.java (revision 425121)
> >+++ src/main/java/org/apache/tuscany/das/rdb/impl/ApplyChangesCommandImpl.java (working copy)
> >@@ -34,13 +34,6 @@
> >     private static final boolean debug = false;
> >
> >     private ChangeSummarizer summarizer = new ChangeSummarizer();
> >-
> >-    public ApplyChangesCommandImpl() {
> >-    }
> >-
> >-    public ApplyChangesCommandImpl(Config config){
> >-      this.configWrapper = new MappingWrapper(config);
> >-    }
> >
> >     public ApplyChangesCommandImpl(Config config, Connection connection){
> >         this.configWrapper = new MappingWrapper(config);
> >@@ -53,18 +46,7 @@
> >               summarizer.setConnection(connection);
> >       }
> >
> >-    public void addCreateCommand(Type type, Command cmd) {
> >-        summarizer.addCreateCommand(type, cmd);
> >-    }
> >
> >-    public void addUpdateCommand(Type type, Command cmd) {
> >-        summarizer.addUpdateCommand(type, cmd);
> >-    }
> >-
> >-    public void addDeleteCommand(Type type, Command cmd) {
> >-        summarizer.addDeleteCommand(type, cmd);
> >-    }
> >-
> >     public void execute(DataObject root) {
> >         DebugUtil.debugln(getClass(), debug, "Executing ApplyChangesCmd");
> >
> >Index: src/main/java/org/apache/tuscany/das/rdb/impl/FactoryRegistry.java
> >===================================================================
> >--- src/main/java/org/apache/tuscany/das/rdb/impl/FactoryRegistry.java (revision 425121)
> >+++ src/main/java/org/apache/tuscany/das/rdb/impl/FactoryRegistry.java (working copy)
> >@@ -39,7 +39,7 @@
> >               ChangeFactory factory = (ChangeFactory)registry.get(type);
> >               if ( factory == null )  {
> >                       DebugUtil.debugln(getClass(), debug, "Creating new ChangeFactory for type " + type.getName());
> >-                      factory = new ChangeFactory(type, mapping, connection);
> >+                      factory = new ChangeFactory(mapping, connection);
> >                       registry.put(type, factory);
> >               }
> >               return factory;
> >Index: src/main/java/org/apache/tuscany/das/rdb/impl/ParameterImpl.java
> >===================================================================
> >--- src/main/java/org/apache/tuscany/das/rdb/impl/ParameterImpl.java   (revision 425121)
> >+++ src/main/java/org/apache/tuscany/das/rdb/impl/ParameterImpl.java   (working copy)
> >@@ -50,10 +50,6 @@
> >               super();
> >       }
> >
> >-      public ParameterImpl(String name) {
> >-              this.name = name;
> >-      }
> >-
> >       public ParameterImpl(int index) {
> >               this.index = index;
> >       }
> >@@ -113,14 +109,6 @@
> >               return this.converter;
> >       }
> >
> >-
> >-      public String toString() {
> >-              StringBuffer buffer = new StringBuffer();
> >-              buffer.append("Index: " + getIndex());
> >-              buffer.append("\nName: " + getName());
> >-              buffer.append("\nValue: " + getValue());
> >-              return buffer.toString();
> >-      }
> >
> >
> > }
> >Index: src/main/java/org/apache/tuscany/das/rdb/impl/InsertCommandImpl.java
> >===================================================================
> >--- src/main/java/org/apache/tuscany/das/rdb/impl/InsertCommandImpl.java       (revision 425121)
> >+++ src/main/java/org/apache/tuscany/das/rdb/impl/InsertCommandImpl.java       (working copy)
> >@@ -35,9 +35,6 @@
> >               addParameters(create.getParameters());
> >       }
> >
> >-      protected boolean isInsert() {
> >-              return true;
> >-      }
> >
> >       public int getGeneratedKey() {
> >
> >@@ -60,16 +57,5 @@
> >
> >       }
> >
> >-      public String toString() {
> >
> >-              String superString = super.toString();
> >-              StringBuffer buffer = new StringBuffer(superString);
> >-
> >-              buffer.append("\nGenerating key: " + hasGeneratedKey);
> >-              if (hasGeneratedKey)
> >-                      buffer.append("\nGenerated key: " + generatedKey);
> >-
> >-              return buffer.toString();
> >-      }
> >-
> > }
> >Index: src/main/java/org/apache/tuscany/das/rdb/impl/WriteCommandImpl.java
> >===================================================================
> >--- src/main/java/org/apache/tuscany/das/rdb/impl/WriteCommandImpl.java        (revision 425121)
> >+++ src/main/java/org/apache/tuscany/das/rdb/impl/WriteCommandImpl.java        (working copy)
> >@@ -17,8 +17,6 @@
> > package org.apache.tuscany.das.rdb.impl;
> >
> > import java.sql.SQLException;
> >-import java.util.Collection;
> >-import java.util.Iterator;
> > import java.util.StringTokenizer;
> >
> > import org.apache.tuscany.das.rdb.config.Config;
> >@@ -89,13 +87,7 @@
> >                       addParameter(p);
> >               }
> >       }
> >-      public void addParameters(Collection updateParameters) {
> >-              Iterator i = updateParameters.iterator();
> >-              while ( i.hasNext()) {
> >-                      ParameterImpl p = (ParameterImpl) i.next();
> >-                      addParameter(p);
> >-              }
> >-      }
> >+
> >
> >
> > }
> >Index: src/main/java/org/apache/tuscany/das/rdb/impl/ChangeFactory.java
> >===================================================================
> >--- src/main/java/org/apache/tuscany/das/rdb/impl/ChangeFactory.java   (revision 425121)
> >+++ src/main/java/org/apache/tuscany/das/rdb/impl/ChangeFactory.java   (working copy)
> >@@ -28,11 +28,8 @@
> > import org.apache.tuscany.das.rdb.util.DebugUtil;
> >
> > import commonj.sdo.DataObject;
> >-import commonj.sdo.Type;
> >
> > public class ChangeFactory {
> >-
> >-      private final Type type;
> >
> >       private InsertCommandImpl createCommand;
> >
> >@@ -46,15 +43,10 @@
> >
> >       private final ConnectionImpl connection;
> >
> >-      public ChangeFactory(Type type, MappingWrapper mapping, ConnectionImpl connection) {
> >-              this.type = type;
> >+      public ChangeFactory(MappingWrapper mapping, ConnectionImpl connection) {
> >               this.mapping = mapping;
> >               this.connection = connection;
> >       }
> >-
> >-      public Type getType() {
> >-              return this.type;
> >-      }
> >
> >       public void setCreateCommand(InsertCommandImpl cmd) {
> >               createCommand = cmd;
> >@@ -138,6 +130,7 @@
> >                               deleteCommand = new DeleteCommandImpl(delete);
> >                       }
> >                       deleteCommand.setConnection(connection);
> >+                      deleteCommand.configWrapper = mapping;
> >               }
> >               return deleteCommand;
> >       }
> >Index: src/main/java/org/apache/tuscany/das/rdb/impl/QueryString.java
> >===================================================================
> >--- src/main/java/org/apache/tuscany/das/rdb/impl/QueryString.java     (revision 425121)
> >+++ src/main/java/org/apache/tuscany/das/rdb/impl/QueryString.java     (working copy)
> >@@ -1,86 +0,0 @@
> >-/**
> >- *
> >- *  Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
> >- *
> >- *  Licensed under the Apache License, Version 2.0 (the "License");
> >- *  you may not use this file except in compliance with the License.
> >- *  You may obtain a copy of the License at
> >- *
> >- *     http://www.apache.org/licenses/LICENSE-2.0
> >- *
> >- *  Unless required by applicable law or agreed to in writing, software
> >- *  distributed under the License is distributed on an "AS IS" BASIS,
> >- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> >- *  See the License for the specific language governing permissions and
> >- *  limitations under the License.
> >- */
> >-package org.apache.tuscany.das.rdb.impl;
> >-
> >-import java.util.HashMap;
> >-import java.util.Iterator;
> >-import java.util.regex.Matcher;
> >-import java.util.regex.Pattern;
> >-
> >-import org.apache.tuscany.das.rdb.util.DebugUtil;
> >-
> >-
> >-public class QueryString {
> >-
> >-      private final String unmodifiedQueryString;
> >-      private final String preparedString;
> >-      private HashMap parameters = new HashMap();
> >-      private static final boolean debug = false;
> >-
> >-      public QueryString(String originalString) {
> >-              this.unmodifiedQueryString = originalString;
> >-              this.preparedString = replaceNamesAndSetIndexes(originalString);
> >-      }
> >-
> >-      public String getPreparedString() {
> >-              return this.preparedString;
> >-      }
> >-
> >-      public String getUnmodifiedString() {
> >-              return this.unmodifiedQueryString;
> >-      }
> >-
> >-      public int getParameterIndex(String name) {
> >-              DebugUtil.debugln(getClass(), debug, "Looking for parameter index for: " + name);
> >-              return ((Integer)parameters.get(name)).intValue();
> >-      }
> >-
> >-      private String replaceNamesAndSetIndexes(String query) {
> >-              DebugUtil.debugln(getClass(), debug, "Parameterizing query: " + query);
> >-              Pattern p = Pattern.compile(":[\\S&&[^,()]]*");
> >-              Matcher m = p.matcher(query);
> >-
> >-              int index = 1;
> >-              while (m.find()) {
> >-                      parameters.put(m.group().substring(1), new Integer(index));
> >-                      query = m.replaceFirst("?");
> >-                      m = p.matcher(query);
> >-                      index++;
> >-              }
> >-
> >-              DebugUtil.debugln(getClass(), debug, "Parameterized query: " + query);
> >-              return query;
> >-      }
> >-
> >-
> >-      public String toString() {
> >-              StringBuffer buffer = new StringBuffer();
> >-              buffer.append("\nOriginal SQL: ");
> >-              buffer.append(unmodifiedQueryString);
> >-              buffer.append("\nPrepared SQL: ");
> >-              buffer.append(preparedString);
> >-              buffer.append("\nParameters: ");
> >-              Iterator i = parameters.keySet().iterator();
> >-              while ( i.hasNext() ) {
> >-                      String key = (String)i.next();
> >-                      buffer.append("\n");
> >-                      buffer.append(key);
> >-              }
> >-              return buffer.toString();
> >-      }
> >-
> >-}
> >Index: src/main/java/org/apache/tuscany/das/rdb/impl/DeleteList.java
> >===================================================================
> >--- src/main/java/org/apache/tuscany/das/rdb/impl/DeleteList.java      (revision 425121)
> >+++ src/main/java/org/apache/tuscany/das/rdb/impl/DeleteList.java      (working copy)
> >@@ -21,6 +21,8 @@
> > import java.util.HashMap;
> > import java.util.Iterator;
> >
> >+import org.apache.tuscany.das.rdb.util.DebugUtil;
> >+
> > /**
> >  * DeleteList will sort delete operations so that child objects are deleted
> >  * before their parents
> >@@ -40,7 +42,7 @@
> >       }
> >
> >       public void add(ChangeOperation op) {
> >-              if (( order == null  ) || ( op.getTableName() == null ) ) {
> >+              if (( order.size() == 0  ) || ( op.getTableName() == null ) ) {
> >                       deleteOperations.add(op);
> >               } else {
> >                       String name = op.getTableName();
> >@@ -54,11 +56,12 @@
> >       }
> >
> >       public Collection getSortedList() {
> >-              if  (( order != null  ) && ( opsByTableName.keySet().size() > 0) ) {
> >+              if  (( order.size() > 0  ) && ( opsByTableName.keySet().size() > 0) ) {
> >                       Iterator i = this.order.iterator();
> >                       while (i.hasNext()) {
> >                               String name = (String) i.next();
> >-                              deleteOperations.addAll((Collection) opsByTableName.get(name));
> >+                              if ( opsByTableName.get(name) != null)
> >+                                      deleteOperations.addAll((Collection) opsByTableName.get(name));
> >                       }
> >               }
> >
> >Index: src/main/java/org/apache/tuscany/das/rdb/ConfigHelper.java
> >===================================================================
> >--- src/main/java/org/apache/tuscany/das/rdb/ConfigHelper.java (revision 425121)
> >+++ src/main/java/org/apache/tuscany/das/rdb/ConfigHelper.java (working copy)
> >@@ -44,9 +44,6 @@
> >         configWrapper = new MappingWrapper(config);
> >     }
> >
> >-    public Config newInstance() {
> >-        return factory.createConfig();
> >-    }
> >
> >     public void addPrimaryKey(String columnName) {
> >         configWrapper.addPrimaryKey(columnName);
> >Index: src/main/java/org/apache/tuscany/das/rdb/config/wrapper/MappingWrapper.java
> >===================================================================
> >--- src/main/java/org/apache/tuscany/das/rdb/config/wrapper/MappingWrapper.java        (revision 425121)
> >+++ src/main/java/org/apache/tuscany/das/rdb/config/wrapper/MappingWrapper.java        (working copy)
> >@@ -190,19 +190,6 @@
> >         return propertyName;
> >     }
> >
> >-    public void addCollisionColumn(String columnName) {
> >-
> >-        if (config == null)
> >-            config = factory.createConfig();
> >-
> >-        QualifiedColumn occColumn = new QualifiedColumn(columnName);
> >-        Table t = findOrCreateTable(occColumn.getTableName());
> >-        Column c = findOrCreateColumn(t, occColumn.getColumnName());
> >-        c.setCollision(true);
> >-
> >-        config.getTable().add(t);
> >-    }
> >-
> >     public void addTable(String tableName, String typeName) {
> >         Table table = getTable(tableName);
> >         if (table != null)
> >Index: src/main/java/org/apache/tuscany/das/rdb/generator/impl/InsertGenerator.java
> >===================================================================
> >--- src/main/java/org/apache/tuscany/das/rdb/generator/impl/InsertGenerator.java       (revision 425121)
> >+++ src/main/java/org/apache/tuscany/das/rdb/generator/impl/InsertGenerator.java       (working copy)
> >@@ -111,7 +111,7 @@
> >                       } else {
> >                               if ( obj.isSet(p) ) {
> >                                       Relationship relationship = config.getRelationshipByReference(p);
> >-                                      if ( p.getOpposite().isMany() || (hasState(config, relationship, obj))) {
> >+                                      if ((p.getOpposite() != null && p.getOpposite().isMany()) || (hasState(config, relationship, obj))) {
> >                                               RelationshipWrapper r = new RelationshipWrapper(
> >                                                       relationship);
> >                                               Iterator keys = r.getForeignKeys().iterator();
> >Index: pom.xml
> >===================================================================
> >--- pom.xml    (revision 425121)
> >+++ pom.xml    (working copy)
> >@@ -63,8 +63,6 @@
> >                         <id>config</id>
> >                         <configuration>
> >                             <schemaFile>${basedir}/src/main/resources/config.xsd</schemaFile>
> >-                            <generateLoader>true</generateLoader>
> >-                            <generateSwitch>true</generateSwitch>
> >                             <noNotification>true</noNotification>
> >                             <noUnsettable>true</noUnsettable>
> >                         </configuration>
> >@@ -76,8 +74,6 @@
> >                         <id>company</id>
> >                         <configuration>
> >                             <schemaFile>${basedir}/src/test/resources/company.xsd</schemaFile>
> >-                            <generateLoader>true</generateLoader>
> >-                            <generateSwitch>true</generateSwitch>
> >                             <noUnsettable>true</noUnsettable>
> >                         </configuration>
> >                         <goals>
> >@@ -88,8 +84,6 @@
> >                         <id>customer</id>
> >                         <configuration>
> >                             <schemaFile>${basedir}/src/test/resources/customer.xsd</schemaFile>
> >-                            <generateLoader>true</generateLoader>
> >-                            <generateSwitch>true</generateSwitch>
> >                             <noUnsettable>true</noUnsettable>
> >                         </configuration>
> >                         <goals>
> >
> >
> >------------------------------------------------------------------------
> >
> >---------------------------------------------------------------------
> >To unsubscribe, e-mail: tuscany-dev-unsubscribe@ws.apache.org
> >For additional commands, e-mail: tuscany-dev-help@ws.apache.org
> >
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: tuscany-dev-unsubscribe@ws.apache.org
> For additional commands, e-mail: tuscany-dev-help@ws.apache.org
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: tuscany-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: tuscany-dev-help@ws.apache.org


Re: [PATCH] Improve DAS test coverage

Posted by Kevin Williams <ke...@qwest.net>.
Brent,
This looks good.  What tool provided the coverage data?
Thanks,
--Kevin


Brent Daniel wrote:

> The attached patch has three changes in response to coverage data:
>
> 1) Some dead internal code has been removed
> 2) Test cases have been updated to test some corner cases that weren't
> being covered
> 3) A fix to operation sorting for deletes (this was not being tested
> previously.)
>
> Brent
>
>------------------------------------------------------------------------
>
>Index: src/test/java/org/apache/tuscany/das/rdb/test/OperationOrderingTests.java
>===================================================================
>--- src/test/java/org/apache/tuscany/das/rdb/test/OperationOrderingTests.java	(revision 425121)
>+++ src/test/java/org/apache/tuscany/das/rdb/test/OperationOrderingTests.java	(working copy)
>@@ -16,6 +16,9 @@
>  */
> package org.apache.tuscany.das.rdb.test;
> 
>+import java.util.ArrayList;
>+import java.util.Iterator;
>+
> import org.apache.tuscany.das.rdb.Command;
> import org.apache.tuscany.das.rdb.DAS;
> import org.apache.tuscany.das.rdb.test.data.CityData;
>@@ -75,4 +78,44 @@
> 		assertEquals(numberOfStates + 1, root.getList("STATES").size());
> 	}
> 
>+	public void testDeletes() throws Exception {
>+		DAS das = DAS.FACTORY.createDAS(getConfig("cityStates.xml"), getConnection());
>+		Command select = das
>+				.createCommand(
>+						"Select * from STATES inner join CITIES on STATES.ID = CITIES.STATE_ID");		
>+		DataObject root = select.executeQuery();
>+
>+		
>+		DataObject firstState = root.getDataObject("STATES[1]");
>+		String stateName = firstState.getString("NAME");
>+		
>+		ArrayList cityNames = new ArrayList();
>+		Iterator i = firstState.getList("cities").iterator();
>+		while ( i.hasNext()) {
>+			DataObject firstCity = (DataObject) i.next();
>+			cityNames.add(firstCity.getString("NAME"));			
>+			firstCity.delete();					
>+		}
>+		firstState.delete();
>+	
>+		
>+		
>+		
>+		das.applyChanges(root);
>+	
>+		root = select.executeQuery();
>+		
>+		Iterator iter = root.getList("STATES").iterator();
>+		while ( iter.hasNext()) {
>+			DataObject state = (DataObject)iter.next();
>+			assertFalse(state.getString("NAME").equals(stateName));
>+		}
>+		
>+		iter = root.getList("CITIES").iterator();
>+		while ( iter.hasNext()) {
>+			DataObject city = (DataObject)iter.next();
>+			assertFalse(cityNames.contains(city.getString("NAME")));
>+		}
>+		
>+	}
> }
>Index: src/test/java/org/apache/tuscany/das/rdb/test/ExceptionTests.java
>===================================================================
>--- src/test/java/org/apache/tuscany/das/rdb/test/ExceptionTests.java	(revision 425121)
>+++ src/test/java/org/apache/tuscany/das/rdb/test/ExceptionTests.java	(working copy)
>@@ -16,6 +16,7 @@
>  */
> package org.apache.tuscany.das.rdb.test;
> 
>+import java.io.FileInputStream;
> import java.sql.Connection;
> 
> import org.apache.tuscany.das.rdb.Command;
>@@ -26,6 +27,7 @@
> import org.apache.tuscany.das.rdb.test.data.OrderData;
> import org.apache.tuscany.das.rdb.test.data.OrderDetailsData;
> import org.apache.tuscany.das.rdb.test.framework.DasTest;
>+import org.apache.tuscany.das.rdb.util.ConfigUtil;
> import org.apache.tuscany.sdo.util.SDOUtil;
> 
> public class ExceptionTests extends DasTest {
>@@ -133,5 +135,6 @@
> 
>     }
>   
>+   
>     
> }
>Index: src/test/java/org/apache/tuscany/das/rdb/test/CrudWithChangeHistory.java
>===================================================================
>--- src/test/java/org/apache/tuscany/das/rdb/test/CrudWithChangeHistory.java	(revision 425121)
>+++ src/test/java/org/apache/tuscany/das/rdb/test/CrudWithChangeHistory.java	(working copy)
>@@ -48,6 +48,41 @@
>         super.tearDown();
>     }
> 
>+    public void testDeleteAndCreate() throws Exception {
>+		DAS das = DAS.FACTORY.createDAS(
>+				getConfig("basicCustomerMappingWithCUD2.xml"), getConnection());
>+		// Read customer 1
>+		Command select = das
>+				.createCommand("Select * from CUSTOMER");
>+		DataObject root = select.executeQuery();
>+
>+		DataObject customer = (DataObject) root.get("CUSTOMER[1]");
>+
>+		int customerId = customer.getInt("ID");
>+		// Modify customer
>+		customer.delete();
>+
>+		DataObject newCustomer = root.createDataObject("CUSTOMER");
>+		newCustomer.setInt("ID", 9999);
>+		newCustomer.setString("LASTNAME", "Jones");
>+		
>+		// Build apply changes command
>+		das.applyChanges(root);
>+
>+		// Verify changes
>+		root = select.executeQuery();
>+		boolean found = false;
>+		Iterator i = root.getList("CUSTOMER").iterator();
>+		while ( i.hasNext()) {
>+			customer = (DataObject)i.next();
>+			assertFalse(customerId == customer.getInt("ID"));
>+			if ( customer.getInt("ID") == 9999 )
>+				found = true;
>+		}
>+		
>+		assertTrue(found);
>+
>+	}
>     /**
>      * Read and modify a customer. Provide needed Create/Update/Delete
>      * statements programatically
>Index: src/test/java/org/apache/tuscany/das/rdb/test/OCCTests.java
>===================================================================
>--- src/test/java/org/apache/tuscany/das/rdb/test/OCCTests.java	(revision 425121)
>+++ src/test/java/org/apache/tuscany/das/rdb/test/OCCTests.java	(working copy)
>@@ -17,7 +17,10 @@
> package org.apache.tuscany.das.rdb.test;
> 
> import org.apache.tuscany.das.rdb.Command;
>+import org.apache.tuscany.das.rdb.ConfigHelper;
> import org.apache.tuscany.das.rdb.DAS;
>+import org.apache.tuscany.das.rdb.config.Config;
>+import org.apache.tuscany.das.rdb.config.ConfigFactory;
> import org.apache.tuscany.das.rdb.test.data.BookData;
> import org.apache.tuscany.das.rdb.test.framework.DasTest;
> 
>@@ -99,4 +102,29 @@
> 				throw ex;
> 		}
> 	}
>+	
>+	public void testProvidedConfig() throws Exception {
>+		// Create config programmatically
>+		Config config = ConfigFactory.INSTANCE.createConfig();
>+		ConfigHelper helper = new ConfigHelper(config);
>+		helper.addPrimaryKey("BOOK.BOOK_ID");
>+		DAS das = DAS.FACTORY.createDAS(helper.getConfig(), getConnection());
>+
>+		// Read a book instance
>+		Command select = das
>+				.createCommand("SELECT * FROM BOOK WHERE BOOK_ID = 1");
>+		DataObject root = select.executeQuery();
>+		DataObject book = root.getDataObject("BOOK[1]");
>+		// Change a field to mark the instance 'dirty'
>+		book.setInt("QUANTITY", 2);
>+
>+		// Flush the change
>+
>+		das.applyChanges(root);
>+
>+		// Verify
>+		root = select.executeQuery();
>+		book = root.getDataObject("BOOK[1]");
>+		assertEquals(2, book.getInt("QUANTITY"));
>+	}
> }
>Index: src/test/java/org/apache/tuscany/das/rdb/test/ConverterTests.java
>===================================================================
>--- src/test/java/org/apache/tuscany/das/rdb/test/ConverterTests.java	(revision 425121)
>+++ src/test/java/org/apache/tuscany/das/rdb/test/ConverterTests.java	(working copy)
>@@ -23,8 +23,11 @@
> 
> import org.apache.tuscany.das.rdb.Command;
> import org.apache.tuscany.das.rdb.DAS;
>+import org.apache.tuscany.das.rdb.test.customer.Customer;
>+import org.apache.tuscany.das.rdb.test.customer.CustomerFactory;
> import org.apache.tuscany.das.rdb.test.data.CustomerData;
> import org.apache.tuscany.das.rdb.test.framework.DasTest;
>+import org.apache.tuscany.sdo.util.SDOUtil;
> 
> import commonj.sdo.DataObject;
> 
>@@ -99,4 +102,59 @@
> 		
> 	}
> 	
>+	public void testInvalidConverter1() throws Exception {
>+
>+		DAS das = DAS.FACTORY.createDAS(getConfig("InvalidConverter.xml"), getConnection());
>+		
>+		// Build the select command to read a specific customer and related
>+		// orders
>+		Command select = das
>+				.createCommand(
>+						"SELECT * FROM CUSTOMER LEFT JOIN ANORDER ON CUSTOMER.ID = ANORDER.CUSTOMER_ID where CUSTOMER.ID = ?");
>+
>+		// Parameterize the command	
>+		select.setParameter(1, new Integer(1));
>+
>+		// Get the graph
>+		try {
>+			select.executeQuery();
>+		} catch (Exception ex) {
>+			assertEquals("java.lang.ClassNotFoundException: not.a.valid.class", ex.getMessage());
>+		}
>+
>+	
>+	}
>+	
>+	public void testInvalidConverter2() throws Exception {
>+
>+		SDOUtil.registerStaticTypes(CustomerFactory.class);
>+		DAS das = DAS.FACTORY.createDAS(getConfig("InvalidConverter.xml"), getConnection());
>+		
>+		// Build the select command to read a specific customer and related
>+		// orders
>+		Command select = das
>+				.createCommand(
>+						"SELECT * FROM ANORDER");	
>+
>+		// Get the graph
>+		
>+		DataObject root = select.executeQuery();
>+		DataObject order = root.getDataObject("AnOrder[1]");
>+		
>+		Customer customer = (Customer) root.createDataObject("Customer");
>+		customer.setID(700);
>+		customer.setLastName("Daniel");
>+		customer.setAddress("an address");		
>+		
>+		customer.getOrders().add(order);	
>+		
>+		try {
>+			das.applyChanges(root);
>+		} catch (Exception ex) {
>+			assertEquals("java.lang.ClassNotFoundException: not.a.valid.class", ex.getMessage());
>+		}
>+
>+	
>+	}
>+	
> }
>Index: src/test/java/org/apache/tuscany/das/rdb/test/GeneratedId.java
>===================================================================
>--- src/test/java/org/apache/tuscany/das/rdb/test/GeneratedId.java	(revision 425121)
>+++ src/test/java/org/apache/tuscany/das/rdb/test/GeneratedId.java	(working copy)
>@@ -22,6 +22,8 @@
>  * 
>  */
> 
>+import java.util.Iterator;
>+
> import org.apache.tuscany.das.rdb.Command;
> import org.apache.tuscany.das.rdb.DAS;
> import org.apache.tuscany.das.rdb.test.data.CompanyData;
>@@ -100,6 +102,31 @@
> 
>     }
> 
>+    // Test insert into row with generated ID and generated insert
>+    public void testInsert4() throws Exception {
>+
>+    	DAS das = DAS.FACTORY.createDAS(getConfig("CompanyConfig.xml"),getConnection());
>+        Command select = das.getCommand("all companies");       
>+        DataObject root = select.executeQuery();
>+
>+        DataObject company = root.createDataObject("COMPANY");
>+        company.setString("NAME", "Phil's Tires");
>+        // This shouldn't do anything
>+        company.setInt("ID", 999);
>+        
>+        das.applyChanges(root);
>+        
>+        // Verify insert                 
>+        root = select.executeQuery();
>+
>+        assertEquals(4, root.getList("COMPANY").size());
>+        Iterator i = root.getList("COMPANY").iterator();
>+        while ( i.hasNext()) {
>+        	DataObject comp = (DataObject)i.next();
>+        	assertFalse( comp.getInt("ID") == 999);
>+        }        
>+
>+    }
>     // Test ability to propogate generated values back to owning data objects
>     public void testPropagateIds() throws Exception {
>         
>Index: src/test/java/org/apache/tuscany/das/rdb/test/CompoundKeyTests.java
>===================================================================
>--- src/test/java/org/apache/tuscany/das/rdb/test/CompoundKeyTests.java	(revision 425121)
>+++ src/test/java/org/apache/tuscany/das/rdb/test/CompoundKeyTests.java	(working copy)
>@@ -92,4 +92,21 @@
>         assertEquals(2, firstOrder.getList("ORDERDETAILS").size());
> 
>     }
>+    
>+    public void testReadAndDelete() throws Exception {
>+    	DAS das = DAS.FACTORY.createDAS(getConfig("OrdersOrderDetailsConfig.xml"), getConnection());
>+        Command getOrderDetails = das
>+                .createCommand("Select * from ORDERDETAILS where ORDERID = ? AND PRODUCTID = ?");
>+       
>+
>+        getOrderDetails.setParameter(1, new Integer(1));
>+        getOrderDetails.setParameter(2, new Integer(1));
>+
>+        DataObject root = getOrderDetails.executeQuery();
>+
>+        DataObject orderDetail = (DataObject) root.get("ORDERDETAILS[1]");
>+        orderDetail.delete();
>+        das.applyChanges(root);      
>+
>+    }
> }
>Index: src/test/resources/BooksConfig.xml
>===================================================================
>--- src/test/resources/BooksConfig.xml	(revision 425121)
>+++ src/test/resources/BooksConfig.xml	(working copy)
>@@ -21,7 +21,7 @@
> 
> 	<Table tableName="BOOK">
>         <Column columnName="BOOK_ID" primaryKey="true"/>
>-	    <Column columnName="OCC" collision="true"/>
>+	    <Column columnName="OCC" collision="true" propertyName="anOccColumn"/>
>     </Table>
>     
> </Config>
>Index: src/test/resources/InvalidConverter.xml
>===================================================================
>--- /dev/null	(revision 0)
>+++ src/test/resources/InvalidConverter.xml	(revision 0)
>@@ -0,0 +1,35 @@
>+<?xml version="1.0" encoding="ASCII"?>
>+<!--
>+  Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable.
>+
>+  Licensed under the Apache License, Version 2.0 (the "License");
>+  you may not use this file except in compliance with the License.
>+  You may obtain a copy of the License at
>+
>+     http://www.apache.org/licenses/LICENSE-2.0
>+
>+  Unless required by applicable law or agreed to in writing, software
>+  distributed under the License is distributed on an "AS IS" BASIS,
>+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
>+  See the License for the specific language governing permissions and
>+  limitations under the License.
>+ -->
>+<Config xsi:noNamespaceSchemaLocation="http:///org.apache.tuscany.das.rdb/config.xsd" 
>+xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>+dataObjectModel="http:///org.apache.tuscany.das.rdb.test/customer.xsd">
>+
>+  <Table tableName="CUSTOMER" typeName="Customer">
>+    <Column columnName="ID"  primaryKey="true" converterClassName="not.a.valid.class"/>
>+  </Table>
>+  
>+  <Table tableName="ANORDER" typeName="AnOrder">
>+  	<Column columnName="CUSTOMER_ID"/>
>+    <Column columnName="ID"  primaryKey="true"/>
>+  </Table>
>+	
>+  <Relationship name="orders" primaryKeyTable="CUSTOMER" foreignKeyTable="ANORDER" many="true">
>+     <KeyPair primaryKeyColumn="ID" foreignKeyColumn="CUSTOMER_ID"/>
>+  </Relationship>
>+  
>+</Config>
>+
>Index: src/main/java/org/apache/tuscany/das/rdb/impl/ApplyChangesCommandImpl.java
>===================================================================
>--- src/main/java/org/apache/tuscany/das/rdb/impl/ApplyChangesCommandImpl.java	(revision 425121)
>+++ src/main/java/org/apache/tuscany/das/rdb/impl/ApplyChangesCommandImpl.java	(working copy)
>@@ -34,13 +34,6 @@
>     private static final boolean debug = false;
> 
>     private ChangeSummarizer summarizer = new ChangeSummarizer();
>-
>-    public ApplyChangesCommandImpl() {
>-    }
>-
>-    public ApplyChangesCommandImpl(Config config){
>-    	this.configWrapper = new MappingWrapper(config);       
>-    }
>     
>     public ApplyChangesCommandImpl(Config config, Connection connection){
>         this.configWrapper = new MappingWrapper(config); 
>@@ -53,18 +46,7 @@
> 		summarizer.setConnection(connection);
> 	}
> 
>-    public void addCreateCommand(Type type, Command cmd) {
>-        summarizer.addCreateCommand(type, cmd);        
>-    }
> 
>-    public void addUpdateCommand(Type type, Command cmd) {      
>-        summarizer.addUpdateCommand(type, cmd);        
>-    }
>-
>-    public void addDeleteCommand(Type type, Command cmd) {
>-        summarizer.addDeleteCommand(type, cmd);       
>-    }
>-
>     public void execute(DataObject root) {
>         DebugUtil.debugln(getClass(), debug, "Executing ApplyChangesCmd");
> 
>Index: src/main/java/org/apache/tuscany/das/rdb/impl/FactoryRegistry.java
>===================================================================
>--- src/main/java/org/apache/tuscany/das/rdb/impl/FactoryRegistry.java	(revision 425121)
>+++ src/main/java/org/apache/tuscany/das/rdb/impl/FactoryRegistry.java	(working copy)
>@@ -39,7 +39,7 @@
> 		ChangeFactory factory = (ChangeFactory)registry.get(type);
> 		if ( factory == null )  {
> 			DebugUtil.debugln(getClass(), debug, "Creating new ChangeFactory for type " + type.getName());
>-			factory = new ChangeFactory(type, mapping, connection);
>+			factory = new ChangeFactory(mapping, connection);
> 			registry.put(type, factory);
> 		}
> 		return factory;
>Index: src/main/java/org/apache/tuscany/das/rdb/impl/ParameterImpl.java
>===================================================================
>--- src/main/java/org/apache/tuscany/das/rdb/impl/ParameterImpl.java	(revision 425121)
>+++ src/main/java/org/apache/tuscany/das/rdb/impl/ParameterImpl.java	(working copy)
>@@ -50,10 +50,6 @@
> 		super();
> 	}
> 
>-	public ParameterImpl(String name) {
>-		this.name = name;
>-	}
>-
> 	public ParameterImpl(int index) {
> 		this.index = index;
> 	}
>@@ -113,14 +109,6 @@
> 		return this.converter;
> 	}
> 
>-
>-	public String toString() {
>-		StringBuffer buffer = new StringBuffer();
>-		buffer.append("Index: " + getIndex());
>-		buffer.append("\nName: " + getName());
>-		buffer.append("\nValue: " + getValue());
>-		return buffer.toString();
>-	}
> 	
> 	
> }
>Index: src/main/java/org/apache/tuscany/das/rdb/impl/InsertCommandImpl.java
>===================================================================
>--- src/main/java/org/apache/tuscany/das/rdb/impl/InsertCommandImpl.java	(revision 425121)
>+++ src/main/java/org/apache/tuscany/das/rdb/impl/InsertCommandImpl.java	(working copy)
>@@ -35,9 +35,6 @@
> 		addParameters(create.getParameters());
> 	}
> 
>-	protected boolean isInsert() {
>-		return true;
>-	}
> 
> 	public int getGeneratedKey() {
> 
>@@ -60,16 +57,5 @@
> 
> 	}
> 
>-	public String toString() {
> 
>-		String superString = super.toString();
>-		StringBuffer buffer = new StringBuffer(superString);
>-
>-		buffer.append("\nGenerating key: " + hasGeneratedKey);
>-		if (hasGeneratedKey)
>-			buffer.append("\nGenerated key: " + generatedKey);
>-
>-		return buffer.toString();
>-	}
>-
> }
>Index: src/main/java/org/apache/tuscany/das/rdb/impl/WriteCommandImpl.java
>===================================================================
>--- src/main/java/org/apache/tuscany/das/rdb/impl/WriteCommandImpl.java	(revision 425121)
>+++ src/main/java/org/apache/tuscany/das/rdb/impl/WriteCommandImpl.java	(working copy)
>@@ -17,8 +17,6 @@
> package org.apache.tuscany.das.rdb.impl;
> 
> import java.sql.SQLException;
>-import java.util.Collection;
>-import java.util.Iterator;
> import java.util.StringTokenizer;
> 
> import org.apache.tuscany.das.rdb.config.Config;
>@@ -89,13 +87,7 @@
> 			addParameter(p);
> 		}
> 	}
>-	public void addParameters(Collection updateParameters) {
>-		Iterator i = updateParameters.iterator();
>-		while ( i.hasNext()) {
>-			ParameterImpl p = (ParameterImpl) i.next();
>-			addParameter(p);
>-		}
>-	}
>+	
> 
> 
> }
>Index: src/main/java/org/apache/tuscany/das/rdb/impl/ChangeFactory.java
>===================================================================
>--- src/main/java/org/apache/tuscany/das/rdb/impl/ChangeFactory.java	(revision 425121)
>+++ src/main/java/org/apache/tuscany/das/rdb/impl/ChangeFactory.java	(working copy)
>@@ -28,11 +28,8 @@
> import org.apache.tuscany.das.rdb.util.DebugUtil;
> 
> import commonj.sdo.DataObject;
>-import commonj.sdo.Type;
> 
> public class ChangeFactory {
>-
>-	private final Type type; 
> 	
> 	private InsertCommandImpl createCommand;
> 
>@@ -46,15 +43,10 @@
> 
> 	private final ConnectionImpl connection; 
> 	
>-	public ChangeFactory(Type type, MappingWrapper mapping, ConnectionImpl connection) {
>-		this.type = type;
>+	public ChangeFactory(MappingWrapper mapping, ConnectionImpl connection) {	
> 		this.mapping = mapping;
> 		this.connection = connection;
> 	}
>-
>-	public Type getType() {
>-		return this.type;
>-	}
> 	
> 	public void setCreateCommand(InsertCommandImpl cmd) {
> 		createCommand = cmd;
>@@ -138,6 +130,7 @@
> 				deleteCommand = new DeleteCommandImpl(delete);						
> 			}
> 			deleteCommand.setConnection(connection);
>+			deleteCommand.configWrapper = mapping;
> 		}
> 		return deleteCommand;
> 	}
>Index: src/main/java/org/apache/tuscany/das/rdb/impl/QueryString.java
>===================================================================
>--- src/main/java/org/apache/tuscany/das/rdb/impl/QueryString.java	(revision 425121)
>+++ src/main/java/org/apache/tuscany/das/rdb/impl/QueryString.java	(working copy)
>@@ -1,86 +0,0 @@
>-/**
>- *
>- *  Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
>- *
>- *  Licensed under the Apache License, Version 2.0 (the "License");
>- *  you may not use this file except in compliance with the License.
>- *  You may obtain a copy of the License at
>- *
>- *     http://www.apache.org/licenses/LICENSE-2.0
>- *
>- *  Unless required by applicable law or agreed to in writing, software
>- *  distributed under the License is distributed on an "AS IS" BASIS,
>- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
>- *  See the License for the specific language governing permissions and
>- *  limitations under the License.
>- */
>-package org.apache.tuscany.das.rdb.impl;
>-
>-import java.util.HashMap;
>-import java.util.Iterator;
>-import java.util.regex.Matcher;
>-import java.util.regex.Pattern;
>-
>-import org.apache.tuscany.das.rdb.util.DebugUtil;
>-
>-
>-public class QueryString {
>-
>-	private final String unmodifiedQueryString;
>-	private final String preparedString;
>-	private HashMap parameters = new HashMap();
>-	private static final boolean debug = false;
>-	
>-	public QueryString(String originalString) {
>-		this.unmodifiedQueryString = originalString;
>-		this.preparedString = replaceNamesAndSetIndexes(originalString);	
>-	}
>-
>-	public String getPreparedString() {
>-		return this.preparedString;
>-	}
>-	
>-	public String getUnmodifiedString() {
>-		return this.unmodifiedQueryString;
>-	}
>-	
>-	public int getParameterIndex(String name) {
>-		DebugUtil.debugln(getClass(), debug, "Looking for parameter index for: " + name);
>-		return ((Integer)parameters.get(name)).intValue();
>-	}
>-	
>-	private String replaceNamesAndSetIndexes(String query) {
>-		DebugUtil.debugln(getClass(), debug, "Parameterizing query: " + query);
>-		Pattern p = Pattern.compile(":[\\S&&[^,()]]*");
>-		Matcher m = p.matcher(query);
>-
>-		int index = 1;
>-		while (m.find()) {
>-			parameters.put(m.group().substring(1), new Integer(index));
>-			query = m.replaceFirst("?");
>-			m = p.matcher(query);
>-			index++;
>-		}
>-		
>-		DebugUtil.debugln(getClass(), debug, "Parameterized query: " + query);
>-		return query;
>-	}
>-
>-	
>-	public String toString() {
>-		StringBuffer buffer = new StringBuffer();
>-		buffer.append("\nOriginal SQL: ");
>-		buffer.append(unmodifiedQueryString);
>-		buffer.append("\nPrepared SQL: ");
>-		buffer.append(preparedString);
>-		buffer.append("\nParameters: ");
>-		Iterator i = parameters.keySet().iterator();
>-		while ( i.hasNext() ) {
>-			String key = (String)i.next();
>-			buffer.append("\n");
>-			buffer.append(key);
>-		}
>-		return buffer.toString();
>-	}
>-
>-}
>Index: src/main/java/org/apache/tuscany/das/rdb/impl/DeleteList.java
>===================================================================
>--- src/main/java/org/apache/tuscany/das/rdb/impl/DeleteList.java	(revision 425121)
>+++ src/main/java/org/apache/tuscany/das/rdb/impl/DeleteList.java	(working copy)
>@@ -21,6 +21,8 @@
> import java.util.HashMap;
> import java.util.Iterator;
> 
>+import org.apache.tuscany.das.rdb.util.DebugUtil;
>+
> /**
>  * DeleteList will sort delete operations so that child objects are deleted
>  * before their parents
>@@ -40,7 +42,7 @@
> 	}
> 
> 	public void add(ChangeOperation op) {
>-		if (( order == null  ) || ( op.getTableName() == null ) ) {
>+		if (( order.size() == 0  ) || ( op.getTableName() == null ) ) {
> 			deleteOperations.add(op);
> 		} else {
> 			String name = op.getTableName();
>@@ -54,11 +56,12 @@
> 	}
> 
> 	public Collection getSortedList() {
>-		if  (( order != null  ) && ( opsByTableName.keySet().size() > 0) ) {
>+		if  (( order.size() > 0  ) && ( opsByTableName.keySet().size() > 0) ) {
> 			Iterator i = this.order.iterator();
> 			while (i.hasNext()) {
> 				String name = (String) i.next();
>-				deleteOperations.addAll((Collection) opsByTableName.get(name));
>+				if ( opsByTableName.get(name) != null)
>+					deleteOperations.addAll((Collection) opsByTableName.get(name));
> 			}
> 		}
> 		
>Index: src/main/java/org/apache/tuscany/das/rdb/ConfigHelper.java
>===================================================================
>--- src/main/java/org/apache/tuscany/das/rdb/ConfigHelper.java	(revision 425121)
>+++ src/main/java/org/apache/tuscany/das/rdb/ConfigHelper.java	(working copy)
>@@ -44,9 +44,6 @@
>         configWrapper = new MappingWrapper(config);
>     }
> 
>-    public Config newInstance() {
>-        return factory.createConfig();
>-    }
> 
>     public void addPrimaryKey(String columnName) {
>         configWrapper.addPrimaryKey(columnName);
>Index: src/main/java/org/apache/tuscany/das/rdb/config/wrapper/MappingWrapper.java
>===================================================================
>--- src/main/java/org/apache/tuscany/das/rdb/config/wrapper/MappingWrapper.java	(revision 425121)
>+++ src/main/java/org/apache/tuscany/das/rdb/config/wrapper/MappingWrapper.java	(working copy)
>@@ -190,19 +190,6 @@
>         return propertyName;
>     }
> 
>-    public void addCollisionColumn(String columnName) {
>-
>-        if (config == null)
>-            config = factory.createConfig();
>-
>-        QualifiedColumn occColumn = new QualifiedColumn(columnName);
>-        Table t = findOrCreateTable(occColumn.getTableName());
>-        Column c = findOrCreateColumn(t, occColumn.getColumnName());
>-        c.setCollision(true);
>-
>-        config.getTable().add(t);
>-    }
>-
>     public void addTable(String tableName, String typeName) {
>         Table table = getTable(tableName);
>         if (table != null)
>Index: src/main/java/org/apache/tuscany/das/rdb/generator/impl/InsertGenerator.java
>===================================================================
>--- src/main/java/org/apache/tuscany/das/rdb/generator/impl/InsertGenerator.java	(revision 425121)
>+++ src/main/java/org/apache/tuscany/das/rdb/generator/impl/InsertGenerator.java	(working copy)
>@@ -111,7 +111,7 @@
> 			} else {
> 				if ( obj.isSet(p) ) {
> 					Relationship relationship = config.getRelationshipByReference(p);
>-					if ( p.getOpposite().isMany() || (hasState(config, relationship, obj))) {							
>+					if ((p.getOpposite() != null && p.getOpposite().isMany()) || (hasState(config, relationship, obj))) {							
> 						RelationshipWrapper r = new RelationshipWrapper(
> 							relationship);
> 						Iterator keys = r.getForeignKeys().iterator();
>Index: pom.xml
>===================================================================
>--- pom.xml	(revision 425121)
>+++ pom.xml	(working copy)
>@@ -63,8 +63,6 @@
>                         <id>config</id>
>                         <configuration>
>                             <schemaFile>${basedir}/src/main/resources/config.xsd</schemaFile>
>-                            <generateLoader>true</generateLoader>
>-                            <generateSwitch>true</generateSwitch>
>                             <noNotification>true</noNotification>
>                             <noUnsettable>true</noUnsettable>
>                         </configuration>
>@@ -76,8 +74,6 @@
>                         <id>company</id>
>                         <configuration>
>                             <schemaFile>${basedir}/src/test/resources/company.xsd</schemaFile>
>-                            <generateLoader>true</generateLoader>
>-                            <generateSwitch>true</generateSwitch>                           
>                             <noUnsettable>true</noUnsettable>
>                         </configuration>
>                         <goals>
>@@ -88,8 +84,6 @@
>                         <id>customer</id>
>                         <configuration>
>                             <schemaFile>${basedir}/src/test/resources/customer.xsd</schemaFile>
>-                            <generateLoader>true</generateLoader>
>-                            <generateSwitch>true</generateSwitch>                        
>                             <noUnsettable>true</noUnsettable>
>                         </configuration>
>                         <goals>
>  
>
>------------------------------------------------------------------------
>
>---------------------------------------------------------------------
>To unsubscribe, e-mail: tuscany-dev-unsubscribe@ws.apache.org
>For additional commands, e-mail: tuscany-dev-help@ws.apache.org
>



---------------------------------------------------------------------
To unsubscribe, e-mail: tuscany-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: tuscany-dev-help@ws.apache.org