diff servlet3/src/main/java/digilib/servlet/AsyncServletWorker.java @ 903:7779b37d1d05

refactored into maven modules per servlet type. can build servlet-api 2.3 and 3.0 via profile now!
author robcast
date Tue, 26 Apr 2011 20:24:31 +0200
parents servlet/src/main/java/digilib/servlet/AsyncServletWorker.java@ba1eb2d821a2
children 66f1ba72d07b
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/servlet3/src/main/java/digilib/servlet/AsyncServletWorker.java	Tue Apr 26 20:24:31 2011 +0200
@@ -0,0 +1,94 @@
+/**
+ * 
+ */
+package digilib.servlet;
+
+import java.io.IOException;
+
+import javax.servlet.AsyncContext;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.log4j.Logger;
+
+import digilib.image.DocuImage;
+import digilib.image.ImageJobDescription;
+import digilib.image.ImageOpException;
+import digilib.image.ImageWorker;
+import digilib.servlet.Scaler.ErrMsg;
+import digilib.servlet.Scaler.Error;
+
+/**
+ * @author casties
+ * 
+ */
+public class AsyncServletWorker implements Runnable {
+
+    /** the AsyncServlet context */
+    private AsyncContext asyncContext;
+
+    /** the ImageWorker we use */
+    private ImageWorker imageWorker;
+
+    protected static Logger logger = Logger.getLogger(AsyncServletWorker.class);
+    private long startTime;
+    private ErrMsg errMsgType = ErrMsg.IMAGE;
+	private ImageJobDescription jobinfo;
+
+    /**
+     * @param dlConfig
+     * @param jobinfo
+     */
+    public AsyncServletWorker(DigilibConfiguration dlConfig,
+            ImageJobDescription jobinfo, AsyncContext asyncContext,
+            ErrMsg errMsgType, long startTime) {
+        // set up image worker
+        imageWorker = new ImageWorker(dlConfig, jobinfo);
+        // save AsyncContext
+        this.asyncContext = asyncContext;
+        this.startTime = startTime;
+        this.errMsgType = errMsgType;
+        this.jobinfo = jobinfo;
+    }
+
+    /**
+     * runs the ImageWorker and writes the image to the ServletResponse.
+     */
+    public void run() {
+        // get fresh response
+        HttpServletResponse response = (HttpServletResponse) asyncContext.getResponse();
+        logger.debug("working on response: (" + ServletOps.headersToString(response) + ")");
+        try {
+            // render the image
+            DocuImage img = imageWorker.call();
+            // forced destination image type
+            String mt = null;
+            if (jobinfo.hasOption("jpg")) {
+            	mt = "image/jpeg";
+            } else if (jobinfo.hasOption("png")) {
+            	mt = "image/png";
+            }
+            // send image
+            ServletOps.sendImage(img, mt, response, logger);
+            logger.debug("Job done in: "
+                    + (System.currentTimeMillis() - startTime) + "ms");
+        } catch (ImageOpException e) {
+            logger.error(e.getClass() + ": " + e.getMessage());
+            Scaler.digilibError(errMsgType, Error.IMAGE, null, response);
+        } catch (IOException e) {
+            logger.error(e.getClass() + ": " + e.getMessage());
+            Scaler.digilibError(errMsgType, Error.FILE, null, response);
+        } catch (ServletException e) {
+            logger.error("Servlet error: ", e);
+        } catch (Exception e) {
+            logger.error("Other error: ", e);
+        } finally {
+            // submit response
+            logger.debug("context complete.");
+            logger.debug("response: (" + ServletOps.headersToString(response) + ")");
+            asyncContext.complete();
+        }
+
+    }
+
+}