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 2016/11/16 02:28:38 UTC

cxf git commit: CXF-7132: Use the original class when it comes to determining classes for ResourceProvider usage. This closes #198.

Repository: cxf
Updated Branches:
  refs/heads/3.1.x-fixes ea48cd091 -> 13fa5dc1f


CXF-7132: Use the original class when it comes to determining classes for ResourceProvider usage. This closes #198.


Project: http://git-wip-us.apache.org/repos/asf/cxf/repo
Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/13fa5dc1
Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/13fa5dc1
Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/13fa5dc1

Branch: refs/heads/3.1.x-fixes
Commit: 13fa5dc1ffebe4e63a27f17528598925af04d570
Parents: ea48cd0
Author: reta <dr...@gmail.com>
Authored: Tue Nov 15 21:28:06 2016 -0500
Committer: reta <dr...@gmail.com>
Committed: Tue Nov 15 21:28:06 2016 -0500

----------------------------------------------------------------------
 .../org/apache/cxf/cdi/CdiResourceProvider.java | 31 +++++++--
 .../cxf/cdi/JAXRSCdiResourceExtension.java      | 69 ++++++++++++++------
 .../cdi/base/AbstractCdiMultiAppTest.java       | 16 +++++
 .../systests/cdi/base/BookStoreVersioned.java   | 39 +++++++++++
 .../jaxrs/BookStoreScopedApplication.java       | 35 ++++++++++
 .../jaxrs/BookStoreScopedApplication.java       | 35 ++++++++++
 6 files changed, 198 insertions(+), 27 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cxf/blob/13fa5dc1/integration/cdi/src/main/java/org/apache/cxf/cdi/CdiResourceProvider.java
----------------------------------------------------------------------
diff --git a/integration/cdi/src/main/java/org/apache/cxf/cdi/CdiResourceProvider.java b/integration/cdi/src/main/java/org/apache/cxf/cdi/CdiResourceProvider.java
index 997cf40..a417c0f 100644
--- a/integration/cdi/src/main/java/org/apache/cxf/cdi/CdiResourceProvider.java
+++ b/integration/cdi/src/main/java/org/apache/cxf/cdi/CdiResourceProvider.java
@@ -18,34 +18,51 @@
  */
 package org.apache.cxf.cdi;
 
