view servlet3/src/main/java/digilib/servlet/DigilibServletConfiguration.java @ 1019:287e2d2d2ae8

fix flicker in Firefox by leaving scaler background visible. add setSize and setRGB actions. disabled rotation slider for now (needs excact numerical input option).
author robcast
date Mon, 20 Feb 2012 22:23:07 +0100
parents b2d97b842612
children 4e368c85cce4
line wrap: on
line source

/*
 * DigilibConfiguration -- Holding all parameters for digilib servlet.
 * 
 * Digital Image Library servlet components
 * 
 * Copyright (C) 2001, 2002 Robert Casties (robcast@mail.berlios.de)
 * 
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the Free
 * Software Foundation; either version 2 of the License, or (at your option)
 * any later version.
 * 
 * Please read license.txt for the full details. A copy of the GPL may be found
 * at http://www.gnu.org/copyleft/lgpl.html
 * 
 * You should have received a copy of the GNU General Public License along with
 * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
 * Place, Suite 330, Boston, MA 02111-1307 USA
 *  
 */

package digilib.servlet;

import java.io.File;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.atomic.AtomicInteger;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;

import digilib.image.DocuImageImpl;
import digilib.io.FileOps;
import digilib.util.Parameter;
import digilib.util.XMLListLoader;

/**
 * Class to hold the digilib servlet configuration parameters. The parameters
 * can be read from the digilib-config file and be passed to other servlets or
 * beans. <br>
 * errorImgFileName: image file to send in case of error. <br>
 * denyImgFileName: image file to send if access is denied. <br>
 * baseDirs: array of base directories in order of preference (prescaled
 * versions first). <br>
 * useAuth: use authentication information. <br>
 * authConfPath: authentication configuration file. <br>
 * ... <br>
 * 
 * @author casties
 * 
 */
public class DigilibServletConfiguration extends DigilibConfiguration {

    /** time the webapp (i.e. this class) was loaded */
    public final Long webappStartTime = System.currentTimeMillis();
    
    /** counter for HttpRequests (mostly for debugging) */
    public AtomicInteger webappRequestCnt = new AtomicInteger(0);

    /** counter for open HttpRequests (mostly for debugging) */
    public AtomicInteger openRequestCnt = new AtomicInteger(0);

    /**
     * Definition of parameters and default values.
     */
    protected void initParams() {
        /*
         * Definition of parameters and default values. System parameters that
         * are not read from config file have a type 's'.
         */

        // digilib servlet version
        newParameter("servlet.version", digilib.servlet.Scaler.getVersion(),
                null, 's');
        // configuration file location
        newParameter("servlet.config.file", null, null, 's');
        // DocuDirCache instance
        newParameter("servlet.dir.cache", null, null, 's');
        // DocuImage class instance
        newParameter("servlet.docuimage.class",
                digilib.image.ImageLoaderDocuImage.class, null, 's');
        // AuthOps instance for authentication
        newParameter("servlet.auth.op", null, null, 's');
        // Executor for image operations
        newParameter("servlet.worker.imageexecutor", null, null, 's');
        // Executor for PDF operations
        newParameter("servlet.worker.pdfexecutor", null, null, 's');
        // Executor for PDF-image operations
        newParameter("servlet.worker.pdfimageexecutor", null, null, 's');

        /*
         * parameters that can be read from config file have a type 'f'
         */

        // image file to send in case of error
        newParameter("error-image", new File("img/digilib-error.png"), null,
                'f');
        // image file to send if access is denied
        newParameter("denied-image", new File("img/digilib-denied.png"), null,
                'f');
        // image file to send if image file not found
        newParameter("notfound-image", new File("img/digilib-notfound.png"),
                null, 'f');
        // base directories in order of preference (prescaled versions last)
        String[] bd = { "/docuserver/images", "/docuserver/scaled/small" };
        newParameter("basedir-list", bd, null, 'f');
        // use authentication information
        newParameter("use-authorization", Boolean.FALSE, null, 'f');
        // authentication configuration file
        newParameter("auth-file", new File("digilib-auth.xml"), null, 'f');
        // sending image files as-is allowed
        newParameter("sendfile-allowed", Boolean.TRUE, null, 'f');
        // Type of DocuImage instance
        newParameter("docuimage-class", "digilib.image.ImageLoaderDocuImage", null, 'f');
        // part of URL used to indicate authorized access
        newParameter("auth-url-path", "authenticated/", null, 'f');
        // degree of subsampling on image load
        newParameter("subsample-minimum", new Float(2f), null, 'f');
        // default scaling quality
        newParameter("default-quality", new Integer(1), null, 'f');
        // use mapping file to translate paths
        newParameter("use-mapping", Boolean.FALSE, null, 'f');
        // mapping file location
        newParameter("mapping-file", new File("digilib-map.xml"), null, 'f');
        // log4j config file location
        newParameter("log-config-file", new File("log4j-config.xml"), null, 'f');
        // maximum destination image size (0 means no limit)
        newParameter("max-image-size", new Integer(0), null, 'f');
        // number of working threads
        newParameter("worker-threads", new Integer(1), null, 'f');
        // max number of waiting threads
        newParameter("max-waiting-threads", new Integer(20), null, 'f');
        // timeout for worker threads (ms)
        newParameter("worker-timeout", new Integer(60000), null, 'f');
        // number of pdf-generation threads
        newParameter("pdf-worker-threads", new Integer(1), null, 'f');
        // max number of waiting pdf-generation threads
        newParameter("pdf-max-waiting-threads", new Integer(20), null, 'f');
        // number of pdf-image generation threads
        newParameter("pdf-image-worker-threads", new Integer(1), null, 'f');
        // max number of waiting pdf-image generation threads
        newParameter("pdf-image-max-waiting-threads", new Integer(10), null,
                'f');
        // PDF generation temp directory
        newParameter("pdf-temp-dir", "pdf_temp", null, 'f');
        // PDF generation cache directory
        newParameter("pdf-cache-dir", "pdf_cache", null, 'f');
        // allow image toolkit to use disk cache
        newParameter("img-diskcache-allowed", Boolean.TRUE, null, 'f');
        // default type of error message (image, text, code)
        newParameter("default-errmsg-type", "image", null, 'f');
    }

