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 {


Reply via email to