Author: amita
Date: Wed Nov 21 04:18:12 2007
New Revision: 597050

URL: http://svn.apache.org/viewvc?rev=597050&view=rev
Log:
TUSCANY-1895 UpdateGenerator logic fix

Added:
    
incubator/tuscany/java/das/rdb/src/test/java/org/apache/tuscany/das/rdb/test/data/ProductData.java
    
incubator/tuscany/java/das/rdb/src/test/java/org/apache/tuscany/das/rdb/test/data/ProductProdSpecData.java
    
incubator/tuscany/java/das/rdb/src/test/java/org/apache/tuscany/das/rdb/test/data/ProductSpecData.java
    
incubator/tuscany/java/das/rdb/src/test/resources/OneToOneNonRestrictedConfig.xml
Modified:
    
incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/generator/impl/UpdateGenerator.java
    
incubator/tuscany/java/das/rdb/src/test/java/org/apache/tuscany/das/rdb/test/RelationshipTests.java
    
incubator/tuscany/java/das/rdb/src/test/java/org/apache/tuscany/das/rdb/test/framework/DatabaseSetup.java
    
incubator/tuscany/java/das/rdb/src/test/resources/OneToOneRestrictedConfig.xml

Modified: 
incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/generator/impl/UpdateGenerator.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/generator/impl/UpdateGenerator.java?rev=597050&r1=597049&r2=597050&view=diff
==============================================================================
--- 
incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/generator/impl/UpdateGenerator.java
 (original)
+++ 
incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/generator/impl/UpdateGenerator.java
 Wed Nov 21 04:18:12 2007
@@ -25,6 +25,7 @@
 
 import org.apache.log4j.Logger;
 import org.apache.tuscany.das.rdb.config.Column;
+import org.apache.tuscany.das.rdb.config.Relationship;
 import org.apache.tuscany.das.rdb.config.Table;
 import org.apache.tuscany.das.rdb.config.wrapper.MappingWrapper;
 import org.apache.tuscany.das.rdb.config.wrapper.RelationshipWrapper;
@@ -35,6 +36,7 @@
 import org.apache.tuscany.das.rdb.impl.ParameterExtendedImpl;
 import org.apache.tuscany.das.rdb.impl.SDODataTypeHelper;
 import org.apache.tuscany.das.rdb.impl.UpdateCommandImpl;
+import org.apache.tuscany.das.rdb.util.CollectionsUtil;
 
 import commonj.sdo.ChangeSummary;
 import commonj.sdo.DataObject;
@@ -180,7 +182,10 @@
                }
             } else {
                 Property ref = setting.getProperty();
-                if (!ref.isMany()) {
+                
+                Relationship relationship = 
config.getRelationshipByReference(ref);
+                if ((ref.getOpposite() != null && ref.getOpposite().isMany()) 
+                        || (hasState(tw, relationship, obj))) {
                     RelationshipWrapper r = new 
RelationshipWrapper(config.getRelationshipByReference(ref));
 
                     Iterator keys = r.getForeignKeys().iterator();
@@ -188,19 +193,31 @@
                         String key = (String) keys.next();
                         String keyProperty = 
config.getColumnPropertyName(tw.getTableName(), key);
                         Property keyProp = 
obj.getType().getProperty(keyProperty);
-                        if ( keyProp == null ) 
+                        if ( keyProp == null ) {
                             throw new RuntimeException("Invalid foreign key 
column: " + key);
+                        }
                         if (changes.add(keyProp) == false) {
                             throw new RuntimeException("Foreign key properties 
should not be set when the corresponding relationship has changed");
                         }
                     }
                 }
-
             }
         }
         return changes;
     }
 
