You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2006/10/13 17:55:02 UTC

svn commit: r463718 - in /incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/map: ClientEntityResolver.java ClientPersistentDescriptor.java EntityDescriptor.java EntityDescriptorFactory.java EntityResolver.java

Author: aadamchik
Date: Fri Oct 13 08:55:01 2006
New Revision: 463718

URL: http://svn.apache.org/viewvc?view=rev&rev=463718
Log:
CAY-682: Generic Cayenne POJO enhancer
(refactoring ClassDescriptors to clearly separate the types of supported objects)

Added:
    incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/map/ClientEntityResolver.java
    incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/map/ClientPersistentDescriptor.java
Modified:
    incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/map/EntityDescriptor.java
    incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/map/EntityDescriptorFactory.java
    incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/map/EntityResolver.java

Added: incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/map/ClientEntityResolver.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/map/ClientEntityResolver.java?view=auto&rev=463718
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/map/ClientEntityResolver.java (added)
+++ incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/map/ClientEntityResolver.java Fri Oct 13 08:55:01 2006
@@ -0,0 +1,53 @@
+/*****************************************************************
+ *   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.map;
+
+import org.apache.cayenne.property.ClassDescriptor;
+import org.apache.cayenne.property.ClassDescriptorFactory;
+
+/**
+ * An EntityResolver subclass that uses a different default {@link ClassDescriptorFactory}
+ * that handles ValueHolder to-one relationships.
+ * 
+ * @since 3.0
+ * @author Andrus Adamchik
+ */
+class ClientEntityResolver extends EntityResolver {
+
+    ClientEntityResolver() {
+    }
+
+    public EntityResolver getClientEntityResolver() {
+        return this;
+    }
+
+    public ClassDescriptorFactory getClassDescriptorFactory() {
+        if (classDescriptorFactory == null) {
+            this.classDescriptorFactory = new EntityDescriptorFactory(this) {
+
+                protected EntityDescriptor createDescriptor(
+                        ObjEntity entity,
+                        ClassDescriptor superclassDescriptor) {
+                    return new ClientPersistentDescriptor(entity, superclassDescriptor);
+                }
+            };
+        }
+        return classDescriptorFactory;
+    }
+}

Added: incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/map/ClientPersistentDescriptor.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/map/ClientPersistentDescriptor.java?view=auto&rev=463718
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/map/ClientPersistentDescriptor.java (added)
+++ incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/map/ClientPersistentDescriptor.java Fri Oct 13 08:55:01 2006
@@ -0,0 +1,77 @@
+/*****************************************************************
+ *   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.map;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.cayenne.ValueHolder;
+import org.apache.cayenne.property.ClassDescriptor;
+import org.apache.cayenne.property.ListProperty;
+import org.apache.cayenne.property.Property;
+import org.apache.cayenne.property.PropertyAccessor;
+import org.apache.cayenne.property.ValueHolderProperty;
+
+/**
+ * A ClassDescriptor for client persistent objects that uses {@link ValueHolder}
+ * indirection for to-one relationships to avoid class enhancement.
+ * 
+ * @since 3.0
+ * @author Andrus Adamchik
+ */
+class ClientPersistentDescriptor extends EntityDescriptor {
+
+    ClientPersistentDescriptor(ObjEntity entity, ClassDescriptor superclassDescriptor) {
+        super(entity, superclassDescriptor);
+    }
+
+    protected void compileRelationships(EntityResolver resolver, Map allDescriptors) {
+
+        // only include this entity relationships and skip superclasses...
+        Iterator it = entity.getDeclaredRelationships().iterator();
+        while (it.hasNext()) {
+
+            ObjRelationship relationship = (ObjRelationship) it.next();
+            ClassDescriptor targetDescriptor = resolver.getClassDescriptor(relationship
+                    .getTargetEntityName());
+            String reverseName = relationship.getReverseRelationshipName();
+
+            Property property;
+            if (relationship.isToMany()) {
+                PropertyAccessor accessor = makeAccessor(
+                        relationship.getName(),
+                        List.class);
+                property = new ListProperty(this, targetDescriptor, accessor, reverseName);
+            }
+            else {
+                PropertyAccessor accessor = makeAccessor(
+                        relationship.getName(),
+                        ValueHolder.class);
+                property = new ValueHolderProperty(
+                        this,
+                        targetDescriptor,
+                        accessor,
+                        reverseName);
+            }
+
+            allDescriptors.put(relationship.getName(), property);
+        }
+    }
+}

