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

Reply via email to