Author: aadamchik
Date: Thu Oct 12 14:26:13 2006
New Revision: 463437

URL: http://svn.apache.org/viewvc?view=rev&rev=463437
Log:
CAY-682 
refactoring enhacer for better extensibility. Splitting different enhancements 
in separate visitors chained together

Added:
    
incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/main/java/org/apache/cayenne/enhancer/ASMTransformer.java
    
incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/main/java/org/apache/cayenne/enhancer/AccessorEnhancer.java
    
incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/main/java/org/apache/cayenne/enhancer/CayenneTransformer.java
      - copied, changed from r463127, 
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/EnhancerHelper.java
      - copied, changed from r454757, 
incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/main/java/org/apache/cayenne/enhancer/ClassVisitorHelper.java
    
incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/main/java/org/apache/cayenne/enhancer/PersistentAccessorEnhancer.java
    
incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/main/java/org/apache/cayenne/enhancer/PersistentInterfaceEnhancer.java
    
incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/test/java/org/apache/cayenne/enhancer/CayenneTransformerTest.java
      - copied, changed from r454799, 
incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/test/java/org/apache/cayenne/enhancer/CayenneEnhancerTest.java
Removed:
    
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/ClassVisitorHelper.java
    
incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/main/java/org/apache/cayenne/enhancer/EnhancerUtil.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/PersistentGetterVisitor.java
    
incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/main/java/org/apache/cayenne/enhancer/PersistentSetterVisitor.java

Added: 
incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/main/java/org/apache/cayenne/enhancer/ASMTransformer.java
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/main/java/org/apache/cayenne/enhancer/ASMTransformer.java?view=auto&rev=463437
==============================================================================
--- 
incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/main/java/org/apache/cayenne/enhancer/ASMTransformer.java
 (added)
+++ 
incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/main/java/org/apache/cayenne/enhancer/ASMTransformer.java
 Thu Oct 12 14:26:13 2006
