Author: aadamchik
Date: Fri Oct 13 07:55:16 2006
New Revision: 463696

URL: http://svn.apache.org/viewvc?view=rev&rev=463696
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/DataObjectDescriptor.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

Added: 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/map/DataObjectDescriptor.java
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/map/DataObjectDescriptor.java?view=auto&rev=463696
==============================================================================
--- 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/map/DataObjectDescriptor.java
 (added)
+++ 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/map/DataObjectDescriptor.java
 Fri Oct 13 07:55:16 2006
@@ -0,0 +1,100 @@
+/*****************************************************************
+ *   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.DataObject;
+import org.apache.cayenne.property.ClassDescriptor;
+import org.apache.cayenne.property.DataObjectAccessor;
+import org.apache.cayenne.property.PersistentObjectProperty;
+import org.apache.cayenne.property.Property;
+import org.apache.cayenne.property.PropertyAccessException;
+import org.apache.cayenne.property.PropertyAccessor;
+import org.apache.cayenne.property.ToManyListProperty;
+
+/**
+ * A ClassDescriptor for entities implementing [EMAIL PROTECTED] DataObject} 
interface, providing
+ * access to the property values.
+ * 
+ * @since 3.0
+ * @author Andrus Adamchik
+ */
+class DataObjectDescriptor extends EntityDescriptor {
+
+    DataObjectDescriptor(ObjEntity entity, ClassDescriptor 
superclassDescriptor) {
+        super(entity, superclassDescriptor);
+    }
+
+    public void shallowMerge(Object from, Object to) throws 
PropertyAccessException {
+        super.shallowMerge(from, to);
+
+        if (from instanceof DataObject && to instanceof DataObject) {
+            ((DataObject) to)
+                    .setSnapshotVersion(((DataObject) 
from).getSnapshotVersion());
+        }
+    }
+
+    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 ToManyListProperty(
+                        this,
+                        targetDescriptor,
+                        accessor,
+                        reverseName);
+            }
+            else {
+                ObjEntity targetEntity = (ObjEntity) 
relationship.getTargetEntity();
+                PropertyAccessor accessor = makeAccessor(
+                        relationship.getName(),
+                        targetEntity.getJavaClass());
+                property = new PersistentObjectProperty(
+                        this,
+                        targetDescriptor,
+                        accessor,
+                        reverseName);
+            }
+
+            allDescriptors.put(relationship.getName(), property);
+        }
+    }
+
+    protected PropertyAccessor makeAccessor(String propertyName, Class 
propertyType)
+            throws PropertyAccessException {
+        return new DataObjectAccessor(propertyName);
+    }
+}

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=463696&r1=463695&r2=463696
==============================================================================
--- 
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 07:55:16 2006
@@ -24,7 +24,6 @@
 import java.util.List;
 import java.util.Map;
 
-import org.apache.cayenne.DataObject;
 import org.apache.cayenne.Persistent;
 import org.apache.cayenne.ValueHolder;
 import org.apache.cayenne.property.BaseClassDescriptor;
@@ -33,13 +32,11 @@
 import org.apache.cayenne.property.DataObjectAccessor;
 import org.apache.cayenne.property.FieldAccessor;
 import org.apache.cayenne.property.ListProperty;
-import org.apache.cayenne.property.PersistentObjectProperty;
 import org.apache.cayenne.property.Property;
 import org.apache.cayenne.property.PropertyAccessException;
 import org.apache.cayenne.property.PropertyAccessor;
 import org.apache.cayenne.property.SimplePersistentProperty;
 import org.apache.cayenne.property.SimpleProperty;
-import org.apache.cayenne.property.ToManyListProperty;
 import org.apache.cayenne.property.ValueHolderProperty;
 import org.apache.commons.lang.builder.ToStringBuilder;
 
@@ -54,7 +51,6 @@
     protected ObjEntity entity;
 
     // compiled properties
-    protected boolean dataObject;
     boolean persistent;
 
     /**
@@ -66,15 +62,6 @@
         this.entity = entity;
     }
 
-    public void shallowMerge(Object from, Object to) throws 
PropertyAccessException {
-        super.shallowMerge(from, to);
-
-        if (dataObject && from instanceof DataObject && to instanceof 
DataObject) {
-            ((DataObject) to)
-                    .setSnapshotVersion(((DataObject) 
from).getSnapshotVersion());
-        }
-    }
-
     /**
      * Returns ObjEntity described by this object.
      */
@@ -111,7 +98,6 @@
         // compile common stuff
         this.objectClass = entity.getJavaClass();
         this.persistent = Persistent.class.isAssignableFrom(objectClass);
-        this.dataObject = persistent && 
DataObject.class.isAssignableFrom(objectClass);
 
         compileSpecialProperties();
 
@@ -203,49 +189,21 @@
 
             Property property;
             if (relationship.isToMany()) {
-
                 PropertyAccessor accessor = makeAccessor(
                         relationship.getName(),
                         List.class);
-
-                if (dataObject) {
-                    property = new ToManyListProperty(
-                            this,
-                            targetDescriptor,
-                            accessor,
-                            reverseName);
-                }
-                else {
-                    property = new ListProperty(
-                            this,
-                            targetDescriptor,
-                            accessor,
-                            reverseName);
-                }
+                property = new ListProperty(this, targetDescriptor, accessor, 
reverseName);
             }
             else {
 
-                if (dataObject) {
-                    ObjEntity targetEntity = (ObjEntity) 
relationship.getTargetEntity();
-                    PropertyAccessor accessor = makeAccessor(
-                            relationship.getName(),
-                            targetEntity.getJavaClass());
-                    property = new PersistentObjectProperty(
-                            this,
-                            targetDescriptor,
-                            accessor,
-                            reverseName);
-                }
-                else {
-                    PropertyAccessor accessor = makeAccessor(
-                            relationship.getName(),
-                            ValueHolder.class);
-                    property = new ValueHolderProperty(
-                            this,
-                            targetDescriptor,
-                            accessor,
-                            reverseName);
-                }
+                PropertyAccessor accessor = makeAccessor(
+                        relationship.getName(),
+                        ValueHolder.class);
+                property = new ValueHolderProperty(
+                        this,
+                        targetDescriptor,
+                        accessor,
+                        reverseName);
             }
 
             allDescriptors.put(relationship.getName(), property);
@@ -259,10 +217,6 @@
      */
     protected PropertyAccessor makeAccessor(String propertyName, Class 
propertyType)
             throws PropertyAccessException {
-
-        if (dataObject) {
-            return new DataObjectAccessor(propertyName);
-        }
 
         try {
             return new FieldAccessor(objectClass, propertyName, propertyType);

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=463696&r1=463695&r2=463696
==============================================================================
--- 
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 07:55:16 2006
@@ -22,6 +22,8 @@
 import java.util.HashMap;
 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;
 
@@ -88,7 +90,16 @@
         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 uncompiled
-        return new EntityDescriptor(entity, superDescriptor);
+        if (dataObject) {
+            return new DataObjectDescriptor(entity, superDescriptor);
+        }
+        else {
+            return new EntityDescriptor(entity, superDescriptor);
+        }
     }
 }


Reply via email to