diff servlet2/src/main/java/digilib/servlet/DigilibServletConfiguration.java @ 1158:2ee261676828 default tip

better out-of-the box experience: * digilib works without config files using sensible defaults * new sample images folder used by default * config files moved to templates
author robcast
date Tue, 19 Feb 2013 17:32:25 +0100
parents 4e368c85cce4
children
line wrap: on
line diff
--- a/servlet2/src/main/java/digilib/servlet/DigilibServletConfiguration.java	Tue Feb 19 17:27:53 2013 +0100
+++ b/servlet2/src/main/java/digilib/servlet/DigilibServletConfiguration.java	Tue Feb 19 17:32:25 2013 +0100
@@ -24,6 +24,7 @@
 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;
@@ -36,47 +37,50 @@
 /**
  * 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>
+ * 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 {
 
-	/**
-	 * 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'.
-		 */
+    /** 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);
 
-		// 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');
-	        // DocuImage version
-	        newParameter("servlet.docuimage.version",
-	                "?", null, 's');
-		// AuthOps instance for authentication
-		newParameter("servlet.auth.op", null, null, 's');
+    /**
+     * 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');
+        // DocuImage version
+        newParameter("servlet.docuimage.version", "?", 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
@@ -84,69 +88,55 @@
         // Executor for PDF-image operations
         newParameter("servlet.worker.pdfimageexecutor", null, null, 's');
 
-		/*
-		 * parameters that can be read from config file have a type 'f'
-		 */
+        /*
+         * 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');
-		// 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');
+        // 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 = { "sample-images" };
+        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(2), 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
@@ -155,17 +145,18 @@
         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);
-	}
+    /**
+     * 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
@@ -184,60 +175,66 @@
         }
         String fn = c.getInitParameter("config-file");
         if (fn == null) {
+            logger.debug("readConfig: no param config-file");
             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());
+        if (f.canRead()) {
+            // 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());
+            // set config file path parameter
+            setValue("servlet.config.file", f.getCanonicalPath());
 
-        /*
-         * read parameters
-         */
+            /*
+             * 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
-                     */
+            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);
+                        // 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');
                 }
-            } else {
-                // parameter unknown -- just add
-                newParameter(confEntry.getKey(), null, confEntry.getValue(),
-                        'f');
+            }
+        } else {
+            logger.warn("No digilib config file! Using defaults!");
+            // update basedir-list
+            String[] dirs = (String[]) this.getValue("basedir-list");
+            for (int j = 0; j < dirs.length; j++) {
+                // make relative directory paths be inside the
+                // webapp
+                dirs[j] = ServletOps.getFile(dirs[j], c);
             }
         }
         // initialise static DocuImage class instance
-        DigilibServletConfiguration.docuImageClass = (Class<DocuImageImpl>) Class
-                .forName(getAsString("docuimage-class"));
+        DigilibServletConfiguration.docuImageClass = (Class<DocuImageImpl>) Class.forName(getAsString("docuimage-class"));
         setValue("servlet.docuimage.version", getDocuImageInstance().getVersion());
     }