Author: rmannibucau
Date: Thu Jan 3 13:58:40 2013
New Revision: 1428350
URL: http://svn.apache.org/viewvc?rev=1428350&view=rev
Log:
TOMEE-696 jaxrs application can be defined as servlet in servlet name (WTF?) so
skipping these servlets
Added:
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ParamValueInfo.java
openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/ApplicationFromWebXmlTest.java
- copied, changed from r1428204,
openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/SimpleApplicationTest.java
Modified:
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ServletInfo.java
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/web/LightweightWebAppBuilder.java
openejb/trunk/openejb/container/openejb-jee/src/main/java/org/apache/openejb/jee/WebApp.java
openejb/trunk/openejb/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
Added:
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ParamValueInfo.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ParamValueInfo.java?rev=1428350&view=auto
==============================================================================
---
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ParamValueInfo.java
(added)
+++
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ParamValueInfo.java
Thu Jan 3 13:58:40 2013
@@ -0,0 +1,22 @@
+/*
+ * 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.assembler.classic;
+
+public class ParamValueInfo {
+ public String name;
+ public String value;
+}
Modified:
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ServletInfo.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ServletInfo.java?rev=1428350&r1=1428349&r2=1428350&view=diff
==============================================================================
---
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ServletInfo.java
(original)
+++
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ServletInfo.java
Thu Jan 3 13:58:40 2013
@@ -24,4 +24,5 @@ public class ServletInfo extends InfoObj
public String servletClass;
public String runAs;
public List<String> mappings = new ArrayList<String>();
+ public List<ParamValueInfo> initParams = new ArrayList<ParamValueInfo>();
}
Modified:
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java?rev=1428350&r1=1428349&r2=1428350&view=diff
==============================================================================
---
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java
(original)
+++
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java
Thu Jan 3 13:58:40 2013
@@ -33,6 +33,7 @@ import org.apache.openejb.assembler.clas
import org.apache.openejb.assembler.classic.ListenerInfo;
import org.apache.openejb.assembler.classic.MdbContainerInfo;
import org.apache.openejb.assembler.classic.MessageDrivenBeanInfo;
+import org.apache.openejb.assembler.classic.ParamValueInfo;
import org.apache.openejb.assembler.classic.PersistenceUnitInfo;
import org.apache.openejb.assembler.classic.PortInfo;
import org.apache.openejb.assembler.classic.ResourceInfo;
@@ -404,6 +405,12 @@ class AppInfoBuilder {
servletInfo.servletName = servlet.getServletName();
servletInfo.servletClass = servlet.getServletClass();
servletInfo.mappings =
webModule.getWebApp().getServletMappings(servletInfo.servletName);
+ for (ParamValue pv : servlet.getInitParam()) {
+ final ParamValueInfo pvi = new ParamValueInfo();
+ pvi.name = pv.getParamName();
+ pvi.value = pv.getParamValue();
+ servletInfo.initParams.add(pvi);
+ }
webAppInfo.servlets.add(servletInfo);
}
Modified:
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/web/LightweightWebAppBuilder.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/web/LightweightWebAppBuilder.java?rev=1428350&r1=1428349&r2=1428350&view=diff
==============================================================================
---
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/web/LightweightWebAppBuilder.java
(original)
+++
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/web/LightweightWebAppBuilder.java
Thu Jan 3 13:58:40 2013
@@ -27,6 +27,7 @@ import org.apache.openejb.assembler.clas
import org.apache.openejb.assembler.classic.InjectionBuilder;
import org.apache.openejb.assembler.classic.JndiEncBuilder;
import org.apache.openejb.assembler.classic.ListenerInfo;
+import org.apache.openejb.assembler.classic.ParamValueInfo;
import org.apache.openejb.assembler.classic.ServletInfo;
import org.apache.openejb.assembler.classic.WebAppBuilder;
import org.apache.openejb.assembler.classic.WebAppInfo;
@@ -55,6 +56,7 @@ import javax.servlet.ServletContextListe
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
+import javax.ws.rs.core.Application;
import java.io.File;
import java.lang.reflect.Method;
import java.util.ArrayList;
@@ -197,6 +199,31 @@ public class LightweightWebAppBuilder im
// register servlets
for (ServletInfo info : webAppInfo.servlets) {
+ if
("true".equalsIgnoreCase(appInfo.properties.getProperty("openejb.jaxrs.on",
"true"))) {
+ // skip jaxrs servlets
+ boolean skip = false;
+ for (ParamValueInfo pvi : info.initParams) {
+ if ("javax.ws.rs.Application".equals(pvi.name) ||
Application.class.getName().equals(pvi.name)) {
+ skip = true;
+ }
+ }
+
+ if (skip) {
+ continue;
+ }
+
+ if (info.servletClass == null) {
+ try {
+ if
(Application.class.isAssignableFrom(classLoader.loadClass(info.servletName))) {
+ continue;
+ }
+ } catch (Exception e) {
+ // no-op
+ }
+ }
+ } // else let the user manage itself a rest servlet etc...
+
+ // deploy
for (String mapping : info.mappings) {
try {
addServletMethod.invoke(null, info.servletClass,
webContext, mapping);
Modified:
openejb/trunk/openejb/container/openejb-jee/src/main/java/org/apache/openejb/jee/WebApp.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-jee/src/main/java/org/apache/openejb/jee/WebApp.java?rev=1428350&r1=1428349&r2=1428350&view=diff
==============================================================================
---
openejb/trunk/openejb/container/openejb-jee/src/main/java/org/apache/openejb/jee/WebApp.java
(original)
+++
openejb/trunk/openejb/container/openejb-jee/src/main/java/org/apache/openejb/jee/WebApp.java
Thu Jan 3 13:58:40 2013
@@ -682,6 +682,21 @@ public class WebApp implements WebCommon
return this;
}
+ public WebApp addServletMapping(final String servletName, final String
mapping) {
+ for (ServletMapping s : getServletMapping()) {
+ if (servletName.equals(s.getServletName())) {
+ s.getUrlPattern().add(mapping);
+ return this;
+ }
+ }
+
+ final ServletMapping sm = new ServletMapping();
+ sm.setServletName(servletName);
+ sm.getUrlPattern().add(mapping);
+ getServletMapping().add(sm);
+ return this;
+ }
+
public WebApp addInitParam(final String servletName, final String name,
final String value) {
final ParamValue paramValue = new ParamValue();
paramValue.setParamName(name);
Copied:
openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/ApplicationFromWebXmlTest.java
(from r1428204,
openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/SimpleApplicationTest.java)
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/ApplicationFromWebXmlTest.java?p2=openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/ApplicationFromWebXmlTest.java&p1=openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/SimpleApplicationTest.java&r1=1428204&r2=1428350&rev=1428350&view=diff
==============================================================================
---
openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/SimpleApplicationTest.java
(original)
+++
openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/ApplicationFromWebXmlTest.java
Thu Jan 3 13:58:40 2013
@@ -16,37 +16,34 @@
*/
package org.apache.openejb.server.cxf.rs;
-import org.apache.cxf.jaxrs.client.ServerWebApplicationException;
import org.apache.cxf.jaxrs.client.WebClient;
import org.apache.openejb.jee.WebApp;
import org.apache.openejb.junit.ApplicationComposer;
-import org.apache.openejb.junit.Classes;
import org.apache.openejb.junit.EnableServices;
import org.apache.openejb.junit.Module;
-import org.apache.openejb.server.cxf.rs.beans.*;
+import org.apache.openejb.server.cxf.rs.beans.MyFirstRestClass;
import org.junit.Test;
import org.junit.runner.RunWith;
-import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.core.Application;
-import javax.ws.rs.core.Response;
-import java.io.InputStream;
-import java.io.StringWriter;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
import static org.junit.Assert.assertEquals;
@EnableServices("jax-rs")
@RunWith(ApplicationComposer.class)
-public class SimpleApplicationTest {
- public static final String BASE_URL = "http://localhost:4204/foo/my-app";
+public class ApplicationFromWebXmlTest {
+ public static final String BASE_URL = "http://localhost:4204/foo/bar";
@Module
- @Classes({ RestWithInjections.class, SimpleEJB.class,
MyExpertRestClass.class, MyFirstRestClass.class })
public WebApp war() {
return new WebApp()
.contextRoot("foo")
.addServlet("REST Application", Application.class.getName())
- .addInitParam("REST Application", "javax.ws.rs.Application",
MyRESTApplication.class.getName());
+ .addInitParam("REST Application", "javax.ws.rs.Application",
XmlApplication.class.getName())
+ .addServletMapping("REST Application", "/bar/*");
}
@Test
@@ -55,38 +52,9 @@ public class SimpleApplicationTest {
assertEquals("Hi from REST World!", hi);
}
- @Test
- public void second() {
- String hi =
WebClient.create(BASE_URL).path("/second/hi2/2nd").get(String.class);
- assertEquals("hi 2nd", hi);
- }
-
- @Test
- public void expert() throws Exception {
- Response response =
WebClient.create(BASE_URL).path("/expert/still-hi").post("Pink Floyd");
- assertEquals(HttpServletResponse.SC_OK, response.getStatus());
-
- InputStream is = (InputStream) response.getEntity();
- StringWriter writer = new StringWriter();
- int c;
- while ((c = is.read()) != -1) {
- writer.write(c);
+ public static class XmlApplication extends Application {
+ public Set<Class<?>> getClasses() {
+ return new
HashSet<Class<?>>(Arrays.asList(MyFirstRestClass.class));
}
- assertEquals("hi Pink Floyd", writer.toString());
- }
-
- @Test(expected = ServerWebApplicationException.class)
- public void nonListed() {
-
WebClient.create(BASE_URL).path("/non-listed/yata/foo").get(String.class);
- }
-
- @Test
- public void hooked() {
- assertEquals(true,
WebClient.create(BASE_URL).path("/hooked/post").get(Boolean.class));
- }
-
- @Test
- public void injectEjb() {
- assertEquals(true,
WebClient.create(BASE_URL).path("/inject/ejb").get(Boolean.class));
}
}
Modified:
openejb/trunk/openejb/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java?rev=1428350&r1=1428349&r2=1428350&view=diff
==============================================================================
---
openejb/trunk/openejb/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java
(original)
+++
openejb/trunk/openejb/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java
Thu Jan 3 13:58:40 2013
@@ -25,7 +25,9 @@ import org.apache.openejb.assembler.clas
import org.apache.openejb.assembler.classic.EjbJarInfo;
import org.apache.openejb.assembler.classic.EnterpriseBeanInfo;
import org.apache.openejb.assembler.classic.IdPropertiesInfo;
+import org.apache.openejb.assembler.classic.ParamValueInfo;
import org.apache.openejb.assembler.classic.ServiceInfo;
+import org.apache.openejb.assembler.classic.ServletInfo;
import org.apache.openejb.assembler.classic.WebAppInfo;
import
org.apache.openejb.assembler.classic.event.AssemblerAfterApplicationCreated;
import
org.apache.openejb.assembler.classic.event.AssemblerBeforeApplicationDestroyed;
@@ -186,7 +188,7 @@ public abstract class RESTService implem
}
if (deploymentWithApplication) { // don't do it if we
detected we should use old deployment
- final String path = appPrefix(appClazz);
+ final String path = appPrefix(webApp, appClazz);
if (path != null) {
prefix += path + wildcard;
} else {
@@ -265,7 +267,7 @@ public abstract class RESTService implem
throw new OpenEJBRestRuntimeException("can't create
class " + app, e);
}
- final String path = appPrefix(appClazz);
+ final String path = appPrefix(webApp, appClazz);
if (path != null) {
appPrefix += path;
}
@@ -391,7 +393,7 @@ public abstract class RESTService implem
}
}
- private static String appPrefix(final Class<?> appClazz) {
+ private static String appPrefix(final WebAppInfo info, final Class<?>
appClazz) {
final ApplicationPath path =
appClazz.getAnnotation(ApplicationPath.class);
if (path != null) {
String appPath = path.value();
@@ -401,6 +403,38 @@ public abstract class RESTService implem
return appPath;
}
}
+
+ // no annotation, try servlets
+ for (ServletInfo s : info.servlets) {
+ if (s.mappings.isEmpty()) {
+ continue;
+ }
+
+ String mapping = null;
+
+ final String name = appClazz.getName();
+ if (name.equals(s.servletClass) || name.equals(s.servletName)) {
+ mapping = s.mappings.iterator().next();
+ } else {
+ for (ParamValueInfo pvi : s.initParams) {
+ if ("javax.ws.rs.Application".equals(pvi.name) ||
Application.class.getName().equals(pvi.name)) {
+ mapping = s.mappings.iterator().next();
+ break;
+ }
+ }
+ }
+
+ if (mapping != null) {
+ if (mapping.endsWith("/*")) {
+ mapping = mapping.substring(0, mapping.length() - 2);
+ }
+ if (mapping.startsWith("/")) {
+ mapping = mapping.substring(1);
+ }
+ return mapping;
+ }
+ }
+
return null;
}
@@ -432,6 +466,9 @@ public abstract class RESTService implem
if (!enabled) return;
final AppInfo appInfo = event.getApp();
+ if
("false".equalsIgnoreCase(appInfo.properties.getProperty("openejb.jaxrs.on",
"true"))) {
+ return;
+ }
quickCheckIfOldDeploymentShouldBeUsedFromEjbConfig(appInfo);
Modified:
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java?rev=1428350&r1=1428349&r2=1428350&view=diff
==============================================================================
---
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java
(original)
+++
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java
Thu Jan 3 13:58:40 2013
@@ -16,13 +16,16 @@
*/
package org.apache.tomee.catalina;
+import org.apache.catalina.Container;
import org.apache.catalina.Context;
import org.apache.catalina.core.StandardContext;
+import org.apache.catalina.core.StandardWrapper;
import org.apache.catalina.deploy.ContextResource;
import org.apache.catalina.deploy.NamingResources;
import org.apache.catalina.deploy.WebXml;
import org.apache.catalina.startup.ContextConfig;
import org.apache.naming.factory.Constants;
+import org.apache.openejb.assembler.classic.AppInfo;
import org.apache.openejb.assembler.classic.ClassListInfo;
import org.apache.openejb.assembler.classic.OpenEjbConfiguration;
import org.apache.openejb.assembler.classic.ResourceInfo;
@@ -40,6 +43,7 @@ import org.apache.tomee.common.NamingUti
import org.apache.tomee.common.ResourceFactory;
import javax.servlet.ServletContainerInitializer;
+import javax.ws.rs.core.Application;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
@@ -47,6 +51,7 @@ import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
@@ -75,6 +80,55 @@ public class OpenEJBContextConfig extend
public void configureStart() {
super.configureStart();
adjustDataSourceNameIfNecessary(); // doing it here to potentially
factorize resource id resolution
+ cleanUpRestServlets();
+ }
+
+ private void cleanUpRestServlets() {
+ final WebAppInfo webAppInfo = info.get();
+ final AppInfo appInfo = info.app();
+ if (webAppInfo == null || appInfo == null ||
"false".equalsIgnoreCase(appInfo.properties.getProperty("openejb.jaxrs.on",
"true"))) {
+ return;
+ }
+
+ final Container[] children = context.findChildren();
+ final Map<String, Container> mappedChildren = new HashMap<String,
Container>();
+ if (children != null) {
+ // index potential rest containers by class to cleanup
applications defined as servlet
+ for (Container c : children) {
+ if (!(c instanceof StandardWrapper)) {
+ continue;
+ }
+
+ final StandardWrapper wrapper = (StandardWrapper) c;
+
+ String appSpec =
wrapper.getInitParameter("javax.ws.rs.Application");
+ if (appSpec != null) {
+ mappedChildren.put(appSpec, c);
+ } else {
+ String app =
wrapper.getInitParameter(Application.class.getName());
+ if (app != null) {
+ mappedChildren.put(app, c);
+ } else if (wrapper.getServletClass() == null) {
+ try {
+ if (Application.class.isAssignableFrom(
+
context.getLoader().getClassLoader().loadClass(wrapper.getServletName()))) {
+ context.removeChild(c); // remove directly
since it is not in restApplications
+ }
+ } catch (Exception e) {
+ // no-op
+ }
+ }
+ }
+ }
+
+ // cleanup
+ for (String clazz : webAppInfo.restApplications) {
+ final Container child = mappedChildren.get(clazz);
+ if (child != null) {
+ context.removeChild(child);
+ }
+ }
+ }
}
@Override
Modified:
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java?rev=1428350&r1=1428349&r2=1428350&view=diff
==============================================================================
---
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
(original)
+++
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
Thu Jan 3 13:58:40 2013
@@ -865,6 +865,15 @@ public class TomcatWebAppBuilder impleme
}
}
+ public AppInfo app() {
+ final ContextInfo contextInfo = getContextInfo(standardContext);
+ if (contextInfo == null) {
+ logger.debug("No ContextInfo for StandardContext " +
standardContext.getName());
+ return null;
+ }
+ return contextInfo.appInfo;
+ }
+
public WebAppInfo get() {
if (standardContext == null) return null;
@@ -1063,6 +1072,7 @@ public class TomcatWebAppBuilder impleme
}
if (webAppInfo != null) {
+
if (appContext == null) {
appContext =
getContainerSystem().getAppContext(contextInfo.appInfo.appId);
}