@@ -0,0 +1,73 @@
+/*****************************************************************
+ *   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.enhancer;
+
+import java.lang.instrument.ClassFileTransformer;
+import java.lang.instrument.IllegalClassFormatException;
+import java.security.ProtectionDomain;
+
+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;
+
+/**
+ * An abstract ClassFileTransformer for handling class enhancement.
+ * 
+ * @since 3.0
+ * @author Andrus Adamchik
+ */
+public abstract class ASMTransformer implements ClassFileTransformer {
+
+    protected Log logger;
+
+    public ASMTransformer() {
+        logger = LogFactory.getLog(getClass());
+    }
+
+    /**
+     * Creates and returns an ASM ClassVisitor for enhancing a class. Returned 
visitor is
+     * either null, if no enhancement of this class is needed, or a wrapper 
around
+     * provided "out" ClassVisitor. Often it is a chain of visitors, each 
doing its own
+     * enhancement.
+     */
+    protected abstract ClassVisitor createVisitor(String className, 
ClassVisitor out);
+
+    public byte[] transform(
+            ClassLoader loader,
+            String className,
+            Class<?> classBeingRedefined,
+            ProtectionDomain protectionDomain,
+            byte[] classfileBuffer) throws IllegalClassFormatException {
+
+        ClassReader reader = new ClassReader(classfileBuffer);
+        ClassWriter writer = new ClassWriter(reader, true);
+
+        ClassVisitor visitor = createVisitor(className, writer);
+        if (visitor == 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();
+    }
+}

Added: 
incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/main/java/org/apache/cayenne/enhancer/AccessorEnhancer.java
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/main/java/org/apache/cayenne/enhancer/AccessorEnhancer.java?view=auto&rev=463437
==============================================================================
--- 
incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/main/java/org/apache/cayenne/enhancer/AccessorEnhancer.java
 (added)
+++ 
incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/main/java/org/apache/cayenne/enhancer/AccessorEnhancer.java
 Thu Oct 12 14:26:13 2006
@@ -0,0 +1,98 @@
+/*****************************************************************
+ *   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.enhancer;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.objectweb.asm.ClassAdapter;
+import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.MethodVisitor;
+
+/**
+ * An enhancer that adds interceptor code to the getters and setters.
+ * 
+ * @since 3.0
+ * @author Andrus Adamchik
+ */
+public abstract class AccessorEnhancer extends ClassAdapter {
+
+    // duplicated from JpaClassDescriptor.
+    private static final Pattern GETTER_PATTERN = Pattern
+            .compile("^(is|get)([A-Z])(.*)$");
+
+    private static final Pattern SETTER_PATTERN = 
Pattern.compile("^set([A-Z])(.*)$");
+
+    public static String propertyNameForGetter(String getterName) {
+        Matcher getMatch = GETTER_PATTERN.matcher(getterName);
+        if (getMatch.matches()) {
+            return getMatch.group(2).toLowerCase() + getMatch.group(3);
+        }
+
+        return null;
+    }
+
+    public static String propertyNameForSetter(String setterName) {
+        Matcher setMatch = SETTER_PATTERN.matcher(setterName);
+
+        if (setMatch.matches()) {
+            return setMatch.group(1).toLowerCase() + setMatch.group(2);
+        }
+
+        return null;
+    }
+
+    public AccessorEnhancer(ClassVisitor cw) {
+        super(cw);
+    }
+
+    protected MethodVisitor visitGetter(MethodVisitor mv, String property) {
+        return mv;
+    }
+
+    protected MethodVisitor visitSetter(MethodVisitor mv, String property) {
+        return mv;
+    }
+
+    @Override
+    public MethodVisitor visitMethod(
+            int access,
+            String name,
+            String desc,
+            String signature,
+            String[] exceptions) {
+
+        MethodVisitor mv = super.visitMethod(access, name, desc, signature, 
exceptions);
+
+        // TODO: andrus, 10/8/2006 - check method sig for real... just checking
+        // the name is not enough
+
+        String getProperty = AccessorEnhancer.propertyNameForGetter(name);
+        if (getProperty != null) {
+            return visitGetter(mv, getProperty);
+        }
+
+        String setProperty = AccessorEnhancer.propertyNameForSetter(name);
+        if (setProperty != null) {
+            return visitSetter(mv, setProperty);
+        }
+
+        return mv;
+    }
+}

Copied: 
incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/main/java/org/apache/cayenne/enhancer/CayenneTransformer.java
 (from r463127, 
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/CayenneTransformer.java?view=diff&rev=463437&p1=incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/main/java/org/apache/cayenne/enhancer/CayenneEnhancer.java&r1=463127&p2=incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/main/java/org/apache/cayenne/enhancer/CayenneTransformer.java&r2=463437
==============================================================================
--- 
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/CayenneTransformer.java
 Thu Oct 12 14:26:13 2006
@@ -18,35 +18,28 @@
  ****************************************************************/
 package org.apache.cayenne.enhancer;
 
-import java.lang.instrument.ClassFileTransformer;
-import java.lang.instrument.IllegalClassFormatException;
-import java.security.ProtectionDomain;
 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;
 
 /**
- * A ClassFileTransformer that enhances a POJO into a persistent object that 
can be used
- * with Cayenne. More specifically, it ensures that the object implements
- * [EMAIL PROTECTED] Persistent} interface and invokes callbacks from the 
accessor methods.
+ * A ClassFileTransformer that performs enhancement based on the metadata from 
Cayenne
+ * DataMap. POJOs are enhanced into persistent objects that can be used with 
Cayenne. More
+ * specifically, CayenneEnhancer ensures that the object implements [EMAIL 
PROTECTED] Persistent}
+ * interface and invokes callbacks from the accessor methods.
  * 
  * @since 3.0
  * @author Andrus Adamchik
  */
-public class CayenneEnhancer implements ClassFileTransformer {
+public class CayenneTransformer extends ASMTransformer {
 
-    protected Log logger = LogFactory.getLog(CayenneEnhancer.class);
     protected Map<String, ObjEntity> entitiesByClass;
 
-    public CayenneEnhancer(EntityResolver entityResolver) {
+    public CayenneTransformer(EntityResolver entityResolver) {
         indexEntities(entityResolver);
     }
 
@@ -67,41 +60,15 @@
         }
     }
 
-    public ObjEntity getEntity(String className) {
-        return entitiesByClass.get(className);
-    }
-
-    public byte[] transform(
-            ClassLoader loader,
-            String className,
-            Class<?> classBeingRedefined,
-            ProtectionDomain protectionDomain,
-            byte[] classfileBuffer) throws IllegalClassFormatException {
-
-        ClassReader reader = new ClassReader(classfileBuffer);
-        ClassWriter writer = new ClassWriter(reader, true);
-
-        ClassVisitor visitor = createVisitor(className, writer);
-        if (visitor == 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();
-    }
-
-    /**
-     * Builds a chain of ASM visitors.
-     */
-    protected ClassVisitor createVisitor(String className, ClassWriter writer) 
{
-        ObjEntity entity = getEntity(className);
+    protected ClassVisitor createVisitor(String className, ClassVisitor out) {
+        ObjEntity entity = entitiesByClass.get(className);
         if (entity == null) {
             return null;
         }
 
-        return new PersistentClassVisitor(writer, entity);
+        // create enhancer chain
+        PersistentInterfaceEnhancer e1 = new PersistentInterfaceEnhancer(out);
+        PersistentAccessorEnhancer e2 = new PersistentAccessorEnhancer(e1, 
entity);
+        return e2;
     }
-
 }

Copied: 
incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/main/java/org/apache/cayenne/enhancer/EnhancerHelper.java
 (from r454757, 
incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/main/java/org/apache/cayenne/enhancer/ClassVisitorHelper.java)
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/main/java/org/apache/cayenne/enhancer/EnhancerHelper.java?view=diff&rev=463437&p1=incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/main/java/org/apache/cayenne/enhancer/ClassVisitorHelper.java&r1=454757&p2=incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/main/java/org/apache/cayenne/enhancer/EnhancerHelper.java&r2=463437
==============================================================================
--- 
incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/main/java/org/apache/cayenne/enhancer/ClassVisitorHelper.java
 (original)
+++ 
incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/main/java/org/apache/cayenne/enhancer/EnhancerHelper.java
 Thu Oct 12 14:26:13 2006
@@ -32,30 +32,30 @@
  * @since 3.0
  * @author Andrus Adamchik
  */
-class ClassVisitorHelper {
+public class EnhancerHelper {
 
     private String fieldPrefix = "$cay_";
     private ClassVisitor classVisitor;
     private Type currentClass;
 
-    ClassVisitorHelper(ClassVisitor classVisitor) {
+    public EnhancerHelper(ClassVisitor classVisitor) {
         this.classVisitor = classVisitor;
     }
 
-    Type getCurrentClass() {
+    public Type getCurrentClass() {
         return currentClass;
     }
 
-    String getPropertyField(String propertyName) {
+    public String getPropertyField(String propertyName) {
         return fieldPrefix + propertyName;
     }
 
-    void reset(String className) {
+    public void reset(String className) {
         // assuming no primitives or arrays
         this.currentClass = Type.getType("L" + className + ";");
     }
 
-    String[] addInterface(String[] interfaces, Class newInterface) {
+    public String[] addInterface(String[] interfaces, Class newInterface) {
 
         String name = Type.getInternalName(newInterface);
         if (interfaces == null || interfaces.length == 0) {
@@ -71,11 +71,11 @@
         return expandedInterfaces;
     }
 
-    void createProperty(Class type, String name) {
+    public void createProperty(Class type, String name) {
         createProperty(type, name, false);
     }
 
-    void createProperty(Class type, String name, boolean isTransient) {
+    public void createProperty(Class type, String name, boolean isTransient) {
         Type asmType = Type.getType(type);
 
         int access = Opcodes.ACC_PROTECTED;

Added: 
incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/main/java/org/apache/cayenne/enhancer/PersistentAccessorEnhancer.java
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/main/java/org/apache/cayenne/enhancer/PersistentAccessorEnhancer.java?view=auto&rev=463437
==============================================================================
--- 
incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/main/java/org/apache/cayenne/enhancer/PersistentAccessorEnhancer.java
 (added)
+++ 
incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/main/java/org/apache/cayenne/enhancer/PersistentAccessorEnhancer.java
 Thu Oct 12 14:26:13 2006
@@ -0,0 +1,70 @@
+/*****************************************************************
+ *   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.enhancer;
+
+import org.apache.cayenne.map.ObjEntity;
+import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.MethodVisitor;
+
+/**
+ * Accessor enhancer that enhances getters and setters mapped in a given 
[EMAIL PROTECTED] ObjEntity}.
+ * 
+ * @author Andrus Adamchik
+ * @since 3.0
+ */
+public class PersistentAccessorEnhancer extends AccessorEnhancer {
+
+    private ObjEntity entity;
+    private EnhancerHelper helper;
+
+    public PersistentAccessorEnhancer(ClassVisitor visitor, ObjEntity entity) {
+        super(visitor);
+        this.entity = entity;
+        this.helper = new EnhancerHelper(this);
+    }
+
+    @Override
+    public void visit(
+            int version,
+            int access,
+            String name,
+            String signature,
+            String superName,
+            String[] interfaces) {
+        
+        helper.reset(name);
+        super.visit(version, access, name, signature, superName, interfaces);
+    }
+
+    @Override
+    protected MethodVisitor visitGetter(MethodVisitor mv, String property) {
+        return (entity.getAttribute(property) != null) ? new 
PersistentGetterVisitor(
+                mv,
+                helper,
+                property) : mv;
+    }
+
+    @Override
+    protected MethodVisitor visitSetter(MethodVisitor mv, String property) {
+        return (entity.getAttribute(property) != null) ? new 
PersistentSetterVisitor(
+                mv,
+                helper,
+                property) : mv;
+    }
+}

Modified: 
incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/main/java/org/apache/cayenne/enhancer/PersistentGetterVisitor.java
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/main/java/org/apache/cayenne/enhancer/PersistentGetterVisitor.java?view=diff&rev=463437&r1=463436&r2=463437
==============================================================================
--- 
incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/main/java/org/apache/cayenne/enhancer/PersistentGetterVisitor.java
 (original)
+++ 
incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/main/java/org/apache/cayenne/enhancer/PersistentGetterVisitor.java
 Thu Oct 12 14:26:13 2006
@@ -31,10 +31,10 @@
  */
 class PersistentGetterVisitor extends MethodAdapter {
 
-    private ClassVisitorHelper helper;
+    private EnhancerHelper helper;
     private String propertyName;
 
-    PersistentGetterVisitor(MethodVisitor mv, ClassVisitorHelper helper,
+    PersistentGetterVisitor(MethodVisitor mv, EnhancerHelper helper,
             String propertyName) {
         super(mv);
         this.helper = helper;

Added: 
incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/main/java/org/apache/cayenne/enhancer/PersistentInterfaceEnhancer.java
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/main/java/org/apache/cayenne/enhancer/PersistentInterfaceEnhancer.java?view=auto&rev=463437
==============================================================================
--- 
incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/main/java/org/apache/cayenne/enhancer/PersistentInterfaceEnhancer.java
 (added)
+++ 
incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/main/java/org/apache/cayenne/enhancer/PersistentInterfaceEnhancer.java
 Thu Oct 12 14:26:13 2006
@@ -0,0 +1,64 @@
+/*****************************************************************
+ *   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.enhancer;
+
+import org.apache.cayenne.ObjectContext;
+import org.apache.cayenne.ObjectId;
+import org.apache.cayenne.Persistent;
+import org.objectweb.asm.ClassAdapter;
+import org.objectweb.asm.ClassVisitor;
+
+/**
+ * Enhances classes passed through the visitor to add [EMAIL PROTECTED] 
Persistent} interface to
+ * them, and fields and methods to support its implementation.
+ * 
+ * @since 3.0
+ * @author Andrus Adamchik
+ */
+public class PersistentInterfaceEnhancer extends ClassAdapter {
+
+    protected EnhancerHelper helper;
+
+    public PersistentInterfaceEnhancer(ClassVisitor visitor) {
+        super(visitor);
+        this.helper = new EnhancerHelper(this);
+    }
+
+    /**
+     * Handles injection of additional fields and Persistent interface 
properties.
+     */
+    @Override
+    public void visit(
+            int version,
+            int access,
+            String name,
+            String signature,
+            String superName,
+            String[] interfaces) {
+
+        helper.reset(name);
+        interfaces = helper.addInterface(interfaces, Persistent.class);
+
+        super.visit(version, access, name, signature, superName, interfaces);
+
+        helper.createProperty(ObjectId.class, "objectId");
+        helper.createProperty(ObjectContext.class, "objectContext", true);
+        helper.createProperty(Integer.TYPE, "persistenceState");
+    }
+}

Modified: 
incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/main/java/org/apache/cayenne/enhancer/PersistentSetterVisitor.java
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/main/java/org/apache/cayenne/enhancer/PersistentSetterVisitor.java?view=diff&rev=463437&r1=463436&r2=463437
==============================================================================
--- 
incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/main/java/org/apache/cayenne/enhancer/PersistentSetterVisitor.java
 (original)
+++ 
incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/main/java/org/apache/cayenne/enhancer/PersistentSetterVisitor.java
 Thu Oct 12 14:26:13 2006
@@ -31,10 +31,10 @@
  */
 class PersistentSetterVisitor extends MethodAdapter {
 
-    private ClassVisitorHelper helper;
+    private EnhancerHelper helper;
     private String propertyName;
 
-    PersistentSetterVisitor(MethodVisitor mv, ClassVisitorHelper helper,
+    PersistentSetterVisitor(MethodVisitor mv, EnhancerHelper helper,
             String propertyName) {
         super(mv);
         this.helper = helper;

Copied: 
incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/test/java/org/apache/cayenne/enhancer/CayenneTransformerTest.java
 (from r454799, 
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/CayenneTransformerTest.java?view=diff&rev=463437&p1=incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/test/java/org/apache/cayenne/enhancer/CayenneEnhancerTest.java&r1=454799&p2=incubator/cayenne/main/trunk/core/cayenne-jdk1.5/src/test/java/org/apache/cayenne/enhancer/CayenneTransformerTest.java&r2=463437
==============================================================================
--- 
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/CayenneTransformerTest.java
 Thu Oct 12 14:26:13 2006
@@ -39,7 +39,7 @@
 import org.apache.cayenne.map.ObjAttribute;
 import org.apache.cayenne.map.ObjEntity;
 
-public class CayenneEnhancerTest extends TestCase {
+public class CayenneTransformerTest extends TestCase {
 
     public static final String C1 = "org.apache.cayenne.enhancer.MockPojo1";
 
@@ -63,7 +63,7 @@
         DataMap map = new DataMap("x");
         map.addObjEntity(e);
 
-        loader = new EnhancingClassLoader(new CayenneEnhancer(new 
EntityResolver(
+        loader = new EnhancingClassLoader(new CayenneTransformer(new 
EntityResolver(
                 Collections.singleton(map))));
     }
 


Reply via email to