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