[jira] [Resolved] (MYFACES-3128) Problems with a custom Resource Resolver

2011-05-09 Thread Juan Fernandez Corugedo (JIRA)

 [ 
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-namejavax.faces.FACELETS_VIEW_MAPPINGS/param-name
 param-value*.test;*.xhtml/param-value
   /context-param
  
   context-param
   param-namejavax.faces.FACELETS_RESOURCE_RESOLVER/param-name
   param-valuecom.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://xx:/z/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(.test) method. It internally 
 calls the getViewHandlerSupport().calculateViewId(context, viewId); method to 
 obtain the viewId, and this method calls 
 

[jira] [Created] (MYFACES-3128) Problems with a custom Resource Resolver

2011-05-06 Thread Juan Fernandez Corugedo (JIRA)
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


Hi.

I'm working in a project with Myfaces 2.0.5 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-namejavax.faces.FACELETS_VIEW_MAPPINGS/param-name
param-value*.test;*.xhtml/param-value
  /context-param
 
  context-param
  param-namejavax.faces.FACELETS_RESOURCE_RESOLVER/param-name
  param-valuecom.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://xx:/z/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(.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