Author: rmannibucau
Date: Mon Jul  7 20:52:57 2014
New Revision: 1608611

URL: http://svn.apache.org/r1608611
Log:
jira is down :( - if @Path is on an interface try to get the implemenation (if 
unique) and scanning by default @Provider like suggested in the spec

Added:
    
tomee/tomee/trunk/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/NoPathOnImplTest.java
      - copied, changed from r1608510, 
tomee/tomee/trunk/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/OptionsTest.java
    
tomee/tomee/trunk/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/ProvidersShouldBeScannedTest.java
Modified:
    
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
    
tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/tool/junit/OpenEJBJUnitDebugListener.java
    
tomee/tomee/trunk/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java

Modified: 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java?rev=1608611&r1=1608610&r2=1608611&view=diff
==============================================================================
--- 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
 (original)
+++ 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
 Mon Jul  7 20:52:57 2014
@@ -5457,6 +5457,18 @@ public class AnnotationDeployer implemen
                 } else {
                     webModule.getEjbRestServices().add(clazz.getName());
                 }
+            } else if (clazz.isInterface()) {
+                final Class api = clazz;
+                final List<Class> impl = finder.findImplementations(api);
+                if (impl != null && impl.size() == 1) { // single impl so 
that's the service
+                    final Class implClass = impl.iterator().next();
+                    final String name = implClass.getName();
+                    if (!isEJB(implClass)) {
+                        classes.add(name);
+                    } else {
+                        webModule.getEjbRestServices().add(name);
+                    }
+                }
             }
         }
 

Modified: 
tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/tool/junit/OpenEJBJUnitDebugListener.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/tool/junit/OpenEJBJUnitDebugListener.java?rev=1608611&r1=1608610&r2=1608611&view=diff
==============================================================================
--- 
tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/tool/junit/OpenEJBJUnitDebugListener.java
 (original)
+++ 
tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/tool/junit/OpenEJBJUnitDebugListener.java
 Mon Jul  7 20:52:57 2014
@@ -48,6 +48,7 @@ public class OpenEJBJUnitDebugListener e
             System.out.println(">>OpenEJBJUnitDebugListener> will monitor " + 
description.getDisplayName());
         }
         thread = new MonitoringThread();
+        thread.setName(MonitoringThread.class.getSimpleName() + "-" + 
thread.hashCode());
         thread.start();
     }
 

Copied: 
tomee/tomee/trunk/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/NoPathOnImplTest.java
 (from r1608510, 
tomee/tomee/trunk/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/OptionsTest.java)
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/NoPathOnImplTest.java?p2=tomee/tomee/trunk/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/NoPathOnImplTest.java&p1=tomee/tomee/trunk/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/OptionsTest.java&r1=1608510&r2=1608611&rev=1608611&view=diff
==============================================================================
--- 
tomee/tomee/trunk/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/OptionsTest.java
 (original)
+++ 
tomee/tomee/trunk/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/NoPathOnImplTest.java
 Mon Jul  7 20:52:57 2014
@@ -25,8 +25,7 @@ import org.apache.openejb.testing.Module
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
-import javax.ejb.Singleton;
-import javax.ws.rs.OPTIONS;
+import javax.ws.rs.GET;
 import javax.ws.rs.Path;
 import java.net.HttpURLConnection;
 import java.net.URL;
@@ -35,28 +34,30 @@ import static org.junit.Assert.assertEqu
 
 @EnableServices("jax-rs")
 @RunWith(ApplicationComposer.class)