+    private boolean hasState(TableWrapper tw, Relationship rel, DataObject 
changedObject) {
+        if (!rel.isMany()) {
+            RelationshipWrapper rw = new RelationshipWrapper(rel);
+            if ((rel.getForeignKeyTable().equals(tw.getTableName())) 
+                    && (CollectionsUtil.disjoint(tw.getPrimaryKeyProperties(), 
rw.getForeignKeys()))) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+    
     private ParameterExtendedImpl fillExtendedParameter(ParameterExtendedImpl 
param, TableWrapper table, Property property, int idx) {
         param.setName(property.getName());
         param.setType(property.getType());

Modified: 
incubator/tuscany/java/das/rdb/src/test/java/org/apache/tuscany/das/rdb/test/RelationshipTests.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/das/rdb/src/test/java/org/apache/tuscany/das/rdb/test/RelationshipTests.java?rev=597050&r1=597049&r2=597050&view=diff
==============================================================================
--- 
incubator/tuscany/java/das/rdb/src/test/java/org/apache/tuscany/das/rdb/test/RelationshipTests.java
 (original)
+++ 
incubator/tuscany/java/das/rdb/src/test/java/org/apache/tuscany/das/rdb/test/RelationshipTests.java
 Wed Nov 21 04:18:12 2007
@@ -24,6 +24,7 @@
  */
 
 import java.sql.SQLException;
+import java.util.List;
 
 import org.apache.tuscany.das.rdb.Command;
 import org.apache.tuscany.das.rdb.ConfigHelper;
@@ -32,12 +33,16 @@
 import org.apache.tuscany.das.rdb.config.Relationship;
 import org.apache.tuscany.das.rdb.config.wrapper.MappingWrapper;
 import org.apache.tuscany.das.rdb.test.data.CompanyData;
+import org.apache.tuscany.das.rdb.test.data.CompanyDeptData;
 import org.apache.tuscany.das.rdb.test.data.CompanyEmpData;
 import org.apache.tuscany.das.rdb.test.data.CustomerData;
 import org.apache.tuscany.das.rdb.test.data.DepEmpData;
 import org.apache.tuscany.das.rdb.test.data.DepartmentData;
 import org.apache.tuscany.das.rdb.test.data.EmployeeData;
 import org.apache.tuscany.das.rdb.test.data.OrderData;
+import org.apache.tuscany.das.rdb.test.data.ProductData;
+import org.apache.tuscany.das.rdb.test.data.ProductProdSpecData;
+import org.apache.tuscany.das.rdb.test.data.ProductSpecData;
 import org.apache.tuscany.das.rdb.test.framework.DasTest;
 
 import commonj.sdo.DataObject;
@@ -47,7 +52,6 @@
 
     protected void setUp() throws Exception {
         super.setUp();
-
         new CustomerData(getAutoConnection()).refresh();
         new OrderData(getAutoConnection()).refresh();
 
@@ -56,6 +60,10 @@
         new DepartmentData(getAutoConnection()).refresh();
         new CompanyEmpData(getAutoConnection()).refresh();
         new DepEmpData(getAutoConnection()).refresh();
+        new CompanyDeptData(getAutoConnection()).refresh();
+        new ProductData(getAutoConnection()).refresh();
+        new ProductSpecData(getAutoConnection()).refresh();
+        new ProductProdSpecData(getAutoConnection()).refresh();
     }
 
     protected void tearDown() throws Exception {
@@ -286,5 +294,437 @@
         
         root = cmd.executeQuery();
         firstCustomer = root.getDataObject("CUSTOMER[ID=1]");
-    }    
-}
+    }
+    
+    //Below is set of test cases with 1-1 key restricted, 1-1 no key 
restricted, 1-n
+    //with parent/child having autogen keys and parent/child not having 
autogen keys
+    //These will help in testing all corner cases of 1-1 relationship
+    public void testOneToOneKeyRestrictedAutogenKeys() throws Exception {
+        DAS das = 
DAS.FACTORY.createDAS(getConfig("OneToOneRestrictedConfig.xml"), 
getConnection());
+
+        Command read = das.getCommand("get named employee with company");
+        read.setParameter(1, "John Smith");
+        DataObject root = read.executeQuery();
+        DataObject john = root.getDataObject("EMPLOYEE[1]");
+
+        //1-Update parent , Insert 
child/////////////////////////////////////////////
+        john.setString("NAME", "johnNew");
+        int origEOTMID = john.getInt("ID");
+        
+        DataObject comp = root.createDataObject("COMPANY");
+        comp.setString("NAME", "comp100");
+        john.setDataObject("company", comp);
+        
+        try {
+            das.applyChanges(root);
+        } catch (RuntimeException ex) {
+               fail("Did not expect exception!");
+        }
+        
+        read.setParameter(1, "johnNew");
+        root = read.executeQuery();
+        john = root.getDataObject("EMPLOYEE[1]");
+        assertNotNull(john);
+        comp = john.getDataObject("company");        
+        assertEquals(origEOTMID, comp.getInt("EOTMID"));
+        assertEquals("comp100", comp.getString("NAME"));
+        
+        //2-Insert Parent, Update 
child///////////////////////////////////////////
+        DataObject emp = root.createDataObject("EMPLOYEE");
+        emp.setString("NAME", "NewEmp");
+        emp.setDataObject("company", comp);//as key restricted, this will fail
+        try {
+            das.applyChanges(root);
+            fail("Expected exception, as key restricted does not allow chages 
in relationship");
+        } catch (RuntimeException ex) {
+        }
+        
+        //3-Update Parent, Update Child
+        read.setParameter(1, "johnNew");
+        root = read.executeQuery();
+        john = root.getDataObject("EMPLOYEE[1]");
+        comp = john.getDataObject("company");
+        
+        john.setString("NAME", "johnOld");
+        comp.setString("NAME", "comp101");
+        try {
+            das.applyChanges(root);
+        } catch (RuntimeException ex) {
+               fail("Did not expect exception!");
+        }
+        
+        read.setParameter(1, "johnOld");
+        root = read.executeQuery();
+        john = root.getDataObject("EMPLOYEE[1]");
+        assertNotNull(john);
+        comp = john.getDataObject("company");        
+        assertEquals(origEOTMID, comp.getInt("EOTMID"));
+        assertEquals("comp101", comp.getString("NAME"));
+    }
+    
+    public void testOneToOneNoKeyRestrictedAutogenKeys() throws Exception {
+        DAS das = 
DAS.FACTORY.createDAS(getConfig("OneToOneNonRestrictedConfig.xml"), 
getConnection());
+
+        Command read = das.getCommand("get named employee with company");
+        read.setParameter(1, "John Smith");
+        DataObject root = read.executeQuery();
+        DataObject john = root.getDataObject("EMPLOYEE[1]");
+        int origEOTMID = john.getInt("ID");
+        
+        //1-Update parent , Insert 
child/////////////////////////////////////////////
+        john.setString("NAME", "johnNew");
+        
+        DataObject comp = root.createDataObject("COMPANY");
+        comp.setString("NAME", "comp100");
+        john.setDataObject("company", comp);
+        
+        try {
+            das.applyChanges(root);
+        } catch (RuntimeException ex) {
+               fail("Did not expect exception!");
+        }
+        
+        read.setParameter(1, "johnNew");
+        root = read.executeQuery();
+        john = root.getDataObject("EMPLOYEE[1]");
+        assertNotNull(john);
+        comp = john.getDataObject("company");        
+        assertEquals(origEOTMID, comp.getInt("EOTMID"));
+        assertEquals("comp100", comp.getString("NAME"));
+        
+        //2-Insert Parent, Update 
child///////////////////////////////////////////
+        DataObject emp = root.createDataObject("EMPLOYEE");
+        emp.setString("NAME", "NewEmp");
+        emp.setDataObject("company", comp);//as no key restricted, this will 
not fail
+        try {
+            das.applyChanges(root);        
+        } catch (RuntimeException ex) {
+               fail("Did not expect exception!");
+        }
+        read.setParameter(1, "NewEmp");
+        root = read.executeQuery();
+        DataObject newEmp = root.getDataObject("EMPLOYEE[1]");
+        assertNotNull(newEmp);
+        int eotmid = newEmp.getInt("ID");
+        comp = newEmp.getDataObject("company");        
+        assertEquals(eotmid, comp.getInt("EOTMID"));
+        assertEquals("comp100", comp.getString("NAME"));        
+        
+        //3-Update Parent, Update Child
+        newEmp.setString("NAME", "johnOld");
+        comp.setString("NAME", "comp101");
+        try {
+            das.applyChanges(root);
+        } catch (RuntimeException ex) {
+               fail("Did not expect exception!");
+        }
+        
+        read.setParameter(1, "johnOld");
+        root = read.executeQuery();
+        newEmp = root.getDataObject("EMPLOYEE[1]");
+        assertNotNull(newEmp);
+        comp = newEmp.getDataObject("company");        
+        assertEquals(eotmid, comp.getInt("EOTMID"));
+        assertEquals("comp101", comp.getString("NAME"));       
+    }
+    
+    public void testOneToOneKeyRestrictedNoAutogenKeys() throws Exception {
+        DAS das = 
DAS.FACTORY.createDAS(getConfig("OneToOneRestrictedConfig.xml"), 
getConnection());
+
+        Command read = das.getCommand("get spec with product");
+        read.setParameter(1, "PQRPen");
+        DataObject root = read.executeQuery();
+        DataObject prod1 = root.getDataObject("PRODUCT[1]");
+        int origProdId = prod1.getInt("ID");
+        
+        //1-Update parent , Insert 
child/////////////////////////////////////////////
+        prod1.setString("NAME", "PQRNewPen");
+        
+        DataObject spec1 = root.createDataObject("PRODUCTSPEC");
+        spec1.setInt("ID", 100);
+        spec1.setString("NAME", "PQRNewPenSpec");
+        prod1.setDataObject("prodspec", spec1);
+        
+        try {
+            das.applyChanges(root);
+        } catch (RuntimeException ex) {
+               fail("Did not expect exception!");
+        }
+        
+        read.setParameter(1, "PQRNewPen");
+        root = read.executeQuery();
+        prod1 = root.getDataObject("PRODUCT[1]");
+        assertNotNull(prod1);
+        spec1 = prod1.getDataObject("prodspec");        
+        assertEquals(origProdId, spec1.getInt("PRODUCT_ID"));
+        assertEquals("PQRNewPenSpec", spec1.getString("NAME"));
+        
+        //2-Insert Parent, Update 
child///////////////////////////////////////////
+        DataObject prod3 = root.createDataObject("PRODUCT");
+        prod3.setString("NAME", "NewProd");
+        prod3.setDataObject("prodspec", spec1);//as key restricted, this will 
fail
+        try {
+            das.applyChanges(root);
+            fail("Expected exception, as key restricted does not allow changes 
in relationship");
+        } catch (RuntimeException ex) {
+        }
+        
+        //3-Update Parent, Update Child
+        read.setParameter(1, "PQRNewPen");
+        root = read.executeQuery();
+        prod1 = root.getDataObject("PRODUCT[1]");
+        spec1 = prod1.getDataObject("prodspec");        
+        
+        prod1.setString("NAME", "PQRProd");
+        spec1.setString("NAME", "PQRProdSpec");
+        try {
+            das.applyChanges(root);
+        } catch (RuntimeException ex) {
+               fail("Did not expect exception!");
+        }
+        
+        read.setParameter(1, "PQRProd");
+        root = read.executeQuery();
+        prod1 = root.getDataObject("PRODUCT[1]");
+        assertNotNull(prod1);
+        spec1 = prod1.getDataObject("prodspec");        
+        assertEquals(origProdId, spec1.getInt("PRODUCT_ID"));
+        assertEquals("PQRProdSpec", spec1.getString("NAME"));          
+    }
+    
+    public void testOneToOneNoKeyRestrictedNoAutogenKeys() throws Exception {
+        DAS das = 
DAS.FACTORY.createDAS(getConfig("OneToOneNonRestrictedConfig.xml"), 
getConnection());
+
+        Command read = das.getCommand("get spec with product");
+        read.setParameter(1, "PQRPen");
+        DataObject root = read.executeQuery();
+        DataObject prod1 = root.getDataObject("PRODUCT[1]");
+        int origProdId = prod1.getInt("ID");
+        
+        //1-Update parent , Insert 
child/////////////////////////////////////////////
+        prod1.setString("NAME", "PQRNewPen");
+        
+        DataObject spec1 = root.createDataObject("PRODUCTSPEC");
+        spec1.setInt("ID", 100);
+        spec1.setString("NAME", "PQRNewPenSpec");
+        prod1.setDataObject("prodspec", spec1);
+        
+        try {
+            das.applyChanges(root);
+        } catch (RuntimeException ex) {
+               fail("Did not expect exception!");
+        }
+        
+        read.setParameter(1, "PQRNewPen");
+        root = read.executeQuery();
+        prod1 = root.getDataObject("PRODUCT[1]");
+        assertNotNull(prod1);
+        spec1 = prod1.getDataObject("prodspec");        
+        assertEquals(origProdId, spec1.getInt("PRODUCT_ID"));
+        assertEquals("PQRNewPenSpec", spec1.getString("NAME"));
+        
+        //2-Insert Parent, Update 
child///////////////////////////////////////////
+        DataObject prod3 = root.createDataObject("PRODUCT");
+        prod3.setInt("ID", 200);
+        prod3.setString("NAME", "NewProd");
+        prod3.setDataObject("prodspec", spec1);//as no key restricted, this 
will not fail
+        try {
+            das.applyChanges(root);        
+        } catch (RuntimeException ex) {
+               fail("Did not expect exception!");
+        }
+        read.setParameter(1, "NewProd");
+        root = read.executeQuery();
+        DataObject newProd = root.getDataObject("PRODUCT[1]");
+        assertNotNull(newProd);
+        int product_id = newProd.getInt("ID");
+        DataObject newSpec = newProd.getDataObject("prodspec");        
+        assertEquals(product_id, newSpec.getInt("PRODUCT_ID"));
+        assertEquals("PQRNewPenSpec", newSpec.getString("NAME"));       
+        
+        //3-Update Parent, Update Child
+        newProd.setString("NAME", "MyProd");
+        newSpec.setString("NAME", "XYZNewPenSpec");
+        try {
+            das.applyChanges(root);
+        } catch (RuntimeException ex) {
+               fail("Did not expect exception!");
+        }
+        
+        read.setParameter(1, "MyProd");
+        root = read.executeQuery();
+        newProd = root.getDataObject("PRODUCT[1]");
+        assertNotNull(newProd);
+        newSpec = newProd.getDataObject("prodspec");        
+        assertEquals(product_id, newSpec.getInt("PRODUCT_ID"));
+        assertEquals("XYZNewPenSpec", newSpec.getString("NAME"));      
+    }
+    
+    public void testOneToManyAutogenKeys() throws Exception {
+        DAS das = DAS.FACTORY.createDAS(getConfig("CompanyConfig.xml"), 
getConnection());
+
+        Command read = das.getCommand("all companies and departments");
+        DataObject root = read.executeQuery();
+        DataObject comp1 = (DataObject)root.getList("COMPANY").get(0);
+        int compId = comp1.getInt("ID");
+        
+        //1-Update parent , Insert 
child/////////////////////////////////////////////
+        comp1.setString("NAME", "MyCompany");
+        
+        DataObject dept1 = root.createDataObject("DEPARTMENT");
+        dept1.setString("NAME", "MyCompanyDepartment");
+        comp1.getList("departments").add(dept1);
+        
+        try {
+            das.applyChanges(root);
+        } catch (RuntimeException ex) {
+               fail("Did not expect exception!");
+        }
+        
+        //read.setParameter(1, new Integer(1));
+        root = read.executeQuery();
+        comp1 = root.getDataObject("COMPANY[ID="+compId+"]");
+        assertNotNull(comp1);
+        assertEquals("MyCompany", comp1.getString("NAME"));
+        List comp1Depts = comp1.getList("departments");
+        boolean foundNewDept = false;
+        DataObject curDept = null;
+        
+        for(int i=0; i<comp1Depts.size(); i++) {
+               curDept = (DataObject)comp1Depts.get(i);
+               if(curDept.getString("NAME").equals("MyCompanyDepartment")) {
+                       foundNewDept = true;
+                       break;
+               }
+        }
+        
+        if(!foundNewDept) {
+               fail("Expected new department to be available!");
+        }
+                
+        assertEquals(comp1.getInt("ID"), curDept.getInt("COMPANYID"));
+        
+        //2-Insert Parent, Update 
child///////////////////////////////////////////
+        DataObject compNew = root.createDataObject("COMPANY");
+        compNew.setString("NAME", "CompanyNew");
+        compNew.getList("departments").add(curDept);
+        try {
+            das.applyChanges(root);        
+        } catch (RuntimeException ex) {
+               fail("Did not expect exception!");
+        }
+        compNew = root.getDataObject("COMPANY[NAME='CompanyNew']");
+        
+        root = read.executeQuery();
+        compNew = root.getDataObject("COMPANY[ID="+compNew.getInt("ID")+"]");
+        assertNotNull(compNew);
+        int newCompany_id = compNew.getInt("ID");
+        List newCompDepts = compNew.getList("departments");        
+        
+        DataObject deptNew = (DataObject)newCompDepts.get(0);
+        assertEquals(newCompany_id, deptNew.getInt("COMPANYID"));
+        assertEquals("MyCompanyDepartment", deptNew.getString("NAME"));       
+        
+        //3-Update Parent, Update Child
+        compNew.setString("NAME", "MyNewCompanyName");
+        deptNew.setString("NAME", "XYZNewSoap123Dept");
+        try {
+            das.applyChanges(root);
+        } catch (RuntimeException ex) {
+               fail("Did not expect exception!");
+        }
+        
+        //read.setParameter(1, new Integer(newCompany_id));
+        root = read.executeQuery();
+        compNew = root.getDataObject("COMPANY[ID="+newCompany_id+"]");
+        assertNotNull(compNew);
+        deptNew = (DataObject)compNew.getList("departments").get(0);        
+        assertEquals(newCompany_id, deptNew.getInt("COMPANYID"));
+        assertEquals("XYZNewSoap123Dept", deptNew.getString("NAME"));          
+    }
+    
+    public void testOneToManyNoAutogenKeys() throws Exception {        
+        DAS das = 
DAS.FACTORY.createDAS(getConfig("CustomersOrdersConfig.xml"), getConnection());
+
+        Command read = das.getCommand("customer and orders");
+        read.setParameter(1, new Integer(1));
+        DataObject root = read.executeQuery();
+        DataObject cust1 = root.getDataObject("CUSTOMER[1]");
+
+        //1-Update parent , Insert 
child/////////////////////////////////////////////
+        cust1.setString("LASTNAME", "MyCustomer");
+        
+        DataObject ord1 = root.createDataObject("ANORDER");
+        ord1.setInt("ID", 100);
+        ord1.setString("PRODUCT", "XYZNewProduct");
+        cust1.getList("orders").add(ord1);
+        
+        try {
+            das.applyChanges(root);
+        } catch (RuntimeException ex) {
+               fail("Did not expect exception!");
+        }
+        
+        read.setParameter(1, new Integer(1));
+        root = read.executeQuery();
+        cust1 = root.getDataObject("CUSTOMER[1]");
+        assertNotNull(cust1);
+        assertEquals("MyCustomer", cust1.getString("LASTNAME"));
+        List cust1Ords = cust1.getList("orders");
+        boolean foundNewOrder = false;
+        DataObject curOrd = null;
+        
+        for(int i=0; i<cust1Ords.size(); i++) {
+               curOrd = (DataObject)cust1Ords.get(i);
+               if(curOrd.getString("PRODUCT").equals("XYZNewProduct")) {
+                       foundNewOrder = true;
+                       break;
+               }
+        }
+        
+        if(!foundNewOrder) {
+               fail("Expected new order to be available!");
+        }
+                
+        assertEquals(cust1.getInt("ID"), curOrd.getInt("CUSTOMER_ID"));
+        
+        //2-Insert Parent, Update 
child///////////////////////////////////////////
+        DataObject custNew = root.createDataObject("CUSTOMER");
+        custNew.setInt("ID", 100);
+        custNew.setString("LASTNAME", "CustNew");
+        custNew.getList("orders").add(curOrd);
+        try {
+            das.applyChanges(root);        
+        } catch (RuntimeException ex) {
+               fail("Did not expect exception!");
+        }
+        
+        read.setParameter(1, new Integer(100));
+        root = read.executeQuery();
+        custNew = root.getDataObject("CUSTOMER[1]");
+        assertNotNull(custNew);
+        int newCustomer_id = custNew.getInt("ID");
+        List newCustOrds = custNew.getList("orders");        
+        
+        DataObject ordNew = (DataObject)newCustOrds.get(0);
+        assertEquals(newCustomer_id, ordNew.getInt("CUSTOMER_ID"));
+        assertEquals("XYZNewProduct", ordNew.getString("PRODUCT"));       
+        
+        //3-Update Parent, Update Child
+        custNew.setString("LASTNAME", "MyNewLastName");
+        ordNew.setString("PRODUCT", "XYZNewSoap123Product");
+        try {
+            das.applyChanges(root);
+        } catch (RuntimeException ex) {
+               fail("Did not expect exception!");
+        }
+        
+        read.setParameter(1, new Integer(100));
+        root = read.executeQuery();
+        custNew = root.getDataObject("CUSTOMER[1]");
+        assertNotNull(custNew);
+        ordNew = (DataObject)custNew.getList("orders").get(0);        
+        assertEquals(100, ordNew.getInt("CUSTOMER_ID"));
+        assertEquals("XYZNewSoap123Product", ordNew.getString("PRODUCT"));     
+    }
+}
\ No newline at end of file

Added: 
incubator/tuscany/java/das/rdb/src/test/java/org/apache/tuscany/das/rdb/test/data/ProductData.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/das/rdb/src/test/java/org/apache/tuscany/das/rdb/test/data/ProductData.java?rev=597050&view=auto
==============================================================================
--- 
incubator/tuscany/java/das/rdb/src/test/java/org/apache/tuscany/das/rdb/test/data/ProductData.java
 (added)
+++ 
incubator/tuscany/java/das/rdb/src/test/java/org/apache/tuscany/das/rdb/test/data/ProductData.java
 Wed Nov 21 04:18:12 2007
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+package org.apache.tuscany.das.rdb.test.data;
+
+import java.sql.Connection;
+import java.sql.Types;
+
+import org.apache.tuscany.das.rdb.test.framework.TestDataWithExplicitColumns;
+
+public class ProductData extends TestDataWithExplicitColumns {
+    private static int[] columnTypes = {Types.INTEGER, Types.VARCHAR};
+
+    private static Object[][] productData = {{new Integer(1), "XYZSoap"}, {new 
Integer(2), "ABCOil"}, {new Integer(3), "PQRPen"}};
+
+    private static String[] productColumns = {"ID", "NAME"};
+
+    public ProductData(Connection connection) {
+        super(connection, productData, productColumns, columnTypes);
+    }
+
+    public String getTableName() {
+        return "PRODUCT";
+    }
+
+}
\ No newline at end of file

Added: 
incubator/tuscany/java/das/rdb/src/test/java/org/apache/tuscany/das/rdb/test/data/ProductProdSpecData.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/das/rdb/src/test/java/org/apache/tuscany/das/rdb/test/data/ProductProdSpecData.java?rev=597050&view=auto
==============================================================================
--- 
incubator/tuscany/java/das/rdb/src/test/java/org/apache/tuscany/das/rdb/test/data/ProductProdSpecData.java
 (added)
+++ 
incubator/tuscany/java/das/rdb/src/test/java/org/apache/tuscany/das/rdb/test/data/ProductProdSpecData.java
 Wed Nov 21 04:18:12 2007
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+package org.apache.tuscany.das.rdb.test.data;
+
+import java.sql.Connection;
+
+import org.apache.tuscany.das.rdb.test.framework.RelationshipData;
+
+
+public class ProductProdSpecData extends RelationshipData {
+
+    protected static Object[][] data = {
+        {"XYZSoap",  "XYZSoapSpec"},
+        {"ABCOil", "ABCOilSpec"}};
+    
+    public ProductProdSpecData(Connection c) {
+        super(c, data);
+    }
+
+    protected String getParentRetrievalStatement() {
+        return "select product.id from product where product.name = ?";
+    }
+
+    protected String getChildUpdateStatement() {
+        return "update productspec set productspec.product_id = ? where 
productspec.name = ?";
+    }
+
+}

Added: 
incubator/tuscany/java/das/rdb/src/test/java/org/apache/tuscany/das/rdb/test/data/ProductSpecData.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/das/rdb/src/test/java/org/apache/tuscany/das/rdb/test/data/ProductSpecData.java?rev=597050&view=auto
==============================================================================
--- 
incubator/tuscany/java/das/rdb/src/test/java/org/apache/tuscany/das/rdb/test/data/ProductSpecData.java
 (added)
+++ 
incubator/tuscany/java/das/rdb/src/test/java/org/apache/tuscany/das/rdb/test/data/ProductSpecData.java
 Wed Nov 21 04:18:12 2007
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+package org.apache.tuscany.das.rdb.test.data;
+
+import java.sql.Connection;
+import java.sql.Types;
+
+import org.apache.tuscany.das.rdb.test.framework.TestDataWithExplicitColumns;
+
+public class ProductSpecData extends TestDataWithExplicitColumns {
+    private static int[] columnTypes = {Types.INTEGER, Types.VARCHAR};
+
+    private static Object[][] productSpecData = {{new Integer(1), 
"XYZSoapSpec"}, {new Integer(2), "ABCOilSpec"}};
+
+    private static String[] productSpecColumns = {"ID", "NAME"};
+
+    public ProductSpecData(Connection connection) {
+        super(connection, productSpecData, productSpecColumns, columnTypes);
+    }
+
+    public String getTableName() {
+        return "PRODUCTSPEC";
+    }
+
+}
\ No newline at end of file

Modified: 
incubator/tuscany/java/das/rdb/src/test/java/org/apache/tuscany/das/rdb/test/framework/DatabaseSetup.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/das/rdb/src/test/java/org/apache/tuscany/das/rdb/test/framework/DatabaseSetup.java?rev=597050&r1=597049&r2=597050&view=diff
==============================================================================
--- 
incubator/tuscany/java/das/rdb/src/test/java/org/apache/tuscany/das/rdb/test/framework/DatabaseSetup.java
 (original)
+++ 
incubator/tuscany/java/das/rdb/src/test/java/org/apache/tuscany/das/rdb/test/framework/DatabaseSetup.java
 Wed Nov 21 04:18:12 2007
@@ -166,8 +166,8 @@
             "DROP TABLE SINGER",
             "DROP TABLE SONG",            
             "DROP TABLE DASTEST1.EMPLOYEE",
-            "DROP TABLE DOCUMENTS_IMAGES"
-
+            "DROP TABLE DOCUMENTS_IMAGES", 
+            "DROP TABLE PRODUCT", "DROP TABLE PRODUCTSPEC",
         };
 
         for (int i = 0; i < statements.length; i++) {
@@ -260,6 +260,8 @@
             s.execute(getCreateKennel());
             s.execute(getCreateVisit());
             s.execute(getCreateOrderDetailsDesc());//JIRA-841
+            s.execute(getCreateProduct());//no autogen ids
+            s.execute(getCreateProductSpec());//no autogen ids
             
             //JIRA-952 start
             s.execute(getCreateDASTEST1Customer());
@@ -397,6 +399,18 @@
         return "CREATE TABLE CONMGT.SERVERSTATUS (STATUSID INTEGER PRIMARY KEY 
NOT NULL " + getGeneratedKeyClause()
                 + "  (START WITH 1 ,INCREMENT BY 1), MANAGEDSERVERID INTEGER 
NOT NULL, TIMESTAMP TIMESTAMP NOT NULL)";
 
+    }
+
+    protected String getCreateProduct() {
+
+        return "CREATE TABLE PRODUCT (ID INTEGER PRIMARY KEY NOT NULL "
+                + "  , "+getStringColumn("NAME", 50) + ")";            
+    }
+    
+    protected String getCreateProductSpec() {
+
+        return "CREATE TABLE PRODUCTSPEC (ID INTEGER PRIMARY KEY NOT NULL "
+                +", "+ getIntegerColumn("PRODUCT_ID")   +", 
"+getStringColumn("NAME", 50) + ")";       
     }
 
     // Dog Kennel Schema

