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 [EMAIL PROTECTED] 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 [EMAIL PROTECTED] 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();