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); + } } }