[ 
https://issues.apache.org/jira/browse/ADFFACES-438?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12486717
 ] 

Martin Marinschek commented on ADFFACES-438:
--------------------------------------------

Scott, ExternalContext.encodeResourceURI is called _after_ the ViewHandler call 
in all JSF components in the standard. So first ViewHandler.getResourceUrl, 
then externalContext.encodeResourceURI(). It's a two step process.

See e.g. the rendering code in ImageRenderer - first the CoreRenderer.toUri() 
method is called (which would map to ViewHandler.getResourceUrl()), then 
CoreRenderer.renderEncodedResourceURI() is called (which would map to 
ExternalContext.encodeResourceURI in the standard).

Anyways you're right in that a test fails with my first code snippet - I'm 
digging into it.

As a reference, the toUri and the ViewHandler.getResourceUrl methods.

regards,

Martin

toUri:

    if (o == null)
      return null;
    
    String uri = o.toString();
    if (uri.startsWith("/"))
    {
      // Treat two slashes as server-relative
      if (uri.startsWith("//"))
      {
        uri = uri.substring(1);
      }
      else
      {
        FacesContext fContext = FacesContext.getCurrentInstance();
        uri = fContext.getExternalContext().getRequestContextPath() + uri;
      }
    }

    return uri;

getResourceUrl():

        if (path.length() > 0 && path.charAt(0) == '/') {
            return facesContext.getExternalContext().getRequestContextPath() + 
path;
        }
        else {
            return path;
        }

> Trinidad components don't use ViewHandler.getResourceUrl - custom 
> ViewHandlers can fail due to this
> ---------------------------------------------------------------------------------------------------
>
>                 Key: ADFFACES-438
>                 URL: https://issues.apache.org/jira/browse/ADFFACES-438
>             Project: MyFaces ADF-Faces
>          Issue Type: Bug
>          Components: Components
>    Affects Versions: 1.0.1-incubating-core-SNAPSHOT
>            Reporter: Martin Marinschek
>         Assigned To: Martin Marinschek
>             Fix For: 1.0.1-incubating-core-SNAPSHOT
>
>
> Trinidad's components all call:
> CoreRenderer.toUri()
>  when they encode their resource-urls.
> This method does essentially the same as the JSF-Viewhandler's method 
> getResourceUrl(), so there is no reason why the core-renderer shouldn't call 
> this method. If the viewHandler's getResourceUrl() is not called, some other 
> projects fail to work together with Trinidad, an example for this is Weblets 
> by John Fallows which overwrites the ViewHandler's getResourceUrl() method.
> Changing toUri() method to:
>   static public String toUri(Object o)
>   {
>     if (o == null)
>       return null;
>     
>     String uri = o.toString();
>     // Treat two slashes as server-relative
>     if (uri.startsWith("//"))
>     {
>         uri = uri.substring(1);
>     }
>     return 
> FacesContext.getCurrentInstance().getApplication().getViewHandler().getResourceURL(
>             FacesContext.getCurrentInstance(),uri);
>   }
> should fix the issue.
> regards,
> Martin

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to