Package com.bbn.openmap.vpfservlet

Source Code of com.bbn.openmap.vpfservlet.Data

// **********************************************************************
// <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/Data.java,v $
// $Revision: 1.4.2.2 $ $Date: 2005/08/11 21:03:08 $ $Author: dietrick $
// **********************************************************************
package com.bbn.openmap.vpfservlet;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.NoSuchElementException;
import java.util.StringTokenizer;

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.ListElement;
import com.bbn.openmap.layer.util.html.StringElement;
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.Constants;
import com.bbn.openmap.layer.vpf.DcwColumnInfo;
import com.bbn.openmap.layer.vpf.DcwRecordFile;

/**
* A servlet class that will output table data.
*/
public class Data extends VPFHttpServlet {
    /** the name of the http parameter with the table name */
    public static final String VDTParam = "vdt";
    /** the possible values of the rowselect parameter */
    public static final String RowSelectParam = "show";
    public static final String RowSelectAll = "all";
    public static final String RowSelectNone = "none";
    public static final String RowSelectTest = "test";
    /** other parameters that the servlet takes */
    public static final String JoinColumnParam = "colname";
    public static final String JoinOtherTableParam = "othertable";
    public static final String JoinOtherTableKeyParam = "othertablekey";
    public static final String IsTiledParam = "isTiled";

    /**
     * A do-nothing constructor - init does all the work.
     */
    public Data() {
        super();
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        DcwRecordFile foo = (DcwRecordFile) request.getAttribute(DispatchServlet.RECORD_FILE_OBJ);
        if (foo == null) {
            response.sendError(HttpServletResponse.SC_BAD_REQUEST);
            return;
        }
        try {
            doWork(request, response, foo);
        } catch (FormatException fe) {
            response.getWriter().println("FormatException dealing with table: "
                    + fe);
        }
    }

    /**
     * Generates the heading used for each HTML table
     */
    protected TableRowElement generateHeader(HttpServletRequest req,
                                             HttpServletResponse resp,
                                             DcwColumnInfo[] dci) {
        TableRowElement thr = new TableRowElement();
        for (int i = 0; i < dci.length; i++) {
            DcwColumnInfo dc = dci[i];
            String colName = dc.getColumnName();
            if (dc.getValueDescriptionTable() == null) {
                thr.addElement(new TableHeaderElement(colName));
            } else {
                StringBuffer baseurl = new StringBuffer();
                baseurl.append(req.getContextPath());
                baseurl.append(req.getServletPath());
                baseurl.append(req.getPathInfo()).append("?");
                String show = req.getParameter(RowSelectParam);
                String vdtl = req.getParameter(VDTParam);
                if (show != null) {
                    baseurl.append(RowSelectParam).append("=");
                    baseurl.append(show).append("&");
                }
                baseurl.append(VDTParam).append("=");
                if (vdtl == null) {
                    vdtl = "";
                }
                boolean appendCol = true;
                boolean needSep = false;
                StringTokenizer st = new StringTokenizer(vdtl, ",");
                while (st.hasMoreTokens()) {
                    String sname = st.nextToken();
                    if (colName.equals(sname)) {
                        appendCol = false;
                    } else {
                        append(baseurl, sname, needSep);
                        needSep = true;
                    }
                }
                if (appendCol) {
                    append(baseurl, colName, needSep);
                }
                thr.addElement(THE(colName, baseurl.toString()));
            }
        }
        return thr;
    }

    public static StringBuffer append(StringBuffer base, String app,
                                      boolean needSep) {
        return (needSep ? base.append(",") : base).append(app);
    }

    public static final String ROWLIST_OBJECT = Data.class.getPackage()
            .getName()
            + ".rowlist";

