Author: aadamchik
Date: Sun Oct 14 12:34:23 2007
New Revision: 584591

URL: http://svn.apache.org/viewvc?rev=584591&view=rev
Log:
CAY-848 Support for mapping to-many as Maps and Sets and Collections
(adding ROP runtime support for maps and sets to-many)

Added:
    
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/reflect/IdMapKeyAccessor.java
    
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/reflect/valueholder/ValueHolderListProperty.java
    
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/reflect/valueholder/ValueHolderMapProperty.java
    
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/reflect/valueholder/ValueHolderSetProperty.java
    
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/reflect/valueholder/ValueHolderToManyProperty.java
    
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/CayenneContextMapRelationshipTest.java
    
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/resources/dml/CayenneContextMapRelationshipTest.xml
Removed:
    
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/reflect/MultiColumnIdMapKeyAccessor.java
    
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/reflect/SingleColumnIdMapKeyAccessor.java
Modified:
    
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/reflect/IndexedListProperty.java
    
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/reflect/ListProperty.java
    
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/reflect/PersistentDescriptorFactory.java
    
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/reflect/valueholder/ValueHolderDescriptorFactory.java

Added: 
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/reflect/IdMapKeyAccessor.java
URL: 
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/reflect/IdMapKeyAccessor.java?rev=584591&view=auto
==============================================================================
--- 
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/reflect/IdMapKeyAccessor.java
 (added)
+++ 
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/reflect/IdMapKeyAccessor.java
 Sun Oct 14 12:34:23 2007
