You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2014/08/31 21:33:39 UTC

svn commit: r1621619 - in /tomee/tomee/trunk: arquillian/arquillian-tomee-tests/arquillian-tomee-jaxrs-tests/src/test/java/org/apache/openejb/arquillian/tests/jaxrs/staticresources/ server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/

Author: rmannibucau
Date: Sun Aug 31 19:33:39 2014
New Revision: 1621619

URL: http://svn.apache.org/r1621619
Log:
TOMEE-1339 try static resources first for JAXRS - jsp/servlets will not work and that's expected, fixing it would mean container didn't through any exception while deploying which is a biggest error ;)

Added:
    tomee/tomee/trunk/arquillian/arquillian-tomee-tests/arquillian-tomee-jaxrs-tests/src/test/java/org/apache/openejb/arquillian/tests/jaxrs/staticresources/
    tomee/tomee/trunk/arquillian/arquillian-tomee-tests/arquillian-tomee-jaxrs-tests/src/test/java/org/apache/openejb/arquillian/tests/jaxrs/staticresources/AvoidConflictTest.java
    tomee/tomee/trunk/arquillian/arquillian-tomee-tests/arquillian-tomee-jaxrs-tests/src/test/java/org/apache/openejb/arquillian/tests/jaxrs/staticresources/TheResource.java
Modified:
    tomee/tomee/trunk/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java

