[ 
https://issues.apache.org/jira/browse/MYFACES-3128?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Juan Fernandez Corugedo resolved MYFACES-3128.
----------------------------------------------

       Resolution: Duplicate
    Fix Version/s: 2.1.0
                   2.1.0-SNAPSHOT


https://issues.apache.org/jira/browse/MYFACES-2628


> Problems with a custom Resource Resolver
> ----------------------------------------
>
>                 Key: MYFACES-3128
>                 URL: https://issues.apache.org/jira/browse/MYFACES-3128
>             Project: MyFaces Core
>          Issue Type: Bug
>    Affects Versions: 2.0.5
>         Environment: GlassFish 3.0 with Oracle JVM 1.6  and Websphere 
> 7.0.0.13 with IBM JVM 1.6
>            Reporter: Juan Fernandez Corugedo
>             Fix For: 2.1.0-SNAPSHOT, 2.1.0
>
>         Attachments: mojarra-test.war, myfaces-test.war
>
>
> Hi.
> I'm working in a project with Myfaces 2.0.5 (or 2.1.0) and I have had a 
> problem with a custom ResourceResolver.
> I have coded a ResourceResolver that dynamically builds an XHTML file when 
> the engine asks him to resolve a certain URL.
> To achieve this, I have update the web.xml as follows:
>   <context-param>
>     <param-name>javax.faces.FACELETS_VIEW_MAPPINGS</param-name>
>     <param-value>*.test;*.xhtml</param-value>
>   </context-param>
>  
>   <context-param>
>       <param-name>javax.faces.FACELETS_RESOURCE_RESOLVER</param-name>
>       <param-value>com.test.view.facelets.CustomResourceResolver</param-value>
>   </context-param>
> My CustomResourceResolver is very simple:
> package com.test.view.facelets;
> import java.io.ByteArrayInputStream;
> import java.io.IOException;
> import java.io.InputStream;
> import java.net.MalformedURLException;
> import java.net.URL;
> import java.net.URLConnection;
> import java.net.URLStreamHandler;
> import javax.faces.view.facelets.ResourceResolver;
> public class CustomResourceResolver extends ResourceResolver {
>     private ResourceResolver innerResourceResolver;
>    
>     private String viewSource = ".... xhtml of the test page ....";
>    
>     public CustomResourceResolver(ResourceResolver resourceResolver){
>         this.innerResourceResolver = resourceResolver;
>     }
>    
>     @Override
>     public URL resolveUrl(String path) {
>         System.out.println("Buscando la URL del recurso: " + path);
>         URL result = null;
>        
>         if(path.endsWith(".test")){
>             try{
>                 result = getUrlForResourceAsStream(path);
>             }catch(Exception e){
>                 System.out.println("Unexpected error while obtaining the URL 
> from resource " + path);
>                 e.printStackTrace(System.out);
>             }
>            
>         }else{
>             result = this.innerResourceResolver.resolveUrl(path);
>         }
>        
>         return result;
>     }
>     private URL getUrlForResourceAsStream(String path) throws 
> MalformedURLException {
>         URLStreamHandler handler = new URLStreamHandler() {
>             protected URLConnection openConnection(URL u) throws IOException {
>                 final String file = u.getFile();
>                 return new URLConnection(u) {
>                     public void connect() throws IOException {
>                     }
>                     public InputStream getInputStream() throws IOException {
>                         System.out.println("Opening internal url to " + file);
>                        
>                         try{
>                             System.out.println("Generando el InputStream de 
> la pagina:\n" + viewSource);
>                             return new 
> ByteArrayInputStream(viewSource.getBytes("UTF-8"));
>                         }catch (Exception e) {
>                             e.printStackTrace();
>                             throw new RuntimeException("Unexpected error 
> while obtaining the view", e);
>                         }
>                     }
>                 };
>             }
>         };
>         return new URL("internal", null, 0, path, handler);
>     }
> }
> As you can see, the code is very simple. When the suffix matches the pattern 
> ".test", the Resolver creates a mock URL with a backing ByteArrayInputStream. 
> If the suffix does not matches the pattern, the normal ResourceResolver is 
> invoked.
> With this configuration and code, when I request the URL: 
> http://xxxxxx:yyyy/zzzzz/anything.test  the application fails with error:
> The problem is this:
> java.lang.NullPointerException
>     at java.lang.StringBuilder.<init>(StringBuilder.java:92)
>     at 
> org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage.getRenderedViewId(FaceletViewDeclarationLanguage.java:1630)
>     at 
> org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage.buildView(FaceletViewDeclarationLanguage.java:279)
>     ....
> The executes the viewHandler.createView("xxxx.test") method. It internally 
> calls the getViewHandlerSupport().calculateViewId(context, viewId); method to 
> obtain the viewId, and this method calls 
> DefaultViewHandlerSupport.checkResourceExists(FacesContext context, String 
> viewId), that checks the physical file of this resource, but there are not 
> any file for this resource!!!! so it return false, and the viewId of the 
> resulting ViewRoot is assigned to null.
> This causes a NullPointerException later, when the code executes the 
> ViewDeclarationLanguage.buildView(FacesContext context, ViewRoot viewRoot).
> If I change the Myfaces implementation with Mojarra 2.0.4, it works 
> perfectly, so I think that the problem is in the implementation.
> I can't extend any class of interface of Myfaces, because my application must 
> not be coupled to a specific implementation.
> I have attached two web projects, one with Myfaces configuration, that fails, 
> and the same project with Mojarra configuration, that works

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to