Repository: deltaspike Updated Branches: refs/heads/master d3a21c0fd -> fcf4d77d6
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/fcf4d77d/deltaspike/modules/partial-bean/impl/pom.xml ---------------------------------------------------------------------- diff --git a/deltaspike/modules/partial-bean/impl/pom.xml b/deltaspike/modules/partial-bean/impl/pom.xml index 6fdf84e..c0d1f00 100644 --- a/deltaspike/modules/partial-bean/impl/pom.xml +++ b/deltaspike/modules/partial-bean/impl/pom.xml @@ -48,43 +48,6 @@ </deltaspike.osgi.provide.capability> </properties> - - <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.partialbean.impl.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> - <dependencies> <dependency> <groupId>org.apache.deltaspike.core</groupId> @@ -95,24 +58,5 @@ <groupId>org.apache.deltaspike.modules</groupId> <artifactId>deltaspike-partial-bean-module-api</artifactId> </dependency> - - <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/modules/partial-bean/impl/src/main/java/org/apache/deltaspike/partialbean/impl/PartialBeanBindingExtension.java ---------------------------------------------------------------------- diff --git a/deltaspike/modules/partial-bean/impl/src/main/java/org/apache/deltaspike/partialbean/impl/PartialBeanBindingExtension.java b/deltaspike/modules/partial-bean/impl/src/main/java/org/apache/deltaspike/partialbean/impl/PartialBeanBindingExtension.java index 6a3841c..399f4f3 100644 --- a/deltaspike/modules/partial-bean/impl/src/main/java/org/apache/deltaspike/partialbean/impl/PartialBeanBindingExtension.java +++ b/deltaspike/modules/partial-bean/impl/src/main/java/org/apache/deltaspike/partialbean/impl/PartialBeanBindingExtension.java @@ -18,7 +18,6 @@ */ package org.apache.deltaspike.partialbean.impl; -import org.apache.deltaspike.partialbean.impl.proxy.PartialBeanProxyFactory; import java.lang.annotation.Annotation; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Modifier; @@ -36,6 +35,7 @@ import org.apache.deltaspike.core.spi.activation.Deactivatable; import org.apache.deltaspike.core.util.ClassDeactivationUtils; import org.apache.deltaspike.core.util.bean.BeanBuilder; import org.apache.deltaspike.core.util.metadata.builder.AnnotatedTypeBuilder; +import org.apache.deltaspike.core.util.proxy.DeltaSpikeProxyContextualLifecycle; import org.apache.deltaspike.partialbean.api.PartialBeanBinding; public class PartialBeanBindingExtension implements Extension, Deactivatable @@ -60,12 +60,6 @@ public class PartialBeanBindingExtension implements Extension, Deactivatable Class<X> beanClass = pat.getAnnotatedType().getJavaClass(); - // skip early generated proxies - if (PartialBeanProxyFactory.isProxyClass(beanClass)) - { - return; - } - // skip classes without a partial bean binding Class<? extends Annotation> bindingClass = extractBindingClass(pat); if (bindingClass == null) @@ -170,13 +164,15 @@ public class PartialBeanBindingExtension implements Extension, Deactivatable AnnotatedType<T> annotatedType = new AnnotatedTypeBuilder<T>().readFromType(beanClass).create(); - PartialBeanLifecycle beanLifecycle = - new PartialBeanLifecycle(beanClass, descriptor.getHandler(), beanManager); + DeltaSpikeProxyContextualLifecycle lifecycle = new DeltaSpikeProxyContextualLifecycle(beanClass, + descriptor.getHandler(), + PartialBeanProxyFactory.getInstance(), + beanManager); BeanBuilder<T> beanBuilder = new BeanBuilder<T>(beanManager) .readFromType(annotatedType) .passivationCapable(true) - .beanLifecycle(beanLifecycle); + .beanLifecycle(lifecycle); return beanBuilder.create(); } http://git-wip-us.apache.org/repos/asf/deltaspike/blob/fcf4d77d/deltaspike/modules/partial-bean/impl/src/main/java/org/apache/deltaspike/partialbean/impl/PartialBeanLifecycle.java ---------------------------------------------------------------------- diff --git a/deltaspike/modules/partial-bean/impl/src/main/java/org/apache/deltaspike/partialbean/impl/PartialBeanLifecycle.java b/deltaspike/modules/partial-bean/impl/src/main/java/org/apache/deltaspike/partialbean/impl/PartialBeanLifecycle.java deleted file mode 100644 index dc05a02..0000000 --- a/deltaspike/modules/partial-bean/impl/src/main/java/org/apache/deltaspike/partialbean/impl/PartialBeanLifecycle.java +++ /dev/null @@ -1,142 +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.partialbean.impl; - -import org.apache.deltaspike.partialbean.impl.proxy.PartialBeanProxyFactory; -import org.apache.deltaspike.partialbean.impl.proxy.PartialBeanProxy; -import org.apache.deltaspike.core.util.ExceptionUtils; -import org.apache.deltaspike.core.util.metadata.builder.ContextualLifecycle; - -import javax.enterprise.context.spi.CreationalContext; -import java.lang.reflect.InvocationHandler; -import java.util.Set; -import javax.enterprise.context.Dependent; -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; - -class PartialBeanLifecycle<T, H extends InvocationHandler> implements ContextualLifecycle<T> -{ - private final Class<T> proxyClass; - private final Class<T> partialBeanClass; - private final Class<H> handlerClass; - - private InjectionTarget<T> injectionTarget; - private CreationalContext<?> creationalContextOfDependentHandler; - - PartialBeanLifecycle(Class<T> partialBeanClass, Class<H> handlerClass, BeanManager beanManager) - { - this.partialBeanClass = partialBeanClass; - this.proxyClass = PartialBeanProxyFactory.getProxyClass(partialBeanClass, handlerClass); - this.handlerClass = handlerClass; - - if (!partialBeanClass.isInterface()) - { - AnnotatedType<T> annotatedType = beanManager.createAnnotatedType(this.partialBeanClass); - this.injectionTarget = beanManager.createInjectionTarget(annotatedType); - } - } - - @Override - public T create(Bean bean, CreationalContext creationalContext) - { - try - { - T instance = proxyClass.newInstance(); - - ((PartialBeanProxy) instance).setRedirectInvocationHandler(createHandlerInstance()); - - 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(); - } - - private H createHandlerInstance() - { - Set<Bean<H>> handlerBeans = BeanProvider.getBeanDefinitions(this.handlerClass, 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.handlerClass + - " 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.handlerClass, creationalContext); - - if (handlerBean.getScope().equals(Dependent.class)) - { - this.creationalContextOfDependentHandler = creationalContext; - } - - return handlerInstance; - } -} http://git-wip-us.apache.org/repos/asf/deltaspike/blob/fcf4d77d/deltaspike/modules/partial-bean/impl/src/main/java/org/apache/deltaspike/partialbean/impl/PartialBeanProxyFactory.java ---------------------------------------------------------------------- diff --git a/deltaspike/modules/partial-bean/impl/src/main/java/org/apache/deltaspike/partialbean/impl/PartialBeanProxyFactory.java b/deltaspike/modules/partial-bean/impl/src/main/java/org/apache/deltaspike/partialbean/impl/PartialBeanProxyFactory.java new file mode 100644 index 0000000..7dd0582 --- /dev/null +++ b/deltaspike/modules/partial-bean/impl/src/main/java/org/apache/deltaspike/partialbean/impl/PartialBeanProxyFactory.java @@ -0,0 +1,62 @@ +/* + * 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.partialbean.impl; + +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.util.ArrayList; +import java.util.Iterator; +import javax.enterprise.inject.Typed; +import org.apache.deltaspike.core.util.proxy.DeltaSpikeProxyFactory; + +@Typed +public class PartialBeanProxyFactory extends DeltaSpikeProxyFactory +{ + private static final PartialBeanProxyFactory INSTANCE = new PartialBeanProxyFactory(); + + public static PartialBeanProxyFactory getInstance() + { + return INSTANCE; + } + + @Override + protected String getProxyClassSuffix() + { + return "$$DSPartialBeanProxy"; + } + + @Override + protected ArrayList<Method> getDelegateMethods(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.isAbstract(method.getModifiers())) + { + methods.add(method); + } + } + + return methods; + } +} http://git-wip-us.apache.org/repos/asf/deltaspike/blob/fcf4d77d/deltaspike/modules/partial-bean/impl/src/main/java/org/apache/deltaspike/partialbean/impl/interception/AbstractManualInvocationHandler.java ---------------------------------------------------------------------- diff --git a/deltaspike/modules/partial-bean/impl/src/main/java/org/apache/deltaspike/partialbean/impl/interception/AbstractManualInvocationHandler.java b/deltaspike/modules/partial-bean/impl/src/main/java/org/apache/deltaspike/partialbean/impl/interception/AbstractManualInvocationHandler.java deleted file mode 100644 index 713c486..0000000 --- a/deltaspike/modules/partial-bean/impl/src/main/java/org/apache/deltaspike/partialbean/impl/interception/AbstractManualInvocationHandler.java +++ /dev/null @@ -1,104 +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.partialbean.impl.interception; - -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/modules/partial-bean/impl/src/main/java/org/apache/deltaspike/partialbean/impl/interception/ManualInvocationContext.java ---------------------------------------------------------------------- diff --git a/deltaspike/modules/partial-bean/impl/src/main/java/org/apache/deltaspike/partialbean/impl/interception/ManualInvocationContext.java b/deltaspike/modules/partial-bean/impl/src/main/java/org/apache/deltaspike/partialbean/impl/interception/ManualInvocationContext.java deleted file mode 100644 index 39cdc8f..0000000 --- a/deltaspike/modules/partial-bean/impl/src/main/java/org/apache/deltaspike/partialbean/impl/interception/ManualInvocationContext.java +++ /dev/null @@ -1,187 +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.partialbean.impl.interception; - -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 value in this method - 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/modules/partial-bean/impl/src/main/java/org/apache/deltaspike/partialbean/impl/interception/ManualInvocationThrowableWrapperException.java ---------------------------------------------------------------------- diff --git a/deltaspike/modules/partial-bean/impl/src/main/java/org/apache/deltaspike/partialbean/impl/interception/ManualInvocationThrowableWrapperException.java b/deltaspike/modules/partial-bean/impl/src/main/java/org/apache/deltaspike/partialbean/impl/interception/ManualInvocationThrowableWrapperException.java deleted file mode 100644 index 23edf17..0000000 --- a/deltaspike/modules/partial-bean/impl/src/main/java/org/apache/deltaspike/partialbean/impl/interception/ManualInvocationThrowableWrapperException.java +++ /dev/null @@ -1,27 +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.partialbean.impl.interception; - -public class ManualInvocationThrowableWrapperException extends Exception -{ - public ManualInvocationThrowableWrapperException(Throwable e) - { - super(e); - } -} http://git-wip-us.apache.org/repos/asf/deltaspike/blob/fcf4d77d/deltaspike/modules/partial-bean/impl/src/main/java/org/apache/deltaspike/partialbean/impl/proxy/AsmProxyClassGenerator.java ---------------------------------------------------------------------- diff --git a/deltaspike/modules/partial-bean/impl/src/main/java/org/apache/deltaspike/partialbean/impl/proxy/AsmProxyClassGenerator.java b/deltaspike/modules/partial-bean/impl/src/main/java/org/apache/deltaspike/partialbean/impl/proxy/AsmProxyClassGenerator.java deleted file mode 100644 index 1ac77f7..0000000 --- a/deltaspike/modules/partial-bean/impl/src/main/java/org/apache/deltaspike/partialbean/impl/proxy/AsmProxyClassGenerator.java +++ /dev/null @@ -1,423 +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.partialbean.impl.proxy; - -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_HANDLER = "__handler"; - - 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, - java.lang.reflect.Method[] redirectMethods, - java.lang.reflect.Method[] interceptionMethods) - { - String proxyName = targetClass.getCanonicalName() + suffix; - String classFileName = proxyName.replace('.', '/'); - - byte[] proxyBytes = generateProxyClassBytes(targetClass, invocationHandlerClass, - classFileName, superAccessorMethodSuffix, redirectMethods, interceptionMethods); - - 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, - java.lang.reflect.Method[] redirectMethods, - java.lang.reflect.Method[] interceptionMethods) - { - Class<?> superClass = targetClass; - String[] interfaces = new String[] { }; - - if (targetClass.isInterface()) - { - superClass = Object.class; - interfaces = new String[] { Type.getInternalName(targetClass) }; - } - - // add PartialBeanProxy as interface - interfaces = Arrays.copyOf(interfaces, interfaces.length + 1); - interfaces[interfaces.length - 1] = Type.getInternalName(PartialBeanProxy.class); - - 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); - definePartialBeanProxyMethods(cw, proxyType, invocationHandlerType); - - for (java.lang.reflect.Method method : redirectMethods) - { - defineMethod(cw, method, RedirectManualInvocationHandler.class); - } - - for (java.lang.reflect.Method method : interceptionMethods) - { - defineSuperAccessorMethod(cw, method, superType, superAccessorMethodSuffix); - defineMethod(cw, method, CallSuperManualInvocationHandler.class); - } - - return cw.toByteArray(); - } - - private static void defineInvocationHandlerField(ClassWriter cw, Type invocationHandlerType) - { - // generates - // private MyPartialBeanInvocationHandler __handler; - cw.visitField(Opcodes.ACC_PRIVATE, FIELDNAME_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 definePartialBeanProxyMethods(ClassWriter cw, Type proxyType, Type invocationHandlerType) - { - try - { - // implement #setRedirectInvocationHandler - Method asmMethod = Method.getMethod(PartialBeanProxy.class.getDeclaredMethod( - "setRedirectInvocationHandler", 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_HANDLER, invocationHandlerType); - mg.returnValue(); - - mg.visitMaxs(2, 1); - mg.visitEnd(); - - - // implement #getRedirectInvocationHandler - asmMethod = Method.getMethod(PartialBeanProxy.class.getDeclaredMethod("getRedirectInvocationHandler")); - mg = new GeneratorAdapter(Opcodes.ACC_PUBLIC, asmMethod, null, null, cw); - - mg.visitCode(); - - mg.loadThis(); - mg.getField(proxyType, FIELDNAME_HANDLER, invocationHandlerType); - mg.returnValue(); - - mg.visitMaxs(2, 1); - mg.visitEnd(); - } - catch (NoSuchMethodException e) - { - throw new IllegalStateException("Unable to implement " + PartialBeanProxy.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/modules/partial-bean/impl/src/main/java/org/apache/deltaspike/partialbean/impl/proxy/CallSuperManualInvocationHandler.java ---------------------------------------------------------------------- diff --git a/deltaspike/modules/partial-bean/impl/src/main/java/org/apache/deltaspike/partialbean/impl/proxy/CallSuperManualInvocationHandler.java b/deltaspike/modules/partial-bean/impl/src/main/java/org/apache/deltaspike/partialbean/impl/proxy/CallSuperManualInvocationHandler.java deleted file mode 100644 index 2f87849..0000000 --- a/deltaspike/modules/partial-bean/impl/src/main/java/org/apache/deltaspike/partialbean/impl/proxy/CallSuperManualInvocationHandler.java +++ /dev/null @@ -1,50 +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.partialbean.impl.proxy; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import javax.enterprise.inject.Typed; -import org.apache.deltaspike.partialbean.impl.interception.AbstractManualInvocationHandler; - -@Typed -public class CallSuperManualInvocationHandler extends AbstractManualInvocationHandler -{ - private static final CallSuperManualInvocationHandler INSTANCE = new CallSuperManualInvocationHandler(); - - 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 = PartialBeanProxyFactory.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/partial-bean/impl/src/main/java/org/apache/deltaspike/partialbean/impl/proxy/PartialBeanProxy.java ---------------------------------------------------------------------- diff --git a/deltaspike/modules/partial-bean/impl/src/main/java/org/apache/deltaspike/partialbean/impl/proxy/PartialBeanProxy.java b/deltaspike/modules/partial-bean/impl/src/main/java/org/apache/deltaspike/partialbean/impl/proxy/PartialBeanProxy.java deleted file mode 100644 index 9ec50c5..0000000 --- a/deltaspike/modules/partial-bean/impl/src/main/java/org/apache/deltaspike/partialbean/impl/proxy/PartialBeanProxy.java +++ /dev/null @@ -1,28 +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.partialbean.impl.proxy; - -import java.lang.reflect.InvocationHandler; - -public interface PartialBeanProxy -{ - void setRedirectInvocationHandler(InvocationHandler redirectInvocationHandler); - - InvocationHandler getRedirectInvocationHandler(); -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/deltaspike/blob/fcf4d77d/deltaspike/modules/partial-bean/impl/src/main/java/org/apache/deltaspike/partialbean/impl/proxy/PartialBeanProxyFactory.java ---------------------------------------------------------------------- diff --git a/deltaspike/modules/partial-bean/impl/src/main/java/org/apache/deltaspike/partialbean/impl/proxy/PartialBeanProxyFactory.java b/deltaspike/modules/partial-bean/impl/src/main/java/org/apache/deltaspike/partialbean/impl/proxy/PartialBeanProxyFactory.java deleted file mode 100644 index e0f971f..0000000 --- a/deltaspike/modules/partial-bean/impl/src/main/java/org/apache/deltaspike/partialbean/impl/proxy/PartialBeanProxyFactory.java +++ /dev/null @@ -1,263 +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.partialbean.impl.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.enterprise.inject.Typed; -import javax.interceptor.InterceptorBinding; -import org.apache.deltaspike.core.util.ClassUtils; - -@Typed -public abstract class PartialBeanProxyFactory -{ - private static final String CLASSNAME_SUFFIX = "$$DSPartialBeanProxy"; - private static final String SUPER_ACCESSOR_METHOD_SUFFIX = "$super"; - - private PartialBeanProxyFactory() - { - // prevent instantiation - } - - public static <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 static 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> redirectMethods = new ArrayList<Method>(); - ArrayList<Method> interceptionMethods = new ArrayList<Method>(); - collectMethods(targetClass, redirectMethods, interceptionMethods); - - // check if a interceptor is defined on class level. if yes -> proxy all public methods - if (!containsInterceptorBinding(targetClass.getDeclaredAnnotations())) - { - // loop every method and check if a interceptor is defined on the method -> otherwise don't proxy - Iterator<Method> iterator = interceptionMethods.iterator(); - while (iterator.hasNext()) - { - Method method = iterator.next(); - if (!containsInterceptorBinding(method.getDeclaredAnnotations())) - { - iterator.remove(); - } - } - } - - proxyClass = AsmProxyClassGenerator.generateProxyClass(classLoader, - targetClass, - invocationHandlerClass, - CLASSNAME_SUFFIX, - SUPER_ACCESSOR_METHOD_SUFFIX, - redirectMethods.toArray(new Method[redirectMethods.size()]), - interceptionMethods.toArray(new Method[interceptionMethods.size()])); - } - - return proxyClass; - } - - // TODO stereotypes - private static boolean containsInterceptorBinding(Annotation[] annotations) - { - for (Annotation annotation : annotations) - { - if (annotation.annotationType().isAnnotationPresent(InterceptorBinding.class)) - { - return true; - } - } - - return false; - } - - private static String constructProxyClassName(Class<?> clazz) - { - return clazz.getCanonicalName() + CLASSNAME_SUFFIX; - } - - private 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 static boolean isProxyClass(Class<?> clazz) - { - return clazz.getName().endsWith(CLASSNAME_SUFFIX); - } - - private static void collectMethods(Class<?> clazz, - ArrayList<Method> redirectMethods, - ArrayList<Method> interceptionMethods) - { - List<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(); - } - - Iterator<Method> it = methods.iterator(); - while (it.hasNext()) - { - Method method = it.next(); - - if (Modifier.isAbstract(method.getModifiers())) - { - redirectMethods.add(method); - } - else if (Modifier.isPublic(method.getModifiers()) && !Modifier.isFinal(method.getModifiers())) - { - interceptionMethods.add(method); - } - } - - } - - private static 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; - } - - private static boolean hasSameSignature(Method a, Method b) - { - return a.getName().equals(b.getName()) - && a.getReturnType().equals(b.getReturnType()) - && Arrays.equals(a.getParameterTypes(), b.getParameterTypes()); - } -} http://git-wip-us.apache.org/repos/asf/deltaspike/blob/fcf4d77d/deltaspike/modules/partial-bean/impl/src/main/java/org/apache/deltaspike/partialbean/impl/proxy/RedirectManualInvocationHandler.java ---------------------------------------------------------------------- diff --git a/deltaspike/modules/partial-bean/impl/src/main/java/org/apache/deltaspike/partialbean/impl/proxy/RedirectManualInvocationHandler.java b/deltaspike/modules/partial-bean/impl/src/main/java/org/apache/deltaspike/partialbean/impl/proxy/RedirectManualInvocationHandler.java deleted file mode 100644 index c8b553b..0000000 --- a/deltaspike/modules/partial-bean/impl/src/main/java/org/apache/deltaspike/partialbean/impl/proxy/RedirectManualInvocationHandler.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.partialbean.impl.proxy; - -import java.lang.reflect.InvocationHandler; -import java.lang.reflect.Method; -import javax.enterprise.inject.Typed; -import org.apache.deltaspike.partialbean.impl.interception.AbstractManualInvocationHandler; - -@Typed -public class RedirectManualInvocationHandler extends AbstractManualInvocationHandler -{ - private static final RedirectManualInvocationHandler INSTANCE = new RedirectManualInvocationHandler(); - - 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 redirectInvocationHandler = ((PartialBeanProxy) proxy).getRedirectInvocationHandler(); - return redirectInvocationHandler.invoke(proxy, method, parameters); - } -} http://git-wip-us.apache.org/repos/asf/deltaspike/blob/fcf4d77d/deltaspike/modules/partial-bean/impl/src/test/java/org/apache/deltaspike/test/core/api/partialbean/util/ArchiveUtils.java ---------------------------------------------------------------------- diff --git a/deltaspike/modules/partial-bean/impl/src/test/java/org/apache/deltaspike/test/core/api/partialbean/util/ArchiveUtils.java b/deltaspike/modules/partial-bean/impl/src/test/java/org/apache/deltaspike/test/core/api/partialbean/util/ArchiveUtils.java index c75cc77..2b760d5 100644 --- a/deltaspike/modules/partial-bean/impl/src/test/java/org/apache/deltaspike/test/core/api/partialbean/util/ArchiveUtils.java +++ b/deltaspike/modules/partial-bean/impl/src/test/java/org/apache/deltaspike/test/core/api/partialbean/util/ArchiveUtils.java @@ -44,13 +44,6 @@ public abstract class ArchiveUtils "ds-core_and_partial-bean"); result.addAll(Arrays.asList(temp)); - temp = ShrinkWrapArchiveUtil.getArchives(null, - "META-INF/MANIFEST.MF", - new String[] { "org.objectweb.asm" }, - new String[] { }, - "asm"); - result.addAll(Arrays.asList(temp)); - return result.toArray(new JavaArchive[result.size()]); } }