    protected void doWork(HttpServletRequest request,
                          HttpServletResponse response, DcwRecordFile drf)
            throws FormatException, IOException {
        DcwColumnInfo dci[] = drf.getColumnInfo();

        int rowlist[] = (int[]) request.getAttribute(ROWLIST_OBJECT);

        ListElement rows = new ListElement();
        WrapElement table = new WrapElement("table", "BORDER=1 ALIGN=CENTER", rows);
        TableRowElement thr = generateHeader(request, response, dci);
        rows.addElement(thr);

        String row_show = request.getParameter(RowSelectParam);
        boolean printall = RowSelectAll.equals(row_show);
        boolean parseall = RowSelectTest.equals(row_show);
        boolean schemaonly = RowSelectNone.equals(row_show);

        String baseurl = request.getContextPath() + request.getServletPath()
                + request.getPathInfo();
        String all = baseurl + "?" + RowSelectParam + "=" + RowSelectAll;
        String none = baseurl + "?" + RowSelectParam + "=" + RowSelectNone;
        String some = baseurl;
        String test = baseurl + "?" + RowSelectParam + "=" + RowSelectTest;
        String qstr = request.getQueryString();
        if (rowlist != null) {
            qstr = null;
        }
        if (qstr == null) {
            qstr = VDTParam + "=ALL";
        }
        if (qstr.indexOf(VDTParam + "=") == -1) {
            qstr += "&" + VDTParam + "=ALL";
        }
        String vdtlookup = baseurl + "?" + qstr;

        response.getWriter().println("<H2>Table Data</H2>");
        String redisplay = "Redisplay " + buildHREF(response, all, "All")
                + "\r\n|" + buildHREF(response, none, "None") + "\r\n|"
                + buildHREF(response, some, "Some") + "\r\n|"
                + buildHREF(response, test, "Test") + "\r\n|"
                + buildHREF(response, vdtlookup, "All VDT Columns") + "\r\n";

        if (schemaonly) {
            response.getWriter().println("Data Omitted: " + redisplay);
            return;
        }

        RowMaker rm;
        String basepath = getRootDir(request);
        String joincol = request.getParameter(JoinColumnParam);
        String jointable = request.getParameter(JoinOtherTableParam);
        String jointablekey = request.getParameter(JoinOtherTableKeyParam);
        if ((joincol != null) && (jointable != null)) {
            String isTiledJoin = request.getParameter(IsTiledParam);
            boolean isTiled = Boolean.valueOf(isTiledJoin).booleanValue();
            if (Constants.ID.equals(jointablekey)) {
                rm = new JoinRowMaker(drf, joincol, jointable, isTiled);
            } else {
                rm = new ComplexJoinRowMaker(drf, joincol, jointable, jointablekey, isTiled);
            }
        } else if (drf.getTableName().equals(Constants.charVDTTableName)
                || drf.getTableName().equals(Constants.intVDTTableName)) {
            rm = new VDTRowMaker(request, response, basepath, drf);
        } else if (drf.getTableName().equals("fcs")) {
            rm = new FCSRowMaker(request, response, basepath, drf);
        } else if (request.getParameter(VDTParam) != null) {
            String subsetmarkup = request.getParameter(VDTParam);
            String[] ss = null;
            if (subsetmarkup != null) {
                StringTokenizer st = new StringTokenizer(subsetmarkup, ",", false);
                ss = new String[st.countTokens()];
                for (int i = 0; i < ss.length; i++) {
                    ss[i] = st.nextToken();
                    if ("ALL".equals(ss[i])) {
                        ss = null; // null array gets all VDT lookups
                        break;
                    }
                }
            }
            rm = new DetailRowMaker(drf, ss);
        } else if (drf.getTableName().endsWith(".fit")) {
            rm = new FITRowMaker(drf);
        } else if (drf.getTableName().endsWith(".cft")
                || drf.getTableName().endsWith(".cjt")) {
            rm = new ComplexFeatureJoinRowMaker(drf);
        } else {
            rm = new PlainRowMaker();
        }

        Iterator rowiter;
        if (rowlist != null) {
            rowiter = new TableSubsetRecordIterator(rowlist, drf);
        } else if (printall) {
            rowiter = new TableListIterator(drf);
        } else if (parseall) {
            rowiter = new TableTestParseIterator(drf);
        } else {
            rowiter = new TableSampleIterator(drf);
        }
        // response.getWriter().println("<hr>Tn = " +
        // drf.getTableName() +
        // "<hr>" + rm.getClass().getName() + " " +
        // rowiter.getClass().getName() + "<hr>");
        int rowcount = 0;
        while (rowiter.hasNext()) {
            if (rowcount++ >= 99) {
                response.getWriter().println(redisplay);
                table.generate(response.getWriter());
                rows = new ListElement();
                table = new WrapElement("table", "BORDER=1 ALIGN=CENTER", rows);
                rows.addElement(new WrapElement("CAPTION", new StringElement("table data")));
                rows.addElement(thr);

                rowcount = 0;
            }
            rows.addElement(rm.generateRow((List) rowiter.next()));
        }
        rm.close();
        response.getWriter().println(redisplay);
        table.generate(response.getWriter());
    }

