Author: rmannibucau Date: Tue Mar 13 13:40:02 2018 New Revision: 1826631 URL: http://svn.apache.org/viewvc?rev=1826631&view=rev Log: OWB-1221 asm 6 upgrade - patch from jgallimore (1.2.x)
Modified: openwebbeans/branches/owb_1.2.x/pom.xml openwebbeans/branches/owb_1.2.x/webbeans-impl/pom.xml openwebbeans/branches/owb_1.2.x/webbeans-impl/src/main/java/org/apache/webbeans/config/OpenWebBeansConfiguration.java openwebbeans/branches/owb_1.2.x/webbeans-impl/src/main/java/org/apache/webbeans/config/WebBeansContext.java openwebbeans/branches/owb_1.2.x/webbeans-impl/src/main/java/org/apache/webbeans/proxy/AbstractProxyFactory.java openwebbeans/branches/owb_1.2.x/webbeans-impl/src/main/java/org/apache/webbeans/proxy/InterceptorDecoratorProxyFactory.java openwebbeans/branches/owb_1.2.x/webbeans-impl/src/main/java/org/apache/webbeans/proxy/NormalScopeProxyFactory.java openwebbeans/branches/owb_1.2.x/webbeans-impl/src/main/java/org/apache/webbeans/proxy/SubclassProxyFactory.java openwebbeans/branches/owb_1.2.x/webbeans-impl/src/main/resources/META-INF/openwebbeans/openwebbeans.properties openwebbeans/branches/owb_1.2.x/webbeans-tomcat7/src/main/java/org/apache/webbeans/web/tomcat7/TomcatInstanceManager.java Modified: openwebbeans/branches/owb_1.2.x/pom.xml URL: http://svn.apache.org/viewvc/openwebbeans/branches/owb_1.2.x/pom.xml?rev=1826631&r1=1826630&r2=1826631&view=diff ============================================================================== --- openwebbeans/branches/owb_1.2.x/pom.xml (original) +++ openwebbeans/branches/owb_1.2.x/pom.xml Tue Mar 13 13:40:02 2018 @@ -78,11 +78,11 @@ <geronimo_interceptor.version>1.0</geronimo_interceptor.version> <geronimo_validation.version>1.1</geronimo_validation.version> <tomcat6.version>6.0.35</tomcat6.version> - <tomcat7.version>7.0.54</tomcat7.version> + <tomcat7.version>7.0.85</tomcat7.version> <openejb.version>3.1.4</openejb.version> <myfaces.version>1.2.9</myfaces.version> <myfaces2.version>2.2.3</myfaces2.version> - <xbean.version>4.1</xbean.version> + <xbean.version>4.6</xbean.version> </properties> <mailingLists> @@ -584,7 +584,7 @@ </dependency> <dependency> <groupId>org.apache.xbean</groupId> - <artifactId>xbean-asm5-shaded</artifactId> + <artifactId>xbean-asm6-shaded</artifactId> <version>${xbean.version}</version> </dependency> @@ -711,6 +711,16 @@ <groupId>org.apache.openejb</groupId> <artifactId>openejb-core</artifactId> <version>${openejb.version}</version> + <exclusions> + <exclusion> + <groupId>org.apache.activemq</groupId> + <artifactId>activemq-ra</artifactId> + </exclusion> + <exclusion> + <groupId>org.apache.activemq</groupId> + <artifactId>activeio-core</artifactId> + </exclusion> + </exclusions> </dependency> <dependency> Modified: openwebbeans/branches/owb_1.2.x/webbeans-impl/pom.xml URL: http://svn.apache.org/viewvc/openwebbeans/branches/owb_1.2.x/webbeans-impl/pom.xml?rev=1826631&r1=1826630&r2=1826631&view=diff ============================================================================== --- openwebbeans/branches/owb_1.2.x/webbeans-impl/pom.xml (original) +++ openwebbeans/branches/owb_1.2.x/webbeans-impl/pom.xml Tue Mar 13 13:40:02 2018 @@ -43,7 +43,7 @@ </dependency> <dependency> <groupId>org.apache.xbean</groupId> - <artifactId>xbean-asm5-shaded</artifactId> + <artifactId>xbean-asm6-shaded</artifactId> </dependency> <dependency> Modified: openwebbeans/branches/owb_1.2.x/webbeans-impl/src/main/java/org/apache/webbeans/config/OpenWebBeansConfiguration.java URL: http://svn.apache.org/viewvc/openwebbeans/branches/owb_1.2.x/webbeans-impl/src/main/java/org/apache/webbeans/config/OpenWebBeansConfiguration.java?rev=1826631&r1=1826630&r2=1826631&view=diff ============================================================================== --- openwebbeans/branches/owb_1.2.x/webbeans-impl/src/main/java/org/apache/webbeans/config/OpenWebBeansConfiguration.java (original) +++ openwebbeans/branches/owb_1.2.x/webbeans-impl/src/main/java/org/apache/webbeans/config/OpenWebBeansConfiguration.java Tue Mar 13 13:40:02 2018 @@ -44,14 +44,8 @@ import org.apache.webbeans.logger.WebBea public class OpenWebBeansConfiguration { /**Logger instance*/ - private final static Logger logger = WebBeansLoggerFacade.getLogger(OpenWebBeansConfiguration.class); + private static final Logger logger = WebBeansLoggerFacade.getLogger(OpenWebBeansConfiguration.class); - /**Default configuration files*/ - private final static String DEFAULT_CONFIG_PROPERTIES_NAME = "META-INF/openwebbeans/openwebbeans.properties"; - - /**Property of application*/ - private final Properties configProperties = new Properties(); - /**Conversation periodic delay in ms.*/ public static final String CONVERSATION_PERIODIC_DELAY = "org.apache.webbeans.conversation.Conversation.periodicDelay"; @@ -123,6 +117,23 @@ public class OpenWebBeansConfiguration */ public static final String IGNORED_INTERFACES = "org.apache.webbeans.ignoredDecoratorInterfaces"; + /** + * The Java Version to use for the generated proxy classes. + * If "auto" then we will pick the version of the current JVM. + * The default is set to "1.6" as some tools in jetty/tomcat/etc still + * cannot properly handle Java8 (mostly due to older Eclipse JDT versions). + */ + public static final String GENERATOR_JAVA_VERSIN = "org.apache.webbeans.generator.javaVersion"; + + + /**Default configuration files*/ + private static final String DEFAULT_CONFIG_PROPERTIES_NAME = "META-INF/openwebbeans/openwebbeans.properties"; + + private static final String AUTO_CONFIG = "auto"; + + /**Property of application*/ + private final Properties configProperties = new Properties(); + private Set<String> ignoredInterfaces; /** @@ -213,15 +224,15 @@ public class OpenWebBeansConfiguration private Properties doPrivilegedGetSystemProperties() { return AccessController.doPrivileged( - new PrivilegedAction<Properties>() + new PrivilegedAction<Properties>() + { + @Override + public Properties run() { - @Override - public Properties run() - { - return System.getProperties(); - } - + return System.getProperties(); } + + } ); } @@ -324,4 +335,15 @@ public class OpenWebBeansConfiguration return ignoredInterfaces; } + + public String getGeneratorJavaVersion() + { + String generatorJavaVersion = getProperty(GENERATOR_JAVA_VERSIN); + if (generatorJavaVersion == null || AUTO_CONFIG.equals(generatorJavaVersion)) + { + return System.getProperty("java.version"); + } + + return generatorJavaVersion; + } } Modified: openwebbeans/branches/owb_1.2.x/webbeans-impl/src/main/java/org/apache/webbeans/config/WebBeansContext.java URL: http://svn.apache.org/viewvc/openwebbeans/branches/owb_1.2.x/webbeans-impl/src/main/java/org/apache/webbeans/config/WebBeansContext.java?rev=1826631&r1=1826630&r2=1826631&view=diff ============================================================================== --- openwebbeans/branches/owb_1.2.x/webbeans-impl/src/main/java/org/apache/webbeans/config/WebBeansContext.java (original) +++ openwebbeans/branches/owb_1.2.x/webbeans-impl/src/main/java/org/apache/webbeans/config/WebBeansContext.java Tue Mar 13 13:40:02 2018 @@ -77,9 +77,9 @@ public class WebBeansContext private final DecoratorsManager decoratorsManager = new DecoratorsManager(this); private final ExtensionLoader extensionLoader = new ExtensionLoader(this); private final InterceptorsManager interceptorsManager = new InterceptorsManager(this); - private final InterceptorDecoratorProxyFactory interceptorDecoratorProxyFactory = new InterceptorDecoratorProxyFactory(this); - private final NormalScopeProxyFactory normalScopeProxyFactory = new NormalScopeProxyFactory(this); - private final SubclassProxyFactory subclassProxyFactory = new SubclassProxyFactory(this); + private final InterceptorDecoratorProxyFactory interceptorDecoratorProxyFactory; + private final NormalScopeProxyFactory normalScopeProxyFactory; + private final SubclassProxyFactory subclassProxyFactory; private final OpenWebBeansConfiguration openWebBeansConfiguration; private final PluginLoader pluginLoader = new PluginLoader(); private final SerializableBeanVault serializableBeanVault = new SerializableBeanVault(); @@ -140,6 +140,11 @@ public class WebBeansContext securityService = getService(SecurityService.class); applicationBoundaryService = getService(ApplicationBoundaryService.class); + interceptorDecoratorProxyFactory = new InterceptorDecoratorProxyFactory(this); + normalScopeProxyFactory = new NormalScopeProxyFactory(this); + subclassProxyFactory = new SubclassProxyFactory(this); + + // Allow the WebBeansContext itself to be looked up managerMap.put(getClass(), this); Modified: openwebbeans/branches/owb_1.2.x/webbeans-impl/src/main/java/org/apache/webbeans/proxy/AbstractProxyFactory.java URL: http://svn.apache.org/viewvc/openwebbeans/branches/owb_1.2.x/webbeans-impl/src/main/java/org/apache/webbeans/proxy/AbstractProxyFactory.java?rev=1826631&r1=1826630&r2=1826631&view=diff ============================================================================== --- openwebbeans/branches/owb_1.2.x/webbeans-impl/src/main/java/org/apache/webbeans/proxy/AbstractProxyFactory.java (original) +++ openwebbeans/branches/owb_1.2.x/webbeans-impl/src/main/java/org/apache/webbeans/proxy/AbstractProxyFactory.java Tue Mar 13 13:40:02 2018 @@ -18,6 +18,9 @@ */ package org.apache.webbeans.proxy; +import static org.apache.xbean.asm6.ClassReader.SKIP_DEBUG; + +import java.io.InputStream; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -31,10 +34,12 @@ import java.util.logging.Logger; import org.apache.webbeans.config.WebBeansContext; import org.apache.webbeans.exception.WebBeansException; import org.apache.webbeans.logger.WebBeansLoggerFacade; -import org.apache.xbean.asm5.ClassWriter; -import org.apache.xbean.asm5.MethodVisitor; -import org.apache.xbean.asm5.Opcodes; -import org.apache.xbean.asm5.Type; +import org.apache.xbean.asm6.ClassReader; +import org.apache.xbean.asm6.ClassWriter; +import org.apache.xbean.asm6.MethodVisitor; +import org.apache.xbean.asm6.Opcodes; +import org.apache.xbean.asm6.Type; +import org.apache.xbean.asm6.shade.commons.EmptyVisitor; /** * Base class for all OWB Proxy factories @@ -53,6 +58,7 @@ public abstract class AbstractProxyFacto private static final Logger logger = WebBeansLoggerFacade.getLogger(AbstractProxyFactory.class); + protected WebBeansContext webBeansContext; /** @@ -63,6 +69,8 @@ public abstract class AbstractProxyFacto private Object unsafe = null; private Method unsafeAllocateInstance = null; + private final int javaVersion; + /** * The name of the field which stores the passivationID of the Bean this proxy serves. @@ -75,9 +83,34 @@ public abstract class AbstractProxyFacto protected AbstractProxyFactory(WebBeansContext webBeansContext) { this.webBeansContext = webBeansContext; + javaVersion = determineDefaultJavaVersion(); initializeUnsafe(); } + private int determineDefaultJavaVersion() + { + String javaVersionProp = webBeansContext.getOpenWebBeansConfiguration().getGeneratorJavaVersion(); + if (javaVersionProp == null) // try to align on the runtime + { + javaVersionProp = System.getProperty("java.version"); + } + if (javaVersionProp != null) + { + if (javaVersionProp.startsWith("1.8")) + { + return Opcodes.V1_8; + } + else if (javaVersionProp.startsWith("9") || javaVersionProp.startsWith("1.9")) + { + return Opcodes.V9; + } + } + + // the fallback is the lowest one to ensure it supports all possible classes of current environments + return Opcodes.V1_6; + } + + protected ClassLoader getProxyClassLoader(Class<?> beanClass) { return webBeansContext.getApplicationBoundaryService().getBoundaryClassLoader(beanClass); @@ -242,7 +275,7 @@ public abstract class AbstractProxyFacto Method[] interceptedMethods, Method[] nonInterceptedMethods) throws ProxyGenerationException { - ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS); + ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES); String classFileName = classToProxy.getName().replace('.', '/'); String[] interfaceNames = new String[]{Type.getInternalName(getMarkerInterface())}; @@ -254,7 +287,7 @@ public abstract class AbstractProxyFacto superClassName = Type.getInternalName(Object.class); } - cw.visit(Opcodes.V1_5, Opcodes.ACC_PUBLIC + Opcodes.ACC_SUPER + Opcodes.ACC_SYNTHETIC, proxyClassFileName, null, superClassName, interfaceNames); + cw.visit(findJavaVersion(classToProxy), Opcodes.ACC_PUBLIC + Opcodes.ACC_SUPER + Opcodes.ACC_SYNTHETIC, proxyClassFileName, null, superClassName, interfaceNames); cw.visitSource(classFileName + ".java", null); createInstanceVariables(cw, classToProxy, classFileName); @@ -282,6 +315,47 @@ public abstract class AbstractProxyFacto return cw.toByteArray(); } + private int findJavaVersion(final Class<?> from) + { + final String resource = from.getName().replace('.', '/') + ".class"; + InputStream stream = null; + + try + { + stream = from.getClassLoader().getResourceAsStream(resource); + + if (stream == null) + { + return javaVersion; + } + + final ClassReader reader = new ClassReader(stream); + final VersionVisitor visitor = new VersionVisitor(); + reader.accept(visitor, SKIP_DEBUG); + if (visitor.version != 0) + { + return visitor.version; + } + } + catch (final Exception e) + { + // no-op + } + finally + { + try + { + stream.close(); + } + catch (Exception e) + { + // no-op + } + } + // mainly for JVM classes - outside the classloader, find to fallback on the JVM version + return javaVersion; + } + /** * The 'defineClass' method on the ClassLoader is protected, thus we need to invoke it via reflection. @@ -773,4 +847,16 @@ public abstract class AbstractProxyFacto } + private static class VersionVisitor extends EmptyVisitor + { + private int version; + + @Override + public void visit(final int version, final int access, final String name, + final String signature, final String superName, final String[] interfaces) + { + super.visit(version, access, name, signature, superName, interfaces); + this.version = version; + } + } } Modified: openwebbeans/branches/owb_1.2.x/webbeans-impl/src/main/java/org/apache/webbeans/proxy/InterceptorDecoratorProxyFactory.java URL: http://svn.apache.org/viewvc/openwebbeans/branches/owb_1.2.x/webbeans-impl/src/main/java/org/apache/webbeans/proxy/InterceptorDecoratorProxyFactory.java?rev=1826631&r1=1826630&r2=1826631&view=diff ============================================================================== --- openwebbeans/branches/owb_1.2.x/webbeans-impl/src/main/java/org/apache/webbeans/proxy/InterceptorDecoratorProxyFactory.java (original) +++ openwebbeans/branches/owb_1.2.x/webbeans-impl/src/main/java/org/apache/webbeans/proxy/InterceptorDecoratorProxyFactory.java Tue Mar 13 13:40:02 2018 @@ -24,11 +24,11 @@ import org.apache.webbeans.exception.Web import org.apache.webbeans.logger.WebBeansLoggerFacade; import org.apache.webbeans.util.Asserts; import org.apache.webbeans.util.ExceptionUtil; -import org.apache.xbean.asm5.ClassWriter; -import org.apache.xbean.asm5.Label; -import org.apache.xbean.asm5.MethodVisitor; -import org.apache.xbean.asm5.Opcodes; -import org.apache.xbean.asm5.Type; +import org.apache.xbean.asm6.ClassWriter; +import org.apache.xbean.asm6.Label; +import org.apache.xbean.asm6.MethodVisitor; +import org.apache.xbean.asm6.Opcodes; +import org.apache.xbean.asm6.Type; import javax.enterprise.inject.spi.Bean; import java.io.ObjectStreamException; Modified: openwebbeans/branches/owb_1.2.x/webbeans-impl/src/main/java/org/apache/webbeans/proxy/NormalScopeProxyFactory.java URL: http://svn.apache.org/viewvc/openwebbeans/branches/owb_1.2.x/webbeans-impl/src/main/java/org/apache/webbeans/proxy/NormalScopeProxyFactory.java?rev=1826631&r1=1826630&r2=1826631&view=diff ============================================================================== --- openwebbeans/branches/owb_1.2.x/webbeans-impl/src/main/java/org/apache/webbeans/proxy/NormalScopeProxyFactory.java (original) +++ openwebbeans/branches/owb_1.2.x/webbeans-impl/src/main/java/org/apache/webbeans/proxy/NormalScopeProxyFactory.java Tue Mar 13 13:40:02 2018 @@ -40,10 +40,10 @@ import org.apache.webbeans.intercept.Nor import org.apache.webbeans.util.ClassUtil; import org.apache.webbeans.util.ExceptionUtil; import org.apache.webbeans.util.WebBeansUtil; -import org.apache.xbean.asm5.ClassWriter; -import org.apache.xbean.asm5.MethodVisitor; -import org.apache.xbean.asm5.Opcodes; -import org.apache.xbean.asm5.Type; +import org.apache.xbean.asm6.ClassWriter; +import org.apache.xbean.asm6.MethodVisitor; +import org.apache.xbean.asm6.Opcodes; +import org.apache.xbean.asm6.Type; /** * This factory creates proxies which delegate the @@ -504,7 +504,7 @@ public class NormalScopeProxyFactory ext * if targetMethod is protected. Please see Java LangSpec 6.6.2 about the complex * rules for calling 'protected' methods. * - * @see #generateDelegationMethod(org.apache.xbean.asm5.ClassWriter, java.lang.reflect.Method, int, Class, String) + * @see #generateDelegationMethod(org.apache.xbean.asm6.ClassWriter, java.lang.reflect.Method, int, Class, String) */ @SuppressWarnings("unused") public static Object delegateProtectedMethod(Method method, Object instance, Object[] params) Modified: openwebbeans/branches/owb_1.2.x/webbeans-impl/src/main/java/org/apache/webbeans/proxy/SubclassProxyFactory.java URL: http://svn.apache.org/viewvc/openwebbeans/branches/owb_1.2.x/webbeans-impl/src/main/java/org/apache/webbeans/proxy/SubclassProxyFactory.java?rev=1826631&r1=1826630&r2=1826631&view=diff ============================================================================== --- openwebbeans/branches/owb_1.2.x/webbeans-impl/src/main/java/org/apache/webbeans/proxy/SubclassProxyFactory.java (original) +++ openwebbeans/branches/owb_1.2.x/webbeans-impl/src/main/java/org/apache/webbeans/proxy/SubclassProxyFactory.java Tue Mar 13 13:40:02 2018 @@ -26,10 +26,10 @@ import java.util.List; import org.apache.webbeans.config.WebBeansContext; import org.apache.webbeans.exception.WebBeansConfigurationException; import org.apache.webbeans.util.ClassUtil; -import org.apache.xbean.asm5.ClassWriter; -import org.apache.xbean.asm5.MethodVisitor; -import org.apache.xbean.asm5.Opcodes; -import org.apache.xbean.asm5.Type; +import org.apache.xbean.asm6.ClassWriter; +import org.apache.xbean.asm6.MethodVisitor; +import org.apache.xbean.asm6.Opcodes; +import org.apache.xbean.asm6.Type; /** * This factory creates subclasses for abstract classes. Modified: openwebbeans/branches/owb_1.2.x/webbeans-impl/src/main/resources/META-INF/openwebbeans/openwebbeans.properties URL: http://svn.apache.org/viewvc/openwebbeans/branches/owb_1.2.x/webbeans-impl/src/main/resources/META-INF/openwebbeans/openwebbeans.properties?rev=1826631&r1=1826630&r2=1826631&view=diff ============================================================================== --- openwebbeans/branches/owb_1.2.x/webbeans-impl/src/main/resources/META-INF/openwebbeans/openwebbeans.properties (original) +++ openwebbeans/branches/owb_1.2.x/webbeans-impl/src/main/resources/META-INF/openwebbeans/openwebbeans.properties Tue Mar 13 13:40:02 2018 @@ -106,3 +106,21 @@ org.apache.webbeans.useBDABeansXMLScanne # org.apache.webbeans.proxy.mapping.javax.enterprise.context.RequestScoped=org.apache.webbeans.intercept.NormalScopedBeanInterceptorHandler org.apache.webbeans.proxy.mapping.javax.enterprise.context.ApplicationScoped=org.apache.webbeans.intercept.ApplicationScopedBeanInterceptorHandler ################################################################################################ + +######################### Java version for generated proxy classes ############################# +# The Java Version to use for the generated proxy classes. +# If "auto" then we will pick the version of the current JVM. +# The default is set to "1.6" as some tools in jetty/tomcat/etc still +# cannot properly handle Java8 (mostly due to older Eclipse JDT versions). +# org.apache.webbeans.generator.javaVersion=1.6 +################################################################################################ + + +######################### Java version for generated proxy classes ############################# +# The Java Version to use for the generated proxy classes. +# If "auto" then we will pick the version of the current JVM. +# The default is set to "1.6" as some tools in jetty/tomcat/etc still +# cannot properly handle Java8 (mostly due to older Eclipse JDT versions). +org.apache.webbeans.generator.javaVersion=1.6 +################################################################################################ + Modified: openwebbeans/branches/owb_1.2.x/webbeans-tomcat7/src/main/java/org/apache/webbeans/web/tomcat7/TomcatInstanceManager.java URL: http://svn.apache.org/viewvc/openwebbeans/branches/owb_1.2.x/webbeans-tomcat7/src/main/java/org/apache/webbeans/web/tomcat7/TomcatInstanceManager.java?rev=1826631&r1=1826630&r2=1826631&view=diff ============================================================================== --- openwebbeans/branches/owb_1.2.x/webbeans-tomcat7/src/main/java/org/apache/webbeans/web/tomcat7/TomcatInstanceManager.java (original) +++ openwebbeans/branches/owb_1.2.x/webbeans-tomcat7/src/main/java/org/apache/webbeans/web/tomcat7/TomcatInstanceManager.java Tue Mar 13 13:40:02 2018 @@ -67,7 +67,8 @@ public class TomcatInstanceManager imple } @Override - public Object newInstance(Class<?> aClass) throws IllegalAccessException, InvocationTargetException, NamingException, InstantiationException + public Object newInstance(Class<?> aClass) throws IllegalAccessException, InvocationTargetException, NamingException, + InstantiationException, NoSuchMethodException { // Creates a defaut instance Object object = this.processor.newInstance(aClass); @@ -79,7 +80,8 @@ public class TomcatInstanceManager imple } @Override - public Object newInstance(String str) throws IllegalAccessException, InvocationTargetException, NamingException, InstantiationException, ClassNotFoundException + public Object newInstance(String str) throws IllegalAccessException, InvocationTargetException, NamingException, + InstantiationException, ClassNotFoundException, NoSuchMethodException { // Creates a defaut instance Object object = this.processor.newInstance(str); @@ -98,7 +100,8 @@ public class TomcatInstanceManager imple } @Override - public Object newInstance(String str, ClassLoader cl) throws IllegalAccessException, InvocationTargetException, NamingException, InstantiationException, ClassNotFoundException + public Object newInstance(String str, ClassLoader cl) throws IllegalAccessException, InvocationTargetException, NamingException, + InstantiationException, ClassNotFoundException, NoSuchMethodException { // Creates a defaut instance Object object = this.processor.newInstance(str, cl);