On Wed, Apr 14, 2010 at 10:09 PM, Jakob Korherr <jakob.korh...@gmail.com> wrote: > WTF?
no appropriate wording, here > Did anyone read my mail on that? nope, where did you sent it ? > It cannot be a FacesException, because > then the message would be lost! that's fine, we can change that back to original code. -Matthias > > > 2010/4/14 Leonardo Uribe <lu4...@gmail.com> >> >> >> 2010/4/14 Matthias Wessendorf <mat...@apache.org> >>> >>> public class FaceletsOnlyException extends Exception >>> >>> >>> ==> can you make that extending FacesException ? >>> >> >> Yes, no problem. It is done. >> >>> >>> -Matthias >>> >>> On Wed, Apr 14, 2010 at 7:48 PM, <jak...@apache.org> wrote: >>> > Author: jakobk >>> > Date: Wed Apr 14 17:48:28 2010 >>> > New Revision: 934048 >>> > >>> > URL: http://svn.apache.org/viewvc?rev=934048&view=rev >>> > Log: >>> > MYFACES-2658 Indicate a better error when using Facelet TAGs on JSP(X) >>> > pages >>> > >>> > Added: >>> > >>> > myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/jsp/FaceletsOnlyException.java >>> > (with props) >>> > Modified: >>> > >>> > myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/jsp/JspViewDeclarationLanguage.java >>> > (contents, props changed) >>> > >>> > Added: >>> > myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/jsp/FaceletsOnlyException.java >>> > URL: >>> > http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/jsp/FaceletsOnlyException.java?rev=934048&view=auto >>> > >>> > ============================================================================== >>> > --- >>> > myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/jsp/FaceletsOnlyException.java >>> > (added) >>> > +++ >>> > myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/jsp/FaceletsOnlyException.java >>> > Wed Apr 14 17:48:28 2010 >>> > @@ -0,0 +1,40 @@ >>> > +/* >>> > + * 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; >>> > + >>> > +/** >>> > + * An Exception that indicates that the user uses a >>> > + * facelets-only feature on a JSP. >>> > + * >>> > + * @author Jakob Korherr (latest modification by $Author$) >>> > + * @version $Revision$ $Date$ >>> > + * >>> > + * @since 2.0 >>> > + */ >>> > +public class FaceletsOnlyException extends Exception >>> > +{ >>> > + >>> > + private static final long serialVersionUID = 4268633427284543647L; >>> > + >>> > + public FaceletsOnlyException(String message, Throwable cause) >>> > + { >>> > + super(message, cause); >>> > + } >>> > + >>> > +} >>> > >>> > Propchange: >>> > myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/jsp/FaceletsOnlyException.java >>> > >>> > ------------------------------------------------------------------------------ >>> > svn:eol-style = native >>> > >>> > Propchange: >>> > myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/jsp/FaceletsOnlyException.java >>> > >>> > ------------------------------------------------------------------------------ >>> > svn:keywords = Date Author Id Revision HeadURL >>> > >>> > Propchange: >>> > myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/jsp/FaceletsOnlyException.java >>> > >>> > ------------------------------------------------------------------------------ >>> > svn:mime-type = text/plain >>> > >>> > Modified: >>> > myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/jsp/JspViewDeclarationLanguage.java >>> > URL: >>> > http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/jsp/JspViewDeclarationLanguage.java?rev=934048&r1=934047&r2=934048&view=diff >>> > >>> > ============================================================================== >>> > --- >>> > myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/jsp/JspViewDeclarationLanguage.java >>> > (original) >>> > +++ >>> > myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/jsp/JspViewDeclarationLanguage.java >>> > Wed Apr 14 17:48:28 2010 >>> > @@ -1,139 +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); >>> > + } >>> > + } >>> > + >>> > +} >>> > >>> > Propchange: >>> > myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/jsp/JspViewDeclarationLanguage.java >>> > >>> > ------------------------------------------------------------------------------ >>> > svn:eol-style = native >>> > >>> > Propchange: >>> > myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/jsp/JspViewDeclarationLanguage.java >>> > >>> > ------------------------------------------------------------------------------ >>> > svn:keywords = Date Author Id Revision HeadURL >>> > >>> > >>> > >>> >>> >>> >>> -- >>> Matthias Wessendorf >>> >>> blog: http://matthiaswessendorf.wordpress.com/ >>> sessions: http://www.slideshare.net/mwessendorf >>> twitter: http://twitter.com/mwessendorf >> > > > > -- > Jakob Korherr > > blog: http://www.jakobk.com > twitter: http://twitter.com/jakobkorherr > work: http://www.irian.at > -- Matthias Wessendorf blog: http://matthiaswessendorf.wordpress.com/ sessions: http://www.slideshare.net/mwessendorf twitter: http://twitter.com/mwessendorf