javassist is about 600kb and the user needs to manage it

2015-03-15 21:48 GMT+01:00 Thomas Andraschko <andraschko.tho...@gmail.com>:

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

Reply via email to