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;
+ }
}
/**