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 2006/10/13 03:45:30 UTC

svn commit: r463546 - in /incubator/cayenne/main/trunk/core/cayenne-jpa/src: main/java/org/apache/cayenne/jpa/cspi/ main/java/org/apache/cayenne/jpa/enhancer/ main/java/org/apache/cayenne/jpa/instrument/ test/java/org/apache/cayenne/jpa/enhancer/

Author: aadamchik
Date: Thu Oct 12 18:45:30 2006
New Revision: 463546

URL: http://svn.apache.org/viewvc?view=rev&rev=463546
Log:
CAY-682: Generic Cayenne POJO enhancer
(switching JPA cglib enhancer to the generic ASM Cayenne enhancer)

Added:
    incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaAccessorVisitor.java
    incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaEnhancerVisitorFactory.java
    incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/instrument/UnitClassTranformer.java
      - copied, changed from r454757, incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/enhancer/UnitClassTranformer.java
Removed:
    incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/enhancer/
    incubator/cayenne/main/trunk/core/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/enhancer/
Modified:
    incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaEntityManager.java
    incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaPersistenceProvider.java

Added: incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaAccessorVisitor.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaAccessorVisitor.java?view=auto&rev=463546
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaAccessorVisitor.java (added)
+++ incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaAccessorVisitor.java Thu Oct 12 18:45:30 2006
@@ -0,0 +1,79 @@
+/*****************************************************************
+ *   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.cspi;
+
+import org.apache.cayenne.enhancer.AccessorVisitor;
+import org.apache.cayenne.enhancer.EnhancementHelper;
+import org.apache.cayenne.enhancer.GetterVisitor;
+import org.apache.cayenne.enhancer.SetterVisitor;
+import org.apache.cayenne.jpa.map.JpaClassDescriptor;
+import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Type;
+
+/**
+ * @author Andrus Adamchik
+ */
+class CjpaAccessorVisitor extends AccessorVisitor {
+
+    private JpaClassDescriptor descriptor;
+    private EnhancementHelper helper;
+
+    public CjpaAccessorVisitor(ClassVisitor visitor, JpaClassDescriptor descriptor) {
+        super(visitor);
+        this.descriptor = descriptor;
+        this.helper = new EnhancementHelper(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,
+            Type propertyType) {
+        return (descriptor.getProperty(property) != null) ? new GetterVisitor(
+                mv,
+                helper,
+                property) : mv;
+    }
+
+    @Override
+    protected MethodVisitor visitSetter(
+            MethodVisitor mv,
+            String property,
+            Type propertyType) {
+        return (descriptor.getProperty(property) != null) ? new SetterVisitor(
+                mv,
+                helper,
+                property,
+                propertyType) : mv;
+    }
+}

Added: incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaEnhancerVisitorFactory.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaEnhancerVisitorFactory.java?view=auto&rev=463546
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaEnhancerVisitorFactory.java (added)
+++ incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaEnhancerVisitorFactory.java Thu Oct 12 18:45:30 2006
@@ -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.cspi;
+
+import java.util.Map;
+
+import org.apache.cayenne.enhancer.EnhancerVisitorFactory;
+import org.apache.cayenne.enhancer.PersistentInterfaceVisitor;
+import org.apache.cayenne.jpa.map.JpaClassDescriptor;
+import org.objectweb.asm.ClassVisitor;
+
+/**
+ * Class enhancer used for JPA.
+ * 
+ * @author Andrus Adamchik
+ */
+class CjpaEnhancerVisitorFactory implements EnhancerVisitorFactory {
+
+    Map<String, JpaClassDescriptor> managedClasses;
+
+    public CjpaEnhancerVisitorFactory(Map<String, JpaClassDescriptor> managedClasses) {
+        this.managedClasses = managedClasses;
+    }
+
+    public ClassVisitor createVisitor(String className, ClassVisitor out) {
+        JpaClassDescriptor descriptor = managedClasses.get(className.replace('/', '.'));
+        if (descriptor == null) {
+            return null;
+        }
+
+        // create enhancer chain
+        PersistentInterfaceVisitor e1 = new PersistentInterfaceVisitor(out);
+        CjpaAccessorVisitor e2 = new CjpaAccessorVisitor(e1, descriptor);
+        return e2;
+    }
+}

Modified: incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaEntityManager.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaEntityManager.java?view=diff&rev=463546&r1=463545&r2=463546
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaEntityManager.java (original)
+++ incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaEntityManager.java Thu Oct 12 18:45:30 2006
@@ -27,7 +27,6 @@
 import javax.persistence.Query;
 
 import org.apache.cayenne.CayenneRuntimeException;
-import org.apache.cayenne.DataObject;
 import org.apache.cayenne.DataObjectUtils;
 import org.apache.cayenne.ObjectContext;
 import org.apache.cayenne.Persistent;
@@ -53,7 +52,7 @@
     @Override
     protected void persistInternal(Object entity) {
         checkEntityType(entity);
-        context.registerNewObject((DataObject) entity);
+        context.registerNewObject(entity);
     }
 
     @Override

Modified: incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaPersistenceProvider.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaPersistenceProvider.java?view=diff&rev=463546&r1=463545&r2=463546
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaPersistenceProvider.java (original)
+++ incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaPersistenceProvider.java Thu Oct 12 18:45:30 2006
@@ -39,11 +39,11 @@
 import org.apache.cayenne.conf.ConnectionProperties;
 import org.apache.cayenne.dba.AutoAdapter;
 import org.apache.cayenne.dba.DbAdapter;
+import org.apache.cayenne.enhancer.Enhancer;
 import org.apache.cayenne.jpa.bridge.DataMapConverter;
 import org.apache.cayenne.jpa.conf.EntityMapLoader;
 import org.apache.cayenne.jpa.conf.EntityMapLoaderContext;
-import org.apache.cayenne.jpa.enhancer.CglibEnhancer;
-import org.apache.cayenne.jpa.enhancer.UnitClassTranformer;
+import org.apache.cayenne.jpa.instrument.UnitClassTranformer;
 import org.apache.cayenne.jpa.map.JpaClassDescriptor;
 import org.apache.cayenne.jpa.spi.JpaPersistenceProvider;
 import org.apache.cayenne.map.DataMap;
@@ -131,9 +131,9 @@
             Map<String, JpaClassDescriptor> managedClasses = loader
                     .getEntityMap()
                     .getMangedClasses();
-            info.addTransformer(new UnitClassTranformer(
-                    managedClasses,
-                    new CglibEnhancer(managedClasses)));
+
+            info.addTransformer(new UnitClassTranformer(managedClasses, new Enhancer(
+                    new CjpaEnhancerVisitorFactory(managedClasses))));
 
             DataMapConverter converter = new DataMapConverter();
             DataMap cayenneMap = converter.toDataMap(name, loader.getContext());

Copied: incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/instrument/UnitClassTranformer.java (from r454757, incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/enhancer/UnitClassTranformer.java)
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/instrument/UnitClassTranformer.java?view=diff&rev=463546&p1=incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/enhancer/UnitClassTranformer.java&r1=454757&p2=incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/instrument/UnitClassTranformer.java&r2=463546
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/enhancer/UnitClassTranformer.java (original)
+++ incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/instrument/UnitClassTranformer.java Thu Oct 12 18:45:30 2006
@@ -16,10 +16,9 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
+package org.apache.cayenne.jpa.instrument;
 
-
-package org.apache.cayenne.jpa.enhancer;
-
+import java.lang.instrument.ClassFileTransformer;
 import java.lang.instrument.IllegalClassFormatException;
 import java.security.ProtectionDomain;
 import java.util.Map;
@@ -27,22 +26,27 @@
 import javax.persistence.spi.ClassTransformer;
 
 import org.apache.cayenne.jpa.map.JpaClassDescriptor;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 
 /**
- * A ClassTransformer decorator that passes through classes mentioned in the JpaEntityMap
- * to the wrapped transformer, letting all other classes to go untransformed.
+ * A ClassFileTransformer decorator that wraps a Java instrumentation ClassFileTransformer
+ * instance in a JPA ClassTransformer. UnitClassTranformer would only do transformation of
+ * the mapped classes.
  * 
  * @author Andrus Adamchik
  */
 public class UnitClassTranformer implements ClassTransformer {
 
-    protected ClassTransformer transformer;
+    protected Log logger;
+    protected ClassFileTransformer transformer;
     protected Map<String, JpaClassDescriptor> managedClasses;
 
     public UnitClassTranformer(Map<String, JpaClassDescriptor> managedClasses,
-            ClassTransformer transformer) {
+            ClassFileTransformer transformer) {
         this.transformer = transformer;
         this.managedClasses = managedClasses;
+        this.logger = LogFactory.getLog(getClass());
     }
 
     public byte[] transform(
@@ -52,12 +56,19 @@
             ProtectionDomain protectionDomain,
             byte[] classfileBuffer) throws IllegalClassFormatException {
 
-        return isManagedClass(className) ? transformer.transform(
-                loader,
-                className,
-                classBeingRedefined,
-                protectionDomain,
-                classfileBuffer) : null;
+        if (isManagedClass(className)) {
+            logger.warn("Will transform: " + className);
+
+            return transformer.transform(
+                    loader,
+                    className,
+                    classBeingRedefined,
+                    protectionDomain,
+                    classfileBuffer);
+        }
+        else {
+            return null;
+        }
     }
 
     /**