Added: tomee/tomee/trunk/arquillian/arquillian-tomee-tests/arquillian-tomee-jaxrs-tests/src/test/java/org/apache/openejb/arquillian/tests/jaxrs/staticresources/AvoidConflictTest.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/arquillian/arquillian-tomee-tests/arquillian-tomee-jaxrs-tests/src/test/java/org/apache/openejb/arquillian/tests/jaxrs/staticresources/AvoidConflictTest.java?rev=1621619&view=auto
==============================================================================
--- tomee/tomee/trunk/arquillian/arquillian-tomee-tests/arquillian-tomee-jaxrs-tests/src/test/java/org/apache/openejb/arquillian/tests/jaxrs/staticresources/AvoidConflictTest.java (added)
+++ tomee/tomee/trunk/arquillian/arquillian-tomee-tests/arquillian-tomee-jaxrs-tests/src/test/java/org/apache/openejb/arquillian/tests/jaxrs/staticresources/AvoidConflictTest.java Sun Aug 31 19:33:39 2014
@@ -0,0 +1,56 @@
+/*
+ * 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.arquillian.tests.jaxrs.staticresources;
+
+import org.apache.ziplock.IO;
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.arquillian.test.api.ArquillianResource;
+import org.jboss.shrinkwrap.api.Archive;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.asset.StringAsset;
+import org.jboss.shrinkwrap.api.spec.WebArchive;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.io.IOException;
+import java.net.URL;
+
+import static org.junit.Assert.assertEquals;
+
+@RunWith(Arquillian.class)
+public class AvoidConflictTest {
+    @Deployment(testable = false)
+    public static Archive<?> war() {
+        return ShrinkWrap.create(WebArchive.class, "app.war")
+                    .addClass(TheResource.class)
+                    .addAsWebResource(new StringAsset("static"), "index.html");
+    }
+
+    @ArquillianResource
+    private URL url;
+
+    @Test
+    public void jaxrs() throws IOException {
+        assertEquals("resource", IO.slurp(new URL(url.toExternalForm() + "the")));
+    }
+
+    @Test
+    public void staticResource() throws IOException {
+        assertEquals("static", IO.slurp(url));
+    }
+}

Added: tomee/tomee/trunk/arquillian/arquillian-tomee-tests/arquillian-tomee-jaxrs-tests/src/test/java/org/apache/openejb/arquillian/tests/jaxrs/staticresources/TheResource.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/arquillian/arquillian-tomee-tests/arquillian-tomee-jaxrs-tests/src/test/java/org/apache/openejb/arquillian/tests/jaxrs/staticresources/TheResource.java?rev=1621619&view=auto
==============================================================================
--- tomee/tomee/trunk/arquillian/arquillian-tomee-tests/arquillian-tomee-jaxrs-tests/src/test/java/org/apache/openejb/arquillian/tests/jaxrs/staticresources/TheResource.java (added)
+++ tomee/tomee/trunk/arquillian/arquillian-tomee-tests/arquillian-tomee-jaxrs-tests/src/test/java/org/apache/openejb/arquillian/tests/jaxrs/staticresources/TheResource.java Sun Aug 31 19:33:39 2014
@@ -0,0 +1,29 @@
+/*
+ * 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.arquillian.tests.jaxrs.staticresources;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+
+@Path("/")
+public class TheResource {
+    @GET
+    @Path("the")
+    public String get() {
+        return "resource";
+    }
+}

Modified: tomee/tomee/trunk/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java?rev=1621619&r1=1621618&r2=1621619&view=diff
==============================================================================
--- tomee/tomee/trunk/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java (original)
+++ tomee/tomee/trunk/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java Sun Aug 31 19:33:39 2014
@@ -103,6 +103,8 @@ import java.util.concurrent.CopyOnWriteA
 import java.util.logging.Level;
 import java.util.regex.Pattern;
 
+import static java.util.Arrays.asList;
+
 public class CxfRsHttpListener implements RsHttpListener {
 
     private static final Logger LOGGER = Logger.getInstance(LogCategory.OPENEJB_RS, CxfRsHttpListener.class);
@@ -116,6 +118,7 @@ public class CxfRsHttpListener implement
     public static final String RESOURCE_COMPARATOR_KEY = CXF_JAXRS_PREFIX + "resourceComparator";
 
     private static final String GLOBAL_PROVIDERS = SystemInstance.get().getProperty(PROVIDERS_KEY);
+    private static final boolean TRY_STATIC_RESOURCES = "true".equalsIgnoreCase(SystemInstance.get().getProperty("openejb.jaxrs.static-first", "true"));
 
     private static final Map<String, String> STATIC_CONTENT_TYPES;
 
@@ -132,6 +135,7 @@ public class CxfRsHttpListener implement
     static {
         STATIC_CONTENT_TYPES = new HashMap<>();
         STATIC_CONTENT_TYPES.put("html", "text/html");
+        STATIC_CONTENT_TYPES.put("htm", "text/html");
         STATIC_CONTENT_TYPES.put("xhtml", "text/html");
         STATIC_CONTENT_TYPES.put("txt", "text/plain");
         STATIC_CONTENT_TYPES.put("css", "text/css");
@@ -149,11 +153,6 @@ public class CxfRsHttpListener implement
 
     @Override
     public void onMessage(final HttpRequest httpRequest, final HttpResponse httpResponse) throws Exception {
-        if (matchPath(httpRequest)) {
-            serveStaticContent(httpRequest, httpResponse, httpRequest.getPathInfo());
-            return;
-        }
-
         // fix the address (to manage multiple connectors)
         if (HttpRequestImpl.class.isInstance(httpRequest)) {
             final HttpRequestImpl requestImpl = HttpRequestImpl.class.cast(httpRequest);
@@ -162,15 +161,20 @@ public class CxfRsHttpListener implement
         }
 
         String baseURL = BaseUrlHelper.getBaseURL(httpRequest);
-
         if (!baseURL.endsWith("/")) {
             baseURL += "/";
         }
-
         httpRequest.setAttribute("org.apache.cxf.transport.endpoint.address", baseURL);
-        if (null == destination.getRegistry().checkRestfulRequest(httpRequest.getRequestURL().toString())) {
-            serveStaticContent(httpRequest, httpResponse, httpRequest.getPathInfo());
-            return;
+
+        boolean matchedStatic = false;
+        if (TRY_STATIC_RESOURCES || (matchedStatic = matchPath(httpRequest))) {
+            final String pathInfo = httpRequest.getPathInfo();
+            if (serveStaticContent(httpRequest, httpResponse, pathInfo)) {
+                if (matchedStatic) { // we should have gotten the resource
+                    throw new ServletException("Static resource " + pathInfo + " is not available");
+                }
+                return; // ok that's a surely rest service
+            }
         }
 
         // delegate invocation
@@ -202,12 +206,20 @@ public class CxfRsHttpListener implement
         return false;
     }
 
-    protected void serveStaticContent(final HttpServletRequest request,
+    protected boolean serveStaticContent(final HttpServletRequest request,
                                       final HttpServletResponse response,
                                       final String pathInfo) throws ServletException {
-        final InputStream is = request.getServletContext().getResourceAsStream(pathInfo);
+        InputStream is = request.getServletContext().getResourceAsStream(pathInfo);
+        if (is == null && "/".equals(pathInfo)) {
+            for (final String n : asList("/index.html", "/index.htm")) {
+                is = request.getServletContext().getResourceAsStream(n);
+                if (is != null) {
+                    break;
+                }
+            }
+        }
         if (is == null) {
-            throw new ServletException("Static resource " + pathInfo + " is not available");
+            return false;
         }
         try {
             final int ind = pathInfo.lastIndexOf(".");
@@ -221,10 +233,11 @@ public class CxfRsHttpListener implement
             final ServletOutputStream os = response.getOutputStream();
             IOUtils.copy(is, os);
             os.flush();
+            response.setStatus(HttpURLConnection.HTTP_OK);
         } catch (final IOException ex) {
             throw new ServletException("Static resource " + pathInfo + " can not be written to the output stream");
         }
-
+        return true;
     }
 
     @Override