changeset 505:06d7e8c09b11 digilibPDF

*** empty log message ***
author cmielack
date Fri, 06 Mar 2009 11:08:26 +0100
parents a370e72f2179
children 7dba370dda3b
files servlet/src/digilib/servlet/DigilibPDFWorker.java servlet/src/digilib/servlet/PDFCache.java servlet/src/digilib/servlet/PDFJobInformation.java servlet/src/digilib/servlet/PDFMaker.java
diffstat 4 files changed, 139 insertions(+), 52 deletions(-) [+]
line wrap: on
line diff
--- a/servlet/src/digilib/servlet/DigilibPDFWorker.java	Fri Mar 06 11:06:21 2009 +0100
+++ b/servlet/src/digilib/servlet/DigilibPDFWorker.java	Fri Mar 06 11:08:26 2009 +0100
@@ -78,13 +78,14 @@
 		// create document object
 		doc = new Document(PageSize.A4, 0,0,0,0);
 		PdfWriter docwriter = null;
-		File output_file = new File(PDFCache.cache_directory + filename);
+		File output_file = new File(PDFCache.temp_directory + filename);
 		FileOutputStream fos;
-
+		
 		try {
 			fos = new FileOutputStream(output_file);
 		} catch (FileNotFoundException e1) {
 			// TODO Auto-generated catch block
+			logger.error(e1.getMessage());
 			e1.printStackTrace();
 			return;
 		}
@@ -100,16 +101,20 @@
 
 			doc.open();
 
-			logger.debug("- doc.open()ed ("+(System.currentTimeMillis()-start_time) + "ms)");
+			logger.debug("- "+filename+" doc.open()ed ("+(System.currentTimeMillis()-start_time) + "ms)");
 			start_time = System.currentTimeMillis();
 			
 
 			Integer[] pgs = get_pgs();
 
 			for(Integer p: pgs){
+				logger.debug(" - adding Image "+p+" to " + filename);
 				addImage(p);
+				logger.debug(" - done adding Image "+p+" to " + filename);
 			}
 			
+			logger.debug(" - done adding all Images to " + filename);
+
 			
 			
 		}
@@ -122,7 +127,7 @@
 		finally {
 			if (doc!=null){
 				doc.close();
-				logger.debug("- doc.close() ("+(System.currentTimeMillis()-start_time) + "ms)");
+				logger.debug("- "+filename+" doc.close() ("+(System.currentTimeMillis()-start_time) + "ms)");
 			}
 			if (docwriter!=null){
 				docwriter.close();
@@ -134,6 +139,7 @@
 		try {
 			fos.flush();
 		} catch (IOException e) {
+			logger.error(e.getMessage());
 			e.printStackTrace();
 			error = e;
 		}
@@ -142,6 +148,7 @@
 				try {
 					fos.close();
 				} catch (IOException e) {
+					logger.error(e.getMessage());
 					e.printStackTrace();
 				}
 			}
@@ -205,14 +212,19 @@
 			doc.add(theimg);
 			
 		} catch (FileOpException e) {
+			logger.error(e.getMessage());
 			e.printStackTrace();
 		} catch (IOException e) {
+			logger.error(e.getMessage());
 			e.printStackTrace();
 		} catch (ImageOpException e) {
+			logger.error(e.getMessage());
 			e.printStackTrace();
 		} catch (BadElementException e) {
+			logger.error(e.getMessage());
 			e.printStackTrace();
 		} catch (DocumentException e) {
+			logger.error(e.getMessage());
 			e.printStackTrace();
 		}
 	}
--- a/servlet/src/digilib/servlet/PDFCache.java	Fri Mar 06 11:06:21 2009 +0100
+++ b/servlet/src/digilib/servlet/PDFCache.java	Fri Mar 06 11:08:26 2009 +0100
@@ -7,6 +7,7 @@
 import java.io.InputStream;
 import java.util.HashMap;
 
+import javax.servlet.RequestDispatcher;
 import javax.servlet.ServletConfig;
 import javax.servlet.ServletContext;
 import javax.servlet.ServletException;
@@ -18,12 +19,17 @@
 
 	private DigilibConfiguration dlConfig = null;
 	
+	
+	
 	public static String cache_directory = "cache/";  // TODO set using dlConfig
 	
-	public static String cache_hash_id = "digilib.servlet.PDFCache";
+	public static String temp_directory = "pdf_temp/";
+	
+	
 	
-	HashMap<String,Integer> cache_hash = null;
+	private static String JSP_WIP = "/pdf/wip.jsp";
 	
+	private static String JSP_ERROR = "/pdf/error.jsp";
 	
 	public static Integer STATUS_DONE = 0;  	// document exists in cache
 
@@ -40,6 +46,7 @@
 	// TODO use JSPs for automatically refreshing waiting-pages and download-pages
 	// TODO register the PDFCache instance globally and implement getters for cache_dir 
 	
