You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by bd...@apache.org on 2006/11/29 08:29:40 UTC

svn commit: r480444 - in /incubator/tuscany/java/das/rdb/src: main/java/org/apache/tuscany/das/rdb/generator/impl/ test/java/org/apache/tuscany/das/rdb/test/

Author: bdaniel
Date: Tue Nov 28 23:29:38 2006
New Revision: 480444

URL: http://svn.apache.org/viewvc?view=rev&rev=480444
Log:
TUSCANY-954 Throw an exception when a user attempts to set both a relationship and a
foreign key property in that relationship

Modified:
    incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/generator/impl/InsertGenerator.java
    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

Modified: incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/generator/impl/InsertGenerator.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/generator/impl/InsertGenerator.java?view=diff&rev=480444&r1=480443&r2=480444
==============================================================================
--- incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/generator/impl/InsertGenerator.java (original)
+++ incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/generator/impl/InsertGenerator.java Tue Nov 28 23:29:38 2006
@@ -20,6 +20,7 @@
 
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 
@@ -112,14 +113,16 @@
 
     }
 
-    private List getAttributeProperties(DataObject obj, MappingWrapper config, TableWrapper tw) {
-        List fields = new ArrayList();
+    private HashSet getAttributeProperties(DataObject obj, MappingWrapper config, TableWrapper tw) {
+        HashSet fields = new HashSet();
         Iterator i = obj.getType().getProperties().iterator();
         while (i.hasNext()) {
             Property p = (Property) i.next();
             if (p.getType().isDataType()) {
                 if (obj.isSet(p)) {
-                    fields.add(p);
+                    if (fields.add(p) == false) {
+                        throw new RuntimeException("Foreign key properties should not be set when the corrsponding relationship has changed");
+                    }
                 }
             } else {
                 if (obj.isSet(p)) {
@@ -132,7 +135,9 @@
                             String key = (String) keys.next();
                             String keyProperty = config.getColumnPropertyName(tw.getTableName(), key);
                             Property keyProp = obj.getType().getProperty(keyProperty);
-                            fields.add(keyProp);
+                            if (fields.add(keyProp) == false) {
+                                throw new RuntimeException("Foreign key properties should not be set when the corresponding relationship has changed");
+                            }
                         }
                     }
 

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?view=diff&rev=480444&r1=480443&r2=480444
==============================================================================
--- 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 Tue Nov 28 23:29:38 2006
@@ -19,6 +19,7 @@
 package org.apache.tuscany.das.rdb.generator.impl;
 
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 
@@ -60,7 +61,7 @@
         statement.append(" set ");
 
         ChangeSummary summary = changedObject.getDataGraph().getChangeSummary();
-        List changedFields = getChangedFields(mapping, summary, changedObject, tableWrapper);
+        HashSet changedFields = getChangedFields(mapping, summary, changedObject, tableWrapper);
         Iterator i = changedFields.iterator();
       
         int idx = 1;
@@ -161,14 +162,17 @@
 
 
 
-    private List getChangedFields(MappingWrapper config, ChangeSummary summary, DataObject obj, TableWrapper tw) {
-        List changes = new ArrayList();
+    private HashSet getChangedFields(MappingWrapper config, ChangeSummary summary, DataObject obj, TableWrapper tw) {
+        HashSet changes = new HashSet();
+        
         Iterator i = summary.getOldValues(obj).iterator();
         while (i.hasNext()) {
             ChangeSummary.Setting setting = (ChangeSummary.Setting) i.next();
             
             if (setting.getProperty().getType().isDataType()) {
-                changes.add(setting.getProperty());
+               if ( changes.add(setting.getProperty()) == false ) {
+                   throw new RuntimeException("Foreign key properties should not be set when the corresponding relationship has changed");
+               }
             } else {
                 Property ref = setting.getProperty();
                 if (!ref.isMany()) {
@@ -179,7 +183,9 @@
                         String key = (String) keys.next();
                         String keyProperty = config.getColumnPropertyName(tw.getTableName(), key);
                         Property keyProp = obj.getType().getProperty(keyProperty);
-                        changes.add(keyProp);
+                        if (changes.add(keyProp) == false) {
+                            throw new RuntimeException("Foreign key properties should not be set when the corresponding relationship has changed");
+                        }
                     }
                 }
 

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?view=diff&rev=480444&r1=480443&r2=480444
==============================================================================
--- 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 Tue Nov 28 23:29:38 2006
@@ -23,6 +23,8 @@
  * 
  */
 
+import java.sql.SQLException;
+
 import org.apache.tuscany.das.rdb.Command;
 import org.apache.tuscany.das.rdb.DAS;
 import org.apache.tuscany.das.rdb.test.data.CustomerData;
@@ -110,4 +112,60 @@
 
     }
 
+    
+    public void testFKBehavior() throws SQLException {
+
+        DAS das = DAS.FACTORY.createDAS(getConfig("basicCustomerOrderMapping.xml"), getConnection());
+        // Read some customers and related orders
+        Command select = das
+                .createCommand("SELECT * FROM CUSTOMER LEFT JOIN ANORDER ON CUSTOMER.ID = ANORDER.CUSTOMER_ID");
+
+        DataObject root = select.executeQuery();
+
+        DataObject cust1 = root.getDataObject("CUSTOMER[1]");
+        DataObject cust2 = root.getDataObject("CUSTOMER[2]");
+
+        // Save IDs
+        Integer cust1ID = (Integer) cust1.get("ID");
+        
+        // Move an order to cust1 from cust2
+        DataObject order = (DataObject) cust2.getList("orders").get(0);
+        cust1.getList("orders").add(order);
+        order.setInt("CUSTOMER_ID", cust1ID);
+       
+        try {
+            das.applyChanges(root);
+            fail("An exception should be thrown");
+        } catch (RuntimeException ex) {
+            assertEquals("Foreign key properties should not be set when the corresponding relationship has changed", ex.getMessage());
+        }
+
+    }
+    
+    public void testFKBehavior2() throws SQLException {
+        DAS das = DAS.FACTORY.createDAS(getConfig("basicCustomerOrderMapping.xml"), getConnection());
+        // Read some customers and related orders
+        Command select = das
+                .createCommand("SELECT * FROM CUSTOMER LEFT JOIN ANORDER ON CUSTOMER.ID = ANORDER.CUSTOMER_ID");
+
+        DataObject root = select.executeQuery();
+
+        DataObject cust1 = root.getDataObject("CUSTOMER[1]");     
+
+        // Save IDs
+        Integer cust1ID = (Integer) cust1.get("ID");
+        
+        // Move an order to cust1 from cust2
+        DataObject order = root.createDataObject("ANORDER");
+        order.setInt("ID", 500);
+        order.setInt("CUSTOMER_ID", cust1ID);
+        cust1.getList("orders").add(order);       
+       
+        try {
+            das.applyChanges(root);
+            fail("An exception should be thrown");
+        } catch (RuntimeException ex) {
+            assertEquals("Foreign key properties should not be set when the corresponding relationship has changed", ex.getMessage());
+        }
+    }
 }



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