You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by de...@apache.org on 2018/05/08 12:48:03 UTC

[myfaces] 03/08: merge revisions 933978-934048 MYFACES-2658, MYFACES-2659

This is an automated email from the ASF dual-hosted git repository.

deki pushed a commit to branch 2_0_0
in repository https://gitbox.apache.org/repos/asf/myfaces.git

commit 8c0dfdfaeaa882a0663b020f2f0142e0322a5fd7
Merge: ff376f1 9f6f90d
Author: Leonardo Uribe <lu...@apache.org>
AuthorDate: Wed Apr 14 19:17:14 2010 +0000

    merge revisions 933978-934048 MYFACES-2658, MYFACES-2659

 .../facelets/FaceletViewDeclarationLanguage.java   |   4 +-
 .../myfaces/view/facelets/FaceletViewHandler.java  |   4 +-
 .../view/facelets/compiler/CompilationManager.java |   4 +-
 .../myfaces/view/facelets/compiler/Compiler.java   |   4 +-
 .../view/facelets/tag/CompositeTagDecorator.java   |   3 +-
 .../view/facelets/tag/jsf/html/HtmlDecorator.java  |   2 +-
 .../FaceletsOnlyException.java}                    |  81 +++--
 .../view/jsp/JspViewDeclarationLanguage.java       | 361 +++++++++++++--------
 8 files changed, 273 insertions(+), 190 deletions(-)

