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 2007/12/22 17:45:24 UTC

svn commit: r606466 - in /cayenne/main/trunk/framework/cayenne-jpa-unpublished/src: main/java/org/apache/cayenne/jpa/conf/ main/java/org/apache/cayenne/jpa/enhancer/ main/java/org/apache/cayenne/jpa/map/ test/java/org/apache/cayenne/jpa/conf/

Author: aadamchik
Date: Sat Dec 22 08:45:23 2007
New Revision: 606466

URL: http://svn.apache.org/viewvc?rev=606466&view=rev
Log:
CAY-946 JPA: property-based access to persistent objects
(skipping Cayenne-generated properties when analyzing the class)

Added:
    cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/test/java/org/apache/cayenne/jpa/conf/MockAnnotatedBean5.java
Modified:
    cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/conf/EntityMapAnnotationLoader.java
    cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/enhancer/JpaAccessorVisitor.java
    cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/enhancer/JpaEnhancerVisitorFactory.java
    cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/map/JpaClassDescriptor.java
    cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/test/java/org/apache/cayenne/jpa/conf/EntityMapDefaultsProcessorTest.java

Modified: cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/conf/EntityMapAnnotationLoader.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/conf/EntityMapAnnotationLoader.java?rev=606466&r1=606465&r2=606466&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/conf/EntityMapAnnotationLoader.java (original)
+++ cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/conf/EntityMapAnnotationLoader.java Sat Dec 22 08:45:23 2007
@@ -188,7 +188,7 @@
 
         JpaClassDescriptor descriptor = new JpaClassDescriptor(managedClass);
 
-        // initially set access to the map level access - may be overriden below
+        // initially set access to the map level access - may be overridden below
         descriptor.setAccess(context.getEntityMap().getAccess());
 
         AnnotationContext stack = new AnnotationContext(descriptor);

Modified: cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/enhancer/JpaAccessorVisitor.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/enhancer/JpaAccessorVisitor.java?rev=606466&r1=606465&r2=606466&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/enhancer/JpaAccessorVisitor.java (original)
+++ cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/enhancer/JpaAccessorVisitor.java Sat Dec 22 08:45:23 2007
@@ -20,7 +20,7 @@
 
 import org.apache.cayenne.enhancer.AccessorVisitor;
 import org.apache.cayenne.jpa.map.AccessType;
-import org.apache.cayenne.jpa.map.JpaClassDescriptor;
+import org.apache.cayenne.jpa.map.JpaManagedClass;
 import org.apache.cayenne.jpa.map.JpaPropertyDescriptor;
 import org.objectweb.asm.ClassVisitor;
 
