> If you have any concerns please speak up :-) I've done so, on the commit thread. Thank you!
Regards, Mark On 2 June 2011 23:34, David Jencks <[email protected]> wrote: > Hi Tim, > > First I fixed this in OWB by having their proxyability-checking code ignore > synthetic methods. This works and AFAICT the actual proxy building code > seems to work ok. However a couple of OWB committers have objected to this > and one of them has told me that starting in java 1.5 marking methods final > has no effect on whether the JIT can optimize better. I'm a little nervous > about this change also since the synthetic flag is not exposed by the java > reflection code. > > So when I get a minute I'm going to try removing the final modifier from > the generated synthetic methods and restore the OWB code. If you have any > concerns please speak up :-) > > thanks! > david jencks > > On Jun 1, 2011, at 1:28 AM, Timothy Ward wrote: > > > > > Hi David, > > > > The proxying code does indeed add a couple of final methods on the > highest woven supertype of a class hierarchy. The equivalent source for > these would be the following: > > > > -------------------------------------------------------- > > > > public final Callable<Object> > org_apache_aries_proxy_weaving_WovenProxy_unwrap() { > > return dispatcherField; > > } > > > > > > > > public final boolean > org_apache_aries_proxy_weaving_WovenProxy_isProxyInstance() { > > > > return dispatcherField != null && listenerField != null; > > > > } > > > > -------------------------------------------------------- > > > > dispatcherField and listenerField are protected final member variables > with long, auto-generated field names that should never clash with anything > already in the class. > > > > Both of these methods are marked synthetic in the bytecode, which I would > have hoped meant that they would be safely ignored. The primary reason for > making the methods final is to ensure the JIT can optimize effectively, so > if you'd like to try changing line 67 of AbstractWovenProxyAdapter to remove > the ACC_FINAL part of the bitmask then that will stop the methods from being > final. This should have no functional effect on the proxy code, just a > potential, minor performance impact. > > > > It's a shame that the webbeans implementation can't use the existing > proxying, but I suppose that's not possible... > > > > > > > > For completeness, weaving also adds the following code to every class > that it weaves (not just the highest supertype): > > > > -------------------------------------------------------- > > > > protected Constructor(Callable<Object> dispatcher, InvocationListener > listener) { > > //either this for the sub-types > > super(dispatcher, listener); > > > > //or this for the highest woven supertype > > super(); // sometimes this(); if there is no no-args super > > dispatcherField = dispatcher; > > listenerField = listener; > > > > } > > > > public WovenProxy > org_apache_aries_proxy_weaving_WovenProxy_createNewProxyInstance(Callable<Object> > dispatcher, InvocationListener listener) { > > return new ThisClass(dispatcher, listener); > > } > > > > -------------------------------------------------------- > > > > > > Regards, > > > > Tim > > > > > > ---------------------------------------- > >> From: [email protected] > >> Subject: Another weaving problem? > >> Date: Tue, 31 May 2011 17:05:04 -0700 > >> To: [email protected] > >> > >> Thanks tim for fixing the SerialVersionUID problem. I think I'm running > into another problem with the weaving since this doesn't show up with plain > geronimo + owb. Most of the jcdi tck fails with deployment errors like this: > >> > >> 2011-05-31 16:02:27,902 ERROR [WebBeansConfigurationListener] An error > occured while starting application context path : > [/org.jboss.jsr299.tck.tests.context.ContextTest] > >> 2011-05-31 16:02:27,903 ERROR [ContextTest]] Exception sending context > initialized event to listener instance of class > org.apache.geronimo.openwebbeans.WebBeansConfigurationListener > >> javax.enterprise.inject.UnproxyableResolutionException: WebBeans with > api type with normal scope must be proxiable to inject. > >> org.jboss.jsr299.tck.tests.context.MySessionBean has final methods! CDI > doesn't allow that. > >> at > org.apache.webbeans.util.InjectionExceptionUtils.throwUnproxyableResolutionException(InjectionExceptionUtils.java:39) > >> at > org.apache.webbeans.util.WebBeansUtil.checkUnproxiableApiType(WebBeansUtil.java:1852) > >> at > org.apache.webbeans.component.creation.ManagedBeanCreatorImpl.checkCreateConditions(ManagedBeanCreatorImpl.java:70) > >> at > org.apache.webbeans.util.WebBeansUtil.defineManagedBean(WebBeansUtil.java:2598) > >> at > org.apache.webbeans.config.BeansDeployer.defineManagedBean(BeansDeployer.java:859) > >> at > org.apache.webbeans.config.BeansDeployer.deploySingleAnnotatedType(BeansDeployer.java:539) > >> at > org.apache.webbeans.config.BeansDeployer.deployFromClassPath(BeansDeployer.java:484) > >> at > org.apache.webbeans.config.BeansDeployer.deploy(BeansDeployer.java:165) > >> at > org.apache.webbeans.lifecycle.AbstractLifeCycle.startApplication(AbstractLifeCycle.java:129) > >> at > org.apache.webbeans.web.lifecycle.WebContainerLifecycle.startApplication(WebContainerLifecycle.java:87) > >> at > org.apache.geronimo.openwebbeans.WebBeansConfigurationListener.contextInitialized(WebBeansConfigurationListener.java:85) > >> at > org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4521) > >> at > org.apache.catalina.core.StandardContext$1.call(StandardContext.java:5004) > >> at > org.apache.catalina.core.StandardContext$1.call(StandardContext.java:4999) > >> at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) > >> at java.util.concurrent.FutureTask.run(FutureTask.java:138) > >> at > java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) > >> at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) > >> at java.lang.Thread.run(Thread.java:680) > >> > >> I don't see any final methods in MySessionBean: > >> > >> @SessionScoped > >> class MySessionBean implements Serializable > >> { > >> private static final long serialVersionUID = 1L; > >> > >> private int id = 0; > >> > >> public void setId(int id) > >> { > >> this.id = id; > >> } > >> > >> public int getId() > >> { > >> return id; > >> } > >> > >> public void ping() > >> { > >> } > >> > >> } > >> > >> so I'm guessing the weaving might have added something?? > >> > >> Is there a description of what the weaving does in terms of java code? > Or even a description of what it does in java op codes? > >> > >> thanks > >> david jencks > >> > > > >
