public class FaceletsOnlyException extends Exception
==> can you make that extending FacesException ? -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