-public class OptionsTest {
+public class NoPathOnImplTest {
     @Module
-    @Classes(OptionsBean.class)
+    @Classes({ API.class, Impl.class })
     public static WebApp service() throws Exception {
         return new WebApp().contextRoot("app");
     }
 
     @Test
     public void check() throws Exception {
-        final HttpURLConnection conn = HttpURLConnection.class.cast(new 
URL("http://127.0.0.1:4204/app/options";).openConnection());
-        conn.setRequestMethod("OPTIONS");
+        final HttpURLConnection conn = HttpURLConnection.class.cast(new 
URL("http://127.0.0.1:4204/app/api";).openConnection());
         assertEquals("ok", IO.slurp(conn.getInputStream()));
         conn.getInputStream().close();
     }
 
-    @Singleton
-    @Path("options")
-    public static class OptionsBean {
-        @OPTIONS
+    @Path("api")
+    public static interface API {
+        @GET
+        String providers();
+    }
+
+    public static class Impl implements API {
+        @Override
         public String providers() {
             return "ok";
         }
-
     }
 }

Added: 
tomee/tomee/trunk/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/ProvidersShouldBeScannedTest.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/ProvidersShouldBeScannedTest.java?rev=1608611&view=auto
==============================================================================
--- 
tomee/tomee/trunk/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/ProvidersShouldBeScannedTest.java
 (added)
+++ 
tomee/tomee/trunk/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/ProvidersShouldBeScannedTest.java
 Mon Jul  7 20:52:57 2014
@@ -0,0 +1,69 @@
+/*
+ *     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.openejb.server.cxf.rs;
+
+import org.apache.openejb.jee.WebApp;
+import org.apache.openejb.junit.ApplicationComposer;
+import org.apache.openejb.loader.IO;
+import org.apache.openejb.testing.Classes;
+import org.apache.openejb.testing.EnableServices;
+import org.apache.openejb.testing.Module;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.ext.ExceptionMapper;
+import javax.ws.rs.ext.Provider;
+import java.net.HttpURLConnection;
+import java.net.URL;
+
+import static org.junit.Assert.assertEquals;
+
+@EnableServices("jax-rs")
+@RunWith(ApplicationComposer.class)
+public class ProvidersShouldBeScannedTest {
+    @Module
+    @Classes({ NeedAProvider.class, DontLetResourcesFail.class })
+    public static WebApp service() throws Exception {
+        return new WebApp().contextRoot("app");
+    }
+
+    @Test
+    public void check() throws Exception {
+        final HttpURLConnection conn = HttpURLConnection.class.cast(new 
URL("http://127.0.0.1:4204/app/need-provider";).openConnection());
+        assertEquals("ok", IO.slurp(conn.getInputStream()));
+        conn.getInputStream().close();
+    }
+
+    @Path("need-provider")
+    public static class NeedAProvider {
+        @GET
+        public String providers() {
+            throw new IllegalArgumentException();
+        }
+    }
+
+    @Provider
+    public static class DontLetResourcesFail implements 
ExceptionMapper<IllegalArgumentException> {
+        @Override
+        public Response toResponse(final IllegalArgumentException throwable) {
+            return Response.ok("ok").build();
+        }
+    }
+}

Modified: 
tomee/tomee/trunk/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java?rev=1608611&r1=1608610&r2=1608611&view=diff
==============================================================================
--- 
tomee/tomee/trunk/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java
 (original)
+++ 
tomee/tomee/trunk/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java
 Mon Jul  7 20:52:57 2014
@@ -125,21 +125,12 @@ public abstract class RESTService implem
             context = webContext.getAppContext().getAppJndiContext();
         }
 
-        final Collection<Object> additionalProviders = new HashSet<Object>();
-        if (useDiscoveredProviders()) {
-            for (final String name : webApp.jaxRsProviders) {
-                try {
-                    additionalProviders.add(classLoader.loadClass(name));
-                } catch (final ClassNotFoundException e) {
-                    LOGGER.warning("can't load '" + name + "'", e);
-                }
-            }
-            additionalProviders.addAll(appProviders(appInfo, classLoader));
-        }
-
         final ClassLoader oldLoader = 
Thread.currentThread().getContextClassLoader();
         Thread.currentThread().setContextClassLoader(classLoader);
 
+        final Collection<Object> additionalProviders = new HashSet<Object>();
+        addAppProvidersIfNeeded(appInfo, webApp, classLoader, 
additionalProviders);
+
         Collection<IdPropertiesInfo> pojoConfigurations = null; // done lazily
         try {
             boolean deploymentWithApplication = 
"true".equalsIgnoreCase(appInfo.properties.getProperty(OPENEJB_USE_APPLICATION_PROPERTY,
 APPLICATION_DEPLOYMENT));
@@ -295,6 +286,19 @@ public abstract class RESTService implem
         }
     }
 
+    private void addAppProvidersIfNeeded(AppInfo appInfo, WebAppInfo webApp, 
ClassLoader classLoader, Collection<Object> additionalProviders) {
+        if (useDiscoveredProviders(appInfo)) {
+            for (final String name : webApp.jaxRsProviders) {
+                try {
+                    additionalProviders.add(classLoader.loadClass(name));
+                } catch (final ClassNotFoundException e) {
+                    LOGGER.warning("can't load '" + name + "'", e);
+                }
+            }
+            additionalProviders.addAll(appProviders(appInfo, classLoader));
+        }
+    }
+
     private void addEjbToApplication(final Application application, final 
Map<String, EJBRestServiceInfo> restEjbs) {
         for (final Map.Entry<String, EJBRestServiceInfo> ejb : 
restEjbs.entrySet()) {
             
application.getClasses().add(ejb.getValue().context.getBeanClass());
@@ -535,8 +539,12 @@ public abstract class RESTService implem
         return restEjbs.containsKey(clazz) && 
!BeanType.MANAGED.equals(restEjbs.get(clazz).context.getComponentType());
     }
 
-    private boolean useDiscoveredProviders() {
-        return 
SystemInstance.get().getOptions().get(OPENEJB_JAXRS_PROVIDERS_AUTO_PROP, false);
+    private boolean useDiscoveredProviders(final AppInfo appInfo) {
+        final String value = 
appInfo.properties.getProperty(OPENEJB_JAXRS_PROVIDERS_AUTO_PROP);
+        if (value != null) {
+            return "true".equalsIgnoreCase(value.trim());
+        }
+        return 
SystemInstance.get().getOptions().get(OPENEJB_JAXRS_PROVIDERS_AUTO_PROP, true);
     }
 
     private Collection<Object> appProviders(final AppInfo appInfo, final 
ClassLoader classLoader) {
@@ -575,7 +583,7 @@ public abstract class RESTService implem
                     }
 
                     final Collection<Object> providers;
-                    if (useDiscoveredProviders()) {
+                    if (useDiscoveredProviders(appInfo)) {
                         providers = appProviders(appInfo, appClassLoader);
                     } else {
                         providers = new ArrayList<Object>();


Reply via email to