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 2016/03/25 19:41:58 UTC

tomee git commit: TOMEE-1759 ensuring JSF can have nested request (forwards)

Repository: tomee
Updated Branches:
  refs/heads/master 7a676c243 -> a5088393d


TOMEE-1759 ensuring JSF can have nested request (forwards)


Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/a5088393
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/a5088393
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/a5088393

Branch: refs/heads/master
Commit: a5088393dd32f167ab0869e955db194aa914dc67
Parents: 7a676c2
Author: Romain manni-Bucau <rm...@gmail.com>
Authored: Fri Mar 25 19:41:39 2016 +0100
Committer: Romain manni-Bucau <rm...@gmail.com>
Committed: Fri Mar 25 19:41:39 2016 +0100

----------------------------------------------------------------------
 .../tomee/catalina/TomcatWebAppBuilder.java     | 23 +++++++
 .../myfaces/TomEEWorkaroundFacesServlet.java    | 70 ++++++++++++++++++++
 2 files changed, 93 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tomee/blob/a5088393/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
----------------------------------------------------------------------
diff --git a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
index e0e53f1..e94e2a1 100644
--- a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
+++ b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
@@ -35,6 +35,7 @@ import org.apache.catalina.Valve;
 import org.apache.catalina.WebResource;
 import org.apache.catalina.WebResourceRoot;
 import org.apache.catalina.WebResourceSet;
+import org.apache.catalina.Wrapper;
 import org.apache.catalina.core.ContainerBase;
 import org.apache.catalina.core.NamingContextListener;
 import org.apache.catalina.core.StandardContext;
@@ -98,6 +99,7 @@ import org.apache.openejb.core.ivm.IntraVmProxy;
 import org.apache.openejb.core.ivm.naming.SystemComponentReference;
 import org.apache.openejb.jee.EnvEntry;
 import org.apache.openejb.jee.WebApp;
+import org.apache.openejb.loader.Files;
 import org.apache.openejb.loader.IO;
 import org.apache.openejb.loader.SystemInstance;
 import org.apache.openejb.server.httpd.BeginWebBeansListener;
@@ -1811,7 +1813,28 @@ public class TomcatWebAppBuilder implements WebAppBuilder, ContextListener, Pare
 
         addConfiguredDocBases(standardContext, contextInfo);
 
+        ensureMyFacesDontLooseFacesContext(standardContext);
+    }
 
+    private void ensureMyFacesDontLooseFacesContext(final StandardContext standardContext) {
+        for (final Container w : standardContext.findChildren()) {
+            if (!Wrapper.class.isInstance(w)) {
+                continue;
+            }
+            final Wrapper wrapper = Wrapper.class.cast(w);
+            if ("FacesServlet".equals(wrapper.getName()) && "javax.faces.webapp.FacesServlet".equals(wrapper.getServletClass())) {
+                final ClassLoader loader = standardContext.getLoader().getClassLoader();
+                try {
+                    if (Files.toFile(loader.getResource("javax/faces/webapp/FacesServlet.class")).getName().startsWith("myfaces")) {
+                        loader.loadClass("org.apache.tomee.myfaces.TomEEWorkaroundFacesServlet");
+                        wrapper.setServletClass("org.apache.tomee.myfaces.TomEEWorkaroundFacesServlet");
+                        break;
+                    }
+                } catch (final Throwable t) {
+                    // not there, not a big deal in most of cases
+                }
+            }
+        }
     }
 
     private static String appVersion(final AppInfo appInfo) {

http://git-wip-us.apache.org/repos/asf/tomee/blob/a5088393/tomee/tomee-myfaces/src/main/java/org/apache/tomee/myfaces/TomEEWorkaroundFacesServlet.java
----------------------------------------------------------------------
diff --git a/tomee/tomee-myfaces/src/main/java/org/apache/tomee/myfaces/TomEEWorkaroundFacesServlet.java b/tomee/tomee-myfaces/src/main/java/org/apache/tomee/myfaces/TomEEWorkaroundFacesServlet.java
new file mode 100644
index 0000000..018e200
--- /dev/null
+++ b/tomee/tomee-myfaces/src/main/java/org/apache/tomee/myfaces/TomEEWorkaroundFacesServlet.java
@@ -0,0 +1,70 @@
+/**
+ * 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.tomee.myfaces;
+
+import javax.faces.context.FacesContext;
+import javax.faces.webapp.FacesServlet;
+import javax.servlet.Servlet;
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.annotation.MultipartConfig;
+import java.io.IOException;
+
+@MultipartConfig // only there to be able to restore a FacesContext if lost cause of a forward in a JSF request
+public class TomEEWorkaroundFacesServlet implements Servlet {
+    private final FacesServlet delegate = new FacesServlet();
+
+    @Override
+    public void init(final ServletConfig config) throws ServletException {
+        delegate.init(config);
+    }
+
+    @Override
+    public ServletConfig getServletConfig() {
+        return delegate.getServletConfig();
+    }
+
+    @Override
+    public void service(final ServletRequest req, final ServletResponse res) throws ServletException, IOException {
+        final FacesContext originalContext = FacesContext.getCurrentInstance(); // should be null in 80% of cases
+        try {
+            delegate.service(req, res);
+        } finally {
+            if (originalContext != null) {
+                SetFacesContext.exec(originalContext);
+            } // else delegate already released the context, we are fine
+        }
+    }
+
+    @Override
+    public String getServletInfo() {
+        return delegate.getServletInfo();
+    }
+
+    @Override
+    public void destroy() {
+        delegate.destroy();
+    }
+
+    private abstract static class SetFacesContext extends FacesContext {
+        private static void exec(final FacesContext context) {
+            setCurrentInstance(context);
+        }
+    }
+}