yep but no need to be merged in core

Romain Manni-Bucau
@rmannibucau <https://twitter.com/rmannibucau> |  Blog
<http://rmannibucau.wordpress.com> | Github <https://github.com/rmannibucau> |
LinkedIn <https://www.linkedin.com/in/rmannibucau> | Tomitriber
<http://www.tomitribe.com>

2015-03-15 22:13 GMT+01:00 Gerhard Petracek <gerhard.petra...@gmail.com>:

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

Reply via email to