I have a UIComponent object. I would like to get the HTML code generated by this component at runtime so I can analyze it.
Is there a way to achieve this?
I am trying to use JsfUnit to create automated tests. I can get ahold of the UICompoment objects from within the test methods. However, I couldn't find a way to check the Html generated by the component.
Just do the same what JSF does under the covers: invoke UIComponent#encodeAll()
. To capture the output, set the response writer to a local buffer by FacesContext#setResponseWriter()
.
E.g. (assuming that you're sitting in invoke application phase; when sitting in render response phase, this needs to be done differently):
FacesContext context = FacesContext.getCurrentInstance();
ResponseWriter originalWriter = context.getResponseWriter();
StringWriter writer = new StringWriter();
try {
context.setResponseWriter(context.getRenderKit().createResponseWriter(writer, "text/html", "UTF-8"));
component.encodeAll(context);
} finally {
if (originalWriter != null) {
context.setResponseWriter(originalWriter);
}
}
String output = writer.toString();
// ...
Solution by BalusC to invoke UIComponent#encodeAll()
generally works, but I had a problem with unicode characters when using utf-8 encoding. All non-ascii characters in ajax response were damaged after I modified current context's response writer.
Instead of modifying response writer on current context retrieved by FacesContext.getCurrentInstance(), I created a wrapper over current context by extending FacesContextWrapper, so that original context is left unmodified:
StringWriter writer = new StringWriter();
FacesContext context = new FacesContextWrapper() {
private ResponseWriter internalWriter = getWrapped()
.getRenderKit().createResponseWriter(writer, "text/html", "UTF-8");
@Override
public FacesContext getWrapped() {
return FacesContext.getCurrentInstance();
}
@Override
public ResponseWriter getResponseWriter() {
return internalWriter;
}
};
component.encodeAll(context);
String output = writer.toString();
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With