You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by re...@apache.org on 2017/11/27 11:46:40 UTC

[cxf] branch master updated: CXF-7544: Support @Context-based injection into proxied CDI beans (#346)

This is an automated email from the ASF dual-hosted git repository.

reta pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cxf.git


The following commit(s) were added to refs/heads/master by this push:
     new 4617ee9  CXF-7544: Support @Context-based injection into proxied CDI beans (#346)
4617ee9 is described below

commit 4617ee993cfa7a274d54fe0ad590fa13409e591a
Author: Andriy Redko <dr...@gmail.com>
AuthorDate: Mon Nov 27 06:46:36 2017 -0500

    CXF-7544: Support @Context-based injection into proxied CDI beans (#346)
---
 .../java/org/apache/cxf/cdi/CdiClassUnwrapper.java | 12 ++-
 .../apache/cxf/jaxrs/model/FilterProviderInfo.java | 13 +++-
 .../org/apache/cxf/jaxrs/model/ProviderInfo.java   | 27 ++++++-
 .../cxf/jaxrs/provider/ServerProviderFactory.java  | 12 ++-
 .../apache/cxf/jaxrs/client/spec/ClientImpl.java   |  6 +-
 .../base/BookStorePreMatchingRequestFilter.java    | 48 ++++++++++++
 systests/cdi/cdi-owb/cdi-producers-owb/pom.xml     |  6 ++
 .../cxf/systest/jaxrs/cdi/SampleFeature.java       |  1 +
 .../systest/jaxrs/cdi/SampleNestedFeature.java}    | 10 +--
 .../jaxrs/cdi/unwrapper/ClassUnwrapperTest.java    | 90 ++++++++++++++++++++++
 systests/cdi/cdi-weld/cdi-producers-weld/pom.xml   |  6 ++
 .../cxf/systest/jaxrs/cdi/SampleFeature.java       |  1 +
 ...SampleFeature.java => SampleNestedFeature.java} | 10 +--
 .../jaxrs/cdi/unwrapper/ClassUnwrapperTest.java    | 75 ++++++++++++++++++
 14 files changed, 289 insertions(+), 28 deletions(-)

diff --git a/integration/cdi/src/main/java/org/apache/cxf/cdi/CdiClassUnwrapper.java b/integration/cdi/src/main/java/org/apache/cxf/cdi/CdiClassUnwrapper.java
index c32e669..ac54da9 100644
--- a/integration/cdi/src/main/java/org/apache/cxf/cdi/CdiClassUnwrapper.java
+++ b/integration/cdi/src/main/java/org/apache/cxf/cdi/CdiClassUnwrapper.java
@@ -22,8 +22,18 @@ import java.util.regex.Pattern;
 
 import org.apache.cxf.common.util.ClassUnwrapper;
 
+/**
+ * Unwraps the CDI proxy classes into real classes.
+ */
 class CdiClassUnwrapper implements ClassUnwrapper {
-    private static final Pattern PROXY_PATTERN = Pattern.compile(".+\\$\\$.+Proxy");
+    /**
+     * Known proxy patterns for OWB and Weld:
+     * 
+     *  Xxx$$OwbNormalScopeProxy0
+     *  Xxx$Proxy$_$$_WeldClientProxy
+     *  
+     */
+    private static final Pattern PROXY_PATTERN = Pattern.compile(".+\\$\\$.+Proxy\\d*");
 
     CdiClassUnwrapper() {
 
diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/FilterProviderInfo.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/FilterProviderInfo.java
index f57401e..0f04b5e 100644
--- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/FilterProviderInfo.java
+++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/FilterProviderInfo.java
@@ -32,18 +32,23 @@ public class FilterProviderInfo<T> extends ProviderInfo<T> {
     private Map<Class<?>, Integer> supportedContracts;
     private boolean dynamic;
 
-    public FilterProviderInfo(T provider,
+    public FilterProviderInfo(Class<?> resourceClass, 
+                              Class<?> serviceClass,
+                              T provider,
                               Bus bus,
                               Map<Class<?>, Integer> supportedContracts) {
-        this(provider, bus, ProviderFactory.DEFAULT_FILTER_NAME_BINDING, false, supportedContracts);
+        this(resourceClass, serviceClass, provider, bus, ProviderFactory.DEFAULT_FILTER_NAME_BINDING, 
+            false, supportedContracts);
     }
 
-    public FilterProviderInfo(T provider,
+    public FilterProviderInfo(Class<?> resourceClass, 
+                              Class<?> serviceClass,
+                              T provider,
                               Bus bus,
                               String nameBinding,
                               boolean dynamic,
                               Map<Class<?>, Integer> supportedContracts) {
-        super(provider, bus, true);
+        super(resourceClass, serviceClass, provider, bus, true);
         this.nameBinding = Collections.singleton(nameBinding);
         this.supportedContracts = supportedContracts;
         this.dynamic = dynamic;
diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/ProviderInfo.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/ProviderInfo.java
index 234a760..73e7147 100644
--- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/ProviderInfo.java
+++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/ProviderInfo.java
@@ -35,7 +35,16 @@ public class ProviderInfo<T> extends AbstractResourceInfo {
     }
 
     public ProviderInfo(T provider, Bus bus, boolean checkContexts, boolean custom) {
-        this(provider, null, bus, checkContexts, custom);
+        this(provider.getClass(), provider.getClass(), provider, bus, true, custom);
+    }
+
+    public ProviderInfo(Class<?> resourceClass, Class<?> serviceClass, T provider, Bus bus, boolean custom) {
+        this(resourceClass, serviceClass, provider, bus, true, custom);
+    }
+
+    public ProviderInfo(Class<?> resourceClass, Class<?> serviceClass, T provider, Bus bus, 
+            boolean checkContexts, boolean custom) {
+        this(resourceClass, serviceClass, provider, null, bus, checkContexts, custom);
     }
 
     public ProviderInfo(T provider,
@@ -45,14 +54,24 @@ public class ProviderInfo<T> extends AbstractResourceInfo {
         this(provider, constructorProxies, bus, true, custom);
     }
 
+    public ProviderInfo(Class<?> resourceClass, 
+            Class<?> serviceClass,
+            T provider,
+            Map<Class<?>, ThreadLocalProxy<?>> constructorProxies,
+            Bus bus,
+            boolean checkContexts,
+            boolean custom) {
+        super(resourceClass, serviceClass, true, checkContexts, constructorProxies, bus, provider);
+        this.provider = provider;
+        this.custom = custom;
+    }
+
     public ProviderInfo(T provider,
                         Map<Class<?>, ThreadLocalProxy<?>> constructorProxies,
                         Bus bus,
                         boolean checkContexts,
                         boolean custom) {
-        super(provider.getClass(), provider.getClass(), true, checkContexts, constructorProxies, bus, provider);
-        this.provider = provider;
-        this.custom = custom;
+        this(provider.getClass(), provider.getClass(), provider, constructorProxies, bus, checkContexts, custom);
     }
 
     @Override
diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ServerProviderFactory.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ServerProviderFactory.java
index dda7ee2..2e85900 100644
--- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ServerProviderFactory.java
+++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ServerProviderFactory.java
@@ -211,7 +211,11 @@ public final class ServerProviderFactory extends ProviderFactory {
                 for (Object featureProvider : cfg.getInstances()) {
                     Map<Class<?>, Integer> contracts = cfg.getContracts(featureProvider.getClass());
                     if (contracts != null && !contracts.isEmpty()) {
-                        allProviders.add(new FilterProviderInfo<Object>(featureProvider,
+                        Class<?> providerCls = ClassHelper.getRealClass(getBus(), featureProvider);
+                        
+                        allProviders.add(new FilterProviderInfo<Object>(featureProvider.getClass(),
+                                                                        providerCls,
+                                                                        featureProvider,
                                                                         getBus(),
                                                                         contracts));
                     } else {
@@ -373,7 +377,10 @@ public final class ServerProviderFactory extends ProviderFactory {
                 for (Object provider : cfg.getInstances()) {
                     Map<Class<?>, Integer> contracts = cfg.getContracts(provider.getClass());
                     if (contracts != null && !contracts.isEmpty()) {
-                        registerUserProvider(new FilterProviderInfo<Object>(provider,
+                        Class<?> providerCls = ClassHelper.getRealClass(getBus(), provider);
+                        registerUserProvider(new FilterProviderInfo<Object>(provider.getClass(),
+                            providerCls,
+                            provider,
                             getBus(),
                             nameBinding,
                             true,
@@ -601,5 +608,4 @@ public final class ServerProviderFactory extends ProviderFactory {
             return result;
         }
     }
-
 }
diff --git a/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/ClientImpl.java b/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/ClientImpl.java
index 78f45f5..61c465a 100644
--- a/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/ClientImpl.java
+++ b/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/ClientImpl.java
@@ -39,6 +39,7 @@ import javax.ws.rs.core.Link;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.UriBuilder;
 
+import org.apache.cxf.common.util.ClassHelper;
 import org.apache.cxf.common.util.SystemPropertyAction;
 import org.apache.cxf.configuration.jsse.TLSClientParameters;
 import org.apache.cxf.jaxrs.client.AbstractClient;
@@ -274,8 +275,9 @@ public class ClientImpl implements Client {
                     if (contracts == null || contracts.isEmpty()) {
                         providers.add(p);
                     } else {
-                        providers.add(
-                            new FilterProviderInfo<Object>(p, pf.getBus(), contracts));
+                        final Class<?> providerCls = ClassHelper.getRealClass(pf.getBus(), p);
+                        providers.add(new FilterProviderInfo<Object>(p.getClass(), 
+                            providerCls, p, pf.getBus(), contracts));
                     }
                 }
             }
diff --git a/systests/cdi/base/src/main/java/org/apache/cxf/systests/cdi/base/BookStorePreMatchingRequestFilter.java b/systests/cdi/base/src/main/java/org/apache/cxf/systests/cdi/base/BookStorePreMatchingRequestFilter.java
new file mode 100644
index 0000000..ec19178
--- /dev/null
+++ b/systests/cdi/base/src/main/java/org/apache/cxf/systests/cdi/base/BookStorePreMatchingRequestFilter.java
@@ -0,0 +1,48 @@
+/**
+ * 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.cxf.systests.cdi.base;
+
+import java.io.IOException;
+
+import javax.enterprise.context.ApplicationScoped;
+import javax.ws.rs.container.ContainerRequestContext;
+import javax.ws.rs.container.ContainerRequestFilter;
+import javax.ws.rs.container.PreMatching;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
+
+@ApplicationScoped @PreMatching
+public class BookStorePreMatchingRequestFilter implements ContainerRequestFilter {
+    private UriInfo uriInfo;
+    
+    @Context 
+    public void setUriInfo(UriInfo uriInfo) {
+        this.uriInfo = uriInfo;
+    }
+    
+    @Override
+    public void filter(ContainerRequestContext requestContext) throws IOException {
+        // Contextual instances should be injected independently
+        if (uriInfo == null || uriInfo.getBaseUri() == null) {
+            requestContext.abortWith(Response.serverError().entity("uriInfo is not set").build());
+        }
+    }
+}
diff --git a/systests/cdi/cdi-owb/cdi-producers-owb/pom.xml b/systests/cdi/cdi-owb/cdi-producers-owb/pom.xml
index 15f03fd..3396248 100644
--- a/systests/cdi/cdi-owb/cdi-producers-owb/pom.xml
+++ b/systests/cdi/cdi-owb/cdi-producers-owb/pom.xml
@@ -45,5 +45,11 @@
              <groupId>org.apache.abdera</groupId>
              <artifactId>abdera-parser</artifactId>
         </dependency>
+        <dependency>
+             <groupId>org.mockito</groupId>
+             <artifactId>mockito-core</artifactId>
+             <version>2.7.14</version>
+             <scope>test</scope>
+        </dependency>
     </dependencies>
 </project>
\ No newline at end of file
diff --git a/systests/cdi/cdi-owb/cdi-producers-owb/src/test/java/org/apache/cxf/systest/jaxrs/cdi/SampleFeature.java b/systests/cdi/cdi-owb/cdi-producers-owb/src/test/java/org/apache/cxf/systest/jaxrs/cdi/SampleFeature.java
index 309a5ea..9aa2638 100644
--- a/systests/cdi/cdi-owb/cdi-producers-owb/src/test/java/org/apache/cxf/systest/jaxrs/cdi/SampleFeature.java
+++ b/systests/cdi/cdi-owb/cdi-producers-owb/src/test/java/org/apache/cxf/systest/jaxrs/cdi/SampleFeature.java
@@ -32,6 +32,7 @@ public class SampleFeature implements Feature {
         context.register(AtomFeedProvider.class);
         context.register(BookStoreRequestFilter.class);
         context.register(BookStoreResponseFilter.class);
+        context.register(SampleNestedFeature.class);
         return false;
     }
 }
diff --git a/systests/cdi/cdi-weld/cdi-producers-weld/src/test/java/org/apache/cxf/systest/jaxrs/cdi/SampleFeature.java b/systests/cdi/cdi-owb/cdi-producers-owb/src/test/java/org/apache/cxf/systest/jaxrs/cdi/SampleNestedFeature.java
similarity index 71%
copy from systests/cdi/cdi-weld/cdi-producers-weld/src/test/java/org/apache/cxf/systest/jaxrs/cdi/SampleFeature.java
copy to systests/cdi/cdi-owb/cdi-producers-owb/src/test/java/org/apache/cxf/systest/jaxrs/cdi/SampleNestedFeature.java
index 309a5ea..4e1e47c 100644
--- a/systests/cdi/cdi-weld/cdi-producers-weld/src/test/java/org/apache/cxf/systest/jaxrs/cdi/SampleFeature.java
+++ b/systests/cdi/cdi-owb/cdi-producers-owb/src/test/java/org/apache/cxf/systest/jaxrs/cdi/SampleNestedFeature.java
@@ -22,16 +22,12 @@ package org.apache.cxf.systest.jaxrs.cdi;
 import javax.ws.rs.core.Feature;
 import javax.ws.rs.core.FeatureContext;
 
-import org.apache.cxf.jaxrs.provider.atom.AtomFeedProvider;
-import org.apache.cxf.systests.cdi.base.BookStoreRequestFilter;
-import org.apache.cxf.systests.cdi.base.BookStoreResponseFilter;
+import org.apache.cxf.systests.cdi.base.BookStorePreMatchingRequestFilter;
 
-public class SampleFeature implements Feature {
+public class SampleNestedFeature implements Feature {
     @Override
     public boolean configure(FeatureContext context) {
-        context.register(AtomFeedProvider.class);
-        context.register(BookStoreRequestFilter.class);
-        context.register(BookStoreResponseFilter.class);
+        context.register(BookStorePreMatchingRequestFilter.class);
         return false;
     }
 }
diff --git a/systests/cdi/cdi-owb/cdi-producers-owb/src/test/java/org/apache/cxf/systest/jaxrs/cdi/unwrapper/ClassUnwrapperTest.java b/systests/cdi/cdi-owb/cdi-producers-owb/src/test/java/org/apache/cxf/systest/jaxrs/cdi/unwrapper/ClassUnwrapperTest.java
new file mode 100644
index 0000000..ae8d573
--- /dev/null
+++ b/systests/cdi/cdi-owb/cdi-producers-owb/src/test/java/org/apache/cxf/systest/jaxrs/cdi/unwrapper/ClassUnwrapperTest.java
@@ -0,0 +1,90 @@
+/**
+ * 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.cxf.systest.jaxrs.cdi.unwrapper;
+
+import java.util.Set;
+
+import javax.enterprise.inject.spi.Bean;
+import javax.enterprise.inject.spi.BeanManager;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletContextEvent;
+
+import org.apache.cxf.Bus;
+import org.apache.cxf.common.util.ClassUnwrapper;
+import org.apache.cxf.systests.cdi.base.BookStorePreMatchingRequestFilter;
+import org.apache.cxf.systests.cdi.base.BookStoreRequestFilter;
+import org.apache.webbeans.config.WebBeansContext;
+import org.apache.webbeans.spi.ContainerLifecycle;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.CoreMatchers.not;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.junit.Assert.assertThat;
+import static org.mockito.Mockito.mock;
+
+
+public class ClassUnwrapperTest {
+    private Bus bus;
+    private ContainerLifecycle lifecycle;
+    private ServletContextEvent event;
+    
+    @Before
+    public void setUp() {
+        event = new ServletContextEvent(mock(ServletContext.class));
+        lifecycle = WebBeansContext.currentInstance().getService(ContainerLifecycle.class);
+        lifecycle.startApplication(event);
+        bus = getBeanReference(Bus.class);
+    }
+
+    @SuppressWarnings("unchecked")
+    private<T> T getBeanReference(Class<T> clazz) {
+        final BeanManager beanManager = lifecycle.getBeanManager();
+        final Set<Bean<?>> beans = beanManager.getBeans(clazz);
+        final Bean<?> bean = beanManager.resolve(beans);
+        return (T)beanManager.getReference(bean, clazz, beanManager.createCreationalContext(bean));
+    }
+
+    @After
+    public void tearDown() {
+        lifecycle.stopApplication(event);
+    }
+    
+    @Test
+    public void testProxyClassIsProperlyUnwrapped() {
+        final BookStorePreMatchingRequestFilter filter = getBeanReference(BookStorePreMatchingRequestFilter.class);
+        final ClassUnwrapper unwrapper = (ClassUnwrapper)bus.getProperty(ClassUnwrapper.class.getName());
+        
+        assertThat(unwrapper, notNullValue());
+        assertThat(filter.getClass(), not(equalTo(BookStorePreMatchingRequestFilter.class)));
+        assertThat(unwrapper.getRealClass(filter), equalTo(BookStorePreMatchingRequestFilter.class));
+    }
+    
+    @Test
+    public void testRealClassIsProperlyUnwrapped() {
+        final BookStoreRequestFilter filter = getBeanReference(BookStoreRequestFilter.class);
+        final ClassUnwrapper unwrapper = (ClassUnwrapper)bus.getProperty(ClassUnwrapper.class.getName());
+        
+        assertThat(unwrapper, notNullValue());
+        assertThat(filter.getClass(), equalTo(BookStoreRequestFilter.class));
+        assertThat(unwrapper.getRealClass(filter), equalTo(BookStoreRequestFilter.class));
+    }
+}
diff --git a/systests/cdi/cdi-weld/cdi-producers-weld/pom.xml b/systests/cdi/cdi-weld/cdi-producers-weld/pom.xml
index 1ed161a..8f73095 100644
--- a/systests/cdi/cdi-weld/cdi-producers-weld/pom.xml
+++ b/systests/cdi/cdi-weld/cdi-producers-weld/pom.xml
@@ -45,5 +45,11 @@
              <groupId>org.apache.abdera</groupId>
              <artifactId>abdera-parser</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.jboss.weld.se</groupId>
+            <artifactId>weld-se-core</artifactId>
+            <version>${cxf.jboss.weld.version}</version>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 </project>
diff --git a/systests/cdi/cdi-weld/cdi-producers-weld/src/test/java/org/apache/cxf/systest/jaxrs/cdi/SampleFeature.java b/systests/cdi/cdi-weld/cdi-producers-weld/src/test/java/org/apache/cxf/systest/jaxrs/cdi/SampleFeature.java
index 309a5ea..9aa2638 100644
--- a/systests/cdi/cdi-weld/cdi-producers-weld/src/test/java/org/apache/cxf/systest/jaxrs/cdi/SampleFeature.java
+++ b/systests/cdi/cdi-weld/cdi-producers-weld/src/test/java/org/apache/cxf/systest/jaxrs/cdi/SampleFeature.java
@@ -32,6 +32,7 @@ public class SampleFeature implements Feature {
         context.register(AtomFeedProvider.class);
         context.register(BookStoreRequestFilter.class);
         context.register(BookStoreResponseFilter.class);
+        context.register(SampleNestedFeature.class);
         return false;
     }
 }
diff --git a/systests/cdi/cdi-weld/cdi-producers-weld/src/test/java/org/apache/cxf/systest/jaxrs/cdi/SampleFeature.java b/systests/cdi/cdi-weld/cdi-producers-weld/src/test/java/org/apache/cxf/systest/jaxrs/cdi/SampleNestedFeature.java
similarity index 71%
copy from systests/cdi/cdi-weld/cdi-producers-weld/src/test/java/org/apache/cxf/systest/jaxrs/cdi/SampleFeature.java
copy to systests/cdi/cdi-weld/cdi-producers-weld/src/test/java/org/apache/cxf/systest/jaxrs/cdi/SampleNestedFeature.java
index 309a5ea..4e1e47c 100644
--- a/systests/cdi/cdi-weld/cdi-producers-weld/src/test/java/org/apache/cxf/systest/jaxrs/cdi/SampleFeature.java
+++ b/systests/cdi/cdi-weld/cdi-producers-weld/src/test/java/org/apache/cxf/systest/jaxrs/cdi/SampleNestedFeature.java
@@ -22,16 +22,12 @@ package org.apache.cxf.systest.jaxrs.cdi;
 import javax.ws.rs.core.Feature;
 import javax.ws.rs.core.FeatureContext;
 
-import org.apache.cxf.jaxrs.provider.atom.AtomFeedProvider;
-import org.apache.cxf.systests.cdi.base.BookStoreRequestFilter;
-import org.apache.cxf.systests.cdi.base.BookStoreResponseFilter;
+import org.apache.cxf.systests.cdi.base.BookStorePreMatchingRequestFilter;
 
-public class SampleFeature implements Feature {
+public class SampleNestedFeature implements Feature {
     @Override
     public boolean configure(FeatureContext context) {
-        context.register(AtomFeedProvider.class);
-        context.register(BookStoreRequestFilter.class);
-        context.register(BookStoreResponseFilter.class);
+        context.register(BookStorePreMatchingRequestFilter.class);
         return false;
     }
 }
diff --git a/systests/cdi/cdi-weld/cdi-producers-weld/src/test/java/org/apache/cxf/systest/jaxrs/cdi/unwrapper/ClassUnwrapperTest.java b/systests/cdi/cdi-weld/cdi-producers-weld/src/test/java/org/apache/cxf/systest/jaxrs/cdi/unwrapper/ClassUnwrapperTest.java
new file mode 100644
index 0000000..7405623
--- /dev/null
+++ b/systests/cdi/cdi-weld/cdi-producers-weld/src/test/java/org/apache/cxf/systest/jaxrs/cdi/unwrapper/ClassUnwrapperTest.java
@@ -0,0 +1,75 @@
+/**
+ * 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.cxf.systest.jaxrs.cdi.unwrapper;
+
+import org.apache.cxf.Bus;
+import org.apache.cxf.common.util.ClassUnwrapper;
+import org.apache.cxf.systests.cdi.base.BookStorePreMatchingRequestFilter;
+import org.apache.cxf.systests.cdi.base.BookStoreRequestFilter;
+import org.jboss.weld.environment.se.Weld;
+import org.jboss.weld.environment.se.WeldContainer;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.CoreMatchers.not;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.junit.Assert.assertThat;
+
+public class ClassUnwrapperTest {
+    private Bus bus;
+    private WeldContainer container;
+    
+    @Before
+    public void setUp() {
+        final Weld weld = new Weld();
+        container = weld.initialize();
+        bus = getBeanReference(Bus.class);
+    }
+
+    private<T> T getBeanReference(Class<T> clazz) {
+        return container.select(clazz).get();
+    }
+
+    @After
+    public void tearDown() {
+        container.close();
+    }
+    
+    @Test
+    public void testProxyClassIsProperlyUnwrapped() {
+        final BookStorePreMatchingRequestFilter filter = getBeanReference(BookStorePreMatchingRequestFilter.class);
+        final ClassUnwrapper unwrapper = (ClassUnwrapper)bus.getProperty(ClassUnwrapper.class.getName());
+        
+        assertThat(unwrapper, notNullValue());
+        assertThat(filter.getClass(), not(equalTo(BookStorePreMatchingRequestFilter.class)));
+        assertThat(unwrapper.getRealClass(filter), equalTo(BookStorePreMatchingRequestFilter.class));
+    }
+    
+    @Test
+    public void testRealClassIsProperlyUnwrapped() {
+        final BookStoreRequestFilter filter = getBeanReference(BookStoreRequestFilter.class);
+        final ClassUnwrapper unwrapper = (ClassUnwrapper)bus.getProperty(ClassUnwrapper.class.getName());
+        
+        assertThat(unwrapper, notNullValue());
+        assertThat(filter.getClass(), equalTo(BookStoreRequestFilter.class));
+        assertThat(unwrapper.getRealClass(filter), equalTo(BookStoreRequestFilter.class));
+    }
+}

-- 
To stop receiving notification emails like this one, please contact
['"commits@cxf.apache.org" <co...@cxf.apache.org>'].