+	private ServletContext context = null;
 	
 	public void init(ServletConfig config) throws ServletException{
 		
@@ -50,7 +57,7 @@
 		logger.info("initialized PDFCache v."+version);
 		
 		// create and register hashtable
-		ServletContext context = config.getServletContext();
+		context = config.getServletContext();
 		
 		dlConfig = (DigilibConfiguration) context.getAttribute("digilib.servlet.configuration");
 		
@@ -59,38 +66,30 @@
 			throw new ServletException("No Configuration!");
 		}
 		
-		context.setAttribute(cache_hash_id, new HashMap<String,Integer>());
+		//context.setAttribute(cache_hash_id, new HashMap<String,Integer>());
 		
-		cache_hash = (HashMap<String,Integer>) context.getAttribute(cache_hash_id);
+		//cache_hash = (HashMap<String,Integer>) context.getAttribute(cache_hash_id);
 
-		if (cache_hash==null){
+		/*if (cache_hash==null){
 			cache_hash = new HashMap<String,Integer>();
 			context.setAttribute(cache_hash_id, cache_hash);
-		}
+		}*/
 		
 		// scan the directory
-		scanCacheDirectory();
-		
+		// scanCacheDirectory();
+		emptyTempDirectory();
 	}
 	
 	
-	public void scanCacheDirectory(){
+	public void emptyTempDirectory(){
 		// search the cache-directory for existing files and fill them into the Hashtable as STATUS_DONE
 
-		ServletContext context = this.getServletContext();
-		HashMap<String,Integer> cache_hash = (HashMap<String,Integer>) context.getAttribute(cache_hash_id);
-
-		File cache_dir = new File(cache_directory);
-		String[] cached_files = cache_dir.list();
+		File temp_dir = new File(temp_directory);
+		String[] cached_files = temp_dir.list();
 		
 		
 		for (String file: cached_files){
-			String docid = file.substring(0,file.length()-4);
-			logger.debug("docid = "+docid);
-			if (file.endsWith(".pdf") && !cache_hash.containsKey(docid)){
-				logger.debug("PDFCache reads in "+file);
-				cache_hash.put(file, STATUS_DONE);
-			}
+			new File(temp_directory,file).delete();
 		}
 	}
 	
@@ -107,6 +106,11 @@
 		
 		String docid = pdfji.getDocumentId();
 		
+		// if some invalid data has been entered ...
+		if(!pdfji.checkValidity()) {
+			notifyUser(STATUS_ERROR, docid, request, response);
+			return;
+		}
 		
 		int status = getStatus(docid);
 		
@@ -114,7 +118,7 @@
 		
 		if(status == STATUS_NONEXISTENT){
 			createNewPdfDocument(pdfji, docid); 
-			informUser(status, docid, response);
+			notifyUser(status, docid, request, response);
 		}
 		else if (status == STATUS_DONE){
 			try {
@@ -125,53 +129,73 @@
 			}
 		}
 		else {
-			informUser(status, docid, response);			
+			notifyUser(status, docid, request, response);			
 		}
 	}
 
 
