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


Reply via email to