+import javax.enterprise.context.RequestScoped;
+import javax.enterprise.context.spi.CreationalContext;
+import javax.enterprise.inject.spi.Bean;
+import javax.enterprise.inject.spi.BeanManager;
+
 import org.apache.cxf.jaxrs.lifecycle.ResourceProvider;
 import org.apache.cxf.message.Message;
 
 public class CdiResourceProvider implements ResourceProvider {
-    private final Object instance;
-    private final Class<?> resourceClass;
+    private Object instance;
+    private CreationalContext< ? > context;
+    
+    private final BeanManager beanManager;
+    private final Bean< ? > bean;
     
-    CdiResourceProvider(final Class<?> resourceClass, final Object instance) {
-        this.resourceClass = resourceClass;
-        this.instance = instance;
+    CdiResourceProvider(final BeanManager beanManager, final Bean< ? > bean) {
+        this.beanManager = beanManager;
+        this.bean = bean;
     }
     
     @Override
     public Object getInstance(Message m) {
+        if (instance == null) {
+            context = beanManager.createCreationalContext(bean);
+            instance = beanManager.getReference(bean, bean.getBeanClass(), context);
+        }
+        
         return instance;
     }
 
     @Override
     public void releaseInstance(Message m, Object o) {
+        if (context != null) {
+            context.release();
+            instance = null;
+        }
     }
 
     @Override
     public Class<?> getResourceClass() {
-        return resourceClass;
+        return bean.getBeanClass();
     }
 
     @Override
     public boolean isSingleton() {
-        return true;
+        return !bean.getScope().isAssignableFrom(RequestScoped.class);
     }
 }

http://git-wip-us.apache.org/repos/asf/cxf/blob/13fa5dc1/integration/cdi/src/main/java/org/apache/cxf/cdi/JAXRSCdiResourceExtension.java
----------------------------------------------------------------------
diff --git a/integration/cdi/src/main/java/org/apache/cxf/cdi/JAXRSCdiResourceExtension.java b/integration/cdi/src/main/java/org/apache/cxf/cdi/JAXRSCdiResourceExtension.java
index 9fb59d8..3d50e89 100644
--- a/integration/cdi/src/main/java/org/apache/cxf/cdi/JAXRSCdiResourceExtension.java
+++ b/integration/cdi/src/main/java/org/apache/cxf/cdi/JAXRSCdiResourceExtension.java
@@ -21,10 +21,8 @@ package org.apache.cxf.cdi;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.HashMap;
 import java.util.LinkedHashSet;
 import java.util.List;
-import java.util.Map;
 import java.util.ServiceLoader;
 import java.util.Set;
 
@@ -49,7 +47,6 @@ import javax.ws.rs.ext.Provider;
 import org.apache.cxf.Bus;
 import org.apache.cxf.bus.extension.ExtensionManagerBus;
 import org.apache.cxf.feature.Feature;
-import org.apache.cxf.helpers.CastUtils;
 import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
 import org.apache.cxf.jaxrs.utils.ResourceUtils;
 
@@ -67,6 +64,40 @@ public class JAXRSCdiResourceExtension implements Extension {
     private final List< CreationalContext< ? > > disposableCreationalContexts = 
         new ArrayList< CreationalContext< ? > >();
 
+    /**
+     * Holder of the classified resource classes, converted to appropriate instance
+     * representations.
+     */
+    private static class ClassifiedClasses {
+        private List< Object > providers = new ArrayList<>();
+        private List< Feature > features = new ArrayList<>();
+        private List< CdiResourceProvider > resourceProviders = new ArrayList<>();
+        
+        public void addProviders(final Collection< Object > others) {
+            this.providers.addAll(others);
+        }
+        
+        public void addFeatures(final Collection< Feature > others) {
+            this.features.addAll(others);
+        }
+        
+        public void addResourceProvider(final CdiResourceProvider other) {
+            this.resourceProviders.add(other);
+        }
+        
+        public List< Object > getProviders() {
+            return providers;
+        }
+        
+        public List< Feature > getFeatures() {
+            return features;
+        }
+        
+        public List<CdiResourceProvider> getResourceProviders() {
+            return resourceProviders;
+        }
+    }
+    
     @SuppressWarnings("unchecked")
     public <T> void collect(@Observes final ProcessBean< T > event) {
         if (event.getAnnotated().isAnnotationPresent(ApplicationPath.class)) {
@@ -168,14 +199,13 @@ public class JAXRSCdiResourceExtension implements Extension {
     private JAXRSServerFactoryBean createFactoryInstance(final Application application, final BeanManager beanManager) {
 
         final JAXRSServerFactoryBean instance = ResourceUtils.createApplication(application, false, false, bus);
-        final Map< Class< ? >, List< Object > > classified = classes2singletons(application, beanManager);
+        final ClassifiedClasses classified = classes2singletons(application, beanManager);
         
-        instance.setProviders(classified.get(Provider.class));
-        instance.getFeatures().addAll(CastUtils.cast(classified.get(Feature.class), Feature.class));
+        instance.setProviders(classified.getProviders());
+        instance.getFeatures().addAll(classified.getFeatures());
         
-        for (final Object resource: classified.get(Path.class)) {
-            instance.setResourceProvider(resource.getClass(), 
-                new CdiResourceProvider(resource.getClass(), resource));
+        for (final CdiResourceProvider resourceProvider: classified.getResourceProviders()) {
+            instance.setResourceProvider(resourceProvider.getResourceClass(), resourceProvider);
         }
 
         return instance;
@@ -188,21 +218,20 @@ public class JAXRSCdiResourceExtension implements Extension {
      * @param application the application instance
      * @return classified singletons by instance types
      */
-    private Map< Class< ? >, List< Object > > classes2singletons(final Application application,
-                                                                 final BeanManager beanManager) {
-        final Map< Class< ? >, List< Object > > classified =
-              new HashMap<>();
-
-        classified.put(Feature.class, new ArrayList<>());
-        classified.put(Provider.class, new ArrayList<>());
-        classified.put(Path.class, new ArrayList<>());
+    private ClassifiedClasses classes2singletons(final Application application, final BeanManager beanManager) {
+        final ClassifiedClasses classified = new ClassifiedClasses(); 
 
         // now loop through the classes
         Set<Class<?>> classes = application.getClasses();
         if (!classes.isEmpty()) {
-            classified.get(Path.class).addAll(loadServices(beanManager, classes));
-            classified.get(Provider.class).addAll(loadProviders(beanManager, classes));
-            classified.get(Feature.class).addAll(loadFeatures(beanManager, classes));
+            classified.addProviders(loadProviders(beanManager, classes));
+            classified.addFeatures(loadFeatures(beanManager, classes));
+            
+            for (final Bean< ? > bean: serviceBeans) {
+                if (classes.contains(bean.getBeanClass())) {
+                    classified.addResourceProvider(new CdiResourceProvider(beanManager, bean));
+                }
+            }
         }
         
         return classified;

http://git-wip-us.apache.org/repos/asf/cxf/blob/13fa5dc1/systests/cdi/base/src/main/java/org/apache/cxf/systests/cdi/base/AbstractCdiMultiAppTest.java
----------------------------------------------------------------------
diff --git a/systests/cdi/base/src/main/java/org/apache/cxf/systests/cdi/base/AbstractCdiMultiAppTest.java b/systests/cdi/base/src/main/java/org/apache/cxf/systests/cdi/base/AbstractCdiMultiAppTest.java
index 68815d8..ebaea91 100644
--- a/systests/cdi/base/src/main/java/org/apache/cxf/systests/cdi/base/AbstractCdiMultiAppTest.java
+++ b/systests/cdi/base/src/main/java/org/apache/cxf/systests/cdi/base/AbstractCdiMultiAppTest.java
@@ -31,6 +31,10 @@ import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;
 import org.apache.cxf.jaxrs.client.WebClient;
 import org.junit.Test;
 
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.CoreMatchers.not;
+import static org.hamcrest.CoreMatchers.startsWith;
+
 public abstract class AbstractCdiMultiAppTest extends AbstractCdiSingleAppTest {
     @Test
     public void testAddOneBookWithValidation() {
@@ -42,6 +46,18 @@ public abstract class AbstractCdiMultiAppTest extends AbstractCdiSingleAppTest {
         assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), r.getStatus());
     }
 
+    @Test
+    public void testGetBookStoreVersion() {
+        Response r1 = createWebClient("/rest/v3/bookstore/versioned/version", MediaType.TEXT_PLAIN).get();
+        assertEquals(Response.Status.OK.getStatusCode(), r1.getStatus());
+        assertThat(r1.readEntity(String.class), startsWith("1.0."));
+        
+        Response r2 = createWebClient("/rest/v3/bookstore/versioned/version", MediaType.TEXT_PLAIN).get();
+        assertEquals(Response.Status.OK.getStatusCode(), r2.getStatus());
+        assertThat(r2.readEntity(String.class), startsWith("1.0."));
+        
+        assertThat(r2.readEntity(String.class), not(equalTo(r1.readEntity(String.class))));
+    }
 
     protected WebClient createWebClient(final String url) {
         return createWebClient(url, MediaType.APPLICATION_JSON);

http://git-wip-us.apache.org/repos/asf/cxf/blob/13fa5dc1/systests/cdi/base/src/main/java/org/apache/cxf/systests/cdi/base/BookStoreVersioned.java
----------------------------------------------------------------------
diff --git a/systests/cdi/base/src/main/java/org/apache/cxf/systests/cdi/base/BookStoreVersioned.java b/systests/cdi/base/src/main/java/org/apache/cxf/systests/cdi/base/BookStoreVersioned.java
new file mode 100644
index 0000000..ff46aed
--- /dev/null
+++ b/systests/cdi/base/src/main/java/org/apache/cxf/systests/cdi/base/BookStoreVersioned.java
@@ -0,0 +1,39 @@
+/**
+ * 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 javax.enterprise.context.RequestScoped;
+import javax.inject.Inject;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+@RequestScoped
+@Path("/bookstore/versioned")
+public class BookStoreVersioned {
+    @Inject private String version;
+    
+    @GET
+    @Path("/version")
+    @Produces(MediaType.TEXT_PLAIN)
+    public String getVersion() {
+        return version + "." + this.hashCode();
+    }
+}

http://git-wip-us.apache.org/repos/asf/cxf/blob/13fa5dc1/systests/cdi/cdi-owb/cdi-multiple-apps-owb/src/test/java/org/apache/cxf/systest/jaxrs/BookStoreScopedApplication.java
----------------------------------------------------------------------
diff --git a/systests/cdi/cdi-owb/cdi-multiple-apps-owb/src/test/java/org/apache/cxf/systest/jaxrs/BookStoreScopedApplication.java b/systests/cdi/cdi-owb/cdi-multiple-apps-owb/src/test/java/org/apache/cxf/systest/jaxrs/BookStoreScopedApplication.java
new file mode 100644
index 0000000..ca6f836
--- /dev/null
+++ b/systests/cdi/cdi-owb/cdi-multiple-apps-owb/src/test/java/org/apache/cxf/systest/jaxrs/BookStoreScopedApplication.java
@@ -0,0 +1,35 @@
+/**
+ * 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;
+
+import java.util.Collections;
+import java.util.Set;
+
+import javax.ws.rs.ApplicationPath;
+import javax.ws.rs.core.Application;
+
+import org.apache.cxf.systests.cdi.base.BookStoreVersioned;
+
+@ApplicationPath("/v3")
+public class BookStoreScopedApplication extends Application {
+    @Override
+    public Set<Class<?>> getClasses() {
+        return Collections.<Class<?>>singleton(BookStoreVersioned.class);
+    }
+}

http://git-wip-us.apache.org/repos/asf/cxf/blob/13fa5dc1/systests/cdi/cdi-weld/cdi-multiple-apps-weld/src/test/java/org/apache/cxf/systest/jaxrs/BookStoreScopedApplication.java
----------------------------------------------------------------------
diff --git a/systests/cdi/cdi-weld/cdi-multiple-apps-weld/src/test/java/org/apache/cxf/systest/jaxrs/BookStoreScopedApplication.java b/systests/cdi/cdi-weld/cdi-multiple-apps-weld/src/test/java/org/apache/cxf/systest/jaxrs/BookStoreScopedApplication.java
new file mode 100644
index 0000000..ca6f836
--- /dev/null
+++ b/systests/cdi/cdi-weld/cdi-multiple-apps-weld/src/test/java/org/apache/cxf/systest/jaxrs/BookStoreScopedApplication.java
@@ -0,0 +1,35 @@
+/**
+ * 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;
+
+import java.util.Collections;
+import java.util.Set;
+
+import javax.ws.rs.ApplicationPath;
+import javax.ws.rs.core.Application;
+
+import org.apache.cxf.systests.cdi.base.BookStoreVersioned;
+
+@ApplicationPath("/v3")
+public class BookStoreScopedApplication extends Application {
+    @Override
+    public Set<Class<?>> getClasses() {
+        return Collections.<Class<?>>singleton(BookStoreVersioned.class);
+    }
+}