-	public void informUser(int status, String documentid, HttpServletResponse response){
+	public void notifyUser(int status, String documentid, HttpServletRequest request, HttpServletResponse response){
 		// depending on the documents status, redirect the user to an appropriate waiting- or download-site
 		// TODO
 		
+		String jsp=null;
+		
 		if(status == STATUS_NONEXISTENT){
 			// tell the user that the document has to be created before he/she can download it
 			logger.debug("PDFCache: "+documentid+" has STATUS_NONEXISTENT.");
+			jsp = JSP_WIP;
 		}
 		else if(status == STATUS_WIP){
 			logger.debug("PDFCache: "+documentid+" has STATUS_WIP.");
+			jsp = JSP_WIP;
 
 			// estimate remaining work time
 			// tell the user he/she has to wait
 		}
 		else if(status == STATUS_DONE){
 			logger.debug("PDFCache: "+documentid+" has STATUS_DONE.");
-
-		// do nothing or refresh
 		}
 		else {
 			logger.debug("PDFCache: "+documentid+" has STATUS_ERROR.");
+			jsp = JSP_ERROR;
+		}
 
-			// status == STATUS_ERROR
-			// an error must have occured; show error page
+		RequestDispatcher dispatch = context.getRequestDispatcher(jsp);
+
+		
+		try {
+			dispatch.forward(request, response);
+		} catch (ServletException e) {
+			logger.debug(e.getMessage());
+			e.printStackTrace();
+		} catch (IOException e) {
+			logger.debug(e.getMessage());
+			e.printStackTrace();
 		}
-	
+		
 	}
 
 	
 	/** check the status of the document corresponding to the documentid */
 	public Integer getStatus(String documentid){
-		// rescan directory?  might be useful if more than one instance uses the same cache directory ;  Problem: wip-files occur in the list
-		if(cache_hash.containsKey(documentid))
-			return cache_hash.get(documentid);
-		else
+		// looks into the cache and temp directory in order to find out the status of the document
+		File cached = new File(cache_directory + documentid);
+		File wip = new File(temp_directory + documentid);
+		if(cached.exists()){
+			return STATUS_DONE;
+		}
+		else if (wip.exists()){
+			return STATUS_WIP;
+		}
+		else {
 			return STATUS_NONEXISTENT;
+		}
 	}
 
 
 	public void createNewPdfDocument(PDFJobInformation pdfji, String filename){
 		// start new worker
-		PDFMaker pdf_maker = new PDFMaker(dlConfig, cache_hash, pdfji,filename);
+		PDFMaker pdf_maker = new PDFMaker(dlConfig, pdfji,filename);
 		new Thread(pdf_maker, "PDFMaker").start();
 	}
 	
--- a/servlet/src/digilib/servlet/PDFJobInformation.java	Fri Mar 06 11:06:21 2009 +0100
+++ b/servlet/src/digilib/servlet/PDFJobInformation.java	Fri Mar 06 11:08:26 2009 +0100
@@ -6,6 +6,8 @@
 
 import javax.servlet.http.HttpServletRequest;
 
+import org.apache.log4j.Logger;
+
 
 /** 
  * A container class for storing a set of instructional parameters 
@@ -29,6 +31,9 @@
 	
 	ImageJobInformation image_info = null;
 	DigilibConfiguration dlConfig = null;
+	/** gengeral logger for this class */
+	protected static Logger logger = Logger.getLogger("digilib.servlet");
+
 	
 	public PDFJobInformation(DigilibConfiguration dlcfg) {
 		super(30);
@@ -176,4 +181,40 @@
 		return numarray;
 	}
 	
+	
+	public boolean checkValidity(){
+		String pgs = getAsString("pgs");
+		try{
+				String[] intervals = null;
+				if(pgs.indexOf(",")>0){
+					intervals = pgs.split(",");
+				}
+				else{
+					intervals = new String[1];
+					intervals[0]=pgs;
+				}
+				for(String interval:intervals){
+					if(interval.indexOf("-")>=0){
+						String[] intrvl = interval.split("-");
+						int a = Integer.valueOf(intrvl[0]);
+						int b = Integer.valueOf(intrvl[1]);
+						if(a<=0 || b<a){
+							return false;
+						}
+					}
+					else {
+						int c = Integer.valueOf(interval);
+						if(c<=0)
+							return false;
+						
+					}
+				}
+		}
+		catch(Exception e){
+			logger.error("invalid pgs-input");
+			return false;
+		}
+		return true;
+	}
+	
 }
\ No newline at end of file
--- a/servlet/src/digilib/servlet/PDFMaker.java	Fri Mar 06 11:06:21 2009 +0100
+++ b/servlet/src/digilib/servlet/PDFMaker.java	Fri Mar 06 11:08:26 2009 +0100
@@ -1,5 +1,6 @@
 package digilib.servlet;
 
+import java.io.File;
 import java.io.IOException;
 import java.util.HashMap;
 
@@ -8,22 +9,21 @@
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletResponse;
 
+import org.apache.log4j.Logger;
+
 public class PDFMaker extends HttpServlet implements Runnable {
 
 	private PDFJobInformation job_info = null;
 	private String filename = null;
-	private HashMap cache_hash = null;
 	private DigilibConfiguration dlConfig = null;
 	
 
-/**	public void init(ServletConfig config){
-		ServletContext context = config.getServletContext();
-		cache_hash = (HashMap<String,Integer>) context.getAttribute(PDFCache.cache_hash_id);
-	}*/
+	/** gengeral logger for this class */
+	protected static Logger logger = Logger.getLogger("digilib.servlet");
 
 	
-	public PDFMaker(DigilibConfiguration dlConfig, HashMap cache_hash, PDFJobInformation pdfji, String filename){
-		this.cache_hash = cache_hash;
+	
+	public PDFMaker(DigilibConfiguration dlConfig, PDFJobInformation pdfji, String filename){
 		this.job_info = pdfji;
 		this.filename = filename;
 		this.dlConfig = dlConfig;
@@ -35,24 +35,34 @@
 	public void run() {
 
 		if (! DigilibWorker.canRun()) {
-			// logger.error("Servlet overloaded!");
-			cache_hash.put(filename, PDFCache.STATUS_ERROR);
+			// TODO include the logger
+			logger.error("Servlet overloaded!");
+			
 			return;
 		}
 
-		cache_hash.put(filename, PDFCache.STATUS_WIP);
-		
 		// create PDFWorker
 		DigilibPDFWorker pdf_worker = new DigilibPDFWorker(dlConfig, job_info, filename);
 		
 		// run PDFWorker
 		pdf_worker.run();
-		
+
+		File document = new File(PDFCache.temp_directory + filename);
+
 		if(pdf_worker.hasError()){
-			cache_hash.put(filename, PDFCache.STATUS_ERROR);
+			// raise error, write to logger
+			logger.error("@@@@ "+pdf_worker.getError().getMessage());
+			document.delete();
 			return;
 		}
-		cache_hash.put(filename, PDFCache.STATUS_DONE);
+		else{
+			boolean success = document.renameTo(new File(PDFCache.cache_directory, filename));
+			if(!success){
+				// TODO raise error
+				
+			}
+		}
+		
 	}