Author: aadamchik
Date: Tue Oct 10 09:06:34 2006
New Revision: 454799
URL: http://svn.apache.org/viewvc?view=rev&rev=454799
Log:
CAY-682
* switching enhancer to use Cayenne mapping metadata
* added logging to enhancer
Modified:
incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/main/java/org/apache/cayenne/enhancer/CayenneEnhancer.java
incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/main/java/org/apache/cayenne/enhancer/PersistentClassVisitor.java
incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/test/java/org/apache/cayenne/enhancer/CayenneEnhancerTest.java
Modified:
incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/main/java/org/apache/cayenne/enhancer/CayenneEnhancer.java
URL:
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/main/java/org/apache/cayenne/enhancer/CayenneEnhancer.java?view=diff&rev=454799&r1=454798&r2=454799
==============================================================================
---
incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/main/java/org/apache/cayenne/enhancer/CayenneEnhancer.java
(original)
+++
incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/main/java/org/apache/cayenne/enhancer/CayenneEnhancer.java
Tue Oct 10 09:06:34 2006
@@ -21,10 +21,14 @@
import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.IllegalClassFormatException;
import java.security.ProtectionDomain;
-import java.util.Collection;
+import java.util.HashMap;
import java.util.Map;
import org.apache.cayenne.Persistent;
+import org.apache.cayenne.map.EntityResolver;
+import org.apache.cayenne.map.ObjEntity;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.ClassWriter;
@@ -39,10 +43,33 @@
*/
public class CayenneEnhancer implements ClassFileTransformer {
- protected Map<String, Collection<String>> persistentPropertiesByClass;
+ protected Log logger = LogFactory.getLog(CayenneEnhancer.class);
+ protected EntityResolver entityResolver;
+ protected Map<String, ObjEntity> entitiesByClass;
- public CayenneEnhancer(Map<String, Collection<String>>
persistentPropertiesByClass) {
- this.persistentPropertiesByClass = persistentPropertiesByClass;
+ public CayenneEnhancer(EntityResolver entityResolver) {
+ indexEntities(entityResolver);
+ }
+
+ private void indexEntities(EntityResolver entityResolver) {
+ // EntityResolver doesn't have an index by class name, (let alone using
+ // "internal" class names with slashes as keys), so we have to build it
+ // manually
+
+ this.entitiesByClass = new HashMap<String, ObjEntity>();
+ for (Object object : entityResolver.getObjEntities()) {
+ ObjEntity entity = (ObjEntity) object;
+
+ // transform method must use internal class names (a/b/c), however
for some
+ // reason in some invironments (e.g. Mac, Eclipse) it uses a.b.c.
Handle both
+ // cases here...
+ entitiesByClass.put(entity.getClassName(), entity);
+ entitiesByClass.put(entity.getClassName().replace('.', '/'),
entity);
+ }
+ }
+
+ public ObjEntity getEntity(String className) {
+ return entitiesByClass.get(className);
}
public byte[] transform(
@@ -57,10 +84,11 @@
ClassVisitor visitor = createVisitor(className, writer);
if (visitor == null) {
- // per JPA spec if no transformation occured, we must return null
+ // per instrumentation docs, if no transformation occured, we must
return null
return null;
}
+ logger.info("enhancing class " + className);
reader.accept(visitor, true);
return writer.toByteArray();
}
@@ -69,11 +97,12 @@
* Builds a chain of ASM visitors.
*/
protected ClassVisitor createVisitor(String className, ClassWriter writer)
{
- Collection<String> properties =
persistentPropertiesByClass.get(className);
- if (properties == null || properties.isEmpty()) {
+ ObjEntity entity = getEntity(className);
+ if (entity == null) {
return null;
}
- return new PersistentClassVisitor(writer, properties);
+ return new PersistentClassVisitor(writer, entity);
}
+
}
Modified:
incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/main/java/org/apache/cayenne/enhancer/PersistentClassVisitor.java
URL:
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/main/java/org/apache/cayenne/enhancer/PersistentClassVisitor.java?view=diff&rev=454799&r1=454798&r2=454799
==============================================================================
---
incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/main/java/org/apache/cayenne/enhancer/PersistentClassVisitor.java
(original)
+++
incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/main/java/org/apache/cayenne/enhancer/PersistentClassVisitor.java
Tue Oct 10 09:06:34 2006
@@ -18,11 +18,10 @@
****************************************************************/
package org.apache.cayenne.enhancer;
-import java.util.Collection;
-
import org.apache.cayenne.ObjectContext;
import org.apache.cayenne.ObjectId;
import org.apache.cayenne.Persistent;
+import org.apache.cayenne.map.ObjEntity;
import org.objectweb.asm.ClassAdapter;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.MethodVisitor;
@@ -35,12 +34,12 @@
*/
class PersistentClassVisitor extends ClassAdapter {
- private Collection<String> enhancedProperties;
+ private ObjEntity entity;
private ClassVisitorHelper helper;
- PersistentClassVisitor(ClassVisitor visitor, Collection<String>
enhancedProperties) {
+ PersistentClassVisitor(ClassVisitor visitor, ObjEntity entity) {
super(visitor);
- this.enhancedProperties = enhancedProperties;
+ this.entity = entity;
this.helper = new ClassVisitorHelper(this);
}
@@ -83,13 +82,16 @@
// the name is not enough
String getProperty = EnhancerUtil.propertyNameForGetter(name);
- if (getProperty != null && enhancedProperties.contains(getProperty)) {
- return new PersistentGetterVisitor(mv, helper, getProperty);
+ if (getProperty != null) {
+ if (entity.getAttribute(getProperty) != null) {
+ return new PersistentGetterVisitor(mv, helper, getProperty);
+ }
}
-
- String setProperty = EnhancerUtil.propertyNameForSetter(name);
- if (setProperty != null && enhancedProperties.contains(setProperty)) {
- return new PersistentSetterVisitor(mv, helper, setProperty);
+ else {
+ String setProperty = EnhancerUtil.propertyNameForSetter(name);
+ if (setProperty != null && entity.getAttribute(setProperty) !=
null) {
+ return new PersistentSetterVisitor(mv, helper, setProperty);
+ }
}
return mv;
Modified:
incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/test/java/org/apache/cayenne/enhancer/CayenneEnhancerTest.java
URL:
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/test/java/org/apache/cayenne/enhancer/CayenneEnhancerTest.java?view=diff&rev=454799&r1=454798&r2=454799
==============================================================================
---
incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/test/java/org/apache/cayenne/enhancer/CayenneEnhancerTest.java
(original)
+++
incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/test/java/org/apache/cayenne/enhancer/CayenneEnhancerTest.java
Tue Oct 10 09:06:34 2006
@@ -23,6 +23,7 @@
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
@@ -33,6 +34,10 @@
import org.apache.cayenne.ObjectId;
import org.apache.cayenne.PersistenceState;
import org.apache.cayenne.Persistent;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.EntityResolver;
+import org.apache.cayenne.map.ObjAttribute;
+import org.apache.cayenne.map.ObjEntity;
public class CayenneEnhancerTest extends TestCase {
@@ -50,8 +55,16 @@
Collection<String> c1 = new HashSet<String>();
c1.add("attribute1");
enhancedPropertyMap.put(C1, c1);
+
+ ObjAttribute a1 = new ObjAttribute("attribute1");
+ ObjEntity e = new ObjEntity("E1");
+ e.addAttribute(a1);
+ e.setClassName(C1);
+ DataMap map = new DataMap("x");
+ map.addObjEntity(e);
- loader = new EnhancingClassLoader(new
CayenneEnhancer(enhancedPropertyMap));
+ loader = new EnhancingClassLoader(new CayenneEnhancer(new
EntityResolver(
+ Collections.singleton(map))));
}
public void testPersistentInterfaceInjected() throws Exception {