// **********************************************************************
// <copyright>
// BBN Technologies
// 10 Moulton Street
// Cambridge, MA 02138
// (617) 873-8000
//
// Copyright (C) BBNT Solutions LLC. All rights reserved.
// </copyright>
// **********************************************************************
// $Source: /cvs/distapps/openmap/src/vpfservlet/WEB-INF/src/com/bbn/openmap/vpfservlet/ThematicIndexServlet.java,v $
// $Revision: 1.2.2.2 $ $Date: 2005/08/11 21:03:07 $ $Author: dietrick $
// **********************************************************************
package com.bbn.openmap.vpfservlet;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.bbn.openmap.io.FormatException;
import com.bbn.openmap.layer.util.html.Element;
import com.bbn.openmap.layer.util.html.HtmlListElement;
import com.bbn.openmap.layer.util.html.ListElement;
import com.bbn.openmap.layer.util.html.TableHeaderElement;
import com.bbn.openmap.layer.util.html.TableRowElement;
import com.bbn.openmap.layer.util.html.WrapElement;
import com.bbn.openmap.layer.vpf.DcwThematicIndex;
/**
* This servlet generates HTML for VPF files in thematic index format.
*/
public class ThematicIndexServlet extends VPFHttpServlet {
/**
* A do-nothing constructor - init does all the work.
*/
public ThematicIndexServlet() {
super();
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String filePath = (String) request.getAttribute(DispatchServlet.ROOTPATH_FILENAME);
if (filePath == null) {
String pathInfo = setPathInfo(request);
filePath = contextInfo.resolvePath(pathInfo);
if (!pathOkay(filePath, pathInfo, response)) {
return;
}
}
DcwThematicIndex ti;
try {
ti = new DcwThematicIndex(filePath, false);
} catch (FormatException fe) {
response.sendError(HttpServletResponse.SC_NOT_FOUND, fe.toString());
return;
}
String valIndex = request.getParameter("valIndex");
if (valIndex != null) {
showTableIndexed(request, response, valIndex, ti);
} else {
showTableData(request, response, ti, filePath);
}
try {
ti.close();
} catch (FormatException fe) {
// ignore
}
}
protected void showTableData(HttpServletRequest request,
HttpServletResponse response,
DcwThematicIndex ti, String filePath)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String title = "VPF Thematic Index for " + new File(filePath).getName();
String basepath = getRootDir(request);
out.println("<HEAD><TITLE>" + title + "</TITLE></HEAD>");
out.println(getStylesheetHTML(request));
out.println("<BODY><H1 CLASS=TableHeadingColor>" + title + "</H1>");
out.println("<H3 CLASS=TableSubheadingColor>General Thematic Index Information</H3>");
HtmlListElement list = new HtmlListElement();
list.addElement("Number of Codes: " + ti.getNumberOfCodes());
list.addElement("Number of Rows: " + ti.getNumberOfRows());
list.addElement("Type Of Index: " + ti.getTypeOfIndex());
list.addElement("Field Type of Index: " + ti.getFieldTypeOfIndex());
list.addElement("Number of Data Elements: "
+ ti.getNumberOfDataElements());
list.addElement("Data Type Specifier: " + ti.getDataTypeSpecifier());
list.addElement("Table Indexed: "
+ fileURL(request, response, basepath, ti.getTableIndexed()));
list.addElement("Column Indexed: " + ti.getColumnIndexed());
list.addElement("Fields Sorted: " + ti.getSorted());
list.generate(out);
out.println("<H3 CLASS=TableSubheadingColor>Thematic Index Data</H3>");
Object[] values = ti.getValueIndexes();
ListElement rows = null;
Element table = null;
TableRowElement th = new TableRowElement();
th.addElement(new TableHeaderElement("CLASS=NavBarCell2", "Index Value"));
th.addElement(new TableHeaderElement("Count"));
th.addElement(new TableHeaderElement("Rows..."));
String valStr = "<A HREF=\"" + request.getContextPath()
+ request.getServletPath() + getPathInfo(request)
+ "?valIndex=";
for (int i = 0; i < values.length; i++) {
if ((i % 50) == 0) {
if (table != null) {
table.generate(out);
}
rows = new ListElement();
table = new WrapElement("table", "BORDER=1", rows);
rows.addElement(th);
}
TableRowElement tr = new TableRowElement();
rows.addElement(tr);
tr.addElement(valStr + values[i] + "\">" + values[i] + "</A>");
try {
int[] intvals = ti.get(values[i]);
tr.addElement(Integer.toString(intvals.length));
StringBuffer sb = new StringBuffer();
sb.append(intvals[0]);
for (int j = 1; j < intvals.length; j++) {
sb.append(", ").append(intvals[j]);
}
tr.addElement(sb.toString());
} catch (FormatException fe) {
tr.addElement(fe.toString());
}
}
table.generate(out);
}
protected void showTableIndexed(HttpServletRequest request,
HttpServletResponse response,
String valIndex, DcwThematicIndex ti)
throws IOException, ServletException {
Object val = null;
switch (ti.getFieldTypeOfIndex()) {
case 'I':
val = Integer.valueOf(valIndex);
break;
case 'S':
val = Short.valueOf(valIndex);
break;
case 'T':
val = valIndex;
break;
}
try {
int[] vals = ti.get(val);
request.setAttribute(Data.ROWLIST_OBJECT, vals);
} catch (FormatException fe) {
response.sendError(HttpServletResponse.SC_NOT_FOUND, fe.toString());
}
String pi = request.getPathInfo();
int lin = pi.lastIndexOf('/') + 1;
RequestDispatcher rd = request.getRequestDispatcher("/UnknownType"
+ pi.substring(0, lin) + ti.getTableIndexed());
rd.forward(request, response);
}
}