Modified: incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/map/EntityDescriptor.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/map/EntityDescriptor.java?view=diff&rev=463718&r1=463717&r2=463718
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/map/EntityDescriptor.java (original)
+++ incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/map/EntityDescriptor.java Fri Oct 13 08:55:01 2006
@@ -25,7 +25,7 @@
 import java.util.Map;
 
 import org.apache.cayenne.Persistent;
-import org.apache.cayenne.ValueHolder;
+import org.apache.cayenne.property.AbstractSingleObjectArcProperty;
 import org.apache.cayenne.property.BaseClassDescriptor;
 import org.apache.cayenne.property.BeanAccessor;
 import org.apache.cayenne.property.ClassDescriptor;
@@ -36,7 +36,6 @@
 import org.apache.cayenne.property.PropertyAccessException;
 import org.apache.cayenne.property.PropertyAccessor;
 import org.apache.cayenne.property.SimplePersistentProperty;
-import org.apache.cayenne.property.ValueHolderProperty;
 import org.apache.commons.lang.builder.ToStringBuilder;
 
 /**
@@ -191,15 +190,20 @@
                 property = new ListProperty(this, targetDescriptor, accessor, reverseName);
             }
             else {
-
                 PropertyAccessor accessor = makeAccessor(
                         relationship.getName(),
-                        ValueHolder.class);
-                property = new ValueHolderProperty(
+                        targetDescriptor.getObjectClass());
+                property = new AbstractSingleObjectArcProperty(
                         this,
                         targetDescriptor,
                         accessor,
-                        reverseName);
+                        reverseName) {
+
+                    // this descriptor doez not support to-one faulting
+                    public boolean isFault(Object target) {
+                        return false;
+                    }
+                };
             }
 
             allDescriptors.put(relationship.getName(), property);

Modified: incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/map/EntityDescriptorFactory.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/map/EntityDescriptorFactory.java?view=diff&rev=463718&r1=463717&r2=463718
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/map/EntityDescriptorFactory.java (original)
+++ incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/map/EntityDescriptorFactory.java Fri Oct 13 08:55:01 2006
@@ -23,7 +23,6 @@
 import java.util.Map;
 
 import org.apache.cayenne.DataObject;
-import org.apache.cayenne.Persistent;
 import org.apache.cayenne.property.ClassDescriptor;
 import org.apache.cayenne.property.ClassDescriptorFactory;
 
@@ -90,16 +89,26 @@
         ClassDescriptor superDescriptor = (superEntityName != null) ? resolver
                 .getClassDescriptor(superEntityName) : null;
 
-        Class objectClass = entity.getJavaClass();
-        boolean persistent = Persistent.class.isAssignableFrom(objectClass);
-        boolean dataObject = persistent && DataObject.class.isAssignableFrom(objectClass);
+        return createDescriptor(entity, superDescriptor);
+    }
+
+    /**
+     * Creates an EntityDescriptor for an ObjEntity and a superclass descriptor.
+     * 
+     * @since 3.0
+     */
+    protected EntityDescriptor createDescriptor(
+            ObjEntity entity,
+            ClassDescriptor superclassDescriptor) {
+        
+        boolean dataObject = DataObject.class.isAssignableFrom(entity.getJavaClass());
 
         // return uncompiled
         if (dataObject) {
-            return new DataObjectDescriptor(entity, superDescriptor);
+            return new DataObjectDescriptor(entity, superclassDescriptor);
         }
         else {
-            return new EntityDescriptor(entity, superDescriptor);
+            return new EntityDescriptor(entity, superclassDescriptor);
         }
     }
 }

Modified: incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/map/EntityResolver.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/map/EntityResolver.java?view=diff&rev=463718&r1=463717&r2=463718
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/map/EntityResolver.java (original)
+++ incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/map/EntityResolver.java Fri Oct 13 08:55:01 2006
@@ -156,7 +156,7 @@
 
                 if (clientEntityResolver == null) {
 
-                    EntityResolver resolver = new EntityResolver();
+                    EntityResolver resolver = new ClientEntityResolver();
 
                     // translate to client DataMaps
                     Iterator it = getDataMaps().iterator();