+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 >