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); - } - }; - } - }