diff --cc impl/src/main/java/org/apache/myfaces/view/jsp/JspViewDeclarationLanguage.java
index bda9a6a,9710d49..918e002
--- a/impl/src/main/java/org/apache/myfaces/view/jsp/JspViewDeclarationLanguage.java
+++ b/impl/src/main/java/org/apache/myfaces/view/jsp/JspViewDeclarationLanguage.java
@@@ -1,139 -1,222 +1,222 @@@
- /*
-  * 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.myfaces.view.jsp;
- 
- import java.io.IOException;
- import java.util.Locale;
- import java.util.logging.Level;
- import java.util.logging.Logger;
- 
- import javax.faces.FacesException;
- import javax.faces.component.UIViewRoot;
- import javax.faces.context.ExternalContext;
- import javax.faces.context.FacesContext;
- import javax.servlet.ServletRequest;
- import javax.servlet.ServletResponse;
- import javax.servlet.http.HttpServletResponse;
- import javax.servlet.jsp.jstl.core.Config;
- 
- import org.apache.myfaces.application.jsp.ServletViewResponseWrapper;
- import org.apache.myfaces.context.servlet.ResponseSwitch;
- import org.apache.myfaces.shared_impl.view.JspViewDeclarationLanguageBase;
- import org.apache.myfaces.util.ExternalContextUtils;
- 
- /**
-  * @author Simon Lessard (latest modification by $Author: slessard $)
-  * @version $Revision: 696523 $ $Date: 2009-03-22 13:55:12 -0400 (mer., 17 sept. 2008) $
-  * 
-  * @since 2.0
-  */
- public class JspViewDeclarationLanguage extends JspViewDeclarationLanguageBase
- {
-     //private static final Log log = LogFactory.getLog(JspViewDeclarationLanguage.class);
-     public static final Logger log = Logger.getLogger(JspViewDeclarationLanguage.class.getName());
-     /**
-      * 
-      */
-     public JspViewDeclarationLanguage()
-     {
-         if (log.isLoggable(Level.FINEST))
-             log.finest("New JspViewDeclarationLanguage instance created");
-     }
- 
-     /**
-      * {@inheritDoc}
-      */
-     @Override
-     public void buildView(FacesContext context, UIViewRoot view) throws IOException
-     {
-         ExternalContext externalContext = context.getExternalContext();
- 
-         if (context.getPartialViewContext().isPartialRequest())
-         {
-             // try to get (or create) a ResponseSwitch and turn off the output
-             Object origResponse = context.getExternalContext().getResponse();
-             ResponseSwitch responseSwitch = ExternalContextUtils.getResponseSwitch(origResponse);
-             if (responseSwitch == null)
-             {
-                 // no ResponseSwitch installed yet - create one 
-                 responseSwitch = ExternalContextUtils.createResponseSwitch(origResponse);
-                 if (responseSwitch != null)
-                 {
-                     // install the ResponseSwitch
-                     context.getExternalContext().setResponse(responseSwitch);
-                 }
-             }
-             if (responseSwitch != null)
-             {
-                 responseSwitch.setEnabled(context, false);
-             }
-         }
-         
-         ServletResponse response = (ServletResponse) externalContext.getResponse();
-         ServletRequest request = (ServletRequest) externalContext.getRequest();
-         
-         Locale locale = view.getLocale();
-         response.setLocale(locale);
-         Config.set(request, Config.FMT_LOCALE, context.getViewRoot().getLocale());
- 
-         String viewId = view.getViewId();
-         ServletViewResponseWrapper wrappedResponse = new ServletViewResponseWrapper((HttpServletResponse) response);
- 
-         externalContext.setResponse(wrappedResponse);
-         try
-         {
-             externalContext.dispatch(viewId);
-         }
-         finally
-         {
-             externalContext.setResponse(response);
-         }
- 
-         boolean errorResponse = wrappedResponse.getStatus() < 200 || wrappedResponse.getStatus() > 299;
-         if (errorResponse)
-         {
-             wrappedResponse.flushToWrappedResponse();
-             return;
-         }
- 
-         //Skip this step if we are rendering an ajax request, because no content outside
-         //f:view tag should be output.
-         if (!context.getPartialViewContext().isPartialRequest())
-         {
-             // store the wrapped response in the request, so it is thread-safe
-             setAfterViewTagResponseWrapper(externalContext, wrappedResponse);
-         }
-     }
- 
-     @Override
-     protected void sendSourceNotFound(FacesContext context, String message)
-     {
-         HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
-         try
-         {
-             context.responseComplete();
-             response.sendError(HttpServletResponse.SC_NOT_FOUND, message);
-         }
-         catch (IOException ioe)
-         {
-             throw new FacesException(ioe);
-         }
-     }
- 
- }
+ /*
+  * 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.myfaces.view.jsp;
+ 
+ import java.io.IOException;
+ import java.util.Locale;
+ import java.util.logging.Level;
+ import java.util.logging.Logger;
+ 
+ import javax.faces.FacesException;
+ import javax.faces.component.UIViewRoot;
+ import javax.faces.context.ExternalContext;
+ import javax.faces.context.FacesContext;
+ import javax.servlet.ServletRequest;
+ import javax.servlet.ServletResponse;
+ import javax.servlet.http.HttpServletResponse;
+ import javax.servlet.jsp.jstl.core.Config;
+ 
+ import org.apache.myfaces.application.jsp.ServletViewResponseWrapper;
+ import org.apache.myfaces.context.servlet.ResponseSwitch;
+ import org.apache.myfaces.shared_impl.view.JspViewDeclarationLanguageBase;
+ import org.apache.myfaces.util.ExternalContextUtils;
+ import org.apache.myfaces.view.facelets.tag.composite.CompositeLibrary;
+ import org.apache.myfaces.view.facelets.tag.jsf.core.CoreLibrary;
+ import org.apache.myfaces.view.facelets.tag.jsf.html.HtmlLibrary;
+ import org.apache.myfaces.view.facelets.tag.ui.UILibrary;
+ 
+ /**
+  * @author Simon Lessard (latest modification by $Author$)
+  * @version $Revision$ $Date$
+  * 
+  * @since 2.0
+  */
+ public class JspViewDeclarationLanguage extends JspViewDeclarationLanguageBase
+ {
+     //private static final Log log = LogFactory.getLog(JspViewDeclarationLanguage.class);
+     public static final Logger log = Logger.getLogger(JspViewDeclarationLanguage.class.getName());
+     
+     /**
+      * Tags that are only available on facelets and not on JSP.
+      * If a user uses one of these tags on a JSP, we will provide
+      * a more informative error message than the standard one.
+      */
+     public static final String[] FACELETS_ONLY_F_TAGS = {"ajax", "event", "metadata"};
+     public static final String[] FACELETS_ONLY_H_TAGS = {"outputScript", "outputStylesheet",
+                                                          "head", "body", "button", "link"};
+     
+     /**
+      * 
+      */
+     public JspViewDeclarationLanguage()
+     {
+         if (log.isLoggable(Level.FINEST))
+             log.finest("New JspViewDeclarationLanguage instance created");
+     }
+ 
+     /**
+      * {@inheritDoc}
+      */
+     @Override
+     public void buildView(FacesContext context, UIViewRoot view) throws IOException
+     {
+         ExternalContext externalContext = context.getExternalContext();
+ 
+         if (context.getPartialViewContext().isPartialRequest())
+         {
+             // try to get (or create) a ResponseSwitch and turn off the output
+             Object origResponse = context.getExternalContext().getResponse();
+             ResponseSwitch responseSwitch = ExternalContextUtils.getResponseSwitch(origResponse);
+             if (responseSwitch == null)
+             {
+                 // no ResponseSwitch installed yet - create one 
+                 responseSwitch = ExternalContextUtils.createResponseSwitch(origResponse);
+                 if (responseSwitch != null)
+                 {
+                     // install the ResponseSwitch
+                     context.getExternalContext().setResponse(responseSwitch);
+                 }
+             }
+             if (responseSwitch != null)
+             {
+                 responseSwitch.setEnabled(context, false);
+             }
+         }
+         
+         ServletResponse response = (ServletResponse) externalContext.getResponse();
+         ServletRequest request = (ServletRequest) externalContext.getRequest();
+         
+         Locale locale = view.getLocale();
+         response.setLocale(locale);
+         Config.set(request, Config.FMT_LOCALE, context.getViewRoot().getLocale());
+ 
+         String viewId = view.getViewId();
+         ServletViewResponseWrapper wrappedResponse = new ServletViewResponseWrapper((HttpServletResponse) response);
+ 
+         externalContext.setResponse(wrappedResponse);
+         try
+         {
+             externalContext.dispatch(viewId);
+         }
+         catch (FacesException e)
+         {
+             // try to extract the most likely exceptions here
+             // and provide a better error message for them
+             
+             String message = e.getMessage(); 
+             
+             // errors related to using facelets-only tags on a JSP page
+             if (message != null)
+             {
+                 // does the message contain "f" (prefix f of tags)
+                 // or the related uri http://java.sun.com/jsf/core
+                 if (message.contains("\"f\"") 
+                         || message.contains("\"" + CoreLibrary.Namespace + "\""))
+                 {
+                     // check facelets-only f tags
+                     for (String tag : FACELETS_ONLY_F_TAGS)
+                     {
+                         if (message.contains("\"" + tag + "\""))
+                         {
+                             String exceptionMessage = "The tag f:" + tag + 
+                                     " is only available on facelets.";
+                             throw new FacesException(exceptionMessage, 
+                                     new FaceletsOnlyException(exceptionMessage, e.getCause()));
+                         }
+                     }
+                 }  
+                 else if (message.contains("\"h\"") 
+                         || message.contains("\"" + HtmlLibrary.Namespace + "\""))
+                 {
+                     // check facelets-only h tags
+                     for (String tag : FACELETS_ONLY_H_TAGS)
+                     {
+                         if (message.contains("\"" + tag + "\""))
+                         {
+                             String exceptionMessage = "The tag h:" + tag + 
+                                     " is only available on facelets.";
+                             throw new FacesException(exceptionMessage, 
+                                     new FaceletsOnlyException(exceptionMessage, e.getCause()));
+                         }
+                     }
+                 }
+                 else 
+                 {
+                     // check facelets-only namespaces
+                     String namespace = null;
+                     if (message.contains(UILibrary.Namespace))
+                     {
+                         namespace = UILibrary.Namespace;
+                     }
+                     else if (message.contains(CompositeLibrary.NAMESPACE))
+                     {
+                         namespace = CompositeLibrary.NAMESPACE;
+                     }
+                     
+                     if (namespace != null)
+                     {
+                         // the message contains a facelets-only namespace
+                         String exceptionMessage = "All tags with namespace " +
+                                 namespace + " are only available on facelets.";
+                         throw new FacesException(exceptionMessage, 
+                                 new FaceletsOnlyException(exceptionMessage, e.getCause()));
+                     }
+                 }
+             }
+             
+             // no rule applied to this Exception - rethrow it
+             throw e;
+         }
+         finally
+         {
+             externalContext.setResponse(response);
+         }
+ 
+         boolean errorResponse = wrappedResponse.getStatus() < 200 || wrappedResponse.getStatus() > 299;
+         if (errorResponse)
+         {
+             wrappedResponse.flushToWrappedResponse();
+             return;
+         }
+ 
+         //Skip this step if we are rendering an ajax request, because no content outside
+         //f:view tag should be output.
+         if (!context.getPartialViewContext().isPartialRequest())
+         {
+             // store the wrapped response in the request, so it is thread-safe
+             setAfterViewTagResponseWrapper(externalContext, wrappedResponse);
+         }
+     }
+ 
+     @Override
+     protected void sendSourceNotFound(FacesContext context, String message)
+     {
+         HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
+         try
+         {
+             context.responseComplete();
+             response.sendError(HttpServletResponse.SC_NOT_FOUND, message);
+         }
+         catch (IOException ioe)
+         {
+             throw new FacesException(ioe);
+         }
+     }
+ 
 -}
++}

-- 
To stop receiving notification emails like this one, please contact
deki@apache.org.