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>();