    public ContextInfo getContextInfo() {
        return contextInfo;
    }

    public static String joinURL(HttpServletRequest request,
                                 HttpServletResponse response, int tag,
                                 String filename, String colname,
                                 String othertable, String othertablekey,
                                 boolean isTiled) {
        String pathInfo = request.getPathInfo();
        int index = pathInfo.lastIndexOf('/');
        String subpath = pathInfo.substring(0, index + 1);
        String url = request.getContextPath() + request.getServletPath()
                + subpath + filename + "?" + JoinColumnParam + "=" + colname
                + "&" + JoinOtherTableParam + "=" + othertable + "&"
                + JoinOtherTableKeyParam + "=" + othertablekey + "&"
                + IsTiledParam + "=" + isTiled;
        String value = "<A HREF=\"" + response.encodeURL(url) + "\">" + tag
                + "</A>\r\n";
        return value;
    }

    /**
     * An iterator that returns a subset of the table rows
     */
    private static class TableSampleIterator implements Iterator {
        private final int recordCount;
        private final int columnCount;
        private int curRow = 0;
        private final DcwRecordFile drf;

        public TableSampleIterator(DcwRecordFile drf) throws FormatException {
            this.drf = drf;
            recordCount = drf.getRecordCount();
            columnCount = drf.getColumnCount();
        }

        public void remove() {
            throw new UnsupportedOperationException();
        }

        public boolean hasNext() {
            return (curRow < recordCount);
        }

        public Object next() {
            if (curRow < 10) {
                curRow++;
            } else if (curRow == 10) {
                curRow = 100;
            } else {
                curRow += 100;
            }
            if (curRow > recordCount) {
                curRow = recordCount;
            }
            ArrayList al = new ArrayList(columnCount);
            try {
                if (!drf.getRow(al, curRow)) {
                    throw new NoSuchElementException();
                }
            } catch (FormatException fe) {
                throw new NoSuchElementException();
            }
            return al;
        }
    }

    /**
     * An iterator that returns a subset of the table rows, but parses
     * every record in the table.
     */
    private static class TableTestParseIterator implements Iterator {
        final ListIterator base;

        public TableTestParseIterator(DcwRecordFile drf) throws FormatException {
            base = new TableListIterator(drf);
        }

        public void remove() {
            throw new UnsupportedOperationException();
        }

        public boolean hasNext() {
            return base.hasNext();
        }

        public Object next() {
            int index;
            Object ret;
            do {
                index = base.nextIndex();
                ret = base.next();
            } while ((index > 10) && ((index % 100) != 0) && base.hasNext());
            return ret;
        }
    }

    /**
     * An iterator that will return every row in the table.
     */
    private static class TableListIterator implements java.util.ListIterator {
        private int curRow = 1;
        private final DcwRecordFile drf;
        private final int columnCount;
        private final int recordCount;

        public TableListIterator(DcwRecordFile drf) throws FormatException {
            this.drf = drf;
            columnCount = drf.getColumnCount();
            recordCount = drf.getRecordCount();
        }

        public void add(Object o) {
            throw new UnsupportedOperationException();
        }

        public boolean hasPrevious() {
            return (curRow > 1);
        }

        public boolean hasNext() {
            return (curRow <= recordCount);
        }

        private ArrayList getRow(int row) {
            ArrayList al = new ArrayList(columnCount);
            try {
                if (!drf.getRow(al, row)) {
                    throw new NoSuchElementException();
                }
            } catch (FormatException fe) {
                throw new NoSuchElementException();
            }
            return al;
        }

        public Object next() {
            return getRow(curRow++);
        }

        public Object previous() {
            return getRow(--curRow);
        }

        public int nextIndex() {
            return curRow;
        }

        public int previousIndex() {
            return (curRow - 1);
        }

        public void remove() {
            throw new UnsupportedOperationException();
        }

        public void set(Object o) {
            throw new UnsupportedOperationException();
        }
    }
}
TOP

Related Classes of com.bbn.openmap.vpfservlet.Data

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.