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>'].