Package com.bbn.openmap.vpfservlet

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

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

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

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.HtmlListElement;
import com.bbn.openmap.layer.util.html.ListBodyElement;
import com.bbn.openmap.layer.util.html.ListElement;
import com.bbn.openmap.layer.util.html.WrapElement;
import com.bbn.openmap.layer.vpf.CoverageAttributeTable;
import com.bbn.openmap.layer.vpf.CoverageTable;
import com.bbn.openmap.layer.vpf.DcwRecordFile;
import com.bbn.openmap.layer.vpf.FeatureClassInfo;
import com.bbn.openmap.layer.vpf.LibrarySelectionTable;

/**
* This class prints out a description of a VPF database, listing the
* available libraries, coverage types and feature types.
*/

public class DescribeDBServlet extends VPFHttpServlet {
    /**
     * Takes path arguments, and prints the DB it finds
     */
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();

        out.println(HTML_DOCTYPE);
        out.println(getStylesheetHTML(request));

        String pathInfo = request.getPathInfo();
        if (pathInfo == null) {
            selectDB(request, response);
            return;
        }
        int findex = pathInfo.indexOf('/', 1);
        if (findex < 0) {
            findex = pathInfo.length();
        }
        String libname = pathInfo.substring(1, findex);

        try {
            LibrarySelectionTable lst = getLST(libname);
            if (lst == null) {
                out.println("VPF Database not configured: " + libname);
                return;
            }
            String dbname = lst.getDatabaseName();
            out.println("<HTML>\n<HEAD><TITLE>Describe VPF Database " + dbname
                    + "</TITLE></HEAD>\n<BODY>\n<H1>VPF Database " + dbname
                    + "</H1>\n");
            ListElement dble = new ListBodyElement();
            WrapElement dblist = new WrapElement("ul", dble);
            dble.addElement("Database Description: "
                    + lst.getDatabaseDescription());
            dble.addElement("Database Description Table: "
                    + buildURL(request, response, libname, "dht"));
            String[] libraries = lst.getLibraryNames();
            StringBuffer libnames = new StringBuffer("Database Libraries: ");
            for (int i = 0; i < libraries.length; i++) {
                libnames.append("<A HREF=\"#").append(libraries[i]);
                libnames.append("\">").append(libraries[i]);
                libnames.append("</A>").append(" ");
            }
            libnames.append("(from ");
            libnames.append(buildURL(request, response, libname, "lat"));
            libnames.append(")");

            dble.addElement(libnames.toString());
            dblist.generate(out);
            for (int i = 0; i < libraries.length; i++) {
                //String prefix = libraries[i] + ":";
                printLibrary(request,
                        response,
                        libname,
                        lst.getCAT(libraries[i]));
            }
            out.println("</body></html>");
        } catch (FormatException fe) {
            throw new ServletException("FormatException: ", fe);
        }
    }

    public void selectDB(HttpServletRequest request,
                         HttpServletResponse response) throws IOException,
            ServletException {
        PrintWriter out = response.getWriter();

        Set databases = contextInfo.keySet();

        out.println("<HTML>\n<HEAD><TITLE>Select VPF Database"
                + "</TITLE></HEAD>\n<BODY>\n<H1>Available VPF Databases"
                + "</H1>\n");
        HtmlListElement dblist = new HtmlListElement();
        for (Iterator dbi = databases.iterator(); dbi.hasNext();) {
            String db = (String) dbi.next();
            String url = request.getContextPath() + "/DescribeVPF/" + db;
            dblist.addElement("<A HREF=\"" + response.encodeURL(url) + "\">"
                    + db + "</A>\r\n");
        }
        dblist.generate(out);
        out.println("</BODY></HTML>\r\n");
    }

    public static String buildURL(HttpServletRequest request,
                                  HttpServletResponse response,
                                  String filepref, String filename, String tag) {
        String url = request.getContextPath() + "/UnknownType/" + filepref
                + "/" + filename;
        return "<A HREF=\"" + response.encodeURL(url) + "\">" + tag + "</A>";
    }

    public static String buildURL(HttpServletRequest request,
                                  HttpServletResponse response,
                                  String filepref, String filename) {
        return buildURL(request, response, filepref, filename, filename);
    }

    /**
     * Prints a VPF Library.
     *
     * @param request the HttpServletRequest.
     * @param response the HTTPServletResponse.
     * @param pathPrefix lines get printed with this prefix
     * @param cat the CoverageAttributeTable (Library) to print
     */
    public void printLibrary(HttpServletRequest request,
                             HttpServletResponse response, String pathPrefix,
                             CoverageAttributeTable cat)
            throws ServletException, IOException {
        PrintWriter out = response.getWriter();
        String libName = cat.getLibraryName();
        String libpath = pathPrefix + "/" + libName;

        if (cat == null) {
            out.println("<H2>Library " + libName + " doesn't exist</H2>");
            return;
        }
        out.println("<H2>Library <A NAME=\"" + libName + "\"></A>"
                + buildURL(request, response, pathPrefix, libName, libName)
                + "</H2>");
        String[] coverages = cat.getCoverageNames();
        Arrays.sort(coverages);

        HtmlListElement list = new HtmlListElement();
        list.addElement("Library uses "
                + (cat.isTiledData() ? "tiled" : "untiled") + " data");
        HtmlListElement clist = new HtmlListElement("Coverage names (from "
                + buildURL(request, response, libpath, "cat") + ")");

        list.addElement(clist);
        for (int i = 0; i < coverages.length; i++) {
            clist.addElement("<A HREF=\"#" + libName + "_" + coverages[i]
                    + "\">" + coverages[i] + "</A>");
        }
        list.addElement("Library Header Table: "
                + buildURL(request, response, libpath, "lht"));
        list.addElement("Geographic Reference Table: "
                + buildURL(request, response, libpath, "grt"));
        list.generate(out);
        for (int i = 0; i < coverages.length; i++) {
            printCoverage(request,
                    response,
                    libpath + "/" + coverages[i],
                    libName,
                    cat,
                    coverages[i]);
        }
    }

    /**
     * Prints a VPF Coverage
     *
     * @param pathPrefix lines get printed with this prefix
     * @param cat the CoverageAttributeTable to get the Coverage from
     * @param covname the name of the coverage to print
     */
    public void printCoverage(HttpServletRequest request,
                              HttpServletResponse response, String pathPrefix,
                              String libName, CoverageAttributeTable cat,
                              String covname) throws ServletException,
            IOException {
        PrintWriter out = response.getWriter();
        out.println("<H3><A NAME=\"" + libName + "_" + covname + "\">Coverage "
                + buildURL(request, response, pathPrefix, "", covname)
                + " for Library <A HREF=\"#" + libName + "\">" + libName
                + "</A></H3>");
        HtmlListElement list = new HtmlListElement();
        list.addElement("Description: " + cat.getCoverageDescription(covname));
        list.addElement("Topology Level: "
                + cat.getCoverageTopologyLevel(covname));
        String fcsURL = buildURL(request, response, pathPrefix, "fcs?"
                + Data.RowSelectParam + "=" + Data.RowSelectAll, "fcs");
        list.addElement("Feature Class Schema: " + fcsURL);
        CoverageTable ct = cat.getCoverageTable(covname);
        // CoverageTable opens alot of files, go through and close
        // them
        for (Iterator i = ct.getFeatureClasses().values().iterator(); i.hasNext();) {
            FeatureClassInfo fci = (FeatureClassInfo) i.next();
            fci.close();
        }

        Map ftypeinfo = new TreeMap(ct.getFeatureTypeInfo());
        if (ftypeinfo.size() == 0) {
            list.addElement("No Feature Types in FCA");
        } else {
            HtmlListElement flist = new HtmlListElement("Feature Types (from "
                    + buildURL(request, response, pathPrefix, "fca") + ")");
            list.addElement(flist);
            for (Iterator i = ftypeinfo.values().iterator(); i.hasNext();) {
                CoverageTable.FeatureClassRec fcr = (CoverageTable.FeatureClassRec) i.next();
                String name = fcr.feature_class.toLowerCase();
//                char t = fcr.type;
                String desc = fcr.description;
                String tstring = "[unknown] ";
                String suffix = "";
                switch (fcr.type) {
                case CoverageTable.TEXT_FEATURETYPE:
                    tstring = "[text feature] ";
                    suffix = ".tft";
                    break;
                case CoverageTable.EDGE_FEATURETYPE:
                    tstring = "[edge feature] ";
                    suffix = ".lft";
                    break;
                case CoverageTable.AREA_FEATURETYPE:
                    tstring = "[area feature] ";
                    suffix = ".aft";
                    break;
                case CoverageTable.UPOINT_FEATURETYPE:
                    FeatureClassInfo fci = ct.getFeatureClassInfo(name);
                    char type = (fci != null) ? fci.getFeatureType()
                            : CoverageTable.SKIP_FEATURETYPE;
                    if (type == CoverageTable.EPOINT_FEATURETYPE) {
                        tstring = "[entity point feature] ";
                    } else if (type == CoverageTable.CPOINT_FEATURETYPE) {
                        tstring = "[connected point feature] ";
                    } else {
                        tstring = "[missing point feature] ";
                    }
                    suffix = ".pft";
                    break;
                case CoverageTable.COMPLEX_FEATURETYPE:
                    tstring = "[complex feature] ";
                    suffix = ".cft";
                    break;
                default:
                    tstring = "[unknown] ";
                    suffix = "";
                }
                String url = buildURL(request, response, pathPrefix, name
                        + suffix, name);
                flist.addElement(url + ": " + tstring + desc);
            }
        }
        try {
            HtmlListElement flist = new HtmlListElement("Feature Types (from "
                    + fcsURL + ")");
            boolean generateflist = false;
            DcwRecordFile fcs = new DcwRecordFile(ct.getDataPath()
                    + File.separator + "fcs" + (ct.appendDot ? "." : ""));
            int featureClassColumn = fcs.whatColumn("feature_class");
            int table1Column = fcs.whatColumn("table1");
//            int table1_keyColumn = fcs.whatColumn("table1_key");
//            int table2Column = fcs.whatColumn("table2");
//            int table2_keyColumn = fcs.whatColumn("table2_key");

            List fcsl = new ArrayList(fcs.getColumnCount());
            while (fcs.parseRow(fcsl)) {
                String featureclass = ((String) fcsl.get(featureClassColumn)).toLowerCase();
                String table1 = ((String) fcsl.get(table1Column)).toLowerCase();
                if (!ftypeinfo.containsKey(featureclass)) {
                    ftypeinfo.put(featureclass, null);
                    String type = null;
                    if (table1.endsWith(".cft")) {
                        type = "complex feature";
                    } else if (table1.endsWith(".pft")) {
                        type = "point feature";
                    } else if (table1.endsWith(".lft")) {
                        type = "line feature";
                    } else if (table1.endsWith(".aft")) {
                        type = "area feature";
                    } else if (table1.endsWith(".tft")) {
                        type = "text feature";
                    }
                    if (type != null) {
                        generateflist = true;
                        flist.addElement(type
                                + " "
                                + buildURL(request,
                                        response,
                                        pathPrefix,
                                        table1,
                                        featureclass));
                    }
                }
            }
            if (generateflist) {
                list.addElement(flist);
            }
            fcs.close();
        } catch (FormatException fe) {
            list.addElement("no fcs");
        }
        list.generate(out);
    }

    public LibrarySelectionTable getLST(String libname) throws FormatException {
        LibrarySelectionTable lst = contextInfo.getLST(libname);
        if (lst == null) {
            String lib_home = contextInfo.getPath(libname);
            if (lib_home == null) {
                return null;
            }
//            File flib_home = new File(lib_home);

            lst = new LibrarySelectionTable(lib_home);
            contextInfo.putLST(libname, lst);
        }
        return lst;
    }
}
TOP

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

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.