Package com.bbn.openmap.vpfservlet

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

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

import java.io.File;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;

import javax.servlet.ServletContext;

import com.bbn.openmap.layer.vpf.LibrarySelectionTable;

/**
* This class holds information retrieved from the ServletContext.
*/
public class ContextInfo {
    /**
     * the name of the attribute where ContextInfo objects are in the
     * ServletContext
     */
    public static final String CONTEXT_INFO = ContextInfo.class.getPackage()
            .getName()
            + ".contextInfo";
    /** the prefix used to configure VPF libraries in web.xml */
    public static final String LIBRARY_PREFIX = ContextInfo.class.getPackage()
            .getName()
            + ".vpf_library.";

    /** a map from library name to (String) library path */
    private Map lib_pathmap;
    /** a map from library name to LibrarySelectionTable */
    private Map lib_lstmap;

    /**
     * A constructor - use getContextInfo to get one.
     *
     * @param context the ServletContext to use to initialize
     * @see #getContextInfo
     */
    private ContextInfo(ServletContext context) {
        lib_pathmap = createLibrariesMap(context);
        lib_lstmap = new HashMap();
    }

    /**
     * Returns the ContextInfo object for the ServletContext.
     *
     * @param context the ServletContext to either get an existing
     *        ContextInfo from, or the context to use to initialize a
     *        new ContextInfo, if one doesn't already exist for the
     *        context.
     */
    public static synchronized ContextInfo getContextInfo(ServletContext context) {
        ContextInfo ci = (ContextInfo) context.getAttribute(CONTEXT_INFO);
        if (ci == null) {
            ci = new ContextInfo(context);
            context.setAttribute(CONTEXT_INFO, ci);
        }
        return ci;
    }

    /**
     * Grovels through the ServletContext initialization parameters
     * and creates a map from library name to library path.
     *
     * @param context the context to grovel through
     */
    private Map createLibrariesMap(ServletContext context) {
        HashMap library_map = new HashMap();
        for (Enumeration en = context.getInitParameterNames(); en.hasMoreElements();) {
            String s = (String) en.nextElement();
            if (s.startsWith(LIBRARY_PREFIX)) {
                String libname = s.substring(LIBRARY_PREFIX.length());
                String path = getPath(context, context.getInitParameter(s));
                if (path != null) {
                    library_map.put(libname, path);
                } else {
                    context.log("Excluding " + libname
                            + " from database list, can't resolve path");
                }

            }
        }
        return Collections.unmodifiableMap(library_map);
    }

    /**
     * Try and find an absolute path from an init parameter
     *
     * @param context the context to use to resolve paths
     * @param path the path to try and resolve
     * @return an absolute path to a file (hopefully a directory) on
     *         the system, or null indicating the resolve failed to
     *         find anything useful.
     */
    private String getPath(ServletContext context, String path) {
        // try to resolve as a relative path in the war file
        try {
            String p2 = context.getRealPath(path);
            File f = new File(p2);
            if (f.exists()) {
                return p2;
            }
        } catch (java.security.AccessControlException jsace) {
            // ignore, nothing to do but press on
        }
        // try to resolve as an absolute path on the system
        try {
            File f = new File(path);
            if (f.exists()) {
                return path;
            }
        } catch (java.security.AccessControlException jsace) {
            // ignore, nothing to do
        }
        return null;
    }

    /**
     * Return a file object that the path resolves to. Performs some
     * minimal checks to try and prevent an attacker from feeding in
     * urls that cause the servlets to climb out of their sandbox. A
     * better option is to use a servlet container with the ability to
     * restrict servlet file access. For example, Apache Software
     * Foundation's Tomcat 5 Servlet/JSP Container running with the
     * -security flag.
     *
     * @param pathInfo the path to resolve (expected to be of the form
     *        "/library_name_in_web_xml/path/to/file")
     * @return a File if it could be resolved, null otherwise
     */
    public String resolvePath(String pathInfo) {
        if ((pathInfo == null) || (pathInfo.indexOf("..") != -1)) { // don't
                                                                    // climb
                                                                    // out
                                                                    // of
                                                                    // sandbox
            return null;
        }
        int libStart = pathInfo.indexOf('/') + 1;
        int libEnd = pathInfo.indexOf('/', libStart);
        if (libEnd == -1) {
            libEnd = pathInfo.length();
        }
        String libname = pathInfo.substring(libStart, libEnd);
        String subpath = pathInfo.substring(libEnd);

        String lib_home = getPath(libname);
        if (lib_home == null) {
            return null;
        }

        return lib_home + "/" + subpath;
    }

    /**
     * Returns a Set whose values are the (String) names of the
     * configured libraries.
     *
     * @return a set of library names
     */
    public Set keySet() {
        return new TreeSet(lib_pathmap.keySet());
    }

    /**
     * Returns the path (or null) for the library
     *
     * @param libname the library name
     * @return the path or null
     */
    public String getPath(String libname) {
        return (String) lib_pathmap.get(libname);
    }

    /**
     * Returns the LibrarySelectionTable (or null) for the library
     *
     * @param libname the library name
     * @return the LST or null
     */
    public LibrarySelectionTable getLST(String libname) {
        return (LibrarySelectionTable) lib_lstmap.get(libname);
    }

    /**
     * Adds an LST for a library
     *
     * @param libname the library name
     * @param lst the LibrarySelectionTable for libname
     */
    public void putLST(String libname, LibrarySelectionTable lst) {
        lib_lstmap.put(libname, lst);
    }
}
TOP

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

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.