You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by st...@apache.org on 2023/07/19 16:56:24 UTC
[openjpa] 01/02: OPENJPA-2911 ReverseMapping in ASM
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 <st...@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);
- }
- };
- }
-
}