yep but no need to be merged in core
Romain Manni-Bucau @rmannibucau <https://twitter.com/rmannibucau> | Blog <http://rmannibucau.wordpress.com> | Github <https://github.com/rmannibucau> | LinkedIn <https://www.linkedin.com/in/rmannibucau> | Tomitriber <http://www.tomitribe.com> 2015-03-15 22:13 GMT+01:00 Gerhard Petracek <gerhard.petra...@gmail.com>: > @romain: > with an own module you have enough flexibility. > > regards, > gerhard > > > > 2015-03-15 21:56 GMT+01:00 Romain Manni-Bucau <rmannibu...@gmail.com>: > > > Well size is already an issue in real life when we dont need all feature > > but for asm issue is you want to use the version you already have. That > is > > why several libs support several asm jars like xbean, spring shades or > > plain asm jars. As a user having 3 asm.jar is an issue for each jvm > upgrade > > so it is avoided as much as possible. > > Le 15 mars 2015 21:49, "Thomas Andraschko" <andraschko.tho...@gmail.com > > > > a > > écrit : > > > > > javassist is about 600kb and the user needs to manage it > > > > > > 2015-03-15 21:48 GMT+01:00 Thomas Andraschko < > > andraschko.tho...@gmail.com > > > >: > > > > > > > do you mean the jar size? the difference is just ~130kb when we shade > > asm > > > > or not > > > > > > > > > > > > 2015-03-15 21:40 GMT+01:00 Romain Manni-Bucau <rmannibu...@gmail.com > >: > > > > > > > >> But owb has no link with ds need imo. Ds is a lib so need to care > > about > > > >> user deps where owb doesnt. > > > >> > > > >> Not having an own module would be another reason to not use ds - > which > > > is > > > >> already the case from my experience for its size but now it would > also > > > be > > > >> to not be smart enough :( > > > >> Le 15 mars 2015 21:20, "Gerhard Petracek" < > gerhard.petra...@gmail.com > > > > > > a > > > >> écrit : > > > >> > > > >> > @romain: > > > >> > +0 for an own module > > > >> > -0.5 for an additional indirection (we also don't have/need it at > > owb) > > > >> > > > > >> > regards, > > > >> > gerhard > > > >> > > > > >> > > > > >> > > > > >> > 2015-03-15 21:11 GMT+01:00 Thomas Andraschko < > > > >> andraschko.tho...@gmail.com > > > >> > >: > > > >> > > > > >> > > +0 for an extra module > > > >> > > > > > >> > > before i implemented the asm proxy for the partial bean module, > i > > > >> tried > > > >> > it > > > >> > > many hours to understand and implement it with commons proxy > > > >> > > as it was not possible out of the box, i switched to plain ASM > > > >> > > If someone would like to evolve commons proxy and use it in DS > -> > > +0 > > > >> > > > > > >> > > 2015-03-15 20:53 GMT+01:00 Romain Manni-Bucau < > > > rmannibu...@gmail.com > > > >> >: > > > >> > > > > > >> > > > Hmm, > > > >> > > > > > > >> > > > shouldn't we provide this as another module? I'm not super > happy > > > to > > > >> > have > > > >> > > > asm shade in core. > > > >> > > > > > > >> > > > BTW can't we just use [proxy2]? we can still make the code > > > evolving > > > >> if > > > >> > > > needed. > > > >> > > > > > > >> > > > Romain Manni-Bucau > > > >> > > > @rmannibucau <https://twitter.com/rmannibucau> | Blog > > > >> > > > <http://rmannibucau.wordpress.com> | Github < > > > >> > > > https://github.com/rmannibucau> | > > > >> > > > LinkedIn <https://www.linkedin.com/in/rmannibucau> | > Tomitriber > > > >> > > > <http://www.tomitribe.com> > > > >> > > > > > > >> > > > ---------- Forwarded message ---------- > > > >> > > > From: <tandrasc...@apache.org> > > > >> > > > Date: 2015-03-15 20:50 GMT+01:00 > > > >> > > > Subject: [2/2] deltaspike git commit: DELTASPIKE-851 move > > > >> > proxy-handling > > > >> > > to > > > >> > > > ds-core > > > >> > > > To: comm...@deltaspike.apache.org > > > >> > > > > > > >> > > > > > > >> > > > DELTASPIKE-851 move proxy-handling to ds-core > > > >> > > > > > > >> > > > Project: > http://git-wip-us.apache.org/repos/asf/deltaspike/repo > > > >> > > > Commit: > > > >> > > > http://git-wip-us.apache.org/repos/asf/deltaspike/commit/fcf4d77d > > > >> > > > Tree: > > > >> http://git-wip-us.apache.org/repos/asf/deltaspike/tree/fcf4d77d > > > >> > > > Diff: > > > >> http://git-wip-us.apache.org/repos/asf/deltaspike/diff/fcf4d77d > > > >> > > > > > > >> > > > Branch: refs/heads/master > > > >> > > > Commit: fcf4d77d692971a6a93731e64d044f6cf1757d6c > > > >> > > > Parents: d3a21c0 > > > >> > > > Author: Thomas Andraschko <tandrasc...@apache.org> > > > >> > > > Authored: Sun Mar 15 20:50:24 2015 +0100 > > > >> > > > Committer: Thomas Andraschko <tandrasc...@apache.org> > > > >> > > > Committed: Sun Mar 15 20:50:24 2015 +0100 > > > >> > > > > > > >> > > > > > > >> > ---------------------------------------------------------------------- > > > >> > > > deltaspike/core/api/pom.xml | 57 +++ > > > >> > > > .../AbstractManualInvocationHandler.java | 104 +++++ > > > >> > > > .../invocation/ManualInvocationContext.java | 187 > ++++++++ > > > >> > > > ...nualInvocationThrowableWrapperException.java | 27 ++ > > > >> > > > .../core/util/proxy/AsmProxyClassGenerator.java | 436 > > > >> > > +++++++++++++++++++ > > > >> > > > .../core/util/proxy/DeltaSpikeProxy.java | 28 ++ > > > >> > > > .../DeltaSpikeProxyContextualLifecycle.java | 144 ++++++ > > > >> > > > .../core/util/proxy/DeltaSpikeProxyFactory.java | 274 > > > ++++++++++++ > > > >> > > > .../DelegateManualInvocationHandler.java | 43 ++ > > > >> > > > .../InterceptManualInvocationHandler.java | 51 +++ > > > >> > > > deltaspike/modules/jsf/impl/pom.xml | 6 - > > > >> > > > .../InjectionAwareApplicationWrapper.java | 6 +- > > > >> > > > .../proxy/ConverterAndValidatorLifecycle.java | 132 ------ > > > >> > > > .../ConverterAndValidatorProxyExtension.java | 19 +- > > > >> > > > .../ConverterAndValidatorProxyFactory.java | 78 ++++ > > > >> > > > .../proxy/ConverterInvocationHandler.java | 13 +- > > > >> > > > .../proxy/DefaultPartialStateHolder.java | 3 + > > > >> > > > .../proxy/DelegatingMethodHandler.java | 58 --- > > > >> > > > .../injection/proxy/MethodHandlerProxy.java | 42 -- > > > >> > > > .../jsf/impl/injection/proxy/ProxyMarker.java | 23 - > > > >> > > > .../proxy/ValidatorInvocationHandler.java | 12 +- > > > >> > > > .../test/jsf/impl/util/ArchiveUtils.java | 1 - > > > >> > > > deltaspike/modules/partial-bean/impl/pom.xml | 56 --- > > > >> > > > .../impl/PartialBeanBindingExtension.java | 16 +- > > > >> > > > .../partialbean/impl/PartialBeanLifecycle.java | 142 ------ > > > >> > > > .../impl/PartialBeanProxyFactory.java | 62 +++ > > > >> > > > .../AbstractManualInvocationHandler.java | 104 ----- > > > >> > > > .../interception/ManualInvocationContext.java | 187 > -------- > > > >> > > > ...nualInvocationThrowableWrapperException.java | 27 -- > > > >> > > > .../impl/proxy/AsmProxyClassGenerator.java | 423 > > > >> > ------------------ > > > >> > > > .../proxy/CallSuperManualInvocationHandler.java | 50 --- > > > >> > > > .../impl/proxy/PartialBeanProxy.java | 28 -- > > > >> > > > .../impl/proxy/PartialBeanProxyFactory.java | 263 > > ----------- > > > >> > > > .../proxy/RedirectManualInvocationHandler.java | 42 -- > > > >> > > > .../core/api/partialbean/util/ArchiveUtils.java | 7 - > > > >> > > > 35 files changed, 1510 insertions(+), 1641 deletions(-) > > > >> > > > > > > >> > ---------------------------------------------------------------------- > > > >> > > > > > > >> > > > > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > http://git-wip-us.apache.org/repos/asf/deltaspike/blob/fcf4d77d/deltaspike/core/api/pom.xml > > > >> > > > > > > >> > ---------------------------------------------------------------------- > > > >> > > > diff --git a/deltaspike/core/api/pom.xml > > > >> b/deltaspike/core/api/pom.xml > > > >> > > > index c5793f4..94b489d 100644 > > > >> > > > --- a/deltaspike/core/api/pom.xml > > > >> > > > +++ b/deltaspike/core/api/pom.xml > > > >> > > > @@ -33,6 +33,42 @@ > > > >> > > > > > > >> > > > <name>Apache DeltaSpike Core-API</name> > > > >> > > > > > > >> > > > + <build> > > > >> > > > + <plugins> > > > >> > > > + <plugin> > > > >> > > > + <groupId>org.apache.maven.plugins</groupId> > > > >> > > > + <artifactId>maven-shade-plugin</artifactId> > > > >> > > > + <version>2.3</version> > > > >> > > > + <configuration> > > > >> > > > + > > > >> > > <shadedArtifactAttached>false</shadedArtifactAttached> > > > >> > > > + > > > >> > > > <createDependencyReducedPom>false</createDependencyReducedPom> > > > >> > > > + > > > >> > > > > > > <promoteTransitiveDependencies>true</promoteTransitiveDependencies> > > > >> > > > + <relocations> > > > >> > > > + <relocation> > > > >> > > > + > > <pattern>org.objectweb.asm</pattern> > > > >> > > > + > > > >> > > > > > > >> > > > > >> > > > > <shadedPattern>org.apache.deltaspike.core.util.proxy.asm5</shadedPattern> > > > >> > > > + </relocation> > > > >> > > > + </relocations> > > > >> > > > + <artifactSet> > > > >> > > > + <includes> > > > >> > > > + > <include>org.ow2.asm:asm</include> > > > >> > > > + > > > >> <include>org.ow2.asm:asm-commons</include> > > > >> > > > + > > > <include>org.ow2.asm:asm-tree</include> > > > >> > > > + </includes> > > > >> > > > + </artifactSet> > > > >> > > > + </configuration> > > > >> > > > + <executions> > > > >> > > > + <execution> > > > >> > > > + <phase>package</phase> > > > >> > > > + <goals> > > > >> > > > + <goal>shade</goal> > > > >> > > > + </goals> > > > >> > > > + </execution> > > > >> > > > + </executions> > > > >> > > > + </plugin> > > > >> > > > + </plugins> > > > >> > > > + </build> > > > >> > > > + > > > >> > > > <properties> > > > >> > > > <deltaspike.osgi.export.pkg> > > > >> > > > org.apache.deltaspike.core.* > > > >> > > > @@ -46,5 +82,26 @@ > > > >> > > > </deltaspike.osgi.provide.capability> > > > >> > > > </properties> > > > >> > > > > > > >> > > > + <dependencies> > > > >> > > > + <dependency> > > > >> > > > + <groupId>org.ow2.asm</groupId> > > > >> > > > + <artifactId>asm</artifactId> > > > >> > > > + <version>5.0.3</version> > > > >> > > > + <optional>true</optional> > > > >> > > > + </dependency> > > > >> > > > + <dependency> > > > >> > > > + <groupId>org.ow2.asm</groupId> > > > >> > > > + <artifactId>asm-commons</artifactId> > > > >> > > > + <version>5.0.3</version> > > > >> > > > + <optional>true</optional> > > > >> > > > + </dependency> > > > >> > > > + <dependency> > > > >> > > > + <groupId>org.ow2.asm</groupId> > > > >> > > > + <artifactId>asm-tree</artifactId> > > > >> > > > + <version>5.0.3</version> > > > >> > > > + <optional>true</optional> > > > >> > > > + </dependency> > > > >> > > > + </dependencies> > > > >> > > > + > > > >> > > > </project> > > > >> > > > > > > >> > > > > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > http://git-wip-us.apache.org/repos/asf/deltaspike/blob/fcf4d77d/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/invocation/AbstractManualInvocationHandler.java > > > >> > > > > > > >> > ---------------------------------------------------------------------- > > > >> > > > diff --git > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/invocation/AbstractManualInvocationHandler.java > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/invocation/AbstractManualInvocationHandler.java > > > >> > > > new file mode 100644 > > > >> > > > index 0000000..5e6fe33 > > > >> > > > --- /dev/null > > > >> > > > +++ > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/invocation/AbstractManualInvocationHandler.java > > > >> > > > @@ -0,0 +1,104 @@ > > > >> > > > +/* > > > >> > > > + * Licensed to the Apache Software Foundation (ASF) under one > > > >> > > > + * or more contributor license agreements. See the NOTICE > file > > > >> > > > + * distributed with this work for additional information > > > >> > > > + * regarding copyright ownership. The ASF licenses this file > > > >> > > > + * to you under the Apache License, Version 2.0 (the > > > >> > > > + * "License"); you may not use this file except in compliance > > > >> > > > + * with the License. You may obtain a copy of the License at > > > >> > > > + * > > > >> > > > + * http://www.apache.org/licenses/LICENSE-2.0 > > > >> > > > + * > > > >> > > > + * Unless required by applicable law or agreed to in writing, > > > >> > > > + * software distributed under the License is distributed on > an > > > >> > > > + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY > > > >> > > > + * KIND, either express or implied. See the License for the > > > >> > > > + * specific language governing permissions and limitations > > > >> > > > + * under the License. > > > >> > > > + */ > > > >> > > > +package org.apache.deltaspike.core.util.invocation; > > > >> > > > + > > > >> > > > +import java.lang.annotation.Annotation; > > > >> > > > +import java.lang.reflect.InvocationHandler; > > > >> > > > +import java.lang.reflect.Method; > > > >> > > > +import java.util.ArrayList; > > > >> > > > +import java.util.List; > > > >> > > > +import javax.enterprise.inject.Typed; > > > >> > > > +import javax.enterprise.inject.spi.BeanManager; > > > >> > > > +import javax.enterprise.inject.spi.InterceptionType; > > > >> > > > +import javax.enterprise.inject.spi.Interceptor; > > > >> > > > +import javax.interceptor.InterceptorBinding; > > > >> > > > +import > > > org.apache.deltaspike.core.api.provider.BeanManagerProvider; > > > >> > > > + > > > >> > > > +@Typed > > > >> > > > +public abstract class AbstractManualInvocationHandler > > implements > > > >> > > > InvocationHandler > > > >> > > > +{ > > > >> > > > + @Override > > > >> > > > + public Object invoke(Object proxy, Method method, > Object[] > > > >> > > parameters) > > > >> > > > throws Throwable > > > >> > > > + { > > > >> > > > + List<Interceptor<?>> interceptors = > > > >> resolveInterceptors(proxy, > > > >> > > > method); > > > >> > > > + if (interceptors != null && interceptors.size() > 0) > > > >> > > > + { > > > >> > > > + try > > > >> > > > + { > > > >> > > > + ManualInvocationContext invocationContext = > > > >> > > > + new ManualInvocationContext(this, > > > >> > interceptors, > > > >> > > > proxy, method, parameters, null); > > > >> > > > + > > > >> > > > + Object returnValue = > > invocationContext.proceed(); > > > >> > > > + > > > >> > > > + if (invocationContext.isProceedOriginal()) > > > >> > > > + { > > > >> > > > + return > > > >> > > > invocationContext.getProceedOriginalReturnValue(); > > > >> > > > + } > > > >> > > > + > > > >> > > > + return returnValue; > > > >> > > > + } > > > >> > > > + catch (ManualInvocationThrowableWrapperException > e) > > > >> > > > + { > > > >> > > > + throw e.getCause(); > > > >> > > > + } > > > >> > > > + } > > > >> > > > + > > > >> > > > + return proceedOriginal(proxy, method, parameters); > > > >> > > > + } > > > >> > > > + > > > >> > > > + protected abstract Object proceedOriginal(Object proxy, > > > Method > > > >> > > method, > > > >> > > > Object[] parameters) throws Throwable; > > > >> > > > + > > > >> > > > + protected List<Interceptor<?>> resolveInterceptors(Object > > > >> > instance, > > > >> > > > Method method) > > > >> > > > + { > > > >> > > > + Annotation[] interceptorBindings = > > > >> > > > extractInterceptorBindings(instance, method); > > > >> > > > + if (interceptorBindings.length > 0) > > > >> > > > + { > > > >> > > > + BeanManager beanManager = > > > >> > > > BeanManagerProvider.getInstance().getBeanManager(); > > > >> > > > + return > > > >> > > > > beanManager.resolveInterceptors(InterceptionType.AROUND_INVOKE, > > > >> > > > interceptorBindings); > > > >> > > > + } > > > >> > > > + > > > >> > > > + return null; > > > >> > > > + } > > > >> > > > + > > > >> > > > + // TODO stereotypes > > > >> > > > + protected Annotation[] extractInterceptorBindings(Object > > > >> instance, > > > >> > > > Method method) > > > >> > > > + { > > > >> > > > + ArrayList<Annotation> bindings = new > > > >> ArrayList<Annotation>(); > > > >> > > > + > > > >> > > > + for (Annotation annotation : > > > >> > > > instance.getClass().getDeclaredAnnotations()) > > > >> > > > + { > > > >> > > > + if > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > (annotation.annotationType().isAnnotationPresent(InterceptorBinding.class) > > > >> > > > + && !bindings.contains(annotation)) > > > >> > > > + { > > > >> > > > + bindings.add(annotation); > > > >> > > > + } > > > >> > > > + } > > > >> > > > + > > > >> > > > + for (Annotation annotation : > > > >> method.getDeclaredAnnotations()) > > > >> > > > + { > > > >> > > > + if > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > (annotation.annotationType().isAnnotationPresent(InterceptorBinding.class) > > > >> > > > + && !bindings.contains(annotation)) > > > >> > > > + { > > > >> > > > + bindings.add(annotation); > > > >> > > > + } > > > >> > > > + } > > > >> > > > + > > > >> > > > + return bindings.toArray(new > > Annotation[bindings.size()]); > > > >> > > > + } > > > >> > > > +} > > > >> > > > > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > http://git-wip-us.apache.org/repos/asf/deltaspike/blob/fcf4d77d/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/invocation/ManualInvocationContext.java > > > >> > > > > > > >> > ---------------------------------------------------------------------- > > > >> > > > diff --git > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/invocation/ManualInvocationContext.java > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/invocation/ManualInvocationContext.java > > > >> > > > new file mode 100644 > > > >> > > > index 0000000..c79f126 > > > >> > > > --- /dev/null > > > >> > > > +++ > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/invocation/ManualInvocationContext.java > > > >> > > > @@ -0,0 +1,187 @@ > > > >> > > > +/* > > > >> > > > + * Licensed to the Apache Software Foundation (ASF) under one > > > >> > > > + * or more contributor license agreements. See the NOTICE > file > > > >> > > > + * distributed with this work for additional information > > > >> > > > + * regarding copyright ownership. The ASF licenses this file > > > >> > > > + * to you under the Apache License, Version 2.0 (the > > > >> > > > + * "License"); you may not use this file except in compliance > > > >> > > > + * with the License. You may obtain a copy of the License at > > > >> > > > + * > > > >> > > > + * http://www.apache.org/licenses/LICENSE-2.0 > > > >> > > > + * > > > >> > > > + * Unless required by applicable law or agreed to in writing, > > > >> > > > + * software distributed under the License is distributed on > an > > > >> > > > + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY > > > >> > > > + * KIND, either express or implied. See the License for the > > > >> > > > + * specific language governing permissions and limitations > > > >> > > > + * under the License. > > > >> > > > + */ > > > >> > > > +package org.apache.deltaspike.core.util.invocation; > > > >> > > > + > > > >> > > > +import java.lang.reflect.Constructor; > > > >> > > > +import java.lang.reflect.Method; > > > >> > > > +import java.util.HashMap; > > > >> > > > +import java.util.List; > > > >> > > > +import java.util.Map; > > > >> > > > +import javax.enterprise.context.spi.CreationalContext; > > > >> > > > +import javax.enterprise.inject.Typed; > > > >> > > > +import javax.enterprise.inject.spi.BeanManager; > > > >> > > > +import javax.enterprise.inject.spi.InterceptionType; > > > >> > > > +import javax.enterprise.inject.spi.Interceptor; > > > >> > > > +import javax.interceptor.InvocationContext; > > > >> > > > +import > > > org.apache.deltaspike.core.api.provider.BeanManagerProvider; > > > >> > > > + > > > >> > > > +@Typed > > > >> > > > +public class ManualInvocationContext<T, H> implements > > > >> > InvocationContext > > > >> > > > +{ > > > >> > > > + protected List<Interceptor<H>> interceptors; > > > >> > > > + protected int interceptorIndex; > > > >> > > > + protected T target; > > > >> > > > + protected Method method; > > > >> > > > + protected Object[] parameters; > > > >> > > > + protected Map<String, Object> contextData; > > > >> > > > + protected Object timer; > > > >> > > > + protected AbstractManualInvocationHandler > > > >> manualInvocationHandler; > > > >> > > > + > > > >> > > > + protected BeanManager beanManager; > > > >> > > > + > > > >> > > > + protected boolean proceedOriginal; > > > >> > > > + protected Object proceedOriginalReturnValue; > > > >> > > > + > > > >> > > > + public > > > ManualInvocationContext(AbstractManualInvocationHandler > > > >> > > > manualInvocationHandler, > > > >> > > > + List<Interceptor<H>> interceptors, T target, > Method > > > >> > method, > > > >> > > > Object[] parameters, Object timer) > > > >> > > > + { > > > >> > > > + this.manualInvocationHandler = > manualInvocationHandler; > > > >> > > > + this.interceptors = interceptors; > > > >> > > > + this.target = target; > > > >> > > > + this.method = method; > > > >> > > > + this.parameters = parameters; > > > >> > > > + this.timer = timer; > > > >> > > > + > > > >> > > > + this.interceptorIndex = 0; > > > >> > > > + } > > > >> > > > + > > > >> > > > + @Override > > > >> > > > + public Object getTarget() > > > >> > > > + { > > > >> > > > + return target; > > > >> > > > + } > > > >> > > > + > > > >> > > > + @Override > > > >> > > > + public Method getMethod() > > > >> > > > + { > > > >> > > > + return method; > > > >> > > > + } > > > >> > > > + > > > >> > > > + @Override > > > >> > > > + public Object[] getParameters() > > > >> > > > + { > > > >> > > > + return parameters; > > > >> > > > + } > > > >> > > > + > > > >> > > > + @Override > > > >> > > > + public void setParameters(Object[] os) > > > >> > > > + { > > > >> > > > + parameters = os; > > > >> > > > + } > > > >> > > > + > > > >> > > > + @Override > > > >> > > > + public Map<String, Object> getContextData() > > > >> > > > + { > > > >> > > > + if (contextData == null) > > > >> > > > + { > > > >> > > > + contextData = new HashMap<String, Object>(); > > > >> > > > + } > > > >> > > > + return contextData; > > > >> > > > + } > > > >> > > > + > > > >> > > > + @Override > > > >> > > > + public Object proceed() throws Exception > > > >> > > > + { > > > >> > > > + if (proceedOriginal) > > > >> > > > + { > > > >> > > > + return null; > > > >> > > > + } > > > >> > > > + > > > >> > > > + if (interceptors.size() > interceptorIndex) > > > >> > > > + { > > > >> > > > + Interceptor<H> interceptor = null; > > > >> > > > + CreationalContext<H> creationalContext = null; > > > >> > > > + H interceptorInstance = null; > > > >> > > > + > > > >> > > > + try > > > >> > > > + { > > > >> > > > + // lazy init beanManager > > > >> > > > + if (beanManager == null) > > > >> > > > + { > > > >> > > > + beanManager = > > > >> > > > BeanManagerProvider.getInstance().getBeanManager(); > > > >> > > > + } > > > >> > > > + > > > >> > > > + interceptor = > > > interceptors.get(interceptorIndex++); > > > >> > > > + creationalContext = > > > >> > > > beanManager.createCreationalContext(interceptor); > > > >> > > > + interceptorInstance = > > > >> > > > interceptor.create(creationalContext); > > > >> > > > + > > > >> > > > + return > > > >> > > > interceptor.intercept(InterceptionType.AROUND_INVOKE, > > > >> > > interceptorInstance, > > > >> > > > this); > > > >> > > > + } > > > >> > > > + finally > > > >> > > > + { > > > >> > > > + if (creationalContext != null) > > > >> > > > + { > > > >> > > > + if (interceptorInstance != null && > > > interceptor > > > >> != > > > >> > > > null) > > > >> > > > + { > > > >> > > > + > > interceptor.destroy(interceptorInstance, > > > >> > > > creationalContext); > > > >> > > > + } > > > >> > > > + > > > >> > > > + creationalContext.release(); > > > >> > > > + } > > > >> > > > + } > > > >> > > > + } > > > >> > > > + > > > >> > > > + > > > >> > > > + // workaround for OWB 1.1, otherwise we could just > > return > > > >> the > > > >> > > > proceedOriginalReturnValue here > > > >> > > > + try > > > >> > > > + { > > > >> > > > + proceedOriginal = true; > > > >> > > > + proceedOriginalReturnValue = > > > >> > > > manualInvocationHandler.proceedOriginal(target, method, > > > parameters); > > > >> > > > + } > > > >> > > > + catch (Exception e) > > > >> > > > + { > > > >> > > > + throw e; > > > >> > > > + } > > > >> > > > + catch (Throwable e) > > > >> > > > + { > > > >> > > > + // wrap the Throwable here as interceptors > declared > > > >> only > > > >> > > > "throws Exception" > > > >> > > > + throw new > > > ManualInvocationThrowableWrapperException(e); > > > >> > > > + } > > > >> > > > + > > > >> > > > + return null; > > > >> > > > + } > > > >> > > > + > > > >> > > > + @Override > > > >> > > > + public Object getTimer() > > > >> > > > + { > > > >> > > > + return timer; > > > >> > > > + } > > > >> > > > + > > > >> > > > + // @Override > > > >> > > > + // CDI 1.1 compatibility > > > >> > > > + public Constructor getConstructor() > > > >> > > > + { > > > >> > > > + return null; > > > >> > > > + } > > > >> > > > + > > > >> > > > + public boolean isProceedOriginal() > > > >> > > > + { > > > >> > > > + return proceedOriginal; > > > >> > > > + } > > > >> > > > + > > > >> > > > + public Object getProceedOriginalReturnValue() > > > >> > > > + { > > > >> > > > + return proceedOriginalReturnValue; > > > >> > > > + } > > > >> > > > + > > > >> > > > + public void setProceedOriginalReturnValue(Object > > > >> > > > proceedOriginalReturnValue) > > > >> > > > + { > > > >> > > > + this.proceedOriginalReturnValue = > > > >> proceedOriginalReturnValue; > > > >> > > > + } > > > >> > > > +} > > > >> > > > > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > http://git-wip-us.apache.org/repos/asf/deltaspike/blob/fcf4d77d/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/invocation/ManualInvocationThrowableWrapperException.java > > > >> > > > > > > >> > ---------------------------------------------------------------------- > > > >> > > > diff --git > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/invocation/ManualInvocationThrowableWrapperException.java > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/invocation/ManualInvocationThrowableWrapperException.java > > > >> > > > new file mode 100644 > > > >> > > > index 0000000..f9df5e8 > > > >> > > > --- /dev/null > > > >> > > > +++ > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/invocation/ManualInvocationThrowableWrapperException.java > > > >> > > > @@ -0,0 +1,27 @@ > > > >> > > > +/* > > > >> > > > + * Licensed to the Apache Software Foundation (ASF) under one > > > >> > > > + * or more contributor license agreements. See the NOTICE > file > > > >> > > > + * distributed with this work for additional information > > > >> > > > + * regarding copyright ownership. The ASF licenses this file > > > >> > > > + * to you under the Apache License, Version 2.0 (the > > > >> > > > + * "License"); you may not use this file except in compliance > > > >> > > > + * with the License. You may obtain a copy of the License at > > > >> > > > + * > > > >> > > > + * http://www.apache.org/licenses/LICENSE-2.0 > > > >> > > > + * > > > >> > > > + * Unless required by applicable law or agreed to in writing, > > > >> > > > + * software distributed under the License is distributed on > an > > > >> > > > + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY > > > >> > > > + * KIND, either express or implied. See the License for the > > > >> > > > + * specific language governing permissions and limitations > > > >> > > > + * under the License. > > > >> > > > + */ > > > >> > > > +package org.apache.deltaspike.core.util.invocation; > > > >> > > > + > > > >> > > > +public class ManualInvocationThrowableWrapperException > extends > > > >> > Exception > > > >> > > > +{ > > > >> > > > + public > ManualInvocationThrowableWrapperException(Throwable > > e) > > > >> > > > + { > > > >> > > > + super(e); > > > >> > > > + } > > > >> > > > +} > > > >> > > > > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > http://git-wip-us.apache.org/repos/asf/deltaspike/blob/fcf4d77d/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/proxy/AsmProxyClassGenerator.java > > > >> > > > > > > >> > ---------------------------------------------------------------------- > > > >> > > > diff --git > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/proxy/AsmProxyClassGenerator.java > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/proxy/AsmProxyClassGenerator.java > > > >> > > > new file mode 100644 > > > >> > > > index 0000000..a615372 > > > >> > > > --- /dev/null > > > >> > > > +++ > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/proxy/AsmProxyClassGenerator.java > > > >> > > > @@ -0,0 +1,436 @@ > > > >> > > > +/* > > > >> > > > + * Licensed to the Apache Software Foundation (ASF) under one > > > >> > > > + * or more contributor license agreements. See the NOTICE > file > > > >> > > > + * distributed with this work for additional information > > > >> > > > + * regarding copyright ownership. The ASF licenses this file > > > >> > > > + * to you under the Apache License, Version 2.0 (the > > > >> > > > + * "License"); you may not use this file except in compliance > > > >> > > > + * with the License. You may obtain a copy of the License at > > > >> > > > + * > > > >> > > > + * http://www.apache.org/licenses/LICENSE-2.0 > > > >> > > > + * > > > >> > > > + * Unless required by applicable law or agreed to in writing, > > > >> > > > + * software distributed under the License is distributed on > an > > > >> > > > + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY > > > >> > > > + * KIND, either express or implied. See the License for the > > > >> > > > + * specific language governing permissions and limitations > > > >> > > > + * under the License. > > > >> > > > + */ > > > >> > > > +package org.apache.deltaspike.core.util.proxy; > > > >> > > > + > > > >> > > > +import > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > org.apache.deltaspike.core.util.proxy.invocation.InterceptManualInvocationHandler; > > > >> > > > +import > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > org.apache.deltaspike.core.util.proxy.invocation.DelegateManualInvocationHandler; > > > >> > > > +import java.lang.annotation.Annotation; > > > >> > > > +import java.lang.reflect.InvocationHandler; > > > >> > > > +import java.lang.reflect.UndeclaredThrowableException; > > > >> > > > +import java.util.ArrayList; > > > >> > > > +import java.util.Arrays; > > > >> > > > +import javax.enterprise.inject.Typed; > > > >> > > > +import org.objectweb.asm.ClassWriter; > > > >> > > > +import org.objectweb.asm.Label; > > > >> > > > +import org.objectweb.asm.Opcodes; > > > >> > > > +import org.objectweb.asm.Type; > > > >> > > > +import org.objectweb.asm.commons.GeneratorAdapter; > > > >> > > > +import org.objectweb.asm.commons.Method; > > > >> > > > + > > > >> > > > +@Typed > > > >> > > > +public abstract class AsmProxyClassGenerator > > > >> > > > +{ > > > >> > > > + private static final String > > > >> FIELDNAME_DELEGATE_INVOCATION_HANDLER > > > >> > = > > > >> > > > "delegateInvocationHandler"; > > > >> > > > + > > > >> > > > + private static final Type TYPE_CLASS = > > > >> Type.getType(Class.class); > > > >> > > > + private static final Type TYPE_OBJECT = > > > >> > Type.getType(Object.class); > > > >> > > > + > > > >> > > > + private AsmProxyClassGenerator() > > > >> > > > + { > > > >> > > > + // prevent instantiation > > > >> > > > + } > > > >> > > > + > > > >> > > > + public static <T> Class<T> generateProxyClass(ClassLoader > > > >> > > classLoader, > > > >> > > > + Class<T> targetClass, > > > >> > > > + Class<? extends InvocationHandler> > > > >> invocationHandlerClass, > > > >> > > > + String suffix, > > > >> > > > + String superAccessorMethodSuffix, > > > >> > > > + Class<?>[] additionalInterfaces, > > > >> > > > + java.lang.reflect.Method[] delegateMethods, > > > >> > > > + java.lang.reflect.Method[] interceptMethods) > > > >> > > > + { > > > >> > > > + String proxyName = targetClass.getCanonicalName() + > > > suffix; > > > >> > > > + String classFileName = proxyName.replace('.', '/'); > > > >> > > > + > > > >> > > > + byte[] proxyBytes = > > generateProxyClassBytes(targetClass, > > > >> > > > invocationHandlerClass, > > > >> > > > + classFileName, superAccessorMethodSuffix, > > > >> > > > additionalInterfaces, delegateMethods, interceptMethods); > > > >> > > > + > > > >> > > > + Class<T> proxyClass = (Class<T>) > loadClass(classLoader, > > > >> > > proxyName, > > > >> > > > proxyBytes); > > > >> > > > + > > > >> > > > + return proxyClass; > > > >> > > > + } > > > >> > > > + > > > >> > > > + private static byte[] generateProxyClassBytes(Class<?> > > > >> > targetClass, > > > >> > > > + Class<? extends InvocationHandler> > > > >> invocationHandlerClass, > > > >> > > > + String proxyName, > > > >> > > > + String superAccessorMethodSuffix, > > > >> > > > + Class<?>[] additionalInterfaces, > > > >> > > > + java.lang.reflect.Method[] delegateMethods, > > > >> > > > + java.lang.reflect.Method[] interceptMethods) > > > >> > > > + { > > > >> > > > + Class<?> superClass = targetClass; > > > >> > > > + String[] interfaces = new String[] { }; > > > >> > > > + > > > >> > > > + if (targetClass.isInterface()) > > > >> > > > + { > > > >> > > > + superClass = Object.class; > > > >> > > > + interfaces = new String[] { > > > >> > > Type.getInternalName(targetClass) > > > >> > > > }; > > > >> > > > + } > > > >> > > > + > > > >> > > > + // add DeltaSpikeProxy as interface > > > >> > > > + interfaces = Arrays.copyOf(interfaces, > > interfaces.length > > > + > > > >> 1); > > > >> > > > + interfaces[interfaces.length - 1] = > > > >> > > > Type.getInternalName(DeltaSpikeProxy.class); > > > >> > > > + > > > >> > > > + if (additionalInterfaces != null && > > > >> > additionalInterfaces.length > > > >> > > > > > > >> > > > 0) > > > >> > > > + { > > > >> > > > + interfaces = Arrays.copyOf(interfaces, > > > >> interfaces.length + > > > >> > > > additionalInterfaces.length); > > > >> > > > + for (int i = 0; i < additionalInterfaces.length; > > i++) > > > >> > > > + { > > > >> > > > + interfaces[(interfaces.length - 1) + i] = > > > >> > > > Type.getInternalName(additionalInterfaces[i]); > > > >> > > > + } > > > >> > > > + } > > > >> > > > + > > > >> > > > + Type superType = Type.getType(superClass); > > > >> > > > + Type proxyType = Type.getObjectType(proxyName); > > > >> > > > + Type invocationHandlerType = > > > >> > > Type.getType(invocationHandlerClass); > > > >> > > > + > > > >> > > > + ClassWriter cw = new > > > ClassWriter(ClassWriter.COMPUTE_MAXS); > > > >> > > > + cw.visit(Opcodes.V1_6, Opcodes.ACC_PUBLIC + > > > >> Opcodes.ACC_SUPER, > > > >> > > > proxyType.getInternalName(), null, > > > >> > > > + superType.getInternalName(), interfaces); > > > >> > > > + > > > >> > > > + // copy annotations > > > >> > > > + for (Annotation annotation : > > > >> > > targetClass.getDeclaredAnnotations()) > > > >> > > > + { > > > >> > > > + > > > >> > > > > > > cw.visitAnnotation(Type.getDescriptor(annotation.annotationType()), > > > >> > > > true).visitEnd(); > > > >> > > > + } > > > >> > > > + > > > >> > > > + defineInvocationHandlerField(cw, > > invocationHandlerType); > > > >> > > > + defineConstructor(cw, proxyType, superType); > > > >> > > > + defineDeltaSpikeProxyMethods(cw, proxyType, > > > >> > > > invocationHandlerType); > > > >> > > > + > > > >> > > > + for (java.lang.reflect.Method method : > delegateMethods) > > > >> > > > + { > > > >> > > > + defineMethod(cw, method, > > > >> > > > DelegateManualInvocationHandler.class); > > > >> > > > + } > > > >> > > > + > > > >> > > > + for (java.lang.reflect.Method method : > > interceptMethods) > > > >> > > > + { > > > >> > > > + defineSuperAccessorMethod(cw, method, superType, > > > >> > > > superAccessorMethodSuffix); > > > >> > > > + defineMethod(cw, method, > > > >> > > > InterceptManualInvocationHandler.class); > > > >> > > > + } > > > >> > > > + > > > >> > > > + return cw.toByteArray(); > > > >> > > > + } > > > >> > > > + > > > >> > > > + private static void > > defineInvocationHandlerField(ClassWriter > > > >> cw, > > > >> > > Type > > > >> > > > invocationHandlerType) > > > >> > > > + { > > > >> > > > + // generates > > > >> > > > + // private MyInvocationHandler > > delegateInvocationHandler; > > > >> > > > + cw.visitField(Opcodes.ACC_PRIVATE, > > > >> > > > FIELDNAME_DELEGATE_INVOCATION_HANDLER, > > > >> > > > + invocationHandlerType.getDescriptor(), null, > > > >> > > > null).visitEnd(); > > > >> > > > + } > > > >> > > > + > > > >> > > > + private static void defineConstructor(ClassWriter cw, > Type > > > >> > > proxyType, > > > >> > > > Type superType) > > > >> > > > + { > > > >> > > > + GeneratorAdapter mg = new > > > >> GeneratorAdapter(Opcodes.ACC_PUBLIC, > > > >> > > > + new Method("<init>", Type.VOID_TYPE, new > > Type[]{ > > > >> }), > > > >> > > > + null, > > > >> > > > + null, > > > >> > > > + cw); > > > >> > > > + > > > >> > > > + mg.visitCode(); > > > >> > > > + > > > >> > > > + // invoke super constructor > > > >> > > > + mg.loadThis(); > > > >> > > > + mg.invokeConstructor(superType, > Method.getMethod("void > > > >> <init> > > > >> > > > ()")); > > > >> > > > + mg.returnValue(); > > > >> > > > + mg.endMethod(); > > > >> > > > + > > > >> > > > + mg.visitEnd(); > > > >> > > > + } > > > >> > > > + > > > >> > > > + private static void > > defineDeltaSpikeProxyMethods(ClassWriter > > > >> cw, > > > >> > > Type > > > >> > > > proxyType, Type invocationHandlerType) > > > >> > > > + { > > > >> > > > + try > > > >> > > > + { > > > >> > > > + // implement #setDelegateInvocationHandler > > > >> > > > + Method asmMethod = > > > >> > > > Method.getMethod(DeltaSpikeProxy.class.getDeclaredMethod( > > > >> > > > + "setDelegateInvocationHandler", > > > >> > > > InvocationHandler.class)); > > > >> > > > + GeneratorAdapter mg = new > > > >> > > GeneratorAdapter(Opcodes.ACC_PUBLIC, > > > >> > > > asmMethod, null, null, cw); > > > >> > > > + > > > >> > > > + mg.visitCode(); > > > >> > > > + > > > >> > > > + mg.loadThis(); > > > >> > > > + mg.loadArg(0); > > > >> > > > + mg.checkCast(invocationHandlerType); > > > >> > > > + mg.putField(proxyType, > > > >> > > FIELDNAME_DELEGATE_INVOCATION_HANDLER, > > > >> > > > invocationHandlerType); > > > >> > > > + mg.returnValue(); > > > >> > > > + > > > >> > > > + mg.visitMaxs(2, 1); > > > >> > > > + mg.visitEnd(); > > > >> > > > + > > > >> > > > + > > > >> > > > + // implement #getDelegateInvocationHandler > > > >> > > > + asmMethod = > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > Method.getMethod(DeltaSpikeProxy.class.getDeclaredMethod("getDelegateInvocationHandler")); > > > >> > > > + mg = new GeneratorAdapter(Opcodes.ACC_PUBLIC, > > > >> asmMethod, > > > >> > > null, > > > >> > > > null, cw); > > > >> > > > + > > > >> > > > + mg.visitCode(); > > > >> > > > + > > > >> > > > + mg.loadThis(); > > > >> > > > + mg.getField(proxyType, > > > >> > > FIELDNAME_DELEGATE_INVOCATION_HANDLER, > > > >> > > > invocationHandlerType); > > > >> > > > + mg.returnValue(); > > > >> > > > + > > > >> > > > + mg.visitMaxs(2, 1); > > > >> > > > + mg.visitEnd(); > > > >> > > > + } > > > >> > > > + catch (NoSuchMethodException e) > > > >> > > > + { > > > >> > > > + throw new IllegalStateException("Unable to > > implement > > > " > > > >> + > > > >> > > > DeltaSpikeProxy.class.getName(), e); > > > >> > > > + } > > > >> > > > + } > > > >> > > > + > > > >> > > > + private static void defineSuperAccessorMethod(ClassWriter > > cw, > > > >> > > > java.lang.reflect.Method method, Type superType, > > > >> > > > + String superAccessorMethodSuffix) > > > >> > > > + { > > > >> > > > + Method originalAsmMethod = Method.getMethod(method); > > > >> > > > + Method newAsmMethod = new Method(method.getName() + > > > >> > > > superAccessorMethodSuffix, > > > >> > > > + originalAsmMethod.getReturnType(), > > > >> > > > + originalAsmMethod.getArgumentTypes()); > > > >> > > > + GeneratorAdapter mg = new > > > >> GeneratorAdapter(Opcodes.ACC_PUBLIC, > > > >> > > > newAsmMethod, null, null, cw); > > > >> > > > + > > > >> > > > + mg.visitCode(); > > > >> > > > + > > > >> > > > + // call super method > > > >> > > > + mg.loadThis(); > > > >> > > > + mg.loadArgs(); > > > >> > > > + mg.visitMethodInsn(Opcodes.INVOKESPECIAL, > > > >> > > > + superType.getInternalName(), > > > >> > > > + method.getName(), > > > >> > > > + Type.getMethodDescriptor(method), > > > >> > > > + false); > > > >> > > > + mg.returnValue(); > > > >> > > > + > > > >> > > > + // finish the method > > > >> > > > + mg.endMethod(); > > > >> > > > + mg.visitMaxs(10, 10); > > > >> > > > + mg.visitEnd(); > > > >> > > > + } > > > >> > > > + > > > >> > > > + private static void defineMethod(ClassWriter cw, > > > >> > > > java.lang.reflect.Method method, > > > >> > > > + Class manualInvocationHandlerClass) > > > >> > > > + { > > > >> > > > + Type methodType = Type.getType(method); > > > >> > > > + > > > >> > > > + ArrayList<Type> exceptionsToCatch = new > > > ArrayList<Type>(); > > > >> > > > + for (Class<?> exception : method.getExceptionTypes()) > > > >> > > > + { > > > >> > > > + if > > > >> (!RuntimeException.class.isAssignableFrom(exception)) > > > >> > > > + { > > > >> > > > + > exceptionsToCatch.add(Type.getType(exception)); > > > >> > > > + } > > > >> > > > + } > > > >> > > > + > > > >> > > > + // push the method definition > > > >> > > > + int modifiers = (Opcodes.ACC_PUBLIC | > > > >> Opcodes.ACC_PROTECTED) & > > > >> > > > method.getModifiers(); > > > >> > > > + Method asmMethod = Method.getMethod(method); > > > >> > > > + GeneratorAdapter mg = new GeneratorAdapter(modifiers, > > > >> > > > + asmMethod, > > > >> > > > + null, > > > >> > > > + getTypes(method.getExceptionTypes()), > > > >> > > > + cw); > > > >> > > > + > > > >> > > > + // copy annotations > > > >> > > > + for (Annotation annotation : > > > >> method.getDeclaredAnnotations()) > > > >> > > > + { > > > >> > > > + > > > >> > > > > > > mg.visitAnnotation(Type.getDescriptor(annotation.annotationType()), > > > >> > > > true).visitEnd(); > > > >> > > > + } > > > >> > > > + > > > >> > > > + mg.visitCode(); > > > >> > > > + > > > >> > > > + Label tryBlockStart = mg.mark(); > > > >> > > > + > > > >> > > > + mg.loadThis(); > > > >> > > > + loadCurrentMethod(mg, method, methodType); > > > >> > > > + loadArguments(mg, method, methodType); > > > >> > > > + > > > >> > > > + // invoke our ProxyInvocationHandler > > > >> > > > + > > > mg.invokeStatic(Type.getType(manualInvocationHandlerClass), > > > >> > > > + Method.getMethod("Object staticInvoke(Object, > > > >> > > > java.lang.reflect.Method, Object[])")); > > > >> > > > + > > > >> > > > + // cast the result > > > >> > > > + mg.unbox(methodType.getReturnType()); > > > >> > > > + > > > >> > > > + // build try catch > > > >> > > > + Label tryBlockEnd = mg.mark(); > > > >> > > > + > > > >> > > > + // push return > > > >> > > > + mg.returnValue(); > > > >> > > > + > > > >> > > > + // catch runtime exceptions and rethrow it > > > >> > > > + Label rethrow = mg.mark(); > > > >> > > > + mg.visitVarInsn(Opcodes.ASTORE, 1); > > > >> > > > + mg.visitVarInsn(Opcodes.ALOAD, 1); > > > >> > > > + mg.throwException(); > > > >> > > > + mg.visitTryCatchBlock(tryBlockStart, tryBlockEnd, > > > rethrow, > > > >> > > > Type.getInternalName(RuntimeException.class)); > > > >> > > > + > > > >> > > > + // catch checked exceptions and rethrow it > > > >> > > > + boolean throwableCatched = false; > > > >> > > > + if (exceptionsToCatch.size() > 0) > > > >> > > > + { > > > >> > > > + rethrow = mg.mark(); > > > >> > > > + mg.visitVarInsn(Opcodes.ASTORE, 1); > > > >> > > > + mg.visitVarInsn(Opcodes.ALOAD, 1); > > > >> > > > + mg.throwException(); > > > >> > > > + > > > >> > > > + // catch declared exceptions and rethrow it... > > > >> > > > + for (Type exceptionType : exceptionsToCatch) > > > >> > > > + { > > > >> > > > + if > > > >> > > > > (exceptionType.getClassName().equals(Throwable.class.getName())) > > > >> > > > + { > > > >> > > > + throwableCatched = true; > > > >> > > > + } > > > >> > > > + mg.visitTryCatchBlock(tryBlockStart, > > tryBlockEnd, > > > >> > > rethrow, > > > >> > > > exceptionType.getInternalName()); > > > >> > > > + } > > > >> > > > + } > > > >> > > > + > > > >> > > > + // if throwable isn't alreached cachted, catch it and > > > wrap > > > >> it > > > >> > > with > > > >> > > > an UndeclaredThrowableException and throw it > > > >> > > > + if (!throwableCatched) > > > >> > > > + { > > > >> > > > + Type uteType = > > > >> > > > Type.getType(UndeclaredThrowableException.class); > > > >> > > > + Label wrapAndRethrow = mg.mark(); > > > >> > > > + > > > >> > > > + mg.visitVarInsn(Opcodes.ASTORE, 1); > > > >> > > > + mg.newInstance(uteType); > > > >> > > > + mg.dup(); > > > >> > > > + mg.visitVarInsn(Opcodes.ALOAD, 1); > > > >> > > > + mg.invokeConstructor(uteType, > > > >> > > > + Method.getMethod("void > > > >> > > <init>(java.lang.Throwable)")); > > > >> > > > + mg.throwException(); > > > >> > > > + > > > >> > > > + mg.visitTryCatchBlock(tryBlockStart, tryBlockEnd, > > > >> > > > wrapAndRethrow, Type.getInternalName(Throwable.class)); > > > >> > > > + } > > > >> > > > + > > > >> > > > + // finish the method > > > >> > > > + mg.endMethod(); > > > >> > > > + mg.visitMaxs(10, 10); > > > >> > > > + mg.visitEnd(); > > > >> > > > + } > > > >> > > > + > > > >> > > > + /** > > > >> > > > + * Generates: > > > >> > > > + * <pre> > > > >> > > > + * Method method = > > > >> > > > + * > method.getDeclaringClass().getMethod("methodName", > > > new > > > >> > > Class[] > > > >> > > > { args... }); > > > >> > > > + * </pre> > > > >> > > > + * @param mg > > > >> > > > + * @param method > > > >> > > > + * @param methodType > > > >> > > > + */ > > > >> > > > + private static void loadCurrentMethod(GeneratorAdapter > mg, > > > >> > > > java.lang.reflect.Method method, Type methodType) > > > >> > > > + { > > > >> > > > + mg.push(Type.getType(method.getDeclaringClass())); > > > >> > > > + mg.push(method.getName()); > > > >> > > > + > > > >> > > > + // create the Class[] > > > >> > > > + mg.push(methodType.getArgumentTypes().length); > > > >> > > > + mg.newArray(TYPE_CLASS); > > > >> > > > + > > > >> > > > + // push parameters into array > > > >> > > > + for (int i = 0; i < > > methodType.getArgumentTypes().length; > > > >> i++) > > > >> > > > + { > > > >> > > > + // keep copy of array on stack > > > >> > > > + mg.dup(); > > > >> > > > + > > > >> > > > + // push index onto stack > > > >> > > > + mg.push(i); > > > >> > > > + mg.push(methodType.getArgumentTypes()[i]); > > > >> > > > + mg.arrayStore(TYPE_CLASS); > > > >> > > > + } > > > >> > > > + > > > >> > > > + // invoke getMethod() with the method name and the > > array > > > of > > > >> > > types > > > >> > > > + mg.invokeVirtual(TYPE_CLASS, > > > >> > > > Method.getMethod("java.lang.reflect.Method > > > getDeclaredMethod(String, > > > >> > > > Class[])")); > > > >> > > > + } > > > >> > > > + > > > >> > > > + /** > > > >> > > > + * Defines a new Object[] and push all method argmuments > > into > > > >> the > > > >> > > > array. > > > >> > > > + * > > > >> > > > + * @param mg > > > >> > > > + * @param method > > > >> > > > + * @param methodType > > > >> > > > + */ > > > >> > > > + private static void loadArguments(GeneratorAdapter mg, > > > >> > > > java.lang.reflect.Method method, Type methodType) > > > >> > > > + { > > > >> > > > + // create the Object[] > > > >> > > > + mg.push(methodType.getArgumentTypes().length); > > > >> > > > + mg.newArray(TYPE_OBJECT); > > > >> > > > + > > > >> > > > + // push parameters into array > > > >> > > > + for (int i = 0; i < > > methodType.getArgumentTypes().length; > > > >> i++) > > > >> > > > + { > > > >> > > > + // keep copy of array on stack > > > >> > > > + mg.dup(); > > > >> > > > + > > > >> > > > + // push index onto stack > > > >> > > > + mg.push(i); > > > >> > > > + > > > >> > > > + mg.loadArg(i); > > > >> > > > + mg.valueOf(methodType.getArgumentTypes()[i]); > > > >> > > > + mg.arrayStore(TYPE_OBJECT); > > > >> > > > + } > > > >> > > > + } > > > >> > > > + > > > >> > > > + private static Type[] getTypes(Class<?>... src) > > > >> > > > + { > > > >> > > > + Type[] result = new Type[src.length]; > > > >> > > > + for (int i = 0; i < result.length; i++) > > > >> > > > + { > > > >> > > > + result[i] = Type.getType(src[i]); > > > >> > > > + } > > > >> > > > + return result; > > > >> > > > + } > > > >> > > > + > > > >> > > > + /** > > > >> > > > + * Adapted from http://asm.ow2.org/doc/faq.html#Q5 > > > >> > > > + * > > > >> > > > + * @param b > > > >> > > > + * > > > >> > > > + * @return Class<?> > > > >> > > > + */ > > > >> > > > + private static Class<?> loadClass(ClassLoader loader, > > String > > > >> > > > className, byte[] b) > > > >> > > > + { > > > >> > > > + // override classDefine (as it is protected) and > define > > > the > > > >> > > class. > > > >> > > > + try > > > >> > > > + { > > > >> > > > + java.lang.reflect.Method method = > > > >> > > > ClassLoader.class.getDeclaredMethod( > > > >> > > > + "defineClass", String.class, > byte[].class, > > > >> > > int.class, > > > >> > > > int.class); > > > >> > > > + > > > >> > > > + // protected method invocation > > > >> > > > + boolean accessible = method.isAccessible(); > > > >> > > > + if (!accessible) > > > >> > > > + { > > > >> > > > + method.setAccessible(true); > > > >> > > > + } > > > >> > > > + try > > > >> > > > + { > > > >> > > > + return (Class<?>) method.invoke(loader, > > > className, > > > >> b, > > > >> > > > Integer.valueOf(0), Integer.valueOf(b.length)); > > > >> > > > + } > > > >> > > > + finally > > > >> > > > + { > > > >> > > > + if (!accessible) > > > >> > > > + { > > > >> > > > + method.setAccessible(false); > > > >> > > > + } > > > >> > > > + } > > > >> > > > + } > > > >> > > > + catch (Exception e) > > > >> > > > + { > > > >> > > > + throw e instanceof RuntimeException ? > > > >> ((RuntimeException) > > > >> > > e) : > > > >> > > > new RuntimeException(e); > > > >> > > > + } > > > >> > > > + } > > > >> > > > +} > > > >> > > > > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > http://git-wip-us.apache.org/repos/asf/deltaspike/blob/fcf4d77d/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/proxy/DeltaSpikeProxy.java > > > >> > > > > > > >> > ---------------------------------------------------------------------- > > > >> > > > diff --git > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/proxy/DeltaSpikeProxy.java > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/proxy/DeltaSpikeProxy.java > > > >> > > > new file mode 100644 > > > >> > > > index 0000000..cb4b1f1 > > > >> > > > --- /dev/null > > > >> > > > +++ > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/proxy/DeltaSpikeProxy.java > > > >> > > > @@ -0,0 +1,28 @@ > > > >> > > > +/* > > > >> > > > + * Licensed to the Apache Software Foundation (ASF) under one > > > >> > > > + * or more contributor license agreements. See the NOTICE > file > > > >> > > > + * distributed with this work for additional information > > > >> > > > + * regarding copyright ownership. The ASF licenses this file > > > >> > > > + * to you under the Apache License, Version 2.0 (the > > > >> > > > + * "License"); you may not use this file except in compliance > > > >> > > > + * with the License. You may obtain a copy of the License at > > > >> > > > + * > > > >> > > > + * http://www.apache.org/licenses/LICENSE-2.0 > > > >> > > > + * > > > >> > > > + * Unless required by applicable law or agreed to in writing, > > > >> > > > + * software distributed under the License is distributed on > an > > > >> > > > + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY > > > >> > > > + * KIND, either express or implied. See the License for the > > > >> > > > + * specific language governing permissions and limitations > > > >> > > > + * under the License. > > > >> > > > + */ > > > >> > > > +package org.apache.deltaspike.core.util.proxy; > > > >> > > > + > > > >> > > > +import java.lang.reflect.InvocationHandler; > > > >> > > > + > > > >> > > > +public interface DeltaSpikeProxy > > > >> > > > +{ > > > >> > > > + void setDelegateInvocationHandler(InvocationHandler > > > >> > > > redirectInvocationHandler); > > > >> > > > + > > > >> > > > + InvocationHandler getDelegateInvocationHandler(); > > > >> > > > +} > > > >> > > > > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > http://git-wip-us.apache.org/repos/asf/deltaspike/blob/fcf4d77d/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/proxy/DeltaSpikeProxyContextualLifecycle.java > > > >> > > > > > > >> > ---------------------------------------------------------------------- > > > >> > > > diff --git > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/proxy/DeltaSpikeProxyContextualLifecycle.java > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/proxy/DeltaSpikeProxyContextualLifecycle.java > > > >> > > > new file mode 100644 > > > >> > > > index 0000000..2932502 > > > >> > > > --- /dev/null > > > >> > > > +++ > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/proxy/DeltaSpikeProxyContextualLifecycle.java > > > >> > > > @@ -0,0 +1,144 @@ > > > >> > > > +/* > > > >> > > > + * Licensed to the Apache Software Foundation (ASF) under one > > > >> > > > + * or more contributor license agreements. See the NOTICE > file > > > >> > > > + * distributed with this work for additional information > > > >> > > > + * regarding copyright ownership. The ASF licenses this file > > > >> > > > + * to you under the Apache License, Version 2.0 (the > > > >> > > > + * "License"); you may not use this file except in compliance > > > >> > > > + * with the License. You may obtain a copy of the License at > > > >> > > > + * > > > >> > > > + * http://www.apache.org/licenses/LICENSE-2.0 > > > >> > > > + * > > > >> > > > + * Unless required by applicable law or agreed to in writing, > > > >> > > > + * software distributed under the License is distributed on > an > > > >> > > > + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY > > > >> > > > + * KIND, either express or implied. See the License for the > > > >> > > > + * specific language governing permissions and limitations > > > >> > > > + * under the License. > > > >> > > > + */ > > > >> > > > +package org.apache.deltaspike.core.util.proxy; > > > >> > > > + > > > >> > > > +import java.lang.reflect.InvocationHandler; > > > >> > > > +import java.util.Set; > > > >> > > > +import javax.enterprise.context.Dependent; > > > >> > > > +import javax.enterprise.context.spi.CreationalContext; > > > >> > > > +import javax.enterprise.inject.spi.AnnotatedType; > > > >> > > > +import javax.enterprise.inject.spi.Bean; > > > >> > > > +import javax.enterprise.inject.spi.BeanManager; > > > >> > > > +import javax.enterprise.inject.spi.InjectionTarget; > > > >> > > > +import javax.enterprise.inject.spi.PassivationCapable; > > > >> > > > +import > > > org.apache.deltaspike.core.api.provider.BeanManagerProvider; > > > >> > > > +import org.apache.deltaspike.core.api.provider.BeanProvider; > > > >> > > > +import org.apache.deltaspike.core.util.ExceptionUtils; > > > >> > > > +import > > > >> > > > > > > >> > org.apache.deltaspike.core.util.metadata.builder.ContextualLifecycle; > > > >> > > > + > > > >> > > > +public class DeltaSpikeProxyContextualLifecycle<T, H extends > > > >> > > > InvocationHandler> implements ContextualLifecycle<T> > > > >> > > > +{ > > > >> > > > + private final Class<T> proxyClass; > > > >> > > > + private final Class<H> delegateInvocationHandlerClass; > > > >> > > > + private final Class<T> targetClass; > > > >> > > > + > > > >> > > > + private InjectionTarget<T> injectionTarget; > > > >> > > > + private CreationalContext<?> > > > >> creationalContextOfDependentHandler; > > > >> > > > + > > > >> > > > + public DeltaSpikeProxyContextualLifecycle(Class<T> > > > targetClass, > > > >> > > > Class<H> delegateInvocationHandlerClass, > > > >> > > > + DeltaSpikeProxyFactory proxyFactory, BeanManager > > > >> > > beanManager) > > > >> > > > + { > > > >> > > > + this.targetClass = targetClass; > > > >> > > > + this.delegateInvocationHandlerClass = > > > >> > > > delegateInvocationHandlerClass; > > > >> > > > + this.proxyClass = > > proxyFactory.getProxyClass(targetClass, > > > >> > > > delegateInvocationHandlerClass); > > > >> > > > + > > > >> > > > + if (!targetClass.isInterface()) > > > >> > > > + { > > > >> > > > + AnnotatedType<T> annotatedType = > > > >> > > > beanManager.createAnnotatedType(this.targetClass); > > > >> > > > + this.injectionTarget = > > > >> > > > beanManager.createInjectionTarget(annotatedType); > > > >> > > > + } > > > >> > > > + } > > > >> > > > + > > > >> > > > + @Override > > > >> > > > + public T create(Bean bean, CreationalContext > > > creationalContext) > > > >> > > > + { > > > >> > > > + try > > > >> > > > + { > > > >> > > > + T instance = proxyClass.newInstance(); > > > >> > > > + > > > >> > > > + if (delegateInvocationHandlerClass != null) > > > >> > > > + { > > > >> > > > + H delegateInvocationHandler = > > > >> > > > instantiateDelegateInvocationHandler(); > > > >> > > > + ((DeltaSpikeProxy) > > > >> > > > > > instance).setDelegateInvocationHandler(delegateInvocationHandler); > > > >> > > > + } > > > >> > > > + > > > >> > > > + if (this.injectionTarget != null) > > > >> > > > + { > > > >> > > > + this.injectionTarget.inject(instance, > > > >> > > creationalContext); > > > >> > > > + this.injectionTarget.postConstruct(instance); > > > >> > > > + } > > > >> > > > + > > > >> > > > + return instance; > > > >> > > > + } > > > >> > > > + catch (Exception e) > > > >> > > > + { > > > >> > > > + ExceptionUtils.throwAsRuntimeException(e); > > > >> > > > + } > > > >> > > > + > > > >> > > > + // can't happen > > > >> > > > + return null; > > > >> > > > + } > > > >> > > > + > > > >> > > > + @Override > > > >> > > > + public void destroy(Bean<T> bean, T instance, > > > >> CreationalContext<T> > > > >> > > > creationalContext) > > > >> > > > + { > > > >> > > > + if (this.injectionTarget != null) > > > >> > > > + { > > > >> > > > + this.injectionTarget.preDestroy(instance); > > > >> > > > + } > > > >> > > > + > > > >> > > > + if (this.creationalContextOfDependentHandler != null) > > > >> > > > + { > > > >> > > > + > this.creationalContextOfDependentHandler.release(); > > > >> > > > + } > > > >> > > > + > > > >> > > > + creationalContext.release(); > > > >> > > > + } > > > >> > > > + > > > >> > > > + protected H instantiateDelegateInvocationHandler() > > > >> > > > + { > > > >> > > > + Set<Bean<H>> handlerBeans = > > > >> > > > > > > BeanProvider.getBeanDefinitions(this.delegateInvocationHandlerClass, > > > >> > > false, > > > >> > > > true); > > > >> > > > + > > > >> > > > + if (handlerBeans.size() != 1) > > > >> > > > + { > > > >> > > > + StringBuilder beanInfo = new StringBuilder(); > > > >> > > > + for (Bean<H> bean : handlerBeans) > > > >> > > > + { > > > >> > > > + if (beanInfo.length() != 0) > > > >> > > > + { > > > >> > > > + beanInfo.append(", "); > > > >> > > > + } > > > >> > > > + beanInfo.append(bean); > > > >> > > > + > > > >> > > > + if (bean instanceof PassivationCapable) > > > >> > > > + { > > > >> > > > + beanInfo.append(" bean-id: > > > >> > > > ").append(((PassivationCapable)bean).getId()); > > > >> > > > + } > > > >> > > > + } > > > >> > > > + > > > >> > > > + throw new > IllegalStateException(handlerBeans.size() > > > + " > > > >> > > beans > > > >> > > > found for " > > > >> > > > + + this.delegateInvocationHandlerClass + " > > > found > > > >> > > beans: > > > >> > > > " + beanInfo.toString()); > > > >> > > > + } > > > >> > > > + > > > >> > > > + Bean<H> handlerBean = handlerBeans.iterator().next(); > > > >> > > > + > > > >> > > > + BeanManager beanManager = > > > >> > > > BeanManagerProvider.getInstance().getBeanManager(); > > > >> > > > + CreationalContext<?> creationalContext = > > > >> > > > beanManager.createCreationalContext(handlerBean); > > > >> > > > + > > > >> > > > + H handlerInstance = (H) > > > >> beanManager.getReference(handlerBean, > > > >> > > > + this.delegateInvocationHandlerClass, > > > >> > creationalContext); > > > >> > > > + > > > >> > > > + if (handlerBean.getScope().equals(Dependent.class)) > > > >> > > > + { > > > >> > > > + this.creationalContextOfDependentHandler = > > > >> > > creationalContext; > > > >> > > > + } > > > >> > > > + > > > >> > > > + return handlerInstance; > > > >> > > > + } > > > >> > > > +} > > > >> > > > > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > http://git-wip-us.apache.org/repos/asf/deltaspike/blob/fcf4d77d/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/proxy/DeltaSpikeProxyFactory.java > > > >> > > > > > > >> > ---------------------------------------------------------------------- > > > >> > > > diff --git > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/proxy/DeltaSpikeProxyFactory.java > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/proxy/DeltaSpikeProxyFactory.java > > > >> > > > new file mode 100644 > > > >> > > > index 0000000..013733d > > > >> > > > --- /dev/null > > > >> > > > +++ > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/proxy/DeltaSpikeProxyFactory.java > > > >> > > > @@ -0,0 +1,274 @@ > > > >> > > > +/* > > > >> > > > + * Licensed to the Apache Software Foundation (ASF) under one > > > >> > > > + * or more contributor license agreements. See the NOTICE > file > > > >> > > > + * distributed with this work for additional information > > > >> > > > + * regarding copyright ownership. The ASF licenses this file > > > >> > > > + * to you under the Apache License, Version 2.0 (the > > > >> > > > + * "License"); you may not use this file except in compliance > > > >> > > > + * with the License. You may obtain a copy of the License at > > > >> > > > + * > > > >> > > > + * http://www.apache.org/licenses/LICENSE-2.0 > > > >> > > > + * > > > >> > > > + * Unless required by applicable law or agreed to in writing, > > > >> > > > + * software distributed under the License is distributed on > an > > > >> > > > + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY > > > >> > > > + * KIND, either express or implied. See the License for the > > > >> > > > + * specific language governing permissions and limitations > > > >> > > > + * under the License. > > > >> > > > + */ > > > >> > > > +package org.apache.deltaspike.core.util.proxy; > > > >> > > > + > > > >> > > > +import java.lang.annotation.Annotation; > > > >> > > > +import java.lang.reflect.InvocationHandler; > > > >> > > > +import java.lang.reflect.Method; > > > >> > > > +import java.lang.reflect.Modifier; > > > >> > > > +import java.util.ArrayList; > > > >> > > > +import java.util.Arrays; > > > >> > > > +import java.util.Iterator; > > > >> > > > +import java.util.List; > > > >> > > > +import javax.interceptor.InterceptorBinding; > > > >> > > > +import org.apache.deltaspike.core.util.ClassUtils; > > > >> > > > + > > > >> > > > +public abstract class DeltaSpikeProxyFactory > > > >> > > > +{ > > > >> > > > + private static final String SUPER_ACCESSOR_METHOD_SUFFIX > = > > > >> > "$super"; > > > >> > > > + > > > >> > > > + public <T> Class<T> getProxyClass(Class<T> targetClass, > > > >> > > > + Class<? extends InvocationHandler> > > > >> invocationHandlerClass) > > > >> > > > + { > > > >> > > > + Class<T> proxyClass = > > > >> > > > > > > >> > ClassUtils.tryToLoadClassForName(constructProxyClassName(targetClass), > > > >> > > > targetClass); > > > >> > > > + if (proxyClass == null) > > > >> > > > + { > > > >> > > > + proxyClass = > > > >> > createProxyClass(targetClass.getClassLoader(), > > > >> > > > targetClass, invocationHandlerClass); > > > >> > > > + } > > > >> > > > + > > > >> > > > + return proxyClass; > > > >> > > > + } > > > >> > > > + > > > >> > > > + private synchronized <T> Class<T> > > > createProxyClass(ClassLoader > > > >> > > > classLoader, Class<T> targetClass, > > > >> > > > + Class<? extends InvocationHandler> > > > >> invocationHandlerClass) > > > >> > > > + { > > > >> > > > + Class<T> proxyClass = > > > >> > > > > > > >> > ClassUtils.tryToLoadClassForName(constructProxyClassName(targetClass), > > > >> > > > targetClass); > > > >> > > > + if (proxyClass == null) > > > >> > > > + { > > > >> > > > + ArrayList<Method> allMethods = > > > >> > > collectAllMethods(targetClass); > > > >> > > > + ArrayList<Method> interceptMethods = > > > >> > > > filterInterceptMethods(targetClass, allMethods); > > > >> > > > + ArrayList<Method> delegateMethods = > > > >> > > > getDelegateMethods(targetClass, allMethods); > > > >> > > > + > > > >> > > > + // check if a interceptor is defined on class > > level. > > > if > > > >> > not, > > > >> > > > skip interceptor methods > > > >> > > > + if (delegateMethods != null > > > >> > > > + && interceptMethods.size() > 0 > > > >> > > > + && > > > >> > > > > > !containsInterceptorBinding(targetClass.getDeclaredAnnotations())) > > > >> > > > + { > > > >> > > > + // loop every method and check if a > interceptor > > > is > > > >> > > defined > > > >> > > > on the method -> otherwise don't proxy > > > >> > > > + Iterator<Method> iterator = > > > >> > interceptMethods.iterator(); > > > >> > > > + while (iterator.hasNext()) > > > >> > > > + { > > > >> > > > + Method method = iterator.next(); > > > >> > > > + if > > > >> > > > (!containsInterceptorBinding(method.getDeclaredAnnotations())) > > > >> > > > + { > > > >> > > > + iterator.remove(); > > > >> > > > + } > > > >> > > > + } > > > >> > > > + } > > > >> > > > + > > > >> > > > + proxyClass = > > > >> > > > AsmProxyClassGenerator.generateProxyClass(classLoader, > > > >> > > > + targetClass, > > > >> > > > + invocationHandlerClass, > > > >> > > > + getProxyClassSuffix(), > > > >> > > > + SUPER_ACCESSOR_METHOD_SUFFIX, > > > >> > > > + > > > >> getAdditionalInterfacesToImplement(targetClass), > > > >> > > > + delegateMethods == null ? new Method[0] > > > >> > > > + : delegateMethods.toArray(new > > > >> > > > Method[delegateMethods.size()]), > > > >> > > > + interceptMethods == null ? new Method[0] > > > >> > > > + : interceptMethods.toArray(new > > > >> > > > Method[interceptMethods.size()])); > > > >> > > > + } > > > >> > > > + > > > >> > > > + return proxyClass; > > > >> > > > + } > > > >> > > > + > > > >> > > > + // TODO stereotypes > > > >> > > > + protected boolean containsInterceptorBinding(Annotation[] > > > >> > > annotations) > > > >> > > > + { > > > >> > > > + for (Annotation annotation : annotations) > > > >> > > > + { > > > >> > > > + if > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > (annotation.annotationType().isAnnotationPresent(InterceptorBinding.class)) > > > >> > > > + { > > > >> > > > + return true; > > > >> > > > + } > > > >> > > > + } > > > >> > > > + > > > >> > > > + return false; > > > >> > > > + } > > > >> > > > + > > > >> > > > + protected String constructProxyClassName(Class<?> clazz) > > > >> > > > + { > > > >> > > > + return clazz.getName() + getProxyClassSuffix(); > > > >> > > > + } > > > >> > > > + > > > >> > > > + protected static String > > > constructSuperAccessorMethodName(Method > > > >> > > > method) > > > >> > > > + { > > > >> > > > + return method.getName() + > SUPER_ACCESSOR_METHOD_SUFFIX; > > > >> > > > + } > > > >> > > > + > > > >> > > > + public static Method getSuperAccessorMethod(Object proxy, > > > >> Method > > > >> > > > method) throws NoSuchMethodException > > > >> > > > + { > > > >> > > > + return proxy.getClass().getMethod( > > > >> > > > + constructSuperAccessorMethodName(method), > > > >> > > > + method.getParameterTypes()); > > > >> > > > + } > > > >> > > > + > > > >> > > > + /** > > > >> > > > + * Checks if the given class is DS proxy class. > > > >> > > > + * > > > >> > > > + * @param clazz > > > >> > > > + * @return > > > >> > > > + */ > > > >> > > > + public boolean isProxyClass(Class<?> clazz) > > > >> > > > + { > > > >> > > > + return > clazz.getName().endsWith(getProxyClassSuffix()); > > > >> > > > + } > > > >> > > > + > > > >> > > > + protected boolean hasSameSignature(Method a, Method b) > > > >> > > > + { > > > >> > > > + return a.getName().equals(b.getName()) > > > >> > > > + && > a.getReturnType().equals(b.getReturnType()) > > > >> > > > + && Arrays.equals(a.getParameterTypes(), > > > >> > > > b.getParameterTypes()); > > > >> > > > + } > > > >> > > > + > > > >> > > > + protected boolean ignoreMethod(Method method, > List<Method> > > > >> > methods) > > > >> > > > + { > > > >> > > > + // we have no interest in generics bridge methods > > > >> > > > + if (method.isBridge()) > > > >> > > > + { > > > >> > > > + return true; > > > >> > > > + } > > > >> > > > + > > > >> > > > + // we do not proxy finalize() > > > >> > > > + if ("finalize".equals(method.getName())) > > > >> > > > + { > > > >> > > > + return true; > > > >> > > > + } > > > >> > > > + > > > >> > > > + // same method... > > > >> > > > + if (methods.contains(method)) > > > >> > > > + { > > > >> > > > + return true; > > > >> > > > + } > > > >> > > > + > > > >> > > > + // check if a method with the same signature is > already > > > >> > > available > > > >> > > > + for (Method currentMethod : methods) > > > >> > > > + { > > > >> > > > + if (hasSameSignature(currentMethod, method)) > > > >> > > > + { > > > >> > > > + return true; > > > >> > > > + } > > > >> > > > + } > > > >> > > > + > > > >> > > > + return false; > > > >> > > > + } > > > >> > > > + > > > >> > > > + protected ArrayList<Method> collectAllMethods(Class<?> > > clazz) > > > >> > > > + { > > > >> > > > + ArrayList<Method> methods = new ArrayList<Method>(); > > > >> > > > + for (Method method : clazz.getDeclaredMethods()) > > > >> > > > + { > > > >> > > > + if (!ignoreMethod(method, methods)) > > > >> > > > + { > > > >> > > > + methods.add(method); > > > >> > > > + } > > > >> > > > + } > > > >> > > > + for (Method method : clazz.getMethods()) > > > >> > > > + { > > > >> > > > + if (!ignoreMethod(method, methods)) > > > >> > > > + { > > > >> > > > + methods.add(method); > > > >> > > > + } > > > >> > > > + } > > > >> > > > + > > > >> > > > + // collect methods from abstract super classes... > > > >> > > > + Class currentSuperClass = clazz.getSuperclass(); > > > >> > > > + while (currentSuperClass != null) > > > >> > > > + { > > > >> > > > + if > > > >> (Modifier.isAbstract(currentSuperClass.getModifiers())) > > > >> > > > + { > > > >> > > > + for (Method method : > > > >> > > > currentSuperClass.getDeclaredMethods()) > > > >> > > > + { > > > >> > > > + if (!ignoreMethod(method, methods)) > > > >> > > > + { > > > >> > > > + methods.add(method); > > > >> > > > + } > > > >> > > > + } > > > >> > > > + for (Method method : > > > >> currentSuperClass.getMethods()) > > > >> > > > + { > > > >> > > > + if (!ignoreMethod(method, methods)) > > > >> > > > + { > > > >> > > > + methods.add(method); > > > >> > > > + } > > > >> > > > + } > > > >> > > > + } > > > >> > > > + currentSuperClass = > > > currentSuperClass.getSuperclass(); > > > >> > > > + } > > > >> > > > + > > > >> > > > + // sort out somewhere implemented abstract methods > > > >> > > > + Class currentClass = clazz; > > > >> > > > + while (currentClass != null) > > > >> > > > + { > > > >> > > > + Iterator<Method> methodIterator = > > methods.iterator(); > > > >> > > > + while (methodIterator.hasNext()) > > > >> > > > + { > > > >> > > > + Method method = methodIterator.next(); > > > >> > > > + if > (Modifier.isAbstract(method.getModifiers())) > > > >> > > > + { > > > >> > > > + try > > > >> > > > + { > > > >> > > > + Method foundMethod = > > > >> > > > currentClass.getMethod(method.getName(), > > > >> method.getParameterTypes()); > > > >> > > > + // if method is implementent in the > > > current > > > >> > > class > > > >> > > > -> remove it > > > >> > > > + if (foundMethod != null && > > > >> > > > !Modifier.isAbstract(foundMethod.getModifiers())) > > > >> > > > + { > > > >> > > > + methodIterator.remove(); > > > >> > > > + } > > > >> > > > + } > > > >> > > > + catch (Exception e) > > > >> > > > + { > > > >> > > > + // ignore... > > > >> > > > + } > > > >> > > > + } > > > >> > > > + } > > > >> > > > + > > > >> > > > + currentClass = currentClass.getSuperclass(); > > > >> > > > + } > > > >> > > > + > > > >> > > > + return methods; > > > >> > > > + } > > > >> > > > + > > > >> > > > + protected ArrayList<Method> > filterInterceptMethods(Class<?> > > > >> > > > targetClass, ArrayList<Method> allMethods) > > > >> > > > + { > > > >> > > > + ArrayList<Method> methods = new ArrayList<Method>(); > > > >> > > > + > > > >> > > > + Iterator<Method> it = allMethods.iterator(); > > > >> > > > + while (it.hasNext()) > > > >> > > > + { > > > >> > > > + Method method = it.next(); > > > >> > > > + > > > >> > > > + if (Modifier.isPublic(method.getModifiers()) > > > >> > > > + && > !Modifier.isFinal(method.getModifiers()) > > > >> > > > + && > > > !Modifier.isAbstract(method.getModifiers())) > > > >> > > > + { > > > >> > > > + methods.add(method); > > > >> > > > + } > > > >> > > > + } > > > >> > > > + > > > >> > > > + return methods; > > > >> > > > + } > > > >> > > > + > > > >> > > > + protected Class<?>[] > > > >> getAdditionalInterfacesToImplement(Class<?> > > > >> > > > targetClass) > > > >> > > > + { > > > >> > > > + return null; > > > >> > > > + } > > > >> > > > + > > > >> > > > + protected abstract ArrayList<Method> > > > >> getDelegateMethods(Class<?> > > > >> > > > targetClass, ArrayList<Method> allMethods); > > > >> > > > + > > > >> > > > + protected abstract String getProxyClassSuffix(); > > > >> > > > +} > > > >> > > > + > > > >> > > > > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > http://git-wip-us.apache.org/repos/asf/deltaspike/blob/fcf4d77d/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/proxy/invocation/DelegateManualInvocationHandler.java > > > >> > > > > > > >> > ---------------------------------------------------------------------- > > > >> > > > diff --git > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/proxy/invocation/DelegateManualInvocationHandler.java > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/proxy/invocation/DelegateManualInvocationHandler.java > > > >> > > > new file mode 100644 > > > >> > > > index 0000000..7a00819 > > > >> > > > --- /dev/null > > > >> > > > +++ > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/proxy/invocation/DelegateManualInvocationHandler.java > > > >> > > > @@ -0,0 +1,43 @@ > > > >> > > > +/* > > > >> > > > + * Licensed to the Apache Software Foundation (ASF) under one > > > >> > > > + * or more contributor license agreements. See the NOTICE > file > > > >> > > > + * distributed with this work for additional information > > > >> > > > + * regarding copyright ownership. The ASF licenses this file > > > >> > > > + * to you under the Apache License, Version 2.0 (the > > > >> > > > + * "License"); you may not use this file except in compliance > > > >> > > > + * with the License. You may obtain a copy of the License at > > > >> > > > + * > > > >> > > > + * http://www.apache.org/licenses/LICENSE-2.0 > > > >> > > > + * > > > >> > > > + * Unless required by applicable law or agreed to in writing, > > > >> > > > + * software distributed under the License is distributed on > an > > > >> > > > + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY > > > >> > > > + * KIND, either express or implied. See the License for the > > > >> > > > + * specific language governing permissions and limitations > > > >> > > > + * under the License. > > > >> > > > + */ > > > >> > > > +package org.apache.deltaspike.core.util.proxy.invocation; > > > >> > > > + > > > >> > > > +import java.lang.reflect.InvocationHandler; > > > >> > > > +import java.lang.reflect.Method; > > > >> > > > +import javax.enterprise.inject.Typed; > > > >> > > > +import > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > org.apache.deltaspike.core.util.invocation.AbstractManualInvocationHandler; > > > >> > > > +import org.apache.deltaspike.core.util.proxy.DeltaSpikeProxy; > > > >> > > > + > > > >> > > > +@Typed > > > >> > > > +public class DelegateManualInvocationHandler extends > > > >> > > > AbstractManualInvocationHandler > > > >> > > > +{ > > > >> > > > + private static final DelegateManualInvocationHandler > > > INSTANCE = > > > >> > new > > > >> > > > DelegateManualInvocationHandler(); > > > >> > > > + > > > >> > > > + public static Object staticInvoke(Object proxy, Method > > > method, > > > >> > > > Object[] parameters) throws Throwable > > > >> > > > + { > > > >> > > > + return INSTANCE.invoke(proxy, method, parameters); > > > >> > > > + } > > > >> > > > + > > > >> > > > + @Override > > > >> > > > + protected Object proceedOriginal(Object proxy, Method > > method, > > > >> > > Object[] > > > >> > > > parameters) throws Throwable > > > >> > > > + { > > > >> > > > + InvocationHandler delegateInvocationHandler = > > > >> > ((DeltaSpikeProxy) > > > >> > > > proxy).getDelegateInvocationHandler(); > > > >> > > > + return delegateInvocationHandler.invoke(proxy, > method, > > > >> > > > parameters); > > > >> > > > + } > > > >> > > > +} > > > >> > > > > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > http://git-wip-us.apache.org/repos/asf/deltaspike/blob/fcf4d77d/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/proxy/invocation/InterceptManualInvocationHandler.java > > > >> > > > > > > >> > ---------------------------------------------------------------------- > > > >> > > > diff --git > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/proxy/invocation/InterceptManualInvocationHandler.java > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/proxy/invocation/InterceptManualInvocationHandler.java > > > >> > > > new file mode 100644 > > > >> > > > index 0000000..77af318 > > > >> > > > --- /dev/null > > > >> > > > +++ > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/proxy/invocation/InterceptManualInvocationHandler.java > > > >> > > > @@ -0,0 +1,51 @@ > > > >> > > > +/* > > > >> > > > + * Licensed to the Apache Software Foundation (ASF) under one > > > >> > > > + * or more contributor license agreements. See the NOTICE > file > > > >> > > > + * distributed with this work for additional information > > > >> > > > + * regarding copyright ownership. The ASF licenses this file > > > >> > > > + * to you under the Apache License, Version 2.0 (the > > > >> > > > + * "License"); you may not use this file except in compliance > > > >> > > > + * with the License. You may obtain a copy of the License at > > > >> > > > + * > > > >> > > > + * http://www.apache.org/licenses/LICENSE-2.0 > > > >> > > > + * > > > >> > > > + * Unless required by applicable law or agreed to in writing, > > > >> > > > + * software distributed under the License is distributed on > an > > > >> > > > + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY > > > >> > > > + * KIND, either express or implied. See the License for the > > > >> > > > + * specific language governing permissions and limitations > > > >> > > > + * under the License. > > > >> > > > + */ > > > >> > > > +package org.apache.deltaspike.core.util.proxy.invocation; > > > >> > > > + > > > >> > > > +import java.lang.reflect.InvocationTargetException; > > > >> > > > +import java.lang.reflect.Method; > > > >> > > > +import javax.enterprise.inject.Typed; > > > >> > > > +import > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > org.apache.deltaspike.core.util.invocation.AbstractManualInvocationHandler; > > > >> > > > +import > > > >> org.apache.deltaspike.core.util.proxy.DeltaSpikeProxyFactory; > > > >> > > > + > > > >> > > > +@Typed > > > >> > > > +public class InterceptManualInvocationHandler extends > > > >> > > > AbstractManualInvocationHandler > > > >> > > > +{ > > > >> > > > + private static final InterceptManualInvocationHandler > > > INSTANCE > > > >> = > > > >> > new > > > >> > > > InterceptManualInvocationHandler(); > > > >> > > > + > > > >> > > > + public static Object staticInvoke(Object proxy, Method > > > method, > > > >> > > > Object[] parameters) throws Throwable > > > >> > > > + { > > > >> > > > + return INSTANCE.invoke(proxy, method, parameters); > > > >> > > > + } > > > >> > > > + > > > >> > > > + @Override > > > >> > > > + protected Object proceedOriginal(Object proxy, Method > > method, > > > >> > > Object[] > > > >> > > > parameters) throws Throwable > > > >> > > > + { > > > >> > > > + try > > > >> > > > + { > > > >> > > > + Method superAccessorMethod = > > > >> > > > DeltaSpikeProxyFactory.getSuperAccessorMethod(proxy, method); > > > >> > > > + return superAccessorMethod.invoke(proxy, > > parameters); > > > >> > > > + } > > > >> > > > + catch (InvocationTargetException e) > > > >> > > > + { > > > >> > > > + // rethrow original exception > > > >> > > > + throw e.getCause(); > > > >> > > > + } > > > >> > > > + } > > > >> > > > +} > > > >> > > > > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > http://git-wip-us.apache.org/repos/asf/deltaspike/blob/fcf4d77d/deltaspike/modules/jsf/impl/pom.xml > > > >> > > > > > > >> > ---------------------------------------------------------------------- > > > >> > > > diff --git a/deltaspike/modules/jsf/impl/pom.xml > > > >> > > > b/deltaspike/modules/jsf/impl/pom.xml > > > >> > > > index 0622730..b31dba3 100644 > > > >> > > > --- a/deltaspike/modules/jsf/impl/pom.xml > > > >> > > > +++ b/deltaspike/modules/jsf/impl/pom.xml > > > >> > > > @@ -141,12 +141,6 @@ > > > >> > > > <type>pom</type> > > > >> > > > <scope>test</scope> > > > >> > > > </dependency> > > > >> > > > - <dependency> > > > >> > > > - <groupId>org.javassist</groupId> > > > >> > > > - <artifactId>javassist</artifactId> > > > >> > > > - <version>3.18.2-GA</version> > > > >> > > > - <scope>test</scope> > > > >> > > > - </dependency> > > > >> > > > </dependencies> > > > >> > > > > > > >> > > > > > > >> > > > > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > http://git-wip-us.apache.org/repos/asf/deltaspike/blob/fcf4d77d/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/injection/InjectionAwareApplicationWrapper.java > > > >> > > > > > > >> > ---------------------------------------------------------------------- > > > >> > > > diff --git > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > a/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/injection/InjectionAwareApplicationWrapper.java > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > b/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/injection/InjectionAwareApplicationWrapper.java > > > >> > > > index a229f3d..928a6de 100644 > > > >> > > > --- > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > a/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/injection/InjectionAwareApplicationWrapper.java > > > >> > > > +++ > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > b/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/injection/InjectionAwareApplicationWrapper.java > > > >> > > > @@ -20,7 +20,6 @@ package > > > org.apache.deltaspike.jsf.impl.injection; > > > >> > > > > > > >> > > > import org.apache.deltaspike.core.util.ProxyUtils; > > > >> > > > import org.apache.deltaspike.jsf.api.config.JsfModuleConfig; > > > >> > > > -import > > > org.apache.deltaspike.jsf.impl.injection.proxy.ProxyMarker; > > > >> > > > import > > > >> > org.apache.deltaspike.jsf.impl.security.SecurityAwareViewHandler; > > > >> > > > > > > >> > > > import javax.faces.FacesException; > > > >> > > > @@ -31,6 +30,7 @@ import javax.faces.convert.Converter; > > > >> > > > import javax.faces.event.PreDestroyViewMapEvent; > > > >> > > > import javax.faces.event.SystemEvent; > > > >> > > > import javax.faces.validator.Validator; > > > >> > > > +import org.apache.deltaspike.core.util.proxy.DeltaSpikeProxy; > > > >> > > > > > > >> > > > public class InjectionAwareApplicationWrapper extends > > > >> > ApplicationWrapper > > > >> > > > { > > > >> > > > @@ -80,7 +80,7 @@ public class > InjectionAwareApplicationWrapper > > > >> extends > > > >> > > > ApplicationWrapper > > > >> > > > return defaultResult; > > > >> > > > } > > > >> > > > > > > >> > > > - if (result instanceof ProxyMarker || > > > >> > > > ProxyUtils.isProxiedClass(result.getClass())) > > > >> > > > + if (result instanceof DeltaSpikeProxy || > > > >> > > > ProxyUtils.isProxiedClass(result.getClass())) > > > >> > > > { > > > >> > > > return result; > > > >> > > > } > > > >> > > > @@ -114,7 +114,7 @@ public class > > InjectionAwareApplicationWrapper > > > >> > extends > > > >> > > > ApplicationWrapper > > > >> > > > return defaultResult; > > > >> > > > } > > > >> > > > > > > >> > > > - if (result instanceof ProxyMarker || > > > >> > > > ProxyUtils.isProxiedClass(result.getClass())) > > > >> > > > + if (result instanceof DeltaSpikeProxy || > > > >> > > > ProxyUtils.isProxiedClass(result.getClass())) > > > >> > > > { > > > >> > > > return result; > > > >> > > > } > > > >> > > > > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > http://git-wip-us.apache.org/repos/asf/deltaspike/blob/fcf4d77d/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/injection/proxy/ConverterAndValidatorLifecycle.java > > > >> > > > > > > >> > ---------------------------------------------------------------------- > > > >> > > > diff --git > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > a/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/injection/proxy/ConverterAndValidatorLifecycle.java > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > b/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/injection/proxy/ConverterAndValidatorLifecycle.java > > > >> > > > deleted file mode 100644 > > > >> > > > index 90a3e6e..0000000 > > > >> > > > --- > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > a/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/injection/proxy/ConverterAndValidatorLifecycle.java > > > >> > > > +++ /dev/null > > > >> > > > @@ -1,132 +0,0 @@ > > > >> > > > -/* > > > >> > > > - * Licensed to the Apache Software Foundation (ASF) under one > > > >> > > > - * or more contributor license agreements. See the NOTICE > file > > > >> > > > - * distributed with this work for additional information > > > >> > > > - * regarding copyright ownership. The ASF licenses this file > > > >> > > > - * to you under the Apache License, Version 2.0 (the > > > >> > > > - * "License"); you may not use this file except in compliance > > > >> > > > - * with the License. You may obtain a copy of the License at > > > >> > > > - * > > > >> > > > - * http://www.apache.org/licenses/LICENSE-2.0 > > > >> > > > - * > > > >> > > > - * Unless required by applicable law or agreed to in writing, > > > >> > > > - * software distributed under the License is distributed on > an > > > >> > > > - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY > > > >> > > > - * KIND, either express or implied. See the License for the > > > >> > > > - * specific language governing permissions and limitations > > > >> > > > - * under the License. > > > >> > > > - */ > > > >> > > > -package org.apache.deltaspike.jsf.impl.injection.proxy; > > > >> > > > - > > > >> > > > -import org.apache.deltaspike.core.util.ClassUtils; > > > >> > > > -import org.apache.deltaspike.core.util.ExceptionUtils; > > > >> > > > -import > > > >> > > > > > > >> > org.apache.deltaspike.core.util.metadata.builder.AnnotatedTypeBuilder; > > > >> > > > -import > > > >> > > > > > > >> > org.apache.deltaspike.core.util.metadata.builder.ContextualLifecycle; > > > >> > > > - > > > >> > > > -import javax.enterprise.context.spi.CreationalContext; > > > >> > > > -import javax.enterprise.inject.spi.Bean; > > > >> > > > -import javax.enterprise.inject.spi.BeanManager; > > > >> > > > -import javax.enterprise.inject.spi.InjectionTarget; > > > >> > > > -import javax.faces.component.PartialStateHolder; > > > >> > > > -import java.lang.reflect.InvocationHandler; > > > >> > > > -import java.lang.reflect.Method; > > > >> > > > -import java.lang.reflect.Proxy; > > > >> > > > -import java.util.ArrayList; > > > >> > > > -import java.util.Collections; > > > >> > > > -import java.util.List; > > > >> > > > - > > > >> > > > -class ConverterAndValidatorLifecycle<T, H extends > > > >> InvocationHandler> > > > >> > > > implements ContextualLifecycle<T> > > > >> > > > -{ > > > >> > > > - private final Class<? extends T> generatedProxyClass; > > > >> > > > - > > > >> > > > - private final InjectionTarget<T> > > > >> injectionTargetForGeneratedProxy; > > > >> > > > - private final Class<H> handlerClass; > > > >> > > > - > > > >> > > > - ConverterAndValidatorLifecycle(Class<T> originalClass, > > > Class<H> > > > >> > > > handlerClass, BeanManager beanManager) > > > >> > > > - { > > > >> > > > - this.handlerClass = handlerClass; > > > >> > > > - > > > >> > > > - AnnotatedTypeBuilder<T> typeBuilder = new > > > >> > > > AnnotatedTypeBuilder<T>().readFromType(originalClass); > > > >> > > > - this.injectionTargetForGeneratedProxy = > > > >> > > > beanManager.createInjectionTarget(typeBuilder.create()); > > > >> > > > - > > > >> > > > - try > > > >> > > > - { > > > >> > > > - Object proxyFactory = > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > ClassUtils.tryToInstantiateClassForName("javassist.util.proxy.ProxyFactory"); > > > >> > > > - > > > >> > > > - Method setSuperclassMethod = > > > >> > > > proxyFactory.getClass().getDeclaredMethod("setSuperclass", > > > >> > Class.class); > > > >> > > > - setSuperclassMethod.invoke(proxyFactory, > > > >> originalClass); > > > >> > > > - > > > >> > > > - List<Class> interfaces = new ArrayList<Class>(); > > > >> > > > - Collections.addAll(interfaces, > > > >> > > originalClass.getInterfaces()); > > > >> > > > - interfaces.add(ProxyMarker.class); > > > >> > > > - > > > >> > > > - if > (!interfaces.contains(PartialStateHolder.class)) > > > >> > > > - { > > > >> > > > - interfaces.add(PartialStateHolder.class); > > > >> > > > - } > > > >> > > > - > > > >> > > > - Method method = > > > >> > > > proxyFactory.getClass().getMethod("setInterfaces", new > > Class[]{new > > > >> > > > Class[]{}.getClass()}); > > > >> > > > - method.invoke(proxyFactory, new Object[] > > > >> > > > {interfaces.toArray(new Class[interfaces.size()])}); > > > >> > > > - > > > >> > > > - Method createClassMethod = > > > >> > > > proxyFactory.getClass().getDeclaredMethod("createClass"); > > > >> > > > - > > > >> > > > - this.generatedProxyClass = ((Class<?>) > > > >> > > > > > createClassMethod.invoke(proxyFactory)).asSubclass(originalClass); > > > >> > > > - } > > > >> > > > - catch (Exception e) > > > >> > > > - { > > > >> > > > - throw ExceptionUtils.throwAsRuntimeException(e); > > > >> > > > - } > > > >> > > > - } > > > >> > > > - > > > >> > > > - public T create(Bean bean, CreationalContext > > > creationalContext) > > > >> > > > - { > > > >> > > > - try > > > >> > > > - { > > > >> > > > - H handlerInstance = > > > >> > > > ClassUtils.tryToInstantiateClass(this.handlerClass); > > > >> > > > - T instance = > createProxyInstance(handlerInstance); > > > >> > > > - > > > >> > > > - if (this.injectionTargetForGeneratedProxy != > null) > > > >> > > > - { > > > >> > > > - > > > >> this.injectionTargetForGeneratedProxy.inject(instance, > > > >> > > > creationalContext); > > > >> > > > - > > > >> > > > this.injectionTargetForGeneratedProxy.postConstruct(instance); > > > >> > > > - } > > > >> > > > - > > > >> > > > - return instance; > > > >> > > > - } > > > >> > > > - catch (Exception e) > > > >> > > > - { > > > >> > > > - ExceptionUtils.throwAsRuntimeException(e); > > > >> > > > - } > > > >> > > > - //can't happen > > > >> > > > - return null; > > > >> > > > - } > > > >> > > > - > > > >> > > > - private T createProxyInstance(H handlerInstance) throws > > > >> Exception > > > >> > > > - { > > > >> > > > - T instance = this.generatedProxyClass.newInstance(); > > > >> > > > - > > > >> > > > - Class methodHandlerClass = > > > >> > > > > > > >> > > ClassUtils.tryToLoadClassForName("javassist.util.proxy.MethodHandler"); > > > >> > > > - Method setHandlerMethod = > > > >> > > > > > > ClassUtils.tryToLoadClassForName("javassist.util.proxy.ProxyObject") > > > >> > > > - .getDeclaredMethod("setHandler", > > methodHandlerClass); > > > >> > > > - > > > >> > > > - > > > >> > > > - MethodHandlerProxy methodHandlerProxy = new > > > >> > > MethodHandlerProxy(); > > > >> > > > - methodHandlerProxy.setDelegatingMethodHandler(new > > > >> > > > DelegatingMethodHandler<H>(handlerInstance)); > > > >> > > > - > > > >> > > > - Object methodHandler = Proxy.newProxyInstance( > > > >> > > > - ClassUtils.getClassLoader(this), new > > > >> > > > Class[]{methodHandlerClass}, methodHandlerProxy); > > > >> > > > - > > > >> > > > - setHandlerMethod.invoke(instance, methodHandler); > > > >> > > > - return instance; > > > >> > > > - } > > > >> > > > - > > > >> > > > - public void destroy(Bean<T> bean, T instance, > > > >> CreationalContext<T> > > > >> > > > creationalContext) > > > >> > > > - { > > > >> > > > - if (this.injectionTargetForGeneratedProxy != null) > > > >> > > > - { > > > >> > > > - > > > >> > this.injectionTargetForGeneratedProxy.preDestroy(instance); > > > >> > > > - } > > > >> > > > - > > > >> > > > - creationalContext.release(); > > > >> > > > - } > > > >> > > > -} > > > >> > > > > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > http://git-wip-us.apache.org/repos/asf/deltaspike/blob/fcf4d77d/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/injection/proxy/ConverterAndValidatorProxyExtension.java > > > >> > > > > > > >> > ---------------------------------------------------------------------- > > > >> > > > diff --git > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > a/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/injection/proxy/ConverterAndValidatorProxyExtension.java > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > b/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/injection/proxy/ConverterAndValidatorProxyExtension.java > > > >> > > > index ea78ab8..1baca10 100644 > > > >> > > > --- > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > a/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/injection/proxy/ConverterAndValidatorProxyExtension.java > > > >> > > > +++ > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > b/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/injection/proxy/ConverterAndValidatorProxyExtension.java > > > >> > > > @@ -20,7 +20,6 @@ package > > > >> > org.apache.deltaspike.jsf.impl.injection.proxy; > > > >> > > > > > > >> > > > import > org.apache.deltaspike.core.spi.activation.Deactivatable; > > > >> > > > import > org.apache.deltaspike.core.util.ClassDeactivationUtils; > > > >> > > > -import org.apache.deltaspike.core.util.ClassUtils; > > > >> > > > import org.apache.deltaspike.core.util.bean.BeanBuilder; > > > >> > > > import > > > >> > > > > > > >> > org.apache.deltaspike.core.util.metadata.builder.AnnotatedTypeBuilder; > > > >> > > > > > > >> > > > @@ -41,6 +40,7 @@ import java.lang.reflect.Modifier; > > > >> > > > import java.util.HashSet; > > > >> > > > import java.util.Set; > > > >> > > > import java.util.logging.Logger; > > > >> > > > +import > > > >> > > > > > > >> > > > > >> > > > > org.apache.deltaspike.core.util.proxy.DeltaSpikeProxyContextualLifecycle; > > > >> > > > > > > >> > > > public class ConverterAndValidatorProxyExtension implements > > > >> Extension, > > > >> > > > Deactivatable > > > >> > > > { > > > >> > > > @@ -84,15 +84,6 @@ public class > > > ConverterAndValidatorProxyExtension > > > >> > > > implements Extension, Deactivat > > > >> > > > return; > > > >> > > > } > > > >> > > > > > > >> > > > - Object proxyFactory = > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > ClassUtils.tryToInstantiateClassForName("javassist.util.proxy.ProxyFactory"); > > > >> > > > - > > > >> > > > - if (proxyFactory == null) > > > >> > > > - { > > > >> > > > - LOG.warning("To use dependency-injection in > > > >> > > > converters/validators with properties, " + > > > >> > > > - "you have to add javassist to the > > application."); > > > >> > > > - return; > > > >> > > > - } > > > >> > > > - > > > >> > > > if (!(Modifier.isFinal(beanClass.getModifiers()))) > > > >> > > > { > > > >> > > > this.classesToProxy.add(beanClass); > > > >> > > > @@ -146,7 +137,6 @@ public class > > > ConverterAndValidatorProxyExtension > > > >> > > > implements Extension, Deactivat > > > >> > > > return false; > > > >> > > > } > > > >> > > > > > > >> > > > - @SuppressWarnings("UnusedDeclaration") > > > >> > > > public <X> void createBeans(@Observes AfterBeanDiscovery > > > >> > > > afterBeanDiscovery, BeanManager beanManager) > > > >> > > > { > > > >> > > > if (!this.isActivated) > > > >> > > > @@ -175,14 +165,13 @@ public class > > > >> ConverterAndValidatorProxyExtension > > > >> > > > implements Extension, Deactivat > > > >> > > > > > > >> > > > AnnotatedType<T> annotatedType = new > > > >> > > > AnnotatedTypeBuilder<T>().readFromType(beanClass).create(); > > > >> > > > > > > >> > > > - ConverterAndValidatorLifecycle beanLifecycle = > > > >> > > > - new ConverterAndValidatorLifecycle(beanClass, > > > >> > > > invocationHandlerClass, beanManager); > > > >> > > > + DeltaSpikeProxyContextualLifecycle lifecycle = new > > > >> > > > DeltaSpikeProxyContextualLifecycle(beanClass, > > > >> > > > + invocationHandlerClass, > > > >> > > > ConverterAndValidatorProxyFactory.getInstance(), beanManager); > > > >> > > > > > > >> > > > BeanBuilder<T> beanBuilder = new > > > >> BeanBuilder<T>(beanManager) > > > >> > > > .readFromType(annotatedType) > > > >> > > > .passivationCapable(true) > > > >> > > > - .beanLifecycle(beanLifecycle) > > > >> > > > - .addType(ProxyMarker.class); > > > >> > > > + .beanLifecycle(lifecycle); > > > >> > > > > > > >> > > > return beanBuilder.create(); > > > >> > > > } > > > >> > > > > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > http://git-wip-us.apache.org/repos/asf/deltaspike/blob/fcf4d77d/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/injection/proxy/ConverterAndValidatorProxyFactory.java > > > >> > > > > > > >> > ---------------------------------------------------------------------- > > > >> > > > diff --git > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > a/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/injection/proxy/ConverterAndValidatorProxyFactory.java > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > b/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/injection/proxy/ConverterAndValidatorProxyFactory.java > > > >> > > > new file mode 100644 > > > >> > > > index 0000000..aff0bb6 > > > >> > > > --- /dev/null > > > >> > > > +++ > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > b/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/injection/proxy/ConverterAndValidatorProxyFactory.java > > > >> > > > @@ -0,0 +1,78 @@ > > > >> > > > +/* > > > >> > > > + * Licensed to the Apache Software Foundation (ASF) under one > > > >> > > > + * or more contributor license agreements. See the NOTICE > file > > > >> > > > + * distributed with this work for additional information > > > >> > > > + * regarding copyright ownership. The ASF licenses this file > > > >> > > > + * to you under the Apache License, Version 2.0 (the > > > >> > > > + * "License"); you may not use this file except in compliance > > > >> > > > + * with the License. You may obtain a copy of the License at > > > >> > > > + * > > > >> > > > + * http://www.apache.org/licenses/LICENSE-2.0 > > > >> > > > + * > > > >> > > > + * Unless required by applicable law or agreed to in writing, > > > >> > > > + * software distributed under the License is distributed on > an > > > >> > > > + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY > > > >> > > > + * KIND, either express or implied. See the License for the > > > >> > > > + * specific language governing permissions and limitations > > > >> > > > + * under the License. > > > >> > > > + */ > > > >> > > > +package org.apache.deltaspike.jsf.impl.injection.proxy; > > > >> > > > + > > > >> > > > +import java.lang.reflect.Method; > > > >> > > > +import java.util.ArrayList; > > > >> > > > +import java.util.Arrays; > > > >> > > > +import java.util.List; > > > >> > > > +import javax.enterprise.inject.Typed; > > > >> > > > +import javax.faces.component.PartialStateHolder; > > > >> > > > +import javax.faces.component.StateHolder; > > > >> > > > +import > > > >> org.apache.deltaspike.core.util.proxy.DeltaSpikeProxyFactory; > > > >> > > > + > > > >> > > > +@Typed > > > >> > > > +public class ConverterAndValidatorProxyFactory extends > > > >> > > > DeltaSpikeProxyFactory > > > >> > > > +{ > > > >> > > > + private static final ConverterAndValidatorProxyFactory > > > >> INSTANCE = > > > >> > > new > > > >> > > > ConverterAndValidatorProxyFactory(); > > > >> > > > + > > > >> > > > + public static ConverterAndValidatorProxyFactory > > getInstance() > > > >> > > > + { > > > >> > > > + return INSTANCE; > > > >> > > > + } > > > >> > > > + > > > >> > > > + @Override > > > >> > > > + protected String getProxyClassSuffix() > > > >> > > > + { > > > >> > > > + return "$$DSJsfProxy"; > > > >> > > > + } > > > >> > > > + > > > >> > > > + @Override > > > >> > > > + protected ArrayList<Method> getDelegateMethods(Class<?> > > > >> > targetClass, > > > >> > > > ArrayList<Method> allMethods) > > > >> > > > + { > > > >> > > > + List<Class<?>> interfaces = > > > >> > > > Arrays.asList(targetClass.getInterfaces()); > > > >> > > > + if (!interfaces.contains(PartialStateHolder.class)) > > > >> > > > + { > > > >> > > > + ArrayList<Method> delegateMethods = new > > > >> > ArrayList<Method>(); > > > >> > > > + > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > delegateMethods.addAll(Arrays.asList(PartialStateHolder.class.getDeclaredMethods())); > > > >> > > > + > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > delegateMethods.addAll(Arrays.asList(StateHolder.class.getDeclaredMethods())); > > > >> > > > + return delegateMethods; > > > >> > > > + } > > > >> > > > + if (!interfaces.contains(StateHolder.class)) > > > >> > > > + { > > > >> > > > + ArrayList<Method> delegateMethods = new > > > >> > ArrayList<Method>(); > > > >> > > > + > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > delegateMethods.addAll(Arrays.asList(StateHolder.class.getDeclaredMethods())); > > > >> > > > + return delegateMethods; > > > >> > > > + } > > > >> > > > + > > > >> > > > + return null; > > > >> > > > + } > > > >> > > > + > > > >> > > > + @Override > > > >> > > > + protected Class<?>[] > > > >> getAdditionalInterfacesToImplement(Class<?> > > > >> > > > targetClass) > > > >> > > > + { > > > >> > > > + List<Class<?>> interfaces = > > > >> > > > Arrays.asList(targetClass.getInterfaces()); > > > >> > > > + if (!interfaces.contains(PartialStateHolder.class)) > > > >> > > > + { > > > >> > > > + return new Class<?>[] { PartialStateHolder.class > }; > > > >> > > > + } > > > >> > > > + > > > >> > > > + return null; > > > >> > > > + } > > > >> > > > +} > > > >> > > > > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > http://git-wip-us.apache.org/repos/asf/deltaspike/blob/fcf4d77d/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/injection/proxy/ConverterInvocationHandler.java > > > >> > > > > > > >> > ---------------------------------------------------------------------- > > > >> > > > diff --git > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > a/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/injection/proxy/ConverterInvocationHandler.java > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > b/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/injection/proxy/ConverterInvocationHandler.java > > > >> > > > index 6bf457c..ab42e5a 100644 > > > >> > > > --- > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > a/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/injection/proxy/ConverterInvocationHandler.java > > > >> > > > +++ > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > b/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/injection/proxy/ConverterInvocationHandler.java > > > >> > > > @@ -18,7 +18,6 @@ > > > >> > > > */ > > > >> > > > package org.apache.deltaspike.jsf.impl.injection.proxy; > > > >> > > > > > > >> > > > -import javax.faces.component.PartialStateHolder; > > > >> > > > import java.lang.reflect.InvocationHandler; > > > >> > > > import java.lang.reflect.Method; > > > >> > > > > > > >> > > > @@ -29,15 +28,7 @@ public class ConverterInvocationHandler > > > >> implements > > > >> > > > InvocationHandler > > > >> > > > @Override > > > >> > > > public Object invoke(Object proxy, Method method, > Object[] > > > >> args) > > > >> > > > throws Throwable > > > >> > > > { > > > >> > > > - // if the original class implements > PartialStateHolder > > > >> > already, > > > >> > > we > > > >> > > > won't get in here > > > >> > > > - if > > > >> > (PartialStateHolder.class.equals(method.getDeclaringClass())) > > > >> > > > - { > > > >> > > > - return method.invoke(defaultPartialStateHolder, > > > args); > > > >> > > > - } > > > >> > > > - else > > > >> > > > - { > > > >> > > > - //shouldn't happen,... > > >