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