@romain: with an own module you have enough flexibility. regards, gerhard
2015-03-15 21:56 GMT+01:00 Romain Manni-Bucau <[email protected]>: > 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" <[email protected]> > a > écrit : > > > javassist is about 600kb and the user needs to manage it > > > > 2015-03-15 21:48 GMT+01:00 Thomas Andraschko < > [email protected] > > >: > > > > > 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 <[email protected]>: > > > > > >> 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" <[email protected] > > > > 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 < > > >> [email protected] > > >> > >: > > >> > > > >> > > +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 < > > [email protected] > > >> >: > > >> > > > > >> > > > 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: <[email protected]> > > >> > > > Date: 2015-03-15 20:50 GMT+01:00 > > >> > > > Subject: [2/2] deltaspike git commit: DELTASPIKE-851 move > > >> > proxy-handling > > >> > > to > > >> > > > ds-core > > >> > > > To: [email protected] > > >> > > > > > >> > > > > > >> > > > 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 <[email protected]> > > >> > > > Authored: Sun Mar 15 20:50:24 2015 +0100 > > >> > > > Committer: Thomas Andraschko <[email protected]> > > >> > > > 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,... >
