How to use graphicImageDynamic with Seam?
bitya_mulder Apr 16, 2006 7:00 PMI want to use graphicImageDynamic for dynamic images in an application using Seam. For testing it, I tried to implement the sandbox GraphicImageDynamicText example using Seam and Facelets. This component uses imageRendererClass param which must point to ?reference or a fully qualified class name which implements org.apache.myfaces.custom.graphicimagedynamic.ImageRenderer?.
I have compiled myfaces svn version (1.1.2) from 29.03.06. All myfaces .jars are placed to
?/jboss/server/default/deploy/jbossweb-tomcat55.sar/jsf-libs/. JBoss version is 4.0.4RC1.
I have Login, LoggedIn and LoggedInInterceptor components from the old beta1 booking example.
I have GraphicImageDynamicComponentHandler and sandbox.taglib.xml from facelets wiki. Facelets version is 1.1.5.
The Seam version is CVS20060416.
Also I have:
Test.java:
package test.seam;
import java.io.IOException;
import javax.ejb.Local;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseStream;
import org.apache.myfaces.custom.dynamicResources.ResourceContext;
@Local
public interface Test {
public void setContext(FacesContext facesContext, ResourceContext resourceContext) throws IOException;
public String getText();
public void setText(String text);
public Class getImageRenderer();
public String getContentType();
public int getContentLength();
public void renderResource(ResponseStream out) throws IOException;
}
TestAction.java:
Imports
<?>
@Stateless
@Name("test")
@Interceptors(SeamInterceptor.class)
@Intercept(InterceptionType.ALWAYS)
@Scope(ScopeType.SESSION)
@LoggedIn
public class TestAction implements Test, ImageRenderer, Serializable {
private static final long serialVersionUID = 500L;
private static final Logger log = Logger.getLogger(Test.class);
private String _text;
private byte[] bytes = null;
public String getText() {
return _text;
}
public void setText(String text) {
this._text = text;
}
@In
private User user;
public void setContext(FacesContext facesContext, ResourceContext resourceContext) throws IOException {
ImageContext imageContext = (ImageContext) resourceContext;
//Object text = imageContext.getParamters().get("text");
Object text = (user== null ? "user=null" : user.getName());
if (text == null) {
text = "_null_";
}
int width = 300;
int height = 30;
Integer widthObj = imageContext.getWidth();
if (widthObj != null) {
width = widthObj.intValue();
}
Integer heightObj = imageContext.getHeight();
if (heightObj != null) {
height = heightObj.intValue();
}
BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics graphics = img.getGraphics();
try {
graphics.setColor(Color.WHITE);
graphics.fillRect(0, 0, width, height);
graphics.setColor(Color.BLUE);
graphics.drawString(text.toString(), 10, 20);
ByteArrayOutputStream baout = new ByteArrayOutputStream();
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(baout);
encoder.encode(img);
baout.flush();
bytes = baout.toByteArray();
}
finally {
graphics.dispose();
}
}
public Class getImageRenderer() {
return this.getClass();
}
public String getContentType() {
return "image/jpeg";
}
public int getContentLength() {
return -1;
}
public void renderResource(ResponseStream out) throws IOException {
out.write( bytes );
}
}
web.xml:
<context-param>
<param-name>javax.faces.DEFAULT_SUFFIX</param-name>
<param-value>.xhtml</param-value>
</context-param>
<context-param>
<param-name>facelets.DEVELOPMENT</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>facelets.LIBRARIES</param-name>
<param-value>/WEB-INF/tomahawk.taglib.xml;/WEB-INF/sandbox.taglib.xml</param-value>
</context-param>
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>client</param-value>
</context-param>
<context-param>
<param-name>org.apache.myfaces.ALLOW_JAVASCRIPT</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>org.apache.myfaces.DETECT_JAVASCRIPT</param-name>
<param-value>false</param-value>
</context-param>
<context-param>
<param-name>org.apache.myfaces.PRETTY_HTML</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>org.apache.myfaces.AUTO_SCROLL</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>org.jboss.seam.core.init.jndiPattern</param-name>
<param-value>test/#{ejbName}/local</param-value>
</context-param>
<filter>
<filter-name>extensionsFilter</filter-name>
<filter-class>org.apache.myfaces.webapp.filter.ExtensionsFilter</filter-class>
</filter>
<filter>
<filter-name>SeamRedirectFilter</filter-name>
<filter-class>org.jboss.seam.servlet.SeamRedirectFilter</filter-class>
</filter>
<filter>
<filter-name>SeamServletFilter</filter-name>
<filter-class>org.jboss.seam.servlet.SeamServletFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>extensionsFilter</filter-name>
<url-pattern>*.jsf</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>extensionsFilter</filter-name>
<url-pattern>/faces/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>SeamRedirectFilter</filter-name>
<url-pattern>*.jsf</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>SeamServletFilter</filter-name>
<url-pattern>/faces/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>org.jboss.seam.servlet.SeamListener</listener-class>
</listener>
<listener>
<listener-class>org.apache.myfaces.webapp.StartupServletContextListener</listener-class>
</listener>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
</web-app>
faces-config.xml:
<faces-config> <navigation-rule> <navigation-case> <from-outcome>test</from-outcome> <to-view-id>/test.xhtml</to-view-id> <redirect /> </navigation-case> </navigation-rule> <application> <view-handler>com.sun.facelets.FaceletViewHandler</view-handler> </application> <lifecycle> <phase-listener>org.jboss.seam.jsf.SeamPhaseListener</phase-listener> </lifecycle> </faces-config>
Test.xhml:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:t="http://myfaces.apache.org/tomahawk"
xmlns:s="http://myfaces.apache.org/sandbox">
<head>
<meta HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=UTF-8" />
</head>
<body>
<h:form enctype="multipart/form-data">
<br/>
<h:inputText maxlength="20" value="#{test.text}"/>
<br/>
<s:graphicImageDynamic id="imageDisplay3" width="300" height="22"
imageRendererClass="#{test.imageRenderer}">
<f:param name="text" value="#{test.text}" />
</s:graphicImageDynamic>
<br/>
<t:messages showDetail="true"/>
<h:commandButton value="Update"/>
</h:form>
</body>
</html>
When I use ?Object text = imageContext.getParamters().get("text");? the text is rendered properly.
When I try to render User name, it is null, but in debug.xhml (taken from the examples), I see the User component in the session context. The same thing happens when I try to use ?@In private Context sessionContext;?.
Why the injection components are null?
Is it possible to use graphicImageDynamic and Seam? And if not, in what way can I use SeamServletFilter in pure servlet to interacts with Seam component? Unfortunately, there are no examples of using SeamServletFilter.
Thanks.