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 2020/07/23 12:07:24 UTC

[openjpa] branch master updated (e3bb1f1 -> 94a033d)

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

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


    from e3bb1f1  OPENJPA-2818 DBDictionary > delimitIdentifiers = true does not work (#69)
     new 589d775  detect newer java versions as well
     new 5d9c88d  just fix broken javadoc
     new bf03bdb  OPENJPA-2822 get rid of tricks < java8
     new ab6e0ed  OPENJPA-2823 treat jakarta.* like javax.*
     new 94a033d  OPENJPA-2821 use AsmAdapter for subclassing

The 5 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../org/apache/openjpa/enhance/AsmAdaptor.java     | 14 +++++++
 .../org/apache/openjpa/enhance/ClassRedefiner.java | 44 ++++++----------------
 .../openjpa/enhance/InstrumentationFactory.java    |  9 -----
 .../openjpa/enhance/ManagedClassSubclasser.java    |  7 +++-
 .../openjpa/enhance/PCClassFileTransformer.java    | 26 ++++++-------
 .../org/apache/openjpa/lib/util/JavaVersions.java  |  6 ++-
 .../persistence/PersistenceProviderImpl.java       |  2 -
 7 files changed, 49 insertions(+), 59 deletions(-)


[openjpa] 02/05: just fix broken javadoc

Posted by st...@apache.org.
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 5d9c88d7cbcc3cdfba0e9fee9d5c6b37bba08030
Author: Mark Struberg <st...@apache.org>
AuthorDate: Thu Jul 23 13:48:25 2020 +0200

    just fix broken javadoc
---
 .../java/org/apache/openjpa/persistence/PersistenceProviderImpl.java    | 2 --
 1 file changed, 2 deletions(-)

diff --git a/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceProviderImpl.java b/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceProviderImpl.java
index 0b6d998..9d24553 100644
--- a/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceProviderImpl.java
+++ b/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceProviderImpl.java
@@ -373,8 +373,6 @@ public class PersistenceProviderImpl
      * This private worker method will attempt to setup the proper
      * LifecycleEventManager type based on if the javax.validation APIs are
      * available and a ValidatorImpl is required by the configuration.
-     * @param log
-     * @param conf
      * @throws if validation setup failed and was required by the config
      */
     private void loadValidator(BrokerFactory factory) {


[openjpa] 01/05: detect newer java versions as well

Posted by st...@apache.org.
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 589d7755d2711198d7f38fd79d14e61b778a2118
Author: Mark Struberg <st...@apache.org>
AuthorDate: Thu Jul 23 13:47:27 2020 +0200

    detect newer java versions as well
---
 .../src/main/java/org/apache/openjpa/lib/util/JavaVersions.java     | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/openjpa-lib/src/main/java/org/apache/openjpa/lib/util/JavaVersions.java b/openjpa-lib/src/main/java/org/apache/openjpa/lib/util/JavaVersions.java
index 9963ebb..ae402e5 100644
--- a/openjpa-lib/src/main/java/org/apache/openjpa/lib/util/JavaVersions.java
+++ b/openjpa-lib/src/main/java/org/apache/openjpa/lib/util/JavaVersions.java
@@ -53,8 +53,12 @@ public class JavaVersions {
             VERSION = 5;
         else if ("1.6".equals(specVersion))
             VERSION = 6;
+        else if ("1.7".equals(specVersion))
+            VERSION = 7;
+        else if ("1.8".equals(specVersion))
+            VERSION = 8;
         else
-            VERSION = 7; // maybe someday...
+            VERSION = 9; // maybe someday...
     }
 
     /**


[openjpa] 05/05: OPENJPA-2821 use AsmAdapter for subclassing

Posted by st...@apache.org.
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 94a033d83bcab3e8f00c9927533ae9889c3d11ec
Author: Mark Struberg <st...@apache.org>
AuthorDate: Thu Jul 23 14:05:56 2020 +0200

    OPENJPA-2821 use AsmAdapter for subclassing
    
    to write proper java8 code
---
 .../main/java/org/apache/openjpa/enhance/AsmAdaptor.java   | 14 ++++++++++++++
 .../org/apache/openjpa/enhance/ManagedClassSubclasser.java |  7 ++++++-
 2 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/AsmAdaptor.java b/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/AsmAdaptor.java
index 7bef1ef..6bb26d9 100644
--- a/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/AsmAdaptor.java
+++ b/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/AsmAdaptor.java
@@ -81,6 +81,20 @@ public final class AsmAdaptor {
         }
     }
 
+    public static void write(BCClass bc, OutputStream os) throws IOException {
+        if (bc.getMajorVersion() < Java7_MajorVersion) {
+            bc.write(os);
+        }
+        else {
+            try {
+                writeJava7(bc, os);
+            } finally {
+                os.flush();
+                os.close();
+            }
+        }
+    }
+
     public static byte[] toByteArray(BCClass bc, byte[] returnBytes) throws IOException {
         if (bc.getMajorVersion() >= Java7_MajorVersion) {
             returnBytes = toJava7ByteArray(bc, returnBytes);
diff --git a/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/ManagedClassSubclasser.java b/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/ManagedClassSubclasser.java
index fab02ab..0a7d376 100644
--- a/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/ManagedClassSubclasser.java
+++ b/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/ManagedClassSubclasser.java
@@ -18,6 +18,7 @@
  */
 package org.apache.openjpa.enhance;
 
+import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
@@ -142,6 +143,8 @@ public class ManagedClassSubclasser {
             if (redefine) {
                 enhancer.setRedefine(true);
             }
+
+            // we need to create subclasses because class retransform doesn't allow to change the interfaces of a previously loaded class
             enhancer.setCreateSubclass(true);
             enhancer.setAddDefaultConstructor(true);
 
@@ -276,7 +279,9 @@ public class ManagedClassSubclasser {
             if (enhancer.isAlreadyRedefined())
                 ints.add(bc.getType());
             else {
-                map.put(bc.getType(), bc.toByteArray());
+                ByteArrayOutputStream baos = new ByteArrayOutputStream();
+                AsmAdaptor.write(bc, baos);
+                map.put(bc.getType(), baos.toByteArray());
                 debugBytecodes(bc);
             }
         } else {


[openjpa] 04/05: OPENJPA-2823 treat jakarta.* like javax.*

Posted by st...@apache.org.
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 ab6e0ed4b46f7e3ef59c8ab74b3e9de4fdeff8b9
Author: Mark Struberg <st...@apache.org>
AuthorDate: Thu Jul 23 14:04:44 2020 +0200

    OPENJPA-2823 treat jakarta.* like javax.*
    
    also simplify needsEnhance logic
---
 .../openjpa/enhance/PCClassFileTransformer.java    | 26 ++++++++++------------
 1 file changed, 12 insertions(+), 14 deletions(-)

diff --git a/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCClassFileTransformer.java b/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCClassFileTransformer.java
index 872d413..d67fb48 100644
--- a/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCClassFileTransformer.java
+++ b/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCClassFileTransformer.java
@@ -64,8 +64,7 @@ public class PCClassFileTransformer
      * @param opts enhancer configuration options
      * @param loader temporary class loader for loading intermediate classes
      */
-    public PCClassFileTransformer(MetaDataRepository repos, Options opts,
-        ClassLoader loader) {
+    public PCClassFileTransformer(MetaDataRepository repos, Options opts, ClassLoader loader) {
         this(repos, toFlags(opts), loader, opts.removeBooleanProperty
             ("scanDevPath", "ScanDevPath", false));
     }
@@ -93,8 +92,7 @@ public class PCClassFileTransformer
      * @param devscan whether to scan the dev classpath for persistent types
      * if none are configured
      */
-    public PCClassFileTransformer(MetaDataRepository repos,
-        PCEnhancer.Flags flags, ClassLoader tmpLoader, boolean devscan) {
+    public PCClassFileTransformer(MetaDataRepository repos, PCEnhancer.Flags flags, ClassLoader tmpLoader, boolean devscan) {
         _repos = repos;
         _tmpLoader = tmpLoader;
 
@@ -108,9 +106,9 @@ public class PCClassFileTransformer
     }
 
     @Override
-    public byte[] transform(ClassLoader loader, String className,
-        Class redef, ProtectionDomain domain, byte[] bytes)
+    public byte[] transform(ClassLoader loader, String className, Class redef, ProtectionDomain domain, byte[] bytes)
         throws IllegalClassFormatException {
+
         if (loader == _tmpLoader)
             return null;
 
@@ -183,12 +181,9 @@ public class PCClassFileTransformer
      * Return whether the given class needs enhancement.
      */
     private Boolean needsEnhance(String clsName, Class redef, byte[] bytes) {
-        if (redef != null) {
-            Class[] intfs = redef.getInterfaces();
-            for (int i = 0; i < intfs.length; i++)
-                if (PersistenceCapable.class.getName().
-                    equals(intfs[i].getName()))
-                    return Boolean.valueOf(!isEnhanced(bytes));
+        if (redef != null && PersistenceCapable.class.isAssignableFrom(redef)) {
+            // if the original class is already enhanced (implements PersistenceCapable)
+            // then we don't need to do any further processing.
             return null;
         }
 
@@ -198,10 +193,13 @@ public class PCClassFileTransformer
             return null;
         }
 
-        if (clsName.startsWith("java/") || clsName.startsWith("javax/"))
+        if (clsName.startsWith("java/") || clsName.startsWith("javax/") || clsName.startsWith("jakarta/")) {
             return null;
-        if (isEnhanced(bytes))
+        }
+
+        if (isEnhanced(bytes)) {
             return Boolean.FALSE;
+        }
 
         try {
             Class c = Class.forName(clsName.replace('/', '.'), false,


[openjpa] 03/05: OPENJPA-2822 get rid of tricks < java8

Posted by st...@apache.org.
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 bf03bdb314d99502046543e2e904235f87f46bb3
Author: Mark Struberg <st...@apache.org>
AuthorDate: Thu Jul 23 14:00:10 2020 +0200

    OPENJPA-2822 get rid of tricks < java8
    
    we can now rely on transform() being available on all JVMs.
---
 .../org/apache/openjpa/enhance/ClassRedefiner.java | 44 ++++++----------------
 .../openjpa/enhance/InstrumentationFactory.java    |  9 -----
 2 files changed, 12 insertions(+), 41 deletions(-)

diff --git a/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/ClassRedefiner.java b/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/ClassRedefiner.java
index 339dc2e..0b2e11e 100644
--- a/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/ClassRedefiner.java
+++ b/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/ClassRedefiner.java
@@ -18,10 +18,8 @@
  */
 package org.apache.openjpa.enhance;
 
-import java.lang.instrument.ClassDefinition;
 import java.lang.instrument.ClassFileTransformer;
 import java.lang.instrument.Instrumentation;
-import java.lang.reflect.Method;
 import java.security.ProtectionDomain;
 import java.util.Map;
 
@@ -47,7 +45,7 @@ public class ClassRedefiner {
     /**
      * For each element in <code>classes</code>, this method will redefine
      * all the element's methods such that field accesses are intercepted
-     * in-line. If {@link #canRedefineClasses()} returns <code>false</code>,
+     * in-line. If {@link #canRedefineClasses(Log)} returns <code>false</code>,
      * this method is a no-op.
      */
     public static void redefineClasses(OpenJPAConfiguration conf,
@@ -62,37 +60,19 @@ public class ClassRedefiner {
             inst = InstrumentationFactory.getInstrumentation(log);
 
             Class<?>[] array = classes.keySet().toArray(new Class[classes.size()]);
-            if (JavaVersions.VERSION >= 6) {
-                log.trace(_loc.get("retransform-types", classes.keySet()));
+            log.trace(_loc.get("retransform-types", classes.keySet()));
 
-                t = new ClassFileTransformer() {
-                    @Override
-                    public byte[] transform(ClassLoader loader, String clsName,
-                        Class<?> classBeingRedefined, ProtectionDomain pd,
-                        byte[] classfileBuffer) {
-                        return classes.get(classBeingRedefined);
-                    }
-                };
+            t = new ClassFileTransformer() {
+                @Override
+                public byte[] transform(ClassLoader loader, String clsName,
+                    Class<?> classBeingRedefined, ProtectionDomain pd,
+                    byte[] classfileBuffer) {
+                    return classes.get(classBeingRedefined);
+                }
+            };
 
-                // these are Java 6 methods, and we don't have a Java 6 build
-                // module yet. The cost of reflection here is negligible
-                // compared to the redefinition / enhancement costs in total,
-                // so this should not be a big problem.
-                Method meth = inst.getClass().getMethod("addTransformer",
-                    new Class[] { ClassFileTransformer.class, boolean.class });
-                meth.invoke(inst, new Object[] { t, true });
-                meth = inst.getClass().getMethod("retransformClasses",
-                    new Class[] { array.getClass() });
-                meth.invoke(inst, new Object[] { array });
-            } else {
-                log.trace(_loc.get("redefine-types", classes.keySet()));
-                // in a Java 5 context, we can use class redefinition instead
-                ClassDefinition[] defs = new ClassDefinition[array.length];
-                for (int i = 0; i < defs.length; i++)
-                    defs[i] = new ClassDefinition(array[i],
-                        classes.get(array[i]));
-                inst.redefineClasses(defs);
-            }
+            inst.addTransformer(t, true);
+            inst.retransformClasses(array);
         } catch (Exception e) {
             throw new InternalException(e);
         } finally {
diff --git a/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/InstrumentationFactory.java b/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/InstrumentationFactory.java
index feeb982..3516750 100644
--- a/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/InstrumentationFactory.java
+++ b/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/InstrumentationFactory.java
@@ -40,7 +40,6 @@ import java.util.zip.ZipOutputStream;
 
 import org.apache.openjpa.lib.log.Log;
 import org.apache.openjpa.lib.util.JavaVendors;
-import org.apache.openjpa.lib.util.JavaVersions;
 import org.apache.openjpa.lib.util.Localizer;
 
 
@@ -89,14 +88,6 @@ public class InstrumentationFactory {
         if ( _inst != null || !_dynamicallyInstall)
             return _inst;
 
-        // dynamic loading of the agent is only available in JDK 1.6+
-        if (JavaVersions.VERSION < 6) {
-            if (log.isTraceEnabled() == true) {
-                log.trace(_name + ".getInstrumentation() Dynamic loading only supported on Java SE 6 or later");
-            }
-            return null;
-        }
-
         AccessController.doPrivileged(new PrivilegedAction<Object>() {
             @Override
             public Object run() {