Added: 
incubator/tuscany/java/das/rdb/src/test/resources/OneToOneNonRestrictedConfig.xml
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/das/rdb/src/test/resources/OneToOneNonRestrictedConfig.xml?rev=597050&view=auto
==============================================================================
--- 
incubator/tuscany/java/das/rdb/src/test/resources/OneToOneNonRestrictedConfig.xml
 (added)
+++ 
incubator/tuscany/java/das/rdb/src/test/resources/OneToOneNonRestrictedConfig.xml
 Wed Nov 21 04:18:12 2007
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+ -->
+<Config xmlns="http:///org.apache.tuscany.das.rdb/config.xsd";> 
+       <Command name="get named employee with company" 
+               SQL="select * from EMPLOYEE left outer join COMPANY on 
EMPLOYEE.ID = COMPANY.EOTMID where EMPLOYEE.NAME= ?" kind = "Select"/>
+
+       <Table tableName="COMPANY">
+       <Column columnName="ID" primaryKey="true" generated="true"/>
+       </Table>
+  
+       <Table tableName="EMPLOYEE">
+               <Column columnName="ID" primaryKey="true" generated="true"/>
+       </Table>        
+
+       <Relationship name="company" primaryKeyTable="EMPLOYEE" 
foreignKeyTable="COMPANY" many="false" keyRestricted="false">
+       <KeyPair primaryKeyColumn="ID" foreignKeyColumn="EOTMID" />
+       </Relationship>
+
+       <Command name="get spec with product" 
+               SQL="select * from PRODUCT left outer join PRODUCTSPEC on 
PRODUCT.ID = PRODUCTSPEC.PRODUCT_ID where PRODUCT.NAME= ?" kind = "Select"/>
+
+       <Table tableName="PRODUCT">
+       <Column columnName="ID" primaryKey="true" generated="false"/>
+       </Table>
+  
+       <Table tableName="PRODUCTSPEC">
+               <Column columnName="ID" primaryKey="true" generated="false"/>
+       </Table>        
+               
+       <Relationship name="prodspec" primaryKeyTable="PRODUCT" 
foreignKeyTable="PRODUCTSPEC" many="false" keyRestricted="false">
+       <KeyPair primaryKeyColumn="ID" foreignKeyColumn="PRODUCT_ID" />
+       </Relationship>
+                       
+</Config>
\ No newline at end of file