    /**
     * Constructor taking a ServletConfig. Reads the config file location from
     * an init parameter and loads the config file. Calls
     * <code>readConfig()</code>.
     * 
     * @see readConfig()
     */
    public DigilibServletConfiguration(ServletContext c) throws Exception {
        readConfig(c);
    }

    /**
     * read parameter list from the XML file in init parameter "config-file" or
     * file digilib-config.xml
     */
    @SuppressWarnings("unchecked")
    public void readConfig(ServletContext c) throws Exception {

        /*
         * Get config file name. The file name is first looked for as an init
         * parameter, then in a fixed location in the webapp.
         */
        if (c == null) {
            // no config no file...
            return;
        }
        String fn = c.getInitParameter("config-file");
        if (fn == null) {
            fn = ServletOps.getConfigFile("digilib-config.xml", c);
            if (fn == null) {
                logger.fatal("readConfig: no param config-file");
                throw new ServletException("ERROR: no digilib config file!");
            }
        }
        File f = new File(fn);
        // setup config file list reader
        XMLListLoader lilo = new XMLListLoader("digilib-config", "parameter",
                "name", "value");
        // read config file into HashMap
        Map<String, String> confTable = lilo.loadURL(f.toURL().toString());

        // set config file path parameter
        setValue("servlet.config.file", f.getCanonicalPath());

        /*
         * read parameters
         */

        for (Entry<String, String> confEntry : confTable.entrySet()) {
            Parameter p = get(confEntry.getKey());
            if (p != null) {
                if (p.getType() == 's') {
                    // type 's' Parameters are not overwritten.
                    continue;
                }
                if (!p.setValueFromString(confEntry.getValue())) {
                    /*
                     * automatic conversion failed -- try special cases
                     */

                    // basedir-list
                    if (confEntry.getKey().equals("basedir-list")) {
                        // split list into directories
                        String[] dirs = FileOps.pathToArray(confEntry.getValue());
                        for (int j = 0; j < dirs.length; j++) {
                            // make relative directory paths be inside the webapp
                            dirs[j] = ServletOps.getFile(dirs[j], c);
                        }
                        if (dirs != null) {
                            p.setValue(dirs);
                        }
                    }
                }
            } else {
                // parameter unknown -- just add
                newParameter(confEntry.getKey(), null, confEntry.getValue(),
                        'f');
            }
        }
        // initialise static DocuImage class instance
        DigilibServletConfiguration.docuImageClass = (Class<DocuImageImpl>) Class
                .forName(getAsString("docuimage-class"));
    }

}