Hi Jon,

Monday would be indeed great for a TomEE 7.x snapshot including this
Java 11 fix!

Thanks,
Alexandre
Le ven. 17 août 2018 à 14:20, Jonathan Gallimore
<[email protected]> a écrit :
>
> Im on leave today, but I'll backport it and publish a snapshot on Monday,
> unless someone beats me to it. My guess is you'll need to replace owb and
> some others as well.
>
> The testing is appreciated, thank you!
>
> Jon
>
> On Fri, 17 Aug 2018, 12:35 Alex The Rocker, <[email protected]> wrote:
>
> > Hello Jon,
> >
> > I'd like to give a try to TomEE 7.0.5 with an "as small as possible"
> > patch that solves this Java 11 compatibility trick. Is there a way I
> > could download "just the modified .jar" ?
> >
> > Thanks,
> > Alexandre
> >
> > Le jeu. 16 août 2018 à 11:59, <[email protected]> a écrit :
> > >
> > > Repository: tomee
> > > Updated Branches:
> > >   refs/heads/master ef64d7dd2 -> 2e3a856b0
> > >
> > >
> > > jdk 11 compatibility
> > >
> > >
> > > Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
> > > Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/d2943704
> > > Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/d2943704
> > > Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/d2943704
> > >
> > > Branch: refs/heads/master
> > > Commit: d294370439cf0f3a3af939c09c4b7272a7f2460a
> > > Parents: d4c5089
> > > Author: Vicente Rossello <[email protected]>
> > > Authored: Wed Aug 15 23:55:01 2018 +0200
> > > Committer: Vicente Rossello <[email protected]>
> > > Committed: Wed Aug 15 23:55:01 2018 +0200
> > >
> > > ----------------------------------------------------------------------
> > >  .../util/proxy/LocalBeanProxyFactory.java       | 37
> > +++++++++++++++++---
> > >  1 file changed, 33 insertions(+), 4 deletions(-)
> > > ----------------------------------------------------------------------
> > >
> > >
> > >
> > http://git-wip-us.apache.org/repos/asf/tomee/blob/d2943704/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/LocalBeanProxyFactory.java
> > > ----------------------------------------------------------------------
> > > diff --git
> > a/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/LocalBeanProxyFactory.java
> > b/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/LocalBeanProxyFactory.java
> > > index 8a0dd8a..a36f7b8 100644
> > > ---
> > a/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/LocalBeanProxyFactory.java
> > > +++
> > b/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/LocalBeanProxyFactory.java
> > > @@ -17,6 +17,9 @@
> > >
> > >  package org.apache.openejb.util.proxy;
> > >
> > > +
> > > +import org.apache.openejb.util.LogCategory;
> > > +import org.apache.openejb.util.Logger;
> > >  import org.apache.openejb.util.Debug;
> > >  import org.apache.xbean.asm6.ClassWriter;
> > >  import org.apache.xbean.asm6.Label;
> > > @@ -47,6 +50,8 @@ import java.util.concurrent.locks.ReentrantLock;
> > >
> > >  public class LocalBeanProxyFactory implements Opcodes {
> > >
> > > +    private static final Logger LOGGER =
> > Logger.getInstance(LogCategory.OPENEJB, QueryProxy.class);
> > > +
> > >      public static final InvocationHandler NON_BUSINESS_HANDLER = new
> > NonBusinessHandler();
> > >
> > >      private static final String BUSSINESS_HANDLER_NAME =
> > "businessHandler";
> > > @@ -700,7 +705,7 @@ public class LocalBeanProxyFactory implements
> > Opcodes {
> > >
> > >          // sun.misc.Unsafe
> > >          private static final Object unsafe;
> > > -        private static final Method defineClass;
> > > +        private static final Method unsafeDefineClass;
> > >          private static final Method allocateInstance;
> > >          private static final Method putObject;
> > >          private static final Method objectFieldOffset;
> > > @@ -774,7 +779,7 @@ public class LocalBeanProxyFactory implements
> > Opcodes {
> > >                      }
> > >                  }
> > >              });
> > > -            defineClass = AccessController.doPrivileged(new
> > PrivilegedAction<Method>() {
> > > +            unsafeDefineClass = AccessController.doPrivileged(new
> > PrivilegedAction<Method>() {
> > >                  @Override
> > >                  public Method run() {
> > >                      try {
> > > @@ -782,7 +787,8 @@ public class LocalBeanProxyFactory implements
> > Opcodes {
> > >                          mtd.setAccessible(true);
> > >                          return mtd;
> > >                      } catch (final Exception e) {
> > > -                        throw new IllegalStateException("Cannot get
> > sun.misc.Unsafe.defineClass", e);
> > > +                        LOGGER.debug("Unsafe's defineClass not
> > available, will use classloader's defineClass");
> > > +                        return null;
> > >                      }
> > >                  }
> > >              });
> > > @@ -816,8 +822,31 @@ public class LocalBeanProxyFactory implements
> > Opcodes {
> > >
> > >          // it is super important to pass a classloader as first
> > parameter otherwise if API class is in a "permanent" classloader then it
> > will leak
> > >          public static Class defineClass(final ClassLoader loader, final
> > Class<?> clsToProxy, final String proxyName, final byte[] proxyBytes)
> > throws IllegalAccessException, InvocationTargetException {
> > > -            return (Class<?>) defineClass.invoke(unsafe, proxyName,
> > proxyBytes, 0, proxyBytes.length, loader, clsToProxy.getProtectionDomain());
> > > +            if (unsafeDefineClass != null) {
> > > +                return (Class<?>) unsafeDefineClass.invoke(unsafe,
> > proxyName, proxyBytes, 0, proxyBytes.length, loader,
> > clsToProxy.getProtectionDomain());
> > > +            } else {
> > > +                return (Class)
> > getClassLoaderDefineClassMethod(loader).invoke(loader, proxyName,
> > proxyBytes, 0, proxyBytes.length, clsToProxy.getProtectionDomain());
> > > +            }
> > > +        }
> > > +
> > > +        private static Method
> > getClassLoaderDefineClassMethod(ClassLoader classLoader) {
> > > +            Class<?> clazz = classLoader.getClass();
> > > +            Method defineClassMethod = null;
> > > +            do {
> > > +                try {
> > > +                    defineClassMethod =
> > clazz.getDeclaredMethod("defineClass", String.class, byte[].class,
> > int.class, int.class, ProtectionDomain.class);
> > > +                } catch (NoSuchMethodException e) {
> > > +                    // do nothing, we need to search the superclass
> > > +                }
> > > +                clazz = clazz.getSuperclass();
> > > +            } while (defineClassMethod == null && clazz !=
> > Object.class);
> > > +
> > > +            if (defineClassMethod != null &&
> > !defineClassMethod.isAccessible()) {
> > > +                defineClassMethod.setAccessible(true);
> > > +            }
> > > +            return defineClassMethod;
> > >          }
> > > +
> > >      }
> > >
> > >      @Target(ElementType.TYPE)
> > >
> >

Reply via email to