Wednesday, September 13, 2006

The end or something...

I am about to leave the ITK, VTK, MRI, Segmentation, and Visualization community to start working for Sony Online Entertainment as a Software Engineer doing Struts and Hibernate stuff as I have done for e-nnovate. This means for fans of my scientific visualization musings and my Linux struggles more or less tough luck - you are now on your own. For all others stay tuned until I find out what I can reveal about my cutting edge software engineerings tricks without jeopardising my new job.

VTK in a servlet

In our second installment of VTK in a servlet (for the first part check here) we will look on how to integrate VTK in a servlet.

Because there are some issues with JNI in servlets (look for instance here or some description involving ImageMagick) you have to decide where to load the native libraries. Because of the frequent crashes of VTK I decied to use the web application's class loader and put the code into the web application itself. Downside is of course, that you will have to restart Tomcat when you make a chnage to your code.

To achieve this I am using the following code and make all the servlet's actions (I am using Struts 1.2) inherit it:

public class vtkAction extends Action {
static {
System.loadLibrary("vtkCommonJava");
System.loadLibrary("vtkFilteringJava");
System.loadLibrary("vtkIOJava");
System.loadLibrary("vtkImagingJava");
System.loadLibrary("vtkGraphicsJava");
System.loadLibrary("vtkRenderingJava");
}

}

In the other installment we showed how to generate off screen renderings. Now we just have to put the two things together for instance this piece of code parses some web parameters and calls the rendering function:



public ActionForward execute(ActionMapping mapping,
ActionForm form, HttpServletRequest req,
HttpServletResponse res) throws Exception
{
DynaActionForm dynaForm = (DynaActionForm)form;
Double level = (Double)dynaForm.get("level");
Double window = (Double)dynaForm.get("window");
double dlevel = 127.5;
double dwindow = 255;
if (level!=null) {
dlevel = level.doubleValue();
}
if (window!=null) {
dwindow = window.doubleValue();
}
File file = ObjectStore.getInstance().getSlice(
(String)dynaForm.getString("filename"),
((Integer)dynaForm.get("orientation")).intValue(),
((Integer)dynaForm.get("slice")).intValue(),
dwindow, dlevel);

System.out.println("test x1");
//write out PNG
FileInputStream in = new FileInputStream(file);
OutputStream out = res.getOutputStream();

res.setContentType("image/png"); //Mime Type: JPEG

//copy to Output Stream
copy2(in, out);
in.close();
out.flush();

file.delete(); //delete file

return null;
}

This essentially is responsible for almost everything. The final product will soon be on our web page http://www.digitalfishlibrary.org