Modified: 
incubator/tuscany/java/das/rdb/src/test/resources/OneToOneRestrictedConfig.xml
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/das/rdb/src/test/resources/OneToOneRestrictedConfig.xml?rev=597050&r1=597049&r2=597050&view=diff
==============================================================================
--- 
incubator/tuscany/java/das/rdb/src/test/resources/OneToOneRestrictedConfig.xml 
(original)
+++ 
incubator/tuscany/java/das/rdb/src/test/resources/OneToOneRestrictedConfig.xml 
Wed Nov 21 04:18:12 2007
@@ -50,5 +50,20 @@
        <KeyPair primaryKeyColumn="ID" foreignKeyColumn="EOTMID" />
        </Relationship>
                        
+       <Command name="get spec with product" 
+               SQL="select * from PRODUCT left outer join PRODUCTSPEC on 
PRODUCT.ID = PRODUCTSPEC.PRODUCT_ID where PRODUCT.NAME= ?" kind = "Select"/>
+
+       <Table tableName="PRODUCT">
+       <Column columnName="ID" primaryKey="true" generated="false"/>
+       </Table>
+  
+       <Table tableName="PRODUCTSPEC">
+               <Column columnName="ID" primaryKey="true" generated="false"/>
+       </Table>        
+               
+       <Relationship name="prodspec" primaryKeyTable="PRODUCT" 
foreignKeyTable="PRODUCTSPEC" many="false" keyRestricted="true">
+       <KeyPair primaryKeyColumn="ID" foreignKeyColumn="PRODUCT_ID" />
+       </Relationship>
+                                               
 </Config>
                        



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to