do you mean the jar size? the difference is just ~130kb when we shade asm
or not


2015-03-15 21:40 GMT+01:00 Romain Manni-Bucau <rmannibu...@gmail.com>:

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

Reply via email to