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