The following patch addresses Tuscany-122
 
Index: 
src/main/java/org/apache/tuscany/das/rdb/generator/impl/UpdateGenerator.java
===================================================================
--- 
src/main/java/org/apache/tuscany/das/rdb/generator/impl/UpdateGenerator.java    
    (revision 389875)
+++ 
src/main/java/org/apache/tuscany/das/rdb/generator/impl/UpdateGenerator.java    
    (working copy)
@@ -142,8 +142,9 @@
                                changes.add(setting.getProperty());
                        } else  {
                                Property ref = setting.getProperty();
-                               if ( !ref.isMany() ) {
-                                       RelationshipWrapper r = new 
RelationshipWrapper(mapping.getRelationshipByName(ref.getOpposite().getName()));
+                               if ( !ref.isMany() ) {                          
                                                                
+                                       RelationshipWrapper r = new 
RelationshipWrapper(mapping.getRelationshipByReference(ref));
+                                       
                                        Iterator keys = 
r.getForeignKeys().iterator();
                                        while ( keys.hasNext()) {
                                                String key = (String) 
keys.next();
Index: src/main/java/org/apache/tuscany/das/rdb/impl/DatabaseObject.java
===================================================================
--- src/main/java/org/apache/tuscany/das/rdb/impl/DatabaseObject.java   
(revision 389875)
+++ src/main/java/org/apache/tuscany/das/rdb/impl/DatabaseObject.java   
(working copy)
@@ -81,6 +81,8 @@
 
                Property parentRef = getParentReference(r.getPrimaryKeyTable());
                DataObject parent = dataObject.getDataObject(parentRef);
+               if ( parent == null ) 
+                       return null;
                String parentKey = getParentKey(r, parameter);
                return parent.get(parentKey);
 
Index: src/main/java/org/apache/tuscany/das/rdb/impl/ChangeSummarizer.java
===================================================================
--- src/main/java/org/apache/tuscany/das/rdb/impl/ChangeSummarizer.java 
(revision 389875)
+++ src/main/java/org/apache/tuscany/das/rdb/impl/ChangeSummarizer.java 
(working copy)
@@ -16,6 +16,7 @@
 */
 package org.apache.tuscany.das.rdb.impl;
 
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
@@ -24,9 +25,12 @@
 import org.apache.tuscany.das.rdb.Key;
 import org.apache.tuscany.das.rdb.config.Column;
 import org.apache.tuscany.das.rdb.config.Config;
+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.QualifiedColumn;
+import org.apache.tuscany.das.rdb.config.wrapper.RelationshipWrapper;
+import org.apache.tuscany.das.rdb.config.wrapper.TableWrapper;
 import org.apache.tuscany.das.rdb.util.DebugUtil;
 import org.apache.tuscany.sdo.impl.AttributeImpl;
 import org.apache.tuscany.sdo.impl.ChangeSummaryImpl;
@@ -35,6 +39,7 @@
 
 import commonj.sdo.ChangeSummary;
 import commonj.sdo.DataObject;
+import commonj.sdo.Property;
 import commonj.sdo.Type;
 
 public class ChangeSummarizer {
@@ -127,10 +132,9 @@
                                                ReferenceImpl ref = 
(ReferenceImpl) setting.getFeature();
 
                                                DebugUtil.debugln(getClass(), 
debug, ref.getName());
-//                                             if 
(ref.getEOpposite().isMany()) {
-                        if (referencesParent(ref)) {
+                                               if (hasState(ref, 
changedObject) ) {                     
                                                        ChangeFactory factory = 
getRegistry().getFactory(
-                                                                       
changedObject.getType());
+                                                                       
changedObject.getType());                                                       
                                                        
changes.addUpdate(factory
                                                                        
.createUpdateOperation(changedObject));
                                                }
@@ -142,6 +146,33 @@
 
        }
 
+       private boolean hasState(Property ref, DataObject changedObject) {
+               if ( ref.getOpposite().isMany() ) {
+                       return true;
+               } else {
+                       MappingWrapper mw = this.mapping;
+                       if ( mw.getConfig() == null ) 
+                               mw = 
registry.getFactory(changedObject.getType()).getConfig();
+                       if ( mw.getConfig() == null )
+                               return false;
+                       
+                       Relationship rel = mw.getRelationshipByReference(ref);  
                
+                       
+                       if ( !rel.isMany()) {
+                               // This is a one-one relationship
+                               Table t = 
mapping.getTableByPropertyName(changedObject.getType().getName());
+                               TableWrapper tw = new TableWrapper(t);
+                               RelationshipWrapper rw = new 
RelationshipWrapper(rel);
+                               if (( 
rel.getForeignKeyTable().equals(t.getName())) &&
+                                               ( 
Collections.disjoint(tw.getPrimaryKeyProperties(),rw.getForeignKeys()) ))
+                                       return true;
+                               
+                       }
+               
+               }
+               return false;
+       }
+
        private boolean hasAttributeChange(List theChanges) {
                Iterator i = theChanges.iterator();
                while (i.hasNext()) {
@@ -224,14 +255,5 @@
        }
 
     
-    private boolean referencesParent(ReferenceImpl reference) {
-        
-        if (reference.getEOpposite().isMany())
-            return true;
-        
-//        if (!reference.getName().contains("_opposite"))
-//            return true;
-        
-        return false;
-    }
+    
 }
Index: src/main/java/org/apache/tuscany/das/rdb/impl/ChangeFactory.java
===================================================================
--- src/main/java/org/apache/tuscany/das/rdb/impl/ChangeFactory.java    
(revision 389875)
+++ src/main/java/org/apache/tuscany/das/rdb/impl/ChangeFactory.java    
(working copy)
@@ -168,5 +168,9 @@
                return updateCommand;
        }
 
+       public MappingWrapper getConfig() {
+               return this.mapping;
+       }
 
+
 }
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 389875)
+++ src/main/java/org/apache/tuscany/das/rdb/config/wrapper/MappingWrapper.java 
(working copy)
@@ -32,7 +32,9 @@
 import org.apache.tuscany.das.rdb.config.impl.ConfigFactoryImpl;
 import org.apache.tuscany.das.rdb.util.DebugUtil;
 
+import commonj.sdo.Property;
 
+
 public class MappingWrapper {
 
        private static final ConfigFactory factory = 
ConfigFactoryImpl.eINSTANCE;
@@ -368,6 +370,17 @@
                return converters;
        }
 
+       public Relationship getRelationshipByReference(Property ref) {
+               Iterator i = config.getRelationship().iterator();
+               while ( i.hasNext() ) {
+                       Relationship r = (Relationship) i.next();
+                       if ( ref.getName().equals (r.getName()) ||
+                                       
ref.getOpposite().getName().equals(r.getName())) 
+                               return r;
+               }
+               throw new RuntimeException("Could not find relationship " + 
ref.getName() + " in the configuration");
+       }
+       
        public Relationship getRelationshipByName(String name) {
                Iterator i = config.getRelationship().iterator();
                while ( i.hasNext() ) {

Reply via email to