@@ -0,0 +1,66 @@
+/*****************************************************************
+ *   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.cayenne.reflect;
+
+import java.util.Map;
+
+import org.apache.cayenne.ObjectId;
+import org.apache.cayenne.Persistent;
+
+/**
+ * A stateless read-only accessor of the map key value that is based on the 
Persistent
+ * object id. For single-column ID's the accessor returns a single value (e.g. 
an
+ * Integer). For multi-column ID's it returns the ObjectId.
+ * 
+ * @since 3.0
+ * @author Andrus Adamchik
+ */
+public class IdMapKeyAccessor implements Accessor {
+
+    public static final Accessor SHARED_ACCESSOR = new IdMapKeyAccessor();
+
+    public String getName() {
+        return "IdMapKeyAccessor";
+    }
+
+    public Object getValue(Object object) throws PropertyException {
+        if (object instanceof Persistent) {
+            ObjectId id = ((Persistent) object).getObjectId();
+
+            if (id.isTemporary()) {
+                return id;
+            }
+
+            Map map = id.getIdSnapshot();
+            if (map.size() == 1) {
+                Map.Entry pkEntry = (Map.Entry) 
map.entrySet().iterator().next();
+                return pkEntry.getValue();
+            }
+
+            return id;
+        }
+        else {
+            throw new IllegalArgumentException("Object must be Persistent: " + 
object);
+        }
+    }
+
+    public void setValue(Object object, Object newValue) throws 
PropertyException {
+        throw new UnsupportedOperationException("Setting map key is not 
supported");
+    }
+}

Modified: 
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/reflect/IndexedListProperty.java
URL: 
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/reflect/IndexedListProperty.java?rev=584591&r1=584590&r2=584591&view=diff
==============================================================================
--- 
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/reflect/IndexedListProperty.java
 (original)
+++ 
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/reflect/IndexedListProperty.java
 Sun Oct 14 12:34:23 2007
@@ -29,6 +29,7 @@
  * 
  * @since 1.2
  * @author Andrus Adamchik
+ * @deprecated since 3.0 (no substitute exists in Cayenne)
  */
 public class IndexedListProperty extends ListProperty {
 

Modified: 
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/reflect/ListProperty.java
URL: 
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/reflect/ListProperty.java?rev=584591&r1=584590&r2=584591&view=diff
==============================================================================
--- 
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/reflect/ListProperty.java
 (original)
+++ 
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/reflect/ListProperty.java
 Sun Oct 14 12:34:23 2007
@@ -29,6 +29,7 @@
  * 
  * @since 1.2
  * @author Andrus Adamchik
+ * @deprecated since 3.0 replaced by non-public classes.
  */
 public class ListProperty extends BaseToManyProperty {
 

Modified: 
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/reflect/PersistentDescriptorFactory.java
URL: 
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/reflect/PersistentDescriptorFactory.java?rev=584591&r1=584590&r2=584591&view=diff
==============================================================================
--- 
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/reflect/PersistentDescriptorFactory.java
 (original)
+++ 
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/reflect/PersistentDescriptorFactory.java
 Sun Oct 14 12:34:23 2007
@@ -233,15 +233,7 @@
             return new PropertyAccessor(targetDescriptor.getProperty(mapKey));
         }
 
-        // do not use 'targetDescriptor' to resolve target entity, as it leads 
to an
-        // endless loop during the phase when descriptos are not fully 
initialized
-        ObjEntity targetEntity = (ObjEntity) relationship.getTargetEntity();
-        if (targetEntity.getDbEntity().getPrimaryKey().size() > 1) {
-            return MultiColumnIdMapKeyAccessor.SHARED_ACCESSOR;
-        }
-        else {
-            return SingleColumnIdMapKeyAccessor.SHARED_ACCESSOR;
-        }
+        return IdMapKeyAccessor.SHARED_ACCESSOR;
     }
 
     /**

Modified: 
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/reflect/valueholder/ValueHolderDescriptorFactory.java
URL: 
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/reflect/valueholder/ValueHolderDescriptorFactory.java?rev=584591&r1=584590&r2=584591&view=diff
==============================================================================
--- 
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/reflect/valueholder/ValueHolderDescriptorFactory.java
 (original)
+++ 
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/reflect/valueholder/ValueHolderDescriptorFactory.java
 Sun Oct 14 12:34:23 2007
@@ -19,6 +19,7 @@
 package org.apache.cayenne.reflect.valueholder;
 
 import java.util.List;
+import java.util.Map;
 
 import org.apache.cayenne.ValueHolder;
 import org.apache.cayenne.map.ObjRelationship;
@@ -26,7 +27,6 @@
 import org.apache.cayenne.reflect.ClassDescriptor;
 import org.apache.cayenne.reflect.ClassDescriptorFactory;
 import org.apache.cayenne.reflect.ClassDescriptorMap;
-import org.apache.cayenne.reflect.ListProperty;
 import org.apache.cayenne.reflect.PersistentDescriptor;
 import org.apache.cayenne.reflect.PersistentDescriptorFactory;
 import org.apache.cayenne.reflect.Property;
@@ -47,7 +47,16 @@
     protected void createToManyCollectionProperty(
             PersistentDescriptor descriptor,
             ObjRelationship relationship) {
-        throw new UnsupportedOperationException("Implement me");
+        ClassDescriptor targetDescriptor = 
descriptorMap.getDescriptor(relationship
+                .getTargetEntityName());
+        String reverseName = relationship.getReverseRelationshipName();
+
+        Accessor accessor = createAccessor(descriptor, relationship.getName(), 
List.class);
+        descriptor.addDeclaredProperty(new ValueHolderListProperty(
+                descriptor,
+                targetDescriptor,
+                accessor,
+                reverseName));
     }
 
     protected void createToManyListProperty(
@@ -58,7 +67,7 @@
         String reverseName = relationship.getReverseRelationshipName();
 
         Accessor accessor = createAccessor(descriptor, relationship.getName(), 
List.class);
-        descriptor.addDeclaredProperty(new ListProperty(
+        descriptor.addDeclaredProperty(new ValueHolderListProperty(
                 descriptor,
                 targetDescriptor,
                 accessor,
@@ -68,13 +77,35 @@
     protected void createToManyMapProperty(
             PersistentDescriptor descriptor,
             ObjRelationship relationship) {
-        throw new UnsupportedOperationException("Implement me");
+
+        ClassDescriptor targetDescriptor = 
descriptorMap.getDescriptor(relationship
+                .getTargetEntityName());
+        String reverseName = relationship.getReverseRelationshipName();
+        Accessor accessor = createAccessor(descriptor, relationship.getName(), 
Map.class);
+        Accessor mapKeyAccessor = createMapKeyAccessor(relationship, 
targetDescriptor);
+        Property property = new ValueHolderMapProperty(
+                descriptor,
+                targetDescriptor,
+                accessor,
+                reverseName,
+                mapKeyAccessor);
+
+        descriptor.addDeclaredProperty(property);
     }
 
     protected void createToManySetProperty(
             PersistentDescriptor descriptor,
             ObjRelationship relationship) {
-        throw new UnsupportedOperationException("Implement me");
+        ClassDescriptor targetDescriptor = 
descriptorMap.getDescriptor(relationship
+                .getTargetEntityName());
+        String reverseName = relationship.getReverseRelationshipName();
+
+        Accessor accessor = createAccessor(descriptor, relationship.getName(), 
List.class);
+        descriptor.addDeclaredProperty(new ValueHolderSetProperty(
+                descriptor,
+                targetDescriptor,
+                accessor,
+                reverseName));
     }
 
     protected void createToOneProperty(

Added: 
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/reflect/valueholder/ValueHolderListProperty.java
URL: 
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/reflect/valueholder/ValueHolderListProperty.java?rev=584591&view=auto
==============================================================================
--- 
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/reflect/valueholder/ValueHolderListProperty.java
 (added)
+++ 
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/reflect/valueholder/ValueHolderListProperty.java
 Sun Oct 14 12:34:23 2007
@@ -0,0 +1,52 @@
+/*****************************************************************
+ *   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.cayenne.reflect.valueholder;
+
+import org.apache.cayenne.Persistent;
+import org.apache.cayenne.ValueHolder;
+import org.apache.cayenne.reflect.Accessor;
+import org.apache.cayenne.reflect.ClassDescriptor;
+import org.apache.cayenne.reflect.PropertyException;
+import org.apache.cayenne.util.PersistentObjectList;
+
+/**
+ * @since 3.0
+ * @author Andrus Adamchik
+ */
+class ValueHolderListProperty extends ValueHolderToManyProperty {
+
+    ValueHolderListProperty(ClassDescriptor owner, ClassDescriptor 
targetDescriptor,
+            Accessor accessor, String reverseName) {
+        super(owner, targetDescriptor, accessor, reverseName);
+    }
+
+    protected ValueHolder createCollectionValueHolder(Object object)
+            throws PropertyException {
+        
+        if (!(object instanceof Persistent)) {
+
+            throw new PropertyException(
+                    "ValueHolders for non-persistent objects are not 
supported.",
+                    this,
+                    object);
+        }
+
+        return new PersistentObjectList((Persistent) object, getName());
+    }
+}

Added: 
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/reflect/valueholder/ValueHolderMapProperty.java
URL: 
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/reflect/valueholder/ValueHolderMapProperty.java?rev=584591&view=auto
==============================================================================
--- 
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/reflect/valueholder/ValueHolderMapProperty.java
 (added)
+++ 
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/reflect/valueholder/ValueHolderMapProperty.java
 Sun Oct 14 12:34:23 2007
@@ -0,0 +1,60 @@
+/*****************************************************************
+ *   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.cayenne.reflect.valueholder;
+
+import org.apache.cayenne.Persistent;
+import org.apache.cayenne.ValueHolder;
+import org.apache.cayenne.reflect.Accessor;
+import org.apache.cayenne.reflect.ClassDescriptor;
+import org.apache.cayenne.reflect.PropertyException;
+import org.apache.cayenne.reflect.ToManyMapProperty;
+import org.apache.cayenne.util.PersistentObjectMap;
+
+/**
+ * @since 3.0
+ * @author Andrus Adamchik
+ */
+class ValueHolderMapProperty extends ValueHolderToManyProperty implements
+        ToManyMapProperty {
+
+    private Accessor mapKeyAccessor;
+
+    ValueHolderMapProperty(ClassDescriptor owner, ClassDescriptor 
targetDescriptor,
+            Accessor accessor, String reverseName, Accessor mapKeyAccessor) {
+        super(owner, targetDescriptor, accessor, reverseName);
+        this.mapKeyAccessor = mapKeyAccessor;
+    }
+
+    protected ValueHolder createCollectionValueHolder(Object object)
+            throws PropertyException {
+        if (!(object instanceof Persistent)) {
+
+            throw new PropertyException(
+                    "ValueHolders for non-persistent objects are not 
supported.",
+                    this,
+                    object);
+        }
+
+        return new PersistentObjectMap((Persistent) object, getName(), 
mapKeyAccessor);
+    }
+
+    public Object getMapKey(Object target) throws PropertyException {
+        return mapKeyAccessor.getValue(target);
+    }
+}

Added: 
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/reflect/valueholder/ValueHolderSetProperty.java
URL: 
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/reflect/valueholder/ValueHolderSetProperty.java?rev=584591&view=auto
==============================================================================
--- 
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/reflect/valueholder/ValueHolderSetProperty.java
 (added)
+++ 
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/reflect/valueholder/ValueHolderSetProperty.java
 Sun Oct 14 12:34:23 2007
@@ -0,0 +1,52 @@
+/*****************************************************************
+ *   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.cayenne.reflect.valueholder;
+
+import org.apache.cayenne.Persistent;
+import org.apache.cayenne.ValueHolder;
+import org.apache.cayenne.reflect.Accessor;
+import org.apache.cayenne.reflect.ClassDescriptor;
+import org.apache.cayenne.reflect.PropertyException;
+import org.apache.cayenne.util.PersistentObjectSet;
+
+/**
+ * @since 3.0
+ * @author Andrus Adamchik
+ */
+class ValueHolderSetProperty extends ValueHolderToManyProperty {
+
+    ValueHolderSetProperty(ClassDescriptor owner, ClassDescriptor 
targetDescriptor,
+            Accessor accessor, String reverseName) {
+        super(owner, targetDescriptor, accessor, reverseName);
+    }
+
+    protected ValueHolder createCollectionValueHolder(Object object)
+            throws PropertyException {
+
+        if (!(object instanceof Persistent)) {
+
+            throw new PropertyException(
+                    "ValueHolders for non-persistent objects are not 
supported.",
+                    this,
+                    object);
+        }
+
+        return new PersistentObjectSet((Persistent) object, getName());
+    }
+}

Added: 
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/reflect/valueholder/ValueHolderToManyProperty.java
URL: 
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/reflect/valueholder/ValueHolderToManyProperty.java?rev=584591&view=auto
==============================================================================
--- 
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/reflect/valueholder/ValueHolderToManyProperty.java
 (added)
+++ 
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/reflect/valueholder/ValueHolderToManyProperty.java
 Sun Oct 14 12:34:23 2007
@@ -0,0 +1,55 @@
+/*****************************************************************
+ *   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.cayenne.reflect.valueholder;
+
+import org.apache.cayenne.Fault;
+import org.apache.cayenne.ValueHolder;
+import org.apache.cayenne.reflect.Accessor;
+import org.apache.cayenne.reflect.BaseToManyProperty;
+import org.apache.cayenne.reflect.ClassDescriptor;
+import org.apache.cayenne.reflect.PropertyException;
+
+/**
+ * @since 3.0
+ * @author Andrus Adamchik
+ */
+abstract class ValueHolderToManyProperty extends BaseToManyProperty {
+
+    ValueHolderToManyProperty(ClassDescriptor owner, ClassDescriptor 
targetDescriptor,
+            Accessor accessor, String reverseName) {
+        super(owner, targetDescriptor, accessor, reverseName);
+    }
+
+    protected abstract ValueHolder createCollectionValueHolder(Object object)
+            throws PropertyException;
+
+    public boolean isFault(Object source) {
+        Object target = accessor.getValue(source);
+        return target == null
+                || target instanceof Fault
+                || ((ValueHolder) target).isFault();
+    }
+
+    public void invalidate(Object object) {
+        ValueHolder list = (ValueHolder) readPropertyDirectly(object);
+        if (list != null) {
+            list.invalidate();
+        }
+    }
+}

Added: 
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/CayenneContextMapRelationshipTest.java
URL: 
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/CayenneContextMapRelationshipTest.java?rev=584591&view=auto
==============================================================================
--- 
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/CayenneContextMapRelationshipTest.java
 (added)
+++ 
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/CayenneContextMapRelationshipTest.java
 Sun Oct 14 12:34:23 2007
@@ -0,0 +1,70 @@
+/*****************************************************************
+ *   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.cayenne;
+
+import java.util.Map;
+
+import org.apache.cayenne.access.ClientServerChannel;
+import org.apache.cayenne.query.ObjectIdQuery;
+import org.apache.cayenne.remote.ClientChannel;
+import org.apache.cayenne.remote.service.LocalConnection;
+import org.apache.cayenne.testdo.mt.ClientMtMapToMany;
+import org.apache.cayenne.testdo.mt.MtMapToMany;
+import org.apache.cayenne.unit.AccessStack;
+import org.apache.cayenne.unit.CayenneCase;
+import org.apache.cayenne.unit.CayenneResources;
+
+public class CayenneContextMapRelationshipTest extends CayenneCase {
+
+    protected AccessStack buildAccessStack() {
+        return 
CayenneResources.getResources().getAccessStack(MULTI_TIER_ACCESS_STACK);
+    }
+
+    private CayenneContext createClientContext() {
+        ClientServerChannel serverChannel = new 
ClientServerChannel(getDomain());
+        LocalConnection connection = new LocalConnection(serverChannel);
+        ClientChannel clientChannel = new ClientChannel(connection);
+        return new CayenneContext(clientChannel);
+    }
+
+    protected void setUp() throws Exception {
+        deleteTestData();
+    }
+
+    public void testReadToMany() throws Exception {
+        createTestData("prepare");
+
+        ObjectContext context = createClientContext();
+
+        ObjectId id = new ObjectId("MtMapToMany", MtMapToMany.ID_PK_COLUMN, 1);
+        ClientMtMapToMany o1 = (ClientMtMapToMany) 
DataObjectUtils.objectForQuery(
+                context,
+                new ObjectIdQuery(id));
+
+        Map targets = o1.getTargets();
+
+        assertTrue(((ValueHolder) targets).isFault());
+
+        assertNotNull(targets);
+        assertEquals(3, targets.size());
+        assertNotNull(targets.get(new Integer(1)));
+        assertNotNull(targets.get(new Integer(2)));
+        assertNotNull(targets.get(new Integer(3)));
+    }
+}

Added: 
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/resources/dml/CayenneContextMapRelationshipTest.xml
URL: 
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/resources/dml/CayenneContextMapRelationshipTest.xml?rev=584591&view=auto
==============================================================================
--- 
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/resources/dml/CayenneContextMapRelationshipTest.xml
 (added)
+++ 
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/resources/dml/CayenneContextMapRelationshipTest.xml
 Sun Oct 14 12:34:23 2007
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" 
"http://www.springframework.org/dtd/spring-beans.dtd";>
+
+<beans default-lazy-init="true">
+
+       <bean id="O1" class="org.apache.cayenne.unit.util.UpdatingSQLTemplate">
+               <constructor-arg type="java.lang.Class">
+                       <value>org.apache.cayenne.testdo.mt.MtMapToMany</value>
+               </constructor-arg>
+               <constructor-arg>
+                       <value>
+                               INSERT INTO MT_MAP_TO_MANY (ID)
+                               VALUES (1)
+                       </value>
+               </constructor-arg>
+       </bean>
+       
+       <bean id="O2" class="org.apache.cayenne.unit.util.UpdatingSQLTemplate">
+               <constructor-arg type="java.lang.Class">
+                       <value>org.apache.cayenne.testdo.mt.MtMapToMany</value>
+               </constructor-arg>
+               <constructor-arg>
+                       <value>
+                               INSERT INTO MT_MAP_TO_MANY (ID)
+                               VALUES (2)
+                       </value>
+               </constructor-arg>
+       </bean>
+       
+       <bean id="O1C1" 
class="org.apache.cayenne.unit.util.UpdatingSQLTemplate">
+               <constructor-arg type="java.lang.Class">
+                       
<value>org.apache.cayenne.testdo.mt.MtMapToManyTarget</value>
+               </constructor-arg>
+               <constructor-arg>
+                       <value>
+                               INSERT INTO MT_MAP_TO_MANY_TARGET (ID, 
MAP_TO_MANY_ID)
+                               VALUES (1, 1)
+                       </value>
+               </constructor-arg>
+       </bean>
+       
+       <bean id="O1C2" 
class="org.apache.cayenne.unit.util.UpdatingSQLTemplate">
+               <constructor-arg type="java.lang.Class">
+                       
<value>org.apache.cayenne.testdo.mt.MtMapToManyTarget</value>
+               </constructor-arg>
+               <constructor-arg>
+                       <value>
+                               INSERT INTO MT_MAP_TO_MANY_TARGET (ID, 
MAP_TO_MANY_ID)
+                               VALUES (2, 1)
+                       </value>
+               </constructor-arg>
+       </bean>
+
+       <bean id="O1C3" 
class="org.apache.cayenne.unit.util.UpdatingSQLTemplate">
+               <constructor-arg type="java.lang.Class">
+                       
<value>org.apache.cayenne.testdo.mt.MtMapToManyTarget</value>
+               </constructor-arg>
+               <constructor-arg>
+                       <value>
+                               INSERT INTO MT_MAP_TO_MANY_TARGET (ID, 
MAP_TO_MANY_ID)
+                               VALUES (3, 1)
+                       </value>
+               </constructor-arg>
+       </bean>
+       
+       <bean id="O2C1" 
class="org.apache.cayenne.unit.util.UpdatingSQLTemplate">
+               <constructor-arg type="java.lang.Class">
+                       
<value>org.apache.cayenne.testdo.mt.MtMapToManyTarget</value>
+               </constructor-arg>
+               <constructor-arg>
+                       <value>
+                               INSERT INTO MT_MAP_TO_MANY_TARGET (ID, 
MAP_TO_MANY_ID)
+                               VALUES (4, 2)
+                       </value>
+               </constructor-arg>
+       </bean>
+       
+       
+       
+       <!-- ======================================= -->
+       <!-- Data Sets -->
+       <!-- ======================================= -->
+
+       <bean id="prepare" class="java.util.ArrayList">
+               <constructor-arg>
+                       <list>
+                               <ref bean="O1" />
+                               <ref bean="O2" />
+                               <ref bean="O1C1" />
+                               <ref bean="O1C2" />
+                               <ref bean="O1C3" />
+                               <ref bean="O2C1" />
+                       </list>
+               </constructor-arg>
+       </bean>
+
+</beans>
\ No newline at end of file


Reply via email to