This is an automated email from the ASF dual-hosted git repository.

struberg pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/openjpa.git

commit bc63865aac831946f17b4b12a771e09d8226eaad
Author: Mark Struberg <strub...@apache.org>
AuthorDate: Wed Jul 19 18:17:03 2023 +0200

    OPENJPA-2911 ReverseMapping in ASM
---
 .../openjpa/jdbc/meta/ReverseMappingTool.java      | 53 +++++++++++++++-------
 .../org/apache/openjpa/enhance/PCEnhancer.java     |  3 +-
 .../apache/openjpa/enhance/SerpPrivacyHelper.java  | 10 ----
 3 files changed, 38 insertions(+), 28 deletions(-)

diff --git 
a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/ReverseMappingTool.java
 
b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/ReverseMappingTool.java
index 58437e27a..8c07ac711 100644
--- 
a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/ReverseMappingTool.java
+++ 
b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/ReverseMappingTool.java
@@ -45,7 +45,6 @@ import java.util.TreeSet;
 import org.apache.openjpa.conf.OpenJPAConfiguration;
 import org.apache.openjpa.enhance.ApplicationIdTool;
 import org.apache.openjpa.enhance.CodeGenerator;
-import org.apache.openjpa.enhance.SerpPrivacyHelper;
 import org.apache.openjpa.jdbc.conf.JDBCConfiguration;
 import org.apache.openjpa.jdbc.conf.JDBCConfigurationImpl;
 import org.apache.openjpa.jdbc.meta.strats.FullClassStrategy;
@@ -54,8 +53,7 @@ import 
org.apache.openjpa.jdbc.meta.strats.MaxEmbeddedBlobFieldStrategy;
 import org.apache.openjpa.jdbc.meta.strats.MaxEmbeddedClobFieldStrategy;
 import org.apache.openjpa.jdbc.meta.strats.NoneDiscriminatorStrategy;
 import org.apache.openjpa.jdbc.meta.strats.PrimitiveFieldStrategy;
-import org.apache.openjpa.jdbc.meta.strats.
-        RelationCollectionInverseKeyFieldStrategy;
+import 
org.apache.openjpa.jdbc.meta.strats.RelationCollectionInverseKeyFieldStrategy;
 import 
org.apache.openjpa.jdbc.meta.strats.RelationCollectionTableFieldStrategy;
 import org.apache.openjpa.jdbc.meta.strats.RelationFieldStrategy;
 import org.apache.openjpa.jdbc.meta.strats.StateComparisonVersionStrategy;
@@ -97,10 +95,16 @@ import org.apache.openjpa.meta.QueryMetaData;
 import org.apache.openjpa.meta.SequenceMetaData;
 import org.apache.openjpa.util.InternalException;
 import org.apache.openjpa.util.MetaDataException;
-
-import serp.bytecode.BCClass;
-import serp.bytecode.BCClassLoader;
-import serp.bytecode.Project;
+import org.apache.openjpa.util.asm.ClassNodeTracker;
+import org.apache.openjpa.util.asm.EnhancementClassLoader;
+import org.apache.openjpa.util.asm.EnhancementProject;
+import org.apache.xbean.asm9.Opcodes;
+import org.apache.xbean.asm9.Type;
+import org.apache.xbean.asm9.tree.ClassNode;
+import org.apache.xbean.asm9.tree.InsnNode;
+import org.apache.xbean.asm9.tree.MethodInsnNode;
+import org.apache.xbean.asm9.tree.MethodNode;
+import org.apache.xbean.asm9.tree.VarInsnNode;
 
 /**
  * Reverse-maps a schema into class mappings and the associated java
@@ -109,8 +113,7 @@ import serp.bytecode.Project;
  *
  * @author Abe White
  */
-public class ReverseMappingTool
-    implements MetaDataModes, Cloneable {
+public class ReverseMappingTool implements MetaDataModes, Cloneable {
 
     /**
      * Unmapped table.
@@ -182,9 +185,8 @@ public class ReverseMappingTool
     private final JDBCConfiguration _conf;
     private final Log _log;
     private final Map _tables = new HashMap();
-    private final Project _project = new Project();
-    private final BCClassLoader _loader = AccessController
-        .doPrivileged(SerpPrivacyHelper.newBCClassLoaderAction(_project));
+    private final EnhancementProject _project = new EnhancementProject();
+    private final EnhancementClassLoader _loader = new 
EnhancementClassLoader(_project);
     private StrategyInstaller _strat = null;
     private String _package = null;
     private File _dir = null;
@@ -1041,10 +1043,11 @@ public class ReverseMappingTool
      * is given, it will be set as the superclass.
      */
     public Class generateClass(String name, Class parent) {
-        BCClass bc = _project.loadClass(name, null);
-        if (parent != null)
-            bc.setSuperclass(parent);
-        bc.addDefaultConstructor();
+        ClassNodeTracker bc = _project.loadClass(name, null);
+        if (parent != null) {
+            bc.getClassNode().superName = Type.getInternalName(parent);
+        }
+        addDefaultConstructor(bc);
 
         try {
             return Class.forName(name, false, _loader);
@@ -1053,6 +1056,24 @@ public class ReverseMappingTool
         }
     }
 
+    private void addDefaultConstructor(ClassNodeTracker cnt) {
+        ClassNode classNode = cnt.getClassNode();
+        // find the default constructor
+        final boolean hasDefaultCt = classNode.methods.stream()
+                .anyMatch(m -> m.name.equals("<init>") && 
m.desc.equals("()V"));
+        if (!hasDefaultCt) {
+            MethodNode ctNode = new MethodNode(Opcodes.ACC_PUBLIC,
+                                               "<init>",
+                                               
Type.getMethodDescriptor(Type.VOID_TYPE),
+                                               null, null);
+            ctNode.instructions.add(new VarInsnNode(Opcodes.ALOAD, 0));
+            ctNode.instructions.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, 
classNode.superName,
+                                                       "<init>", "()V"));
+            ctNode.instructions.add(new InsnNode(Opcodes.RETURN));
+            classNode.methods.add(ctNode);
+        }
+    }
+
     /**
      * Return whether the given foreign key is unique.
      */
diff --git 
a/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java 
b/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java
index c3ebe76f8..2937b484e 100644
--- a/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java
+++ b/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java
@@ -3296,8 +3296,7 @@ public class PCEnhancer {
             ctNode.instructions.add(new InsnNode(Opcodes.RETURN));
             classNode.methods.add(ctNode);
 
-            if (!(_meta.getDescribedType().isInterface() || 
getCreateSubclass())
-                    && _log.isWarnEnabled()) {
+            if (!(_meta.getDescribedType().isInterface() || 
getCreateSubclass()) && _log.isWarnEnabled()) {
                 _log.warn(_loc.get("enhance-adddefaultconst", classNode.name, 
access));
             }
 
diff --git 
a/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/SerpPrivacyHelper.java
 
b/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/SerpPrivacyHelper.java
index 5e984e3cf..06b571c11 100644
--- 
a/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/SerpPrivacyHelper.java
+++ 
b/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/SerpPrivacyHelper.java
@@ -47,14 +47,4 @@ public class SerpPrivacyHelper extends J2DoPrivHelper {
         };
     }
 
-    public static PrivilegedAction<BCClassLoader> newBCClassLoaderAction(
-        final Project project) {
-        return new PrivilegedAction<BCClassLoader>() {
-            @Override
-            public BCClassLoader run() {
-                return new BCClassLoader(project);
-            }
-        };
-    }
-
 }

Reply via email to