Forwarded my original mail to this topic since it obviously went wrong the
first time.

---------- Forwarded message ----------
From: Jakob Korherr <jak...@apache.org>
Date: 2010/4/14
Subject: Re: svn commit: r934048 - in
/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/jsp:
FaceletsOnlyException.java JspViewDeclarationLanguage.java
To: MyFaces Development <dev@myfaces.apache.org>


No I cannot, because then its message won't be displayed by the
ExceptionHandler, because the ExceptionHandler "extracts" the Exception
until it finds the first non-FacesException and then it handles this one.

Thus if I would make it a FacesException, the message will be lost. This was
the reason I created FaceletsOnlyException in the first place...

Regards,
Jakob

2010/4/14 Matthias Wessendorf <mat...@apache.org>

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
>



-- 
Jakob Korherr

blog: http://www.jakobk.com
twitter: http://twitter.com/jakobkorherr
work: http://www.irian.at



-- 
Jakob Korherr

blog: http://www.jakobk.com
twitter: http://twitter.com/jakobkorherr
work: http://www.irian.at

Reply via email to