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/20 19:06:57 UTC
svn commit: r605986 - in /cayenne/main/trunk:
framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/
framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/conf/
framework/cayenne-jpa-unpublished/src/main/java/org/apach...
Author: aadamchik
Date: Thu Dec 20 10:06:56 2007
New Revision: 605986
URL: http://svn.apache.org/viewvc?rev=605986&view=rev
Log:
CAY-946 JPA: property-based access to persistent objects
(sort of works, but requires more testing... and of course a working enhancer)
Modified:
cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/Provider.java
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/map/JpaEntityMap.java
cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/reflect/JpaClassDescriptorFactory.java
cayenne/main/trunk/itests/jpa-chapter2/src/test/java/org/apache/cayenne/jpa/itest/ch2/_2_1_1_PeristentFieldsAndPropertiesTest.java
Modified: cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/Provider.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/Provider.java?rev=605986&r1=605985&r2=605986&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/Provider.java (original)
+++ cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/Provider.java Thu Dec 20 10:06:56 2007
@@ -220,17 +220,6 @@
boolean isJTA = isJta(unit, map);
- // configure Cayenne domain
- domain = new DataDomain(name);
- ClassDescriptorMap descriptors = domain
- .getEntityResolver()
- .getClassDescriptorMap();
- FaultFactory faultFactory = new SingletonFaultFactory();
- descriptors.addFactory(new JpaClassDescriptorFactory(
- descriptors,
- faultFactory));
- configuration.addDomain(domain);
-
EntityMapLoader loader = new EntityMapLoader(unit);
// add transformer before DataMapConverter starts loading the classes via app
@@ -246,6 +235,18 @@
DataMapConverter converter = new DataMapConverter();
DataMap cayenneMap = converter.toDataMap(name, loader.getContext());
+
+ // configure Cayenne domain
+ domain = new DataDomain(name);
+ ClassDescriptorMap descriptors = domain
+ .getEntityResolver()
+ .getClassDescriptorMap();
+ FaultFactory faultFactory = new SingletonFaultFactory();
+ descriptors.addFactory(new JpaClassDescriptorFactory(
+ loader.getEntityMap(),
+ descriptors,
+ faultFactory));
+ configuration.addDomain(domain);
// TODO: andrus, 2/3/2007 - clarify this logic.... JTA EM may not always mean
// JTA DS?
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=605986&r1=605985&r2=605986&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 Thu Dec 20 10:06:56 2007
@@ -174,7 +174,7 @@
public void loadClassMapping(Class<?> managedClass) throws JpaProviderException {
// avoid duplicates loaded from annotations per CAY-756
- if (context.getEntityMap().containsManagedClass(managedClass.getName())) {
+ if (context.getEntityMap().getManagedClass(managedClass.getName()) != null) {
context.recordConflict(new SimpleValidationFailure(
managedClass.getName(),
"Duplicate managed class declaration " + managedClass.getName()));
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=605986&r1=605985&r2=605986&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 Thu Dec 20 10:06:56 2007
@@ -19,6 +19,7 @@
package org.apache.cayenne.jpa.enhancer;
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.JpaPropertyDescriptor;
import org.objectweb.asm.ClassVisitor;
@@ -37,7 +38,8 @@
@Override
protected boolean isEnhancedProperty(String property) {
- return descriptor.getProperty(property) != null;
+ return descriptor.getAccess() != AccessType.PROPERTY
+ && descriptor.getProperty(property) != null;
}
@Override
Modified: cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/map/JpaEntityMap.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/map/JpaEntityMap.java?rev=605986&r1=605985&r2=605986&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/map/JpaEntityMap.java (original)
+++ cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/map/JpaEntityMap.java Thu Dec 20 10:06:56 2007
@@ -109,12 +109,12 @@
if (mappedSuperclasses != null) {
encoder.print(mappedSuperclasses);
}
-
- if(entities != null) {
+
+ if (entities != null) {
encoder.print(entities);
}
-
- if(embeddables != null) {
+
+ if (embeddables != null) {
encoder.print(embeddables);
}
@@ -123,9 +123,9 @@
}
/**
- * Returns true if a given managed class is already loaded.
+ * Returns an existing managed class, or null if no match is found.
*/
- public boolean containsManagedClass(String className) {
+ public JpaManagedClass getManagedClass(String className) {
if (className == null) {
throw new IllegalArgumentException("Null class name");
}
@@ -133,7 +133,7 @@
if (mappedSuperclasses != null) {
for (JpaMappedSuperclass object : mappedSuperclasses) {
if (className.equals(object.getClassName())) {
- return true;
+ return object;
}
}
}
@@ -141,7 +141,7 @@
if (entities != null) {
for (JpaEntity object : entities) {
if (className.equals(object.getClassName())) {
- return true;
+ return object;
}
}
}
@@ -149,12 +149,12 @@
if (embeddables != null) {
for (JpaEmbeddable object : embeddables) {
if (className.equals(object.getClassName())) {
- return true;
+ return object;
}
}
}
- return false;
+ return null;
}
/**
@@ -205,8 +205,8 @@
if (entityClassName == null) {
throw new IllegalArgumentException("Null entity class name");
}
-
- if(entities == null) {
+
+ if (entities == null) {
return null;
}
@@ -218,7 +218,7 @@
return null;
}
-
+
/**
* Returns a JpaEmbeddable describing a given embeddable class.
*/
@@ -230,7 +230,7 @@
return embeddableForClass(embeddableClass.getName());
}
-
+
/**
* Returns a JpaEmbeddable describing a given embeddable class.
*/
@@ -238,8 +238,8 @@
if (embeddableClassName == null) {
throw new IllegalArgumentException("Null embeddable class name");
}
-
- if(embeddables == null) {
+
+ if (embeddables == null) {
return null;
}
@@ -251,7 +251,6 @@
return null;
}
-
public AccessType getAccess() {
return access;
Modified: cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/reflect/JpaClassDescriptorFactory.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/reflect/JpaClassDescriptorFactory.java?rev=605986&r1=605985&r2=605986&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/reflect/JpaClassDescriptorFactory.java (original)
+++ cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/reflect/JpaClassDescriptorFactory.java Thu Dec 20 10:06:56 2007
@@ -24,20 +24,51 @@
import java.util.Map;
import java.util.Set;
+import org.apache.cayenne.jpa.map.AccessType;
+import org.apache.cayenne.jpa.map.JpaEntityMap;
+import org.apache.cayenne.jpa.map.JpaManagedClass;
import org.apache.cayenne.map.ObjRelationship;
import org.apache.cayenne.reflect.Accessor;
+import org.apache.cayenne.reflect.BeanAccessor;
import org.apache.cayenne.reflect.ClassDescriptor;
import org.apache.cayenne.reflect.ClassDescriptorMap;
import org.apache.cayenne.reflect.FaultFactory;
import org.apache.cayenne.reflect.PersistentDescriptor;
import org.apache.cayenne.reflect.Property;
+import org.apache.cayenne.reflect.PropertyException;
import org.apache.cayenne.reflect.pojo.EnhancedPojoDescriptorFactory;
public class JpaClassDescriptorFactory extends EnhancedPojoDescriptorFactory {
- public JpaClassDescriptorFactory(ClassDescriptorMap descriptorMap,
- FaultFactory faultFactory) {
+ protected JpaEntityMap entityMap;
+
+ public JpaClassDescriptorFactory(JpaEntityMap entityMap,
+ ClassDescriptorMap descriptorMap, FaultFactory faultFactory) {
super(descriptorMap, faultFactory);
+ this.entityMap = entityMap;
+ }
+
+ @Override
+ protected Accessor createAccessor(
+ PersistentDescriptor descriptor,
+ String propertyName,
+ Class<?> propertyType) throws PropertyException {
+
+ String className = descriptor.getObjectClass().getName();
+ JpaManagedClass managedClass = entityMap.getManagedClass(className);
+ if (managedClass == null) {
+ throw new IllegalArgumentException("Not a managed class: " + className);
+ }
+
+ if (managedClass.getAccess() == AccessType.PROPERTY) {
+ return new BeanAccessor(
+ descriptor.getObjectClass(),
+ propertyName,
+ propertyType);
+ }
+ else {
+ return super.createAccessor(descriptor, propertyName, propertyType);
+ }
}
protected void createToManyListProperty(
Modified: cayenne/main/trunk/itests/jpa-chapter2/src/test/java/org/apache/cayenne/jpa/itest/ch2/_2_1_1_PeristentFieldsAndPropertiesTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/itests/jpa-chapter2/src/test/java/org/apache/cayenne/jpa/itest/ch2/_2_1_1_PeristentFieldsAndPropertiesTest.java?rev=605986&r1=605985&r2=605986&view=diff
==============================================================================
--- cayenne/main/trunk/itests/jpa-chapter2/src/test/java/org/apache/cayenne/jpa/itest/ch2/_2_1_1_PeristentFieldsAndPropertiesTest.java (original)
+++ cayenne/main/trunk/itests/jpa-chapter2/src/test/java/org/apache/cayenne/jpa/itest/ch2/_2_1_1_PeristentFieldsAndPropertiesTest.java Thu Dec 20 10:06:56 2007
@@ -46,13 +46,18 @@
"property1"));
}
- // TODO: andrus 8/10/2006 - fails
- public void _testPropertyBasedPersistence() {
+ public void testPropertyBasedPersistence() throws Exception {
+ getDbHelper().deleteAll("PropertyPersistenceEntity");
+
PropertyPersistenceEntity o1 = new PropertyPersistenceEntity();
o1.setProperty1("p1");
o1.setProperty2(true);
getEntityManager().persist(o1);
getEntityManager().getTransaction().commit();
+
+ assertEquals("p1", getDbHelper().getObject(
+ "PropertyPersistenceEntity",
+ "property1"));
}
public void testSkipTransientProperties() {