Example: Using HTMLTree classes

Note: Read the Code example disclaimer for important legal information.
///////////////////////////////////////////////////////////////////////////////
//
// This source is an example of using the IBM Toolbox for Java HTML
// package classes, which allow you to easily build HTML and File Trees.
//
///////////////////////////////////////////////////////////////////////////////

import java.io.File;
import java.io.PrintWriter;
import java.io.IOException;

import java.util.Vector;
import java.util.Properties;

import javax.servlet.*;
import javax.servlet.http.*;

import com.ibm.as400.access.AS400;
import com.ibm.as400.access.Trace;
import com.ibm.as400.access.IFSJavaFile;
import com.ibm.as400.util.html.HTMLMeta;
import com.ibm.as400.util.html.HTMLTree;
import com.ibm.as400.util.html.HTMLTreeElement;
import com.ibm.as400.util.html.URLParser;
import com.ibm.as400.util.html.DirFilter;
import com.ibm.as400.util.html.FileTreeElement;
import com.ibm.as400.util.servlet.ServletHyperlink;

/**
 *  An example of using the HTMLTree and FileTreeElement classes in a servlet.
 **/
public class TreeNav extends HttpServlet 
{
   public void init(ServletConfig config) 
      throws ServletException
   {
      super.init(config);

      // The Toolbox uses a set of default icons to represents expanded,
      // collapsed, and documents within the HTMLTree. To enhance those icons,
      // the Toolbox ships three gifs (expanded.gif, collapsed.gif, bullet.gif)
      // in the jt400Servlet.jar file.  Browsers do not have the ability to 
      // find gifs in a jar or zip file, so those images need to be extracted
      // from the jar file and placed in the appropriate webserver directory 
      // (by default it is the /html directory). Then uncomment the following
      // lines of code and specify the correct location in the these set
      // methods. The location can be absolute or relative.

      HTMLTreeElement.setExpandedGif("/images/expanded.gif");
      HTMLTreeElement.setCollapsedGif("/images/collapsed.gif");
      HTMLTreeElement.setDocGif("/images/bullet.gif");
   }

   /**
    *  Process the GET request.
    *  @param req The request.
    *  @param res The response.
    **/
   public void doGet (HttpServletRequest req, HttpServletResponse resp) 
      throws ServletException, IOException
   {
      HttpSession session = req.getSession(true);
      HTMLTree fileTree = (HTMLTree)session.getValue("filetree");

      // If this session does not already have a file tree, then
      // create the initial tree.
      if (fileTree == null)
         fileTree = createTree(req, resp, req.getRequestURI());

      // Set the Http servlet request on the HTMLTree.
      fileTree.setHttpServletRequest(req);

      resp.setContentType("text/html");

      PrintWriter out = resp.getWriter();
      out.println("<html>\n");
      out.println(new HTMLMeta("Expires", "Mon, 03 Jan 1990 13:00:00 GMT"));
      out.println("<body>\n");

      // Get the tag for the HTMLTree.
      out.println(fileTree.getTag());

      out.println("</body>\n");
      out.println("</html>\n");
      out.close();

      // Set the session tree value, so when entering this servlet for
      // the second time, the FileTree object will be reused.
      session.putValue("filetree", fileTree);
   }

   /**
    *  Process the POST request.
    *  @param req The request.
    *  @param res The response.
    **/
   public void doPost (HttpServletRequest req, HttpServletResponse res)
      throws ServletException, IOException
   {
      res.setContentType("text/html");
      ServletOutputStream out = res.getOutputStream();
   }

   /**
    *  This method will create the initial HTMLTree.
    **/
   private HTMLTree createTree(HttpServletRequest req, HttpServletResponse resp, String uri)
   {
      // Create an HTMLTree object.
      HTMLTree tree = new HTMLTree(req);

      try
      {
         // Create a URLParser object.
         URLParser urlParser = new URLParser(uri);

         AS400 sys = new AS400(CPUStatus.systemName_, "javactl", "jteam1");

         // Create a File object and set the root IFS directory.
         IFSJavaFile root = new IFSJavaFile(sys, "/QIBM");

         // Create a Filter and list all of the directories.
         DirFilter filter = new DirFilter();
         //File[] dirList = root.listFiles(filter);

         // Get the list of files that satisfy the directory filter.
         String[] list = root.list(filter);

         File[] dirList = new File[list.length];

         // We don't want to require webservers to use JDK1.2 because
         // most webserver JVM's are slower to upgrade to the latest JDK level.
         // The most efficient way to create these file objects is to use
         // the listFiles(filter) method in JDK1.2 which would be done
         // like the following, instead of using the list(filter) method
         // and then converting the returned string arrary into the appropriate
         // File array.
         // File[] dirList = root.listFiles(filter);

         for (int j=0; j<dirList.length; ++j)
         {
            if (root instanceof IFSJavaFile)
               dirList[j] = new IFSJavaFile((IFSJavaFile)root, list[j]);
            else
               dirList[j] = new File(list[j]);
         }
 
         for (int i=0; i<dirList.length; i++)
         {
            // Create a FileTreeElement for each directory in the list.
            FileTreeElement node = new FileTreeElement(dirList[i]);

            // Create a ServletHyperlink for the expand/collapse icons.
            ServletHyperlink sl = new ServletHyperlink(urlParser.getURI());
            //sl.setHttpServletResponse(resp);
            node.setIconUrl(sl);

            // Create a ServletHyperlink to the TreeList servlet, which will
            // display the contents of thie FileTreeElement (directory).
            ServletHyperlink tl = new ServletHyperlink("/servlet/TreeList");
            tl.setTarget("list");

            // If the ServletHyperlink doesn't have a name, then set it to the
            // name of the directory.
            if (tl.getText() == null)
               tl.setText(dirList[i].getName());

            // Set the TextUrl for the FileTreeElement.
            node.setTextUrl(tl);

            // Add the FileTreeElement to the HTMLTree.
            tree.addElement(node);
         }
      }
      catch (Exception e)
      {
        e.printStackTrace();
      }
        
      return tree;
   }

   public void destroy(ServletConfig config)
   {  
      // do nothing
   }

   public String getServletInfo()
   {
       return "FileTree Navigation";
   }
}