@@ -29,22 +29,24 @@
  */
 class JpaAccessorVisitor extends AccessorVisitor {
 
-    private JpaClassDescriptor descriptor;
+    private JpaManagedClass managedClass;
 
-    public JpaAccessorVisitor(ClassVisitor visitor, JpaClassDescriptor descriptor) {
+    public JpaAccessorVisitor(ClassVisitor visitor, JpaManagedClass managedClass) {
         super(visitor);
-        this.descriptor = descriptor;
+        this.managedClass = managedClass;
     }
 
     @Override
     protected boolean isEnhancedProperty(String property) {
-        return descriptor.getAccess() != AccessType.PROPERTY
-                && descriptor.getProperty(property) != null;
+        return managedClass.getAccess() != AccessType.PROPERTY
+                && managedClass.getAttributes().getAttribute(property) != null;
     }
 
     @Override
     protected boolean isLazyFaulted(String property) {
-        JpaPropertyDescriptor propertyDescriptor = descriptor.getProperty(property);
+        JpaPropertyDescriptor propertyDescriptor = managedClass
+                .getClassDescriptor()
+                .getProperty(property);
 
         // TODO: andrus, 10/14/2006 - this should access Jpa LAZY vs. EAGER flag
         // instead of using Cayenne default logic of lazy relationships

Modified: cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/enhancer/JpaEnhancerVisitorFactory.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/enhancer/JpaEnhancerVisitorFactory.java?rev=606466&r1=606465&r2=606466&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/enhancer/JpaEnhancerVisitorFactory.java (original)
+++ cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/enhancer/JpaEnhancerVisitorFactory.java Sat Dec 22 08:45:23 2007
@@ -49,8 +49,7 @@
 
             // create enhancer chain
             PersistentInterfaceVisitor e1 = new PersistentInterfaceVisitor(out);
-            JpaAccessorVisitor e2 = new JpaAccessorVisitor(e1, entity
-                    .getClassDescriptor());
+            JpaAccessorVisitor e2 = new JpaAccessorVisitor(e1, entity);
 
             // this ensures that both enhanced and original classes have compatible
             // serialized

Modified: cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/map/JpaClassDescriptor.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/map/JpaClassDescriptor.java?rev=606466&r1=606465&r2=606466&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/map/JpaClassDescriptor.java (original)
+++ cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/map/JpaClassDescriptor.java Sat Dec 22 08:45:23 2007
@@ -26,10 +26,14 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Map;
+import java.util.Set;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import org.apache.cayenne.ObjectContext;
+import org.apache.cayenne.ObjectId;
 import org.apache.cayenne.enhancer.EnhancementHelper;
 
 /**
@@ -44,11 +48,24 @@
             .compile("^(is|get)([A-Z])(.*)$");
     private static final Pattern SETTER_PATTERN = Pattern.compile("^set([A-Z])(.*)$");
 
+    static final Set<String> reservedProperties;
+
+    static {
+        reservedProperties = new HashSet<String>();
+        reservedProperties.add(propertyKey("objectId", ObjectId.class));
+        reservedProperties.add(propertyKey("persistenceState", Integer.TYPE));
+        reservedProperties.add(propertyKey("objectContext", ObjectContext.class));
+    }
+
     protected Collection<JpaPropertyDescriptor> fieldDescriptors;
     protected Collection<JpaPropertyDescriptor> propertyDescriptors;
     protected Class<?> managedClass;
     protected AccessType access;
 
+    static String propertyKey(String propertyName, Class<?> propertyType) {
+        return propertyName + ':' + propertyType.getName();
+    }
+
     public static String propertyNameForGetter(String getterName) {
         Matcher getMatch = GETTER_PATTERN.matcher(getterName);
         if (getMatch.matches()) {
@@ -214,7 +231,12 @@
                 String propertyName = propertyNameForGetter(name);
 
                 if (propertyName != null) {
-                    String key = propertyName + ":" + returnType.getName();
+                    String key = propertyKey(propertyName, returnType);
+
+                    if (reservedProperties.contains(key)) {
+                        continue;
+                    }
+
                     PropertyTuple t = properties.get(key);
                     if (t == null) {
                         t = new PropertyTuple();
@@ -254,7 +276,7 @@
         }
     }
 
-    final class PropertyTuple {
+    static final class PropertyTuple {
 
         String name;
         Method getter;

Modified: cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/test/java/org/apache/cayenne/jpa/conf/EntityMapDefaultsProcessorTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/test/java/org/apache/cayenne/jpa/conf/EntityMapDefaultsProcessorTest.java?rev=606466&r1=606465&r2=606466&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/test/java/org/apache/cayenne/jpa/conf/EntityMapDefaultsProcessorTest.java (original)
+++ cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/test/java/org/apache/cayenne/jpa/conf/EntityMapDefaultsProcessorTest.java Sat Dec 22 08:45:23 2007
@@ -47,6 +47,7 @@
         EntityMapAnnotationLoader loader = new EntityMapAnnotationLoader(context);
         loader.loadClassMapping(MockAnnotatedBean1.class);
         loader.loadClassMapping(MockAnnotatedBean3.class);
+        loader.loadClassMapping(MockAnnotatedBean5.class);
 
         // apply defaults
         EntityMapDefaultsProcessor defaultsProcessor = new EntityMapDefaultsProcessor();
@@ -68,6 +69,15 @@
 
         assertNotNull(entity.getAttributes().getBasicAttribute("attribute1"));
         assertNull(entity.getAttributes().getBasicAttribute("attribute2"));
+    }
+
+    public void testSkipCayennePersistentProperties() throws Exception {
+
+        JpaEntity e5 = context.getEntityMap().entityForClass(MockAnnotatedBean5.class);
+        assertNotNull(e5);
+
+        assertNotNull(e5.getAttributes().getBasicAttribute("attribute1"));
+        assertNull(e5.getAttributes().getBasicAttribute("objectId"));
     }
 
     public void testTargetEntityNameToOne() {

Added: cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/test/java/org/apache/cayenne/jpa/conf/MockAnnotatedBean5.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/test/java/org/apache/cayenne/jpa/conf/MockAnnotatedBean5.java?rev=606466&view=auto
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/test/java/org/apache/cayenne/jpa/conf/MockAnnotatedBean5.java (added)
+++ cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/test/java/org/apache/cayenne/jpa/conf/MockAnnotatedBean5.java Sat Dec 22 08:45: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.jpa.conf;
+
+import javax.persistence.Basic;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+import org.apache.cayenne.ObjectId;
+
+@Entity
+public class MockAnnotatedBean5 {
+
+    @Id
+    public int getId() {
+        return 35;
+    }
+
+    public ObjectId getObjectId() {
+        return new ObjectId("MockAnnotatedBean5");
+    }
+    
+    public void setObjectId(ObjectId id) {
+        
+    }
+    
+    @Basic
+    public int getAttribute1() {
+        return 66;
+    }
+    
+    public void setAttribute1(int a) {
+        
+    }
+
+}