# HG changeset patch
# User robcast
# Date 1291970109 -3600
# Node ID e1094c5ec0323c43f2051cec709038bc91cbbaaf
# Parent e7c29b587829ca28ebd8e7ea485b6ca41b6374c0
more cleanup and refactoring
diff -r e7c29b587829 -r e1094c5ec032 client/digitallibrary/digimage.jsp
--- a/client/digitallibrary/digimage.jsp Fri Oct 22 19:04:49 2010 +0200
+++ b/client/digitallibrary/digimage.jsp Fri Dec 10 09:35:09 2010 +0100
@@ -26,7 +26,7 @@
// add number of pages
dlRequest.setValue("pt", docBean.getNumPages());
// store objects for jsp:include
-pageContext.setAttribute("docBean", docBean, pageContext.REQUEST_SCOPE);
+pageContext.setAttribute("docBean", docBean, PageContext.REQUEST_SCOPE);
%>
Digital Document Library (L1)
diff -r e7c29b587829 -r e1094c5ec032 servlet/src/digilib/servlet/DigilibImageWorker1.java
--- a/servlet/src/digilib/servlet/DigilibImageWorker1.java Fri Oct 22 19:04:49 2010 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,274 +0,0 @@
-/* DigilibImageWorker.java -- worker for image operations
- *
- * Digital Image Library servlet components
- *
- * Copyright (C) 2004 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
- *
- * Created on 19.10.2004
- */
-
-package digilib.servlet;
-
-import java.awt.Rectangle;
-import java.awt.geom.Rectangle2D;
-import java.io.IOException;
-import java.io.OutputStream;
-
-import digilib.image.DocuImage;
-import digilib.image.ImageOpException;
-import digilib.image.ImageOps;
-import digilib.io.FileOpException;
-import digilib.io.ImageFile;
-
-/**
- * worker for image operations.
- *
- * @author casties
- *
- */
-public class DigilibImageWorker1 extends DigilibWorker1 {
-
- private DigilibConfiguration dlConfig;
-
- //HttpServletResponse response;
-
- OutputStream outstream;
-
- long startTime;
-
- String mimeType;
-
- int scaleQual;
-
- //DigilibRequest dlRequest;
-
- //ImageJobInformation ijd;
-
- float paramROT;
-
- float paramCONT;
-
- float paramBRGT;
-
- float[] paramRGBM;
-
- float[] paramRGBA;
-
- ImageFile fileToLoad;
-
- float areaXoff;
-
- float areaYoff;
-
- float areaWidth;
-
- float areaHeight;
-
- float scaleXY;
-
- Rectangle2D outerUserImgArea;
-
- Rectangle2D innerUserImgArea;
-
- float minSubsample;
-
- boolean wholeRotArea;
-
- boolean vmir;
- boolean hmir;
-
- int forceType;
-
-
- public DigilibImageWorker1(DigilibConfiguration dlConfig, OutputStream outstream, ImageJobInformation jobinfo) {
- super();
-
- this.dlConfig = dlConfig;
- this.outstream = outstream;
- this.mimeType = jobinfo.get_mimeType();
- this.scaleQual = jobinfo.get_scaleQual();
- this.paramROT = jobinfo.getAsFloat("rot");
- this.paramCONT = jobinfo.getAsFloat("cont");
- this.paramBRGT = jobinfo.getAsFloat("brgt");
- this.paramRGBM = jobinfo.get_paramRGBM();
- this.paramRGBA = jobinfo.get_paramRGBA();
- try {
- this.fileToLoad = jobinfo.get_fileToLoad();
- this.scaleXY = jobinfo.get_scaleXY();
- this.outerUserImgArea = jobinfo.get_outerUserImgArea();
- this.innerUserImgArea = jobinfo.get_innerUserImgArea();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (ImageOpException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
-
- this.minSubsample = dlConfig.getAsFloat("subsample-minimum");
- this.wholeRotArea = jobinfo.get_wholeRotArea();
- this.forceType = jobinfo.get_forceType();
- this.hmir = jobinfo.get_hmir();
- this.vmir = jobinfo.get_vmir();
- }
-
- /*
- * do the work
- */
- public DocuImage render() throws FileOpException, IOException, ImageOpException {
-
- logger.debug("image worker " + this.getName() + " working");
- startTime = System.currentTimeMillis();
-
- /* crop and scale image */
-
- // new DocuImage instance
- DocuImage docuImage = dlConfig.getDocuImageInstance();
- if (docuImage == null) {
- throw new ImageOpException("Unable to load DocuImage class!");
- }
-
- // set interpolation quality
- docuImage.setQuality(scaleQual);
-
- Rectangle loadRect = outerUserImgArea.getBounds();
- // use subimage loading if possible
- if (docuImage.isSubimageSupported()) {
- logger.debug("Subimage: scale " + scaleXY + " = " + (1 / scaleXY));
- float subf = 1f;
- float subsamp = 1f;
- if (scaleXY < 1) {
- subf = 1 / scaleXY;
- // for higher quality reduce subsample factor by
- // minSubsample
- if (scaleQual > 0) {
- subsamp = (float) Math.max(Math.floor(subf / minSubsample),
- 1d);
- } else {
- subsamp = (float) Math.floor(subf);
- }
- scaleXY = subsamp / subf;
- logger.debug("Using subsampling: " + subsamp + " rest "
- + scaleXY);
- }
-
- docuImage.loadSubimage(fileToLoad, loadRect, (int) subsamp);
-
- logger.debug("SUBSAMP: " + subsamp + " -> " + docuImage.getWidth()
- + "x" + docuImage.getHeight());
-
- docuImage.scale(scaleXY, scaleXY);
-
- } else {
- // else load and crop the whole file
- docuImage.loadImage(fileToLoad);
- docuImage.crop((int) loadRect.getX(), (int) loadRect.getY(),
- (int) loadRect.getWidth(), (int) loadRect.getHeight());
-
- docuImage.scale(scaleXY, scaleXY);
- }
-
- // mirror image
- // operation mode: "hmir": mirror horizontally, "vmir": mirror
- // vertically
- if (hmir) {
- docuImage.mirror(0);
- }
- if (vmir) {
- docuImage.mirror(90);
- }
-
- // rotate image
- if (paramROT != 0d) {
- docuImage.rotate(paramROT);
- if (wholeRotArea) {
- // crop to the inner bounding box
- float xcrop = (float) (docuImage.getWidth() - innerUserImgArea
- .getWidth()
- * scaleXY);
- float ycrop = (float) (docuImage.getHeight() - innerUserImgArea
- .getHeight()
- * scaleXY);
- if ((xcrop > 0) || (ycrop > 0)) {
- // only crop smaller
- xcrop = (xcrop > 0) ? xcrop : 0;
- ycrop = (ycrop > 0) ? ycrop : 0;
- // crop image
- docuImage.crop((int) (xcrop / 2), (int) (ycrop / 2),
- (int) (docuImage.getWidth() - xcrop),
- (int) (docuImage.getHeight() - ycrop));
- }
- }
-
- }
-
- // color modification
- if ((paramRGBM != null) || (paramRGBA != null)) {
- // make shure we actually have two arrays
- if (paramRGBM == null) {
- paramRGBM = new float[3];
- }
- if (paramRGBA == null) {
- paramRGBA = new float[3];
- }
- // calculate "contrast" values (c=2^x)
- float[] mult = new float[3];
- for (int i = 0; i < 3; i++) {
- mult[i] = (float) Math.pow(2, (float) paramRGBM[i]);
- }
- docuImage.enhanceRGB(mult, paramRGBA);
- }
-
- // contrast and brightness enhancement
- if ((paramCONT != 0f) || (paramBRGT != 0f)) {
- float mult = (float) Math.pow(2, paramCONT);
- docuImage.enhance(mult, paramBRGT);
- }
-
- logger.debug("rendered in " + (System.currentTimeMillis() - startTime) + "ms");
-
- return docuImage;
- }
-
- public void write(DocuImage img) throws FileOpException, IOException {
- /* write the resulting image */
-
- // setup output -- if output type is forced use that otherwise
- // if source is JPG then dest will be JPG else it's PNG
- if (forceType != ImageOps.TYPE_AUTO) {
- if (forceType == ImageOps.TYPE_JPEG) {
- mimeType = "image/jpeg";
- }
- if (forceType == ImageOps.TYPE_PNG) {
- mimeType = "image/png";
- }
- } else if ((mimeType.equals("image/jpeg")
- || mimeType.equals("image/jp2") || mimeType.equals("image/fpx"))) {
- mimeType = "image/jpeg";
- } else {
- mimeType = "image/png";
- }
-
- // write the image
- img.writeImage(mimeType, outstream);
- outstream.flush();
-
-
- logger.info("image worker " + this.getName() + " done in "
- + (System.currentTimeMillis() - startTime));
-
- img.dispose();
- }
-}
diff -r e7c29b587829 -r e1094c5ec032 servlet/src/digilib/servlet/DigilibPDFWorker.java
--- a/servlet/src/digilib/servlet/DigilibPDFWorker.java Fri Oct 22 19:04:49 2010 +0200
+++ b/servlet/src/digilib/servlet/DigilibPDFWorker.java Fri Dec 10 09:35:09 2010 +0100
@@ -162,7 +162,7 @@
*/
public void addImage(int pn) {
// create ImageJobInformation
- ImageJobInformation iji = job_info.getImageJobInformation();
+ ImageJobDescription iji = job_info.getImageJobInformation();
iji.setValue("pn", pn);
// create image worker
DigilibImageWorker1 image_worker = new DigilibImageWorker1(dlConfig, null, iji);
diff -r e7c29b587829 -r e1094c5ec032 servlet/src/digilib/servlet/DigilibRequest.java
--- a/servlet/src/digilib/servlet/DigilibRequest.java Fri Oct 22 19:04:49 2010 +0200
+++ b/servlet/src/digilib/servlet/DigilibRequest.java Fri Dec 10 09:35:09 2010 +0100
@@ -61,15 +61,9 @@
*/
public class DigilibRequest extends ParameterMap {
- private static final long serialVersionUID = -4707707539569977901L;
-
- //private Logger logger = Logger.getLogger(this.getClass());
+ protected DocuImage image; // internal DocuImage instance for this request
- private boolean boolRDF = false; // use RDF Parameters
-
- private DocuImage image; // internal DocuImage instance for this request
-
- private ServletRequest servletRequest; // internal ServletRequest
+ protected ServletRequest servletRequest; // internal ServletRequest
/** Creates a new instance of DigilibRequest and sets default values. */
public DigilibRequest() {
@@ -100,7 +94,7 @@
// scale factor
newParameter("ws", new Float(1), null, 's');
// special options like 'fit' for gifs
- newParameter("mo", "", null, 's');
+ newParameter("mo", this.options, null, 's');
// rotation angle (degree)
newParameter("rot", new Float(0), null, 's');
// contrast enhancement factor
@@ -328,7 +322,7 @@
public String getAsString(int type) {
StringBuffer s = new StringBuffer(50);
// go through all values
- for (Parameter p: this.values()) {
+ for (Parameter p: params.values()) {
if ((type > 0) && (p.getType() != type)) {
// skip the wrong types
continue;
@@ -391,7 +385,7 @@
for (Enumeration i = request.getParameterNames(); i.hasMoreElements();) {
String name = (String) i.nextElement();
// is this a known parameter?
- if (this.containsKey(name)) {
+ if (params.containsKey(name)) {
Parameter p = (Parameter) this.get(name);
// internal parameters are not set
if (p.getType() == 'i') {
@@ -426,7 +420,7 @@
String name = URLDecoder.decode(nv[0], "UTF-8");
String val = URLDecoder.decode(nv[1], "UTF-8");
// is this a known parameter?
- if (this.containsKey(name)) {
+ if (params.containsKey(name)) {
Parameter p = (Parameter) this.get(name);
// internal parameters are not set
if (p.getType() == 'i') {
@@ -447,6 +441,7 @@
/**
* Test if option string opt
is set. Checks if the substring
* opt
is contained in the options string param
.
+ * Deprecated! use hasOption(String opt) for "mo"-options.
*
* @param opt
* Option string to be tested.
@@ -523,10 +518,6 @@
setValue("docu.image", image);
}
- public boolean isRDF() {
- return boolRDF;
- }
-
/**
* @return
*/
diff -r e7c29b587829 -r e1094c5ec032 servlet/src/digilib/servlet/DocumentBean.java
--- a/servlet/src/digilib/servlet/DocumentBean.java Fri Oct 22 19:04:49 2010 +0200
+++ b/servlet/src/digilib/servlet/DocumentBean.java Fri Dec 10 09:35:09 2010 +0100
@@ -211,7 +211,7 @@
// get original pixel size
ImageFile origfile = fileset.getBiggest();
// check image for size if mo=hires
- if ((! origfile.isChecked())&&dlRequest.hasOption("mo", "hires")) {
+ if ((! origfile.isChecked())&&dlRequest.hasOption("hires")) {
logger.debug("pre-checking image!");
ImageOps.checkFile(origfile);
}
diff -r e7c29b587829 -r e1094c5ec032 servlet/src/digilib/servlet/ImageJobDescription.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/servlet/src/digilib/servlet/ImageJobDescription.java Fri Dec 10 09:35:09 2010 +0100
@@ -0,0 +1,483 @@
+package digilib.servlet;
+
+import java.awt.geom.AffineTransform;
+import java.awt.geom.Rectangle2D;
+import java.io.IOException;
+
+import org.apache.log4j.Logger;
+
+import digilib.image.ImageOpException;
+import digilib.image.ImageOps;
+import digilib.image.ImageSize;
+import digilib.io.DocuDirCache;
+import digilib.io.DocuDirectory;
+import digilib.io.FileOpException;
+import digilib.io.FileOps;
+import digilib.io.ImageFile;
+import digilib.io.ImageFileset;
+
+
+/**
+ * A container class for storing a set of instructional parameters
+ * used for content generating classes like MakePDF.
+ *
+ * This contains the functionality formerly found in Scaler, processRequest, only factorized.
+ *
+ * TODO clean up...
+ *
+ * @author cmielack, casties
+ *
+ */
+
+public class ImageJobDescription extends ParameterMap {
+
+ String[] parameter_list = {"fn","pn","dw","dh",
+ "wx", "wy", "ww", "wh", "ws",
+ "mo", "rot", "cont", "brgt", "rgbm", "rbgm",
+ "ddpi", "ddpix", "ddpiy", "scale"};
+ DigilibConfiguration dlConfig = null;
+ protected static Logger logger = Logger.getLogger("digilib.servlet");
+
+ ImageFile fileToLoad = null;
+ ImageFileset fileset = null;
+ DocuDirectory fileDir = null;
+ String filePath = null;
+ ImageSize expectedSourceSize = null;
+ Float scaleXY = null;
+ Rectangle2D userImgArea = null;
+ Rectangle2D outerUserImgArea= null;
+ Boolean imageSendable = null;
+ String mimeType;
+ Integer paramDW;
+ Integer paramDH;
+
+ /** create empty ImageJobDescription.
+ * @param dlcfg
+ */
+ public ImageJobDescription(DigilibConfiguration dlcfg) {
+ super(30);
+ dlConfig = dlcfg;
+ // url of the page/document (second part)
+ newParameter("fn", "", null, 's');
+ // page number
+ newParameter("pn", new Integer(1), null, 's');
+ // width of client in pixels
+ newParameter("dw", new Integer(0), null, 's');
+ // height of client in pixels
+ newParameter("dh", new Integer(0), null, 's');
+ // left edge of image (float from 0 to 1)
+ newParameter("wx", new Float(0), null, 's');
+ // top edge in image (float from 0 to 1)
+ newParameter("wy", new Float(0), null, 's');
+ // width of image (float from 0 to 1)
+ newParameter("ww", new Float(1), null, 's');
+ // height of image (float from 0 to 1)
+ newParameter("wh", new Float(1), null, 's');
+ // scale factor
+ newParameter("ws", new Float(1), null, 's');
+ // special options like 'fit' for gifs
+ newParameter("mo", this.options, null, 's');
+ // rotation angle (degree)
+ newParameter("rot", new Float(0), null, 's');
+ // contrast enhancement factor
+ newParameter("cont", new Float(0), null, 's');
+ // brightness enhancement factor
+ newParameter("brgt", new Float(0), null, 's');
+ // color multiplicative factors
+ newParameter("rgbm", "0/0/0", null, 's');
+ // color additive factors
+ newParameter("rgba", "0/0/0", null, 's');
+ // display dpi resolution (total)
+ newParameter("ddpi", new Float(0), null, 's');
+ // display dpi X resolution
+ newParameter("ddpix", new Float(0), null, 's');
+ // display dpi Y resolution
+ newParameter("ddpiy", new Float(0), null, 's');
+ // scale factor for mo=ascale
+ newParameter("scale", new Float(1), null, 's');
+ }
+
+
+ /** Constructor using another ParameterMap.
+ * Clones internal Maps only!
+ * @param otherMap
+ * @param dlcfg
+ */
+ public ImageJobDescription(ParameterMap otherMap, DigilibConfiguration dlcfg) {
+ super(otherMap);
+ dlConfig = dlcfg;
+ }
+
+
+ public String getMimeType() throws IOException {
+ if (mimeType == null) {
+ fileToLoad = getFileToLoad();
+ if(! fileToLoad.isChecked()){
+ ImageOps.checkFile(fileToLoad);
+ }
+ mimeType = fileToLoad.getMimetype();
+ }
+ return mimeType;
+ }
+
+ public ImageFile getFileToLoad() throws IOException {
+
+ if(fileToLoad == null){
+ fileset = getFileset();
+
+ /* select a resolution */
+ if (getHiresOnly()) {
+ // get first element (= highest resolution)
+ fileToLoad = fileset.getBiggest();
+ } else if (getLoresOnly()) {
+ // enforced lores uses next smaller resolution
+ fileToLoad = fileset.getNextSmaller(getExpectedSourceSize());
+ if (fileToLoad == null) {
+ // this is the smallest we have
+ fileToLoad = fileset.getSmallest();
+ }
+ } else {
+ // autores: use next higher resolution
+ fileToLoad = fileset.getNextBigger(getExpectedSourceSize());
+ if (fileToLoad == null) {
+ // this is the highest we have
+ fileToLoad = fileset.getBiggest();
+ }
+ }
+ logger.info("Planning to load: " + fileToLoad.getFile());
+ }
+
+ return fileToLoad;
+
+ }
+
+ public DocuDirectory getFileDirectory() throws FileOpException{
+ if(fileDir==null){
+ DocuDirCache dirCache = (DocuDirCache) dlConfig.getValue("servlet.dir.cache");
+
+ fileDir = dirCache.getDirectory(getFilePath());
+ if (fileDir == null) {
+ throw new FileOpException("Directory " + getFilePath() + " not found.");
+ }
+ }
+ return fileDir;
+ }
+
+ public ImageFileset getFileset() throws FileOpException{
+ if(fileset==null){
+ DocuDirCache dirCache = (DocuDirCache) dlConfig.getValue("servlet.dir.cache");
+
+ fileset = (ImageFileset) dirCache.getFile(getFilePath(), getAsInt("pn"), FileOps.CLASS_IMAGE);
+ if (fileset == null) {
+ throw new FileOpException("File " + getFilePath() + "("
+ + getAsInt("pn") + ") not found.");
+ }
+ }
+ return fileset;
+ }
+
+ public String getFilePath() {
+ if(filePath == null){
+ String s = this.getAsString("request.path");
+ s += this.getAsString("fn");
+ filePath = FileOps.normalName(s);
+ }
+ return filePath;
+ }
+
+ public boolean getHiresOnly(){
+ return hasOption("clip") || hasOption("hires");
+ }
+
+ public boolean getLoresOnly(){
+ return hasOption("lores");
+ }
+
+ public boolean getScaleToFit() {
+ return !(hasOption("clip") || hasOption("osize") || hasOption("ascale"));
+ }
+
+ public boolean getAbsoluteScale(){
+ return hasOption("osize") || hasOption("ascale");
+ }
+
+
+ public ImageSize getExpectedSourceSize() throws IOException {
+ if (expectedSourceSize == null){
+ expectedSourceSize = new ImageSize();
+ if (getScaleToFit()) {
+ // scale to fit -- calculate minimum source size
+ float scale = (1 / Math.min(getAsFloat("ww"), getAsFloat("wh"))) * getAsFloat("ws");
+ expectedSourceSize.setSize((int) (getDw() * scale),
+ (int) (getDh() * scale));
+ } else if (getAbsoluteScale() && hasOption("ascale")) {
+ // absolute scale -- apply scale to hires size
+ expectedSourceSize = getHiresSize().getScaled(getAsFloat("scale"));
+ } else {
+ // clip to fit -- source = destination size
+ expectedSourceSize.setSize((int) (getDw() * getAsFloat("ws")),
+ (int) (getDh() * getAsFloat("ws")));
+ }
+ }
+ return expectedSourceSize;
+ }
+
+ public ImageSize getHiresSize() throws IOException {
+ logger.debug("get_hiresSize()");
+
+ ImageSize hiresSize = null;
+ ImageFileset fileset = getFileset();
+ if (getAbsoluteScale()) {
+ ImageFile hiresFile = fileset.getBiggest();
+ if (!hiresFile.isChecked()) {
+ ImageOps.checkFile(hiresFile);
+ }
+ hiresSize = hiresFile.getSize();
+ }
+ return hiresSize;
+
+ }
+
+ /** Returns image scaling factor.
+ * Uses image size and user parameters.
+ * Modifies scaleXY, userImgArea.
+ * @return
+ * @throws IOException
+ * @throws ImageOpException
+ */
+ public float getScaleXY() throws IOException, ImageOpException {
+ //logger.debug("get_scaleXY()");
+ if(scaleXY == null){
+ // coordinates and scaling
+ float areaWidth;
+ float areaHeight;
+ float ws = getAsFloat("ws");
+ ImageSize imgSize = getFileToLoad().getSize();
+ // user window area in [0,1] coordinates
+ Rectangle2D relUserArea = new Rectangle2D.Float(getAsFloat("wx"), getAsFloat("wy"),
+ getAsFloat("ww"), getAsFloat("wh"));
+ // transform from relative [0,1] to image coordinates.
+ AffineTransform imgTrafo = AffineTransform.getScaleInstance(imgSize
+ .getWidth(), imgSize.getHeight());
+ // transform user coordinate area to image coordinate area
+ userImgArea = imgTrafo.createTransformedShape(
+ relUserArea).getBounds2D();
+
+ if (getScaleToFit()) {
+ // calculate scaling factors based on inner user area
+ areaWidth = (float) userImgArea.getWidth();
+ areaHeight = (float) userImgArea.getHeight();
+ float scaleX = getDw() / areaWidth * ws;
+ float scaleY = getDh() / areaHeight * ws;
+ scaleXY = (scaleX > scaleY) ? scaleY : scaleX;
+ } else if (getAbsoluteScale()) {
+ // absolute scaling factor
+ if (hasOption("osize")) {
+ // get original resolution from metadata
+ fileset.checkMeta();
+ float origResX = fileset.getResX();
+ float origResY = fileset.getResY();
+ if ((origResX == 0) || (origResY == 0)) {
+ throw new ImageOpException("Missing image DPI information!");
+ }
+ if ((getAsFloat("ddpix") == 0) || (getAsFloat("ddpiy") == 0)) {
+ throw new ImageOpException("Missing display DPI information!");
+ }
+ // calculate absolute scale factor
+ float sx = getAsFloat("ddpix") / origResX;
+ float sy = getAsFloat("ddpiy") / origResY;
+ // currently only same scale -- mean value
+ scaleXY = (sx + sy) / 2f;
+ } else {
+ scaleXY = getAsFloat("scale");
+ }
+ // we need to correct the factor if we use a pre-scaled image
+ ImageSize hiresSize = getHiresSize();
+ if (imgSize.getWidth() != hiresSize.getWidth()) {
+ scaleXY *= (float)hiresSize.getWidth() / (float)imgSize.getWidth();
+ }
+ areaWidth = getDw() / scaleXY * ws;
+ areaHeight = getDh() / scaleXY * ws;
+ // reset user area size
+ userImgArea.setRect(userImgArea.getX(), userImgArea.getY(),
+ areaWidth, areaHeight);
+ } else {
+ // crop to fit -- don't scale
+ areaWidth = getDw() * ws;
+ areaHeight = getDh() * ws;
+ // reset user area size
+ userImgArea.setRect(userImgArea.getX(), userImgArea.getY(),
+ areaWidth, areaHeight);
+ scaleXY = 1f;
+ }
+ }
+ return (float) scaleXY;
+ }
+
+ public int getDw() throws IOException {
+ logger.debug("get_paramDW()");
+ if (paramDW == null) {
+
+ paramDW = getAsInt("dw");
+ paramDH = getAsInt("dh");
+
+ float imgAspect = getFileToLoad().getAspect();
+ if (paramDW == 0) {
+ // calculate dw
+ paramDW = Math.round(paramDH * imgAspect);
+ setValue("dw", paramDW);
+ } else if (paramDH == 0) {
+ // calculate dh
+ paramDH = Math.round(paramDW / imgAspect);
+ setValue("dh", paramDH);
+ }
+ }
+ return paramDW;
+ }
+
+ public int getDh() throws IOException {
+ logger.debug("get_paramDH()");
+ if (paramDH == null) {
+
+ paramDW = getAsInt("dw");
+ paramDH = getAsInt("dh");
+
+ float imgAspect = getFileToLoad().getAspect();
+ if (paramDW == 0) {
+ // calculate dw
+ paramDW = Math.round(paramDH * imgAspect);
+ setValue("dw", paramDW);
+ } else if (paramDH == 0) {
+ // calculate dh
+ paramDH = Math.round(paramDW / imgAspect);
+ setValue("dh", paramDH);
+ }
+ }
+ return paramDH;
+ }
+
+ public Integer get_scaleQual(){
+ logger.debug("get_scaleQual()");
+ Integer qual = dlConfig.getAsInt("default-quality");
+ if(hasOption("q0"))
+ qual = 0;
+ else if(hasOption("q1"))
+ qual = 1;
+ else if(hasOption("q2"))
+ qual = 2;
+ return qual;
+ }
+
+
+ public Rectangle2D getUserImgArea() throws IOException, ImageOpException{
+ if(userImgArea == null) {
+ // getScaleXY sets userImgArea
+ getScaleXY();
+ }
+ return userImgArea;
+
+ }
+
+ public Rectangle2D getOuterUserImgArea() throws IOException, ImageOpException {
+ if(outerUserImgArea == null){
+ outerUserImgArea = getUserImgArea();
+
+ // image size in pixels
+ ImageSize imgSize = getFileToLoad().getSize();
+ Rectangle2D imgBounds = new Rectangle2D.Float(0, 0, imgSize.getWidth(),
+ imgSize.getHeight());
+
+ // clip area at the image border
+ outerUserImgArea = outerUserImgArea.createIntersection(imgBounds);
+
+ // check image parameters sanity
+ scaleXY = getScaleXY();
+ logger.debug("outerUserImgArea.getWidth()=" + outerUserImgArea.getWidth());
+ logger.debug("get_scaleXY() * outerUserImgArea.getWidth() = " + (scaleXY * outerUserImgArea.getWidth()));
+
+ if ((outerUserImgArea.getWidth() < 1)
+ || (outerUserImgArea.getHeight() < 1)
+ || (scaleXY * outerUserImgArea.getWidth() < 2)
+ || (scaleXY * outerUserImgArea.getHeight() < 2)) {
+ logger.error("ERROR: invalid scale parameter set!");
+ throw new ImageOpException("Invalid scale parameter set!");
+ }
+ }
+ return outerUserImgArea;
+ }
+
+
+ public int getForceType(){
+ if(hasOption("jpg"))
+ return ImageOps.TYPE_JPEG;
+ if(hasOption("png"))
+ return ImageOps.TYPE_PNG;
+
+ return ImageOps.TYPE_AUTO;
+ }
+
+ public float[] getRGBM(){
+ float[] paramRGBM = null;//{0f,0f,0f};
+ Parameter p = params.get("rgbm");
+ if (p.hasValue() && (!p.getAsString().equals("0/0/0"))) {
+ return p.parseAsFloatArray("/");
+ }
+ return paramRGBM;
+ }
+
+ public float[] getRGBA(){
+ float[] paramRGBA = null;//{0f,0f,0f};
+ Parameter p = params.get("rgba");
+ if (p.hasValue() && (!p.getAsString().equals("0/0/0"))) {
+ paramRGBA = p.parseAsFloatArray("/");
+ }
+ return paramRGBA;
+ }
+
+ /** Has send-as-file been requested?
+ * @return
+ */
+ public boolean getSendAsFile(){
+ return hasOption("file")
+ || hasOption("rawfile");
+ }
+
+ /** Could the image be sent without processing?
+ * Takes image type and additional image operations into account.
+ * Does not check requested size transformation.
+ * @return
+ * @throws IOException
+ */
+ public boolean isImageSendable() throws IOException {
+ // cached result?
+ if (imageSendable == null) {
+ String mimeType = getMimeType();
+ imageSendable = ( (mimeType.equals("image/jpeg")
+ || mimeType.equals("image/png")
+ || mimeType.equals("image/gif") )
+ &&
+ !(hasOption("hmir")
+ || hasOption("vmir")
+ || (getAsFloat("rot") != 0.0)
+ || (getRGBM() != null)
+ || (getRGBA() != null)
+ || (getAsFloat("cont") != 0.0)
+ || (getAsFloat("brgt") != 0.0)));
+ }
+
+ return imageSendable;
+ }
+
+
+ public boolean isTransformRequired() throws IOException {
+ ImageSize is = getFileToLoad().getSize();
+ ImageSize ess = getExpectedSourceSize();
+ // nt = no transform required
+ boolean nt = isImageSendable() && (
+ // lores: send if smaller
+ (getLoresOnly() && is.isSmallerThan(ess))
+ // else send if it fits
+ || (!(getLoresOnly() || getHiresOnly()) && is.fitsIn(ess)));
+ return ! nt;
+ }
+}
\ No newline at end of file
diff -r e7c29b587829 -r e1094c5ec032 servlet/src/digilib/servlet/ImageJobInformation.java
--- a/servlet/src/digilib/servlet/ImageJobInformation.java Fri Oct 22 19:04:49 2010 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,690 +0,0 @@
-package digilib.servlet;
-
-import java.awt.geom.AffineTransform;
-import java.awt.geom.NoninvertibleTransformException;
-import java.awt.geom.Rectangle2D;
-import java.io.IOException;
-import java.util.StringTokenizer;
-
-import javax.servlet.http.HttpServletRequest;
-
-import org.apache.log4j.Logger;
-
-import digilib.image.ImageOpException;
-import digilib.image.ImageOps;
-import digilib.image.ImageSize;
-import digilib.io.DocuDirCache;
-import digilib.io.DocuDirectory;
-import digilib.io.FileOpException;
-import digilib.io.FileOps;
-import digilib.io.ImageFile;
-import digilib.io.ImageFileset;
-
-
-/**
- * A container class for storing a set of instructional parameters
- * used for content generating classes like MakePDF.
- *
- * This contains the functionality formerly found in Scaler, processRequest, only factorized.
- *
- * TODO clean up...
- *
- * @author cmielack
- *
- */
-
-public class ImageJobInformation extends ParameterMap {
-
- String[] parameter_list = {"fn","pn","dw","dh",
- "wx", "wy", "ww", "wh", "ws",
- "mo", "rot", "cont", "brgt", "rgbm", "rbgm",
- "ddpi", "ddpix", "ddpiy", "scale"};
- DigilibConfiguration dlConfig = null;
- protected static Logger logger = Logger.getLogger("digilib.servlet");
-
- ImageFile fileToLoad = null;
- ImageFileset fileset=null;
- DocuDirectory fileDir = null;
- String filePath = null;
- ImageSize expectedSourceSize = null;
- Float scaleXY = null;
- Rectangle2D userImgArea = null;
- Rectangle2D outerUserImgArea= null;
- Boolean imageSendable = null;
-// Integer paramDW = null;
-// Integer paramDH
- public ImageJobInformation(DigilibConfiguration dlcfg) {
- super(30);
-
- // url of the page/document (second part)
- newParameter("fn", "", null, 's');
- // page number
- newParameter("pn", new Integer(1), null, 's');
- // width of client in pixels
- newParameter("dw", new Integer(0), null, 's');
- // height of client in pixels
- newParameter("dh", new Integer(0), null, 's');
- // left edge of image (float from 0 to 1)
- newParameter("wx", new Float(0), null, 's');
- // top edge in image (float from 0 to 1)
- newParameter("wy", new Float(0), null, 's');
- // width of image (float from 0 to 1)
- newParameter("ww", new Float(1), null, 's');
- // height of image (float from 0 to 1)
- newParameter("wh", new Float(1), null, 's');
- // scale factor
- newParameter("ws", new Float(1), null, 's');
- // special options like 'fit' for gifs
- newParameter("mo", "", null, 's');
- // rotation angle (degree)
- newParameter("rot", new Float(0), null, 's');
- // contrast enhancement factor
- newParameter("cont", new Float(0), null, 's');
- // brightness enhancement factor
- newParameter("brgt", new Float(0), null, 's');
- // color multiplicative factors
- newParameter("rgbm", "0/0/0", null, 's');
- // color additive factors
- newParameter("rgba", "0/0/0", null, 's');
- // display dpi resolution (total)
- newParameter("ddpi", new Float(0), null, 's');
- // display dpi X resolution
- newParameter("ddpix", new Float(0), null, 's');
- // display dpi Y resolution
- newParameter("ddpiy", new Float(0), null, 's');
- // scale factor for mo=ascale
- newParameter("scale", new Float(1), null, 's');
-
- /*
- * Parameters of type 'i' are not exchanged between client and server,
- * but are for the servlets or JSPs internal use.
- */
-
- // url of the page/document (first part, may be empty)
- newParameter("request.path", "", null, 'i');
- // base URL (from http:// to below /servlet)
- newParameter("base.url", "", null, 'i');
-
- /*
- * Parameters of type 'c' are for the clients use
- */
-/*
- // "real" filename
- newParameter("img.fn", "", null, 'c');
- // image dpi x
- newParameter("img.dpix", new Integer(0), null, 'c');
- // image dpi y
- newParameter("img.dpiy", new Integer(0), null, 'c');
- // hires image size x
- newParameter("img.pix_x", new Integer(0), null, 'c');
- // hires image size y
- newParameter("img.pix_y", new Integer(0), null, 'c');
- // total number of pages
- newParameter("pt", new Integer(0), null, 'c');
- // display level of digilib (0 = just image, 1 = one HTML page
- // 2 = in frameset, 3 = XUL-'frameset'
- // 4 = XUL-Sidebar )
- newParameter("lv", new Integer(2), null, 'c');
- // marks
- newParameter("mk", "", null, 'c');
-*/
- dlConfig = dlcfg;
- }
-
-
-
- public void setWithRequest(HttpServletRequest request) {
- for (String param : parameter_list){
- if (request.getParameterMap().containsKey(param)){
- this.setValueFromString(param, request.getParameter(param));
- }
- }
- setValueFromString("request.path", ((HttpServletRequest) request).getPathInfo());
- String[] baseurl_parts = ((HttpServletRequest) request).getRequestURL().toString().split("/");
- String baseurl = "";
- for(int i=0; i scaleY) ? scaleY : scaleX;
- } else if (get_absoluteScale()) {
- scaleXY = getAsFloat("scale");
- // we need to correct the factor if we use a pre-scaled image
- if (imgSize.getWidth() != hiresSize.getWidth()) {
- scaleXY *= (float)hiresSize.getWidth() / (float)imgSize.getWidth();
- }
- //scaleX = scaleXY;
- //scaleY = scaleXY;
- areaWidth = get_paramDW() / scaleXY * getAsFloat("ws");
- areaHeight = get_paramDH() / scaleXY * getAsFloat("ws");
- // reset user area size
- userImgArea.setRect(userImgArea.getX(), userImgArea.getY(),
- areaWidth, areaHeight);
- } else {
- // crop to fit
- areaWidth = get_paramDW() * getAsFloat("ws");
- areaHeight = get_paramDH() * getAsFloat("ws");
- // reset user area size
- userImgArea.setRect(userImgArea.getX(), userImgArea.getY(),
- areaWidth, areaHeight);
- scaleX = 1f;
- scaleY = 1f;
- scaleXY = 1f;
- }
- }
-
- return (float) scaleXY;
- }
-
- public int get_paramDW(){
- logger.debug("get_paramDW()");
-
- int paramDW = getAsInt("dw");
- int paramDH = getAsInt("dh");
-
- float imgAspect;
- try {
- imgAspect = get_fileToLoad().getAspect();
- if (paramDW == 0) {
- paramDW = (int) Math.round(paramDH * imgAspect);
- setValue("dw", paramDW);
- } else if (paramDH == 0) {
- setValue("dh", (int) Math.round(paramDW / imgAspect));
- }
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (ImageOpException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- return paramDW;
- }
-
- public int get_paramDH(){
- logger.debug("get_paramDH()");
-
- int paramDW = getAsInt("dw");
- int paramDH = getAsInt("dh");
-
- float imgAspect;
- try {
- imgAspect = get_fileToLoad().getAspect();
- if (paramDW == 0) {
- setValue("dw", (int) Math.round(paramDH * imgAspect));
- } else if (paramDH == 0) {
- paramDH = (int) Math.round(paramDW / imgAspect);
- setValue("dh", paramDH );
- }
-
-
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (ImageOpException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- return paramDH;
- }
- public Integer get_scaleQual(){
- logger.debug("get_scaleQual()");
-
- Integer qual = dlConfig.getAsInt("default-quality");
- if(hasOption("mo","q0"))
- qual = 0;
- else if(hasOption("mo","q1"))
- qual = 1;
- else if(hasOption("mo","q2"))
- qual = 2;
- return qual;
- }
-
-
- public ImageSize get_imgSize() throws IOException, ImageOpException{
-
- ImageSize imgSize = get_fileToLoad().getSize();
- return imgSize;
- }
-
- public Rectangle2D get_userImgArea() throws IOException, ImageOpException{
- //logger.debug("get_userImgArea()");
-
- if(userImgArea==null){
- // transform from relative [0,1] to image coordinates.
- AffineTransform imgTrafo = AffineTransform.getScaleInstance(get_imgSize()
- .getWidth(), get_imgSize().getHeight());
-
- // user window area in [0,1] coordinates
- Rectangle2D relUserArea = new Rectangle2D.Float(getAsFloat("wx"), getAsFloat("wy"),
- getAsFloat("ww"), getAsFloat("wh"));
-
- // transform user coordinate area to image coordinate area
- userImgArea = imgTrafo.createTransformedShape(
- relUserArea).getBounds2D();
-
- if(get_absoluteScale()){
- float areaWidth = getAsInt("dw") / get_scaleXY() * getAsFloat("ws");
- float areaHeight = getAsInt("dh") / get_scaleXY() * getAsFloat("ws");
- // reset user area size
- userImgArea.setRect(userImgArea.getX(), userImgArea.getY(),
- areaWidth, areaHeight);
- } else if (!get_scaleToFit()){
- // crop to fit
- float areaWidth = getAsInt("dw") * getAsFloat("ws");
- float areaHeight = getAsInt("dh") * getAsFloat("ws");
- // reset user area size
- userImgArea.setRect(userImgArea.getX(), userImgArea.getY(),
- areaWidth, areaHeight);
- }
- }
- return userImgArea;
-
- }
-
- public Rectangle2D get_outerUserImgArea() throws IOException, ImageOpException{
- //logger.debug("get_outerUserImgArea()");
-
- if(outerUserImgArea == null){
- Rectangle2D userImgArea = get_userImgArea();
-
- // image size in pixels
- Rectangle2D imgBounds = new Rectangle2D.Float(0, 0, get_imgSize()
- .getWidth(), get_imgSize().getHeight());
-
-
-
-
- outerUserImgArea = userImgArea;
- Rectangle2D innerUserImgArea = userImgArea;
- if (get_wholeRotArea()) {
- if (getAsFloat("rot") != 0) {
- try {
- // rotate user area coordinates around center of user
- // area
- AffineTransform rotTrafo = AffineTransform
- .getRotateInstance(Math.toRadians(getAsFloat("rot")),
- userImgArea.getCenterX(), userImgArea
- .getCenterY());
- // get bounds from rotated end position
- innerUserImgArea = rotTrafo.createTransformedShape(
- userImgArea).getBounds2D();
- // get bounds from back-rotated bounds
- outerUserImgArea = rotTrafo.createInverse()
- .createTransformedShape(innerUserImgArea)
- .getBounds2D();
- } catch (NoninvertibleTransformException e1) {
- // this shouldn't happen anyway
- logger.error(e1);
- }
- }
- }
-
- // logger.debug("Scale " + scaleXY + "(" + scaleX + "," + scaleY
- //+ ") on " + outerUserImgArea);
-
- // clip area at the image border
- outerUserImgArea = outerUserImgArea.createIntersection(imgBounds);
-
- // check image parameters sanity
- logger.debug("outerUserImgArea.getWidth()=" + outerUserImgArea.getWidth());
- logger.debug("get_scaleXY() * outerUserImgArea.getWidth() = " + (get_scaleXY() * outerUserImgArea.getWidth()));
-
- if ((outerUserImgArea.getWidth() < 1)
- || (outerUserImgArea.getHeight() < 1)
- || (get_scaleXY() * outerUserImgArea.getWidth() < 2)
- || (get_scaleXY() * outerUserImgArea.getHeight() < 2)) {
- logger.error("ERROR: invalid scale parameter set!");
- throw new ImageOpException("Invalid scale parameter set!");
- }
- }
- return outerUserImgArea;
- }
-
-
- public Rectangle2D get_innerUserImgArea() throws IOException, ImageOpException{
- logger.debug("get_innerUserImgArea()");
-
- Rectangle2D userImgArea = get_userImgArea();
- Rectangle2D innerUserImgArea = get_userImgArea();
- if (get_wholeRotArea()) {
- if (getAsFloat("rot") != 0) {
- // rotate user area coordinates around center of user
- // area
- AffineTransform rotTrafo = AffineTransform
- .getRotateInstance(Math.toRadians(getAsFloat("rot")),
- userImgArea.getCenterX(), userImgArea
- .getCenterY());
- // get bounds from rotated end position
- innerUserImgArea = rotTrafo.createTransformedShape(
- userImgArea).getBounds2D();
- }
- }
- return innerUserImgArea;
-
- }
- public boolean get_wholeRotArea(){
- // TODO this is not really implemented yet
- //boolean wholeRotArea = false;
- return false;//wholeRotArea;
- }
-
- public int get_forceType(){
-
- if(hasOption("mo","jpg"))
- return ImageOps.TYPE_JPEG;
- if(hasOption("mo","png"))
- return ImageOps.TYPE_PNG;
-
- return ImageOps.TYPE_AUTO;
- }
-
- public float[] get_paramRGBM(){
- logger.debug("get_paramRGBM()");
-
- float[] paramRGBM = null;//{0f,0f,0f};
- Parameter p = get("rgbm");
- if (p.hasValue() && (!p.getAsString().equals("0/0/0"))) {
- return p.parseAsFloatArray("/");
- }
- return paramRGBM;
- }
-
- public float[] get_paramRGBA(){
- logger.debug("get_paramRGBA()");
-
- float[] paramRGBA = null;//{0f,0f,0f};
- Parameter p = get("rgba");
- if (p.hasValue() && (!p.getAsString().equals("0/0/0"))) {
- paramRGBA = p.parseAsFloatArray("/");
- }
- return paramRGBA;
- }
-
- public boolean get_hmir(){
- logger.debug("get_hmir()");
-
- return hasOption("mo","hmir");
- }
-
- public boolean get_vmir(){
- logger.debug("get_vmir()");
-
- return hasOption("mo","vmir");
- }
-
- public float getRot(){
- return getAsFloat("rot");
- }
-
- public float getCont(){
- return getAsFloat("cont");
- }
-
- public float getBrgt(){
- return getAsFloat("brgt");
- }
-
- public boolean checkSendAsFile(){
- return hasOption("mo", "file")
- || hasOption("mo", "rawfile");
- }
-
- public boolean get_imageSendable(){
- if(imageSendable==null){
- String mimeType = get_mimeType();
- imageSendable = ( (mimeType.equals("image/jpeg")
- || mimeType.equals("image/png")
- || mimeType.equals("image/gif") )
- &&
- !(hasOption("mo", "hmir")
- || hasOption("mo", "vmir")
- || (getAsFloat("rot") != 0)
- || (get_paramRGBM() != null)
- || (get_paramRGBA() != null)
- || (getAsFloat("cont") != 0)
- || (getAsFloat("brgt") != 0)));
- }
-
- return imageSendable;
- }
-
-
- public boolean noTransformRequired(){
- try {
- return get_imageSendable() && ((get_loresOnly() && get_fileToLoad().getSize().isSmallerThan(
- get_expectedSourceSize())) || (!(get_loresOnly() || get_hiresOnly()) && get_fileToLoad()
- .getSize().fitsIn(expectedSourceSize)));
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (ImageOpException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- return false;
- }
-}
\ No newline at end of file
diff -r e7c29b587829 -r e1094c5ec032 servlet/src/digilib/servlet/ImageWorker.java
--- a/servlet/src/digilib/servlet/ImageWorker.java Fri Oct 22 19:04:49 2010 +0200
+++ b/servlet/src/digilib/servlet/ImageWorker.java Fri Dec 10 09:35:09 2010 +0100
@@ -23,9 +23,9 @@
protected static Logger logger = Logger.getLogger(ImageWorker.class);
private DigilibConfiguration dlConfig;
- private ImageJobInformation jobinfo;
+ private ImageJobDescription jobinfo;
- public ImageWorker(DigilibConfiguration dlConfig, ImageJobInformation jobinfo) {
+ public ImageWorker(DigilibConfiguration dlConfig, ImageJobDescription jobinfo) {
super();
this.dlConfig = dlConfig;
this.jobinfo = jobinfo;
@@ -51,8 +51,8 @@
// set interpolation quality
docuImage.setQuality(jobinfo.get_scaleQual());
- Rectangle loadRect = jobinfo.get_outerUserImgArea().getBounds();
- float scaleXY = jobinfo.get_scaleXY();
+ Rectangle loadRect = jobinfo.getOuterUserImgArea().getBounds();
+ float scaleXY = jobinfo.getScaleXY();
// use subimage loading if possible
if (docuImage.isSubimageSupported()) {
@@ -72,7 +72,7 @@
+ scaleXY);
}
- docuImage.loadSubimage(jobinfo.get_fileToLoad(), loadRect, (int) subsamp);
+ docuImage.loadSubimage(jobinfo.getFileToLoad(), loadRect, (int) subsamp);
logger.debug("SUBSAMP: " + subsamp + " -> " + docuImage.getWidth()
+ "x" + docuImage.getHeight());
@@ -81,7 +81,7 @@
} else {
// else load and crop the whole file
- docuImage.loadImage(jobinfo.get_fileToLoad());
+ docuImage.loadImage(jobinfo.getFileToLoad());
docuImage.crop((int) loadRect.getX(), (int) loadRect.getY(),
(int) loadRect.getWidth(), (int) loadRect.getHeight());
@@ -91,17 +91,17 @@
// mirror image
// operation mode: "hmir": mirror horizontally, "vmir": mirror
// vertically
- if (jobinfo.get_hmir()) {
+ if (jobinfo.hasOption("hmir")) {
docuImage.mirror(0);
}
- if (jobinfo.get_vmir()) {
+ if (jobinfo.hasOption("vmir")) {
docuImage.mirror(90);
}
// rotate image
- if (jobinfo.getRot() != 0d) {
- docuImage.rotate(jobinfo.getRot());
- if (jobinfo.get_wholeRotArea()) {
+ if (jobinfo.getAsFloat("rot") != 0d) {
+ docuImage.rotate(jobinfo.getAsFloat("rot"));
+ /* if (jobinfo.get_wholeRotArea()) {
// crop to the inner bounding box
float xcrop = (float) (docuImage.getWidth() - jobinfo.get_innerUserImgArea().getWidth()
* scaleXY);
@@ -116,15 +116,15 @@
(int) (docuImage.getWidth() - xcrop),
(int) (docuImage.getHeight() - ycrop));
}
- }
+ } */
}
// color modification
- float[] paramRGBM = jobinfo.get_paramRGBM();
- float[] paramRGBA = jobinfo.get_paramRGBA();
+ float[] paramRGBM = jobinfo.getRGBM();
+ float[] paramRGBA = jobinfo.getRGBA();
if ((paramRGBM != null) || (paramRGBA != null)) {
- // make shure we actually have two arrays
+ // make sure we actually have two arrays
if (paramRGBM == null) {
paramRGBM = new float[3];
}
@@ -140,8 +140,8 @@
}
// contrast and brightness enhancement
- float paramCONT = jobinfo.getCont();
- float paramBRGT = jobinfo.getBrgt();
+ float paramCONT = jobinfo.getAsFloat("cont");
+ float paramBRGT = jobinfo.getAsFloat("brgt");
if ((paramCONT != 0f) || (paramBRGT != 0f)) {
float mult = (float) Math.pow(2, paramCONT);
docuImage.enhance(mult, paramBRGT);
diff -r e7c29b587829 -r e1094c5ec032 servlet/src/digilib/servlet/OptionsSet.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/servlet/src/digilib/servlet/OptionsSet.java Fri Dec 10 09:35:09 2010 +0100
@@ -0,0 +1,67 @@
+/**
+ *
+ */
+package digilib.servlet;
+
+import java.util.HashSet;
+import java.util.StringTokenizer;
+
+/**
+ * @author casties
+ *
+ */
+@SuppressWarnings("serial")
+public class OptionsSet extends HashSet {
+
+ protected String optionSep = ",";
+
+ public OptionsSet() {
+ super();
+ }
+
+ /** Constructor with String of options.
+ * @param s
+ */
+ public OptionsSet(String s) {
+ super();
+ parseString(s);
+ }
+
+ /** Adds all options from String to Set.
+ * @param s
+ */
+ public void parseString(String s) {
+ if (s != null) {
+ StringTokenizer i = new StringTokenizer(s, optionSep);
+ while (i.hasMoreTokens()) {
+ String opt = i.nextToken();
+ this.add(opt);
+ }
+ }
+ }
+
+ public boolean hasOption(String opt) {
+ return this.contains(opt);
+ }
+
+ public String toString() {
+ StringBuffer b = new StringBuffer();
+ for (String s: this) {
+ if (b.length() > 0) {
+ b.append(optionSep);
+ }
+ b.append(s);
+ }
+ return b.toString();
+ }
+
+
+ public String getOptionSep() {
+ return optionSep;
+ }
+
+ public void setOptionSep(String optionSep) {
+ this.optionSep = optionSep;
+ }
+
+}
diff -r e7c29b587829 -r e1094c5ec032 servlet/src/digilib/servlet/PDFFileWorker.java
--- a/servlet/src/digilib/servlet/PDFFileWorker.java Fri Oct 22 19:04:49 2010 +0200
+++ b/servlet/src/digilib/servlet/PDFFileWorker.java Fri Dec 10 09:35:09 2010 +0100
@@ -1,7 +1,17 @@
package digilib.servlet;
+import java.io.OutputStream;
import java.util.concurrent.Callable;
-public class PDFFileWorker extends PDFStreamWorker implements Callable {
+import digilib.image.DocuImage;
+
+public class PDFFileWorker extends PDFStreamWorker implements Callable {
+
+ public PDFFileWorker(DigilibConfiguration dlConfig,
+ OutputStream outputfile, PDFJobInformation job_info,
+ DigilibJobCenter imageJobCenter) {
+ super(dlConfig, outputfile, job_info, imageJobCenter);
+ // TODO Auto-generated constructor stub
+ }
}
diff -r e7c29b587829 -r e1094c5ec032 servlet/src/digilib/servlet/PDFJobInformation.java
--- a/servlet/src/digilib/servlet/PDFJobInformation.java Fri Oct 22 19:04:49 2010 +0200
+++ b/servlet/src/digilib/servlet/PDFJobInformation.java Fri Dec 10 09:35:09 2010 +0100
@@ -27,7 +27,7 @@
// (this should be redesigned later...)
- ImageJobInformation image_info = null;
+ ImageJobDescription image_info = null;
DigilibConfiguration dlConfig = null;
NumRange pages = null;
/** gengeral logger for this class */
@@ -56,8 +56,8 @@
* @param request
*/
public void setWithRequest(HttpServletRequest request) {
- image_info = new ImageJobInformation(dlConfig);
- image_info.setWithRequest(request);
+ image_info = new ImageJobDescription(dlConfig);
+ // FIXME: image_info.setWithRequest(request);
for (String param : parameter_list){
if (request.getParameterMap().containsKey(param)){
@@ -108,8 +108,8 @@
}
- public ImageJobInformation getImageJobInformation(){
- ImageJobInformation new_image_info = (ImageJobInformation) image_info.clone();
+ public ImageJobDescription getImageJobInformation(){
+ ImageJobDescription new_image_info = new ImageJobDescription(image_info, dlConfig);
return new_image_info;
}
diff -r e7c29b587829 -r e1094c5ec032 servlet/src/digilib/servlet/PDFStreamWorker.java
--- a/servlet/src/digilib/servlet/PDFStreamWorker.java Fri Oct 22 19:04:49 2010 +0200
+++ b/servlet/src/digilib/servlet/PDFStreamWorker.java Fri Dec 10 09:35:09 2010 +0100
@@ -83,7 +83,7 @@
for (int p : pgs) {
logger.debug(" - adding Image " + p + " to " + outstream);
// create ImageJobInformation
- ImageJobInformation iji = job_info.getImageJobInformation();
+ ImageJobDescription iji = job_info.getImageJobInformation();
iji.setValue("pn", p);
addImage(doc, iji);
logger.debug(" - done adding Image " + p + " to " + outstream);
@@ -135,7 +135,7 @@
* @throws IOException
* @throws DocumentException
*/
- public Document addImage(Document doc, ImageJobInformation iji)
+ public Document addImage(Document doc, ImageJobDescription iji)
throws InterruptedException, ExecutionException, IOException,
DocumentException {
// create image worker
diff -r e7c29b587829 -r e1094c5ec032 servlet/src/digilib/servlet/Parameter.java
--- a/servlet/src/digilib/servlet/Parameter.java Fri Oct 22 19:04:49 2010 +0200
+++ b/servlet/src/digilib/servlet/Parameter.java Fri Dec 10 09:35:09 2010 +0100
@@ -113,6 +113,11 @@
this.value = new File(val);
return true;
}
+ // set Options
+ if (c == OptionsSet.class) {
+ this.value = new OptionsSet(val);
+ return true;
+ }
// set Boolean if string == "true"
if (c == Boolean.class) {
this.value = new Boolean(val.compareToIgnoreCase("true") == 0);
diff -r e7c29b587829 -r e1094c5ec032 servlet/src/digilib/servlet/ParameterMap.java
--- a/servlet/src/digilib/servlet/ParameterMap.java Fri Oct 22 19:04:49 2010 +0200
+++ b/servlet/src/digilib/servlet/ParameterMap.java Fri Dec 10 09:35:09 2010 +0100
@@ -30,22 +30,36 @@
* @author casties
*
*/
-public class ParameterMap extends HashMap {
+public class ParameterMap {
- private static final long serialVersionUID = 1530820988748391313L;
-
+ protected HashMap params;
+
+ protected OptionsSet options;
+
/** Default constructor.
*
*/
public ParameterMap() {
- super();
+ params = new HashMap();
+ options = new OptionsSet();
}
- /** Construcotr with initial size.
+ /** Constructor with initial size.
* @param arg0
*/
public ParameterMap(int arg0) {
- super(arg0);
+ params = new HashMap(arg0);
+ options = new OptionsSet();
+ }
+
+ /** Shallow copy constructor.
+ * Be warned that the maps are only cloned i.e. keys and values are shared!
+ * @param pm
+ */
+ @SuppressWarnings("unchecked")
+ public ParameterMap(ParameterMap pm) {
+ params = (HashMap) pm.params.clone();
+ options = (OptionsSet) pm.options.clone();
}
/** Get the Parameter with the corresponding key.
@@ -56,7 +70,7 @@
* @return
*/
public Parameter get(String key) {
- return super.get(key);
+ return params.get(key);
}
/** Get the Parameter with the corresponding key.
@@ -67,7 +81,7 @@
* @return
*/
public Object getValue(String key) {
- Parameter p = super.get(key);
+ Parameter p = params.get(key);
return (p != null) ? p.getValue() : null;
}
@@ -79,7 +93,7 @@
* @return
*/
public String getAsString(String key) {
- Parameter p = super.get(key);
+ Parameter p = params.get(key);
return (p != null) ? p.getAsString() : null;
}
@@ -91,7 +105,7 @@
* @return
*/
public int getAsInt(String key) {
- Parameter p = super.get(key);
+ Parameter p = params.get(key);
return (p != null) ? p.getAsInt() : 0;
}
@@ -103,7 +117,7 @@
* @return
*/
public float getAsFloat(String key) {
- Parameter p = super.get(key);
+ Parameter p = params.get(key);
return (p != null) ? p.getAsFloat() : 0f;
}
@@ -115,7 +129,7 @@
* @return
*/
public boolean getAsBoolean(String key) {
- Parameter p = super.get(key);
+ Parameter p = params.get(key);
return (p != null) ? p.getAsBoolean() : false;
}
@@ -125,7 +139,7 @@
* @return
*/
public boolean hasValue(String key) {
- Parameter p = super.get(key);
+ Parameter p = params.get(key);
return (p != null) ? p.hasValue() : false;
}
@@ -138,7 +152,7 @@
* @return
*/
public Parameter put(String key, Parameter val) {
- return super.put(key, val);
+ return params.put(key, val);
}
/** Add the Parameter val to the map, using val's name.
@@ -149,7 +163,7 @@
* @return
*/
public Parameter put(Parameter val) {
- return super.put(val.getName(), val);
+ return params.put(val.getName(), val);
}
/** Add a new Parameter with name, default and value.
@@ -163,7 +177,7 @@
*/
public Parameter newParameter(String name, Object def, Object val) {
Parameter p = new Parameter(name, def, val);
- return super.put(name, p);
+ return params.put(name, p);
}
/** Add a new Parameter with name, default, value and type.
@@ -178,7 +192,7 @@
*/
public Parameter newParameter(String name, Object def, Object val, int type) {
Parameter p = new Parameter(name, def, val, type);
- return super.put(name, p);
+ return params.put(name, p);
}
/** Set the value of an existing parameter.
@@ -190,7 +204,7 @@
* @return
*/
public boolean setValue(String key, Object val) {
- Parameter p = get(key);
+ Parameter p = params.get(key);
if (p != null) {
p.setValue(val);
return true;
@@ -207,7 +221,7 @@
* @return
*/
public boolean setValue(String key, int val) {
- Parameter p = get(key);
+ Parameter p = params.get(key);
if (p != null) {
p.setValue(val);
return true;
@@ -224,7 +238,7 @@
* @return
*/
public boolean setValue(String key, float val) {
- Parameter p = get(key);
+ Parameter p = params.get(key);
if (p != null) {
p.setValue(val);
return true;
@@ -241,11 +255,19 @@
* @return
*/
public boolean setValueFromString(String key, String val) {
- Parameter p = get(key);
+ Parameter p = params.get(key);
if (p != null) {
p.setValueFromString(val);
return true;
}
return false;
}
+
+ /** Returns of the option has been set.
+ * @param opt
+ * @return
+ */
+ public boolean hasOption(String opt) {
+ return options.hasOption(opt);
+ }
}
diff -r e7c29b587829 -r e1094c5ec032 servlet/src/digilib/servlet/Scaler.java
--- a/servlet/src/digilib/servlet/Scaler.java Fri Oct 22 19:04:49 2010 +0200
+++ b/servlet/src/digilib/servlet/Scaler.java Fri Dec 10 09:35:09 2010 +0100
@@ -24,10 +24,11 @@
// TODO digilibError is not used anymore and may need to get reintegrated
+@SuppressWarnings("serial")
public class Scaler extends RequestHandler {
/** digilib servlet version (for all components) */
- public static final String dlVersion = "1.8.1a";
+ public static final String dlVersion = "1.9.0a";
/** general error code */
public static final int ERROR_UNKNOWN = 0;
@@ -45,7 +46,7 @@
DocuDirCache dirCache;
/** Image executor */
- DigilibJobCenter imageJobCenter;
+ DigilibJobCenter imageJobCenter;
/** authentication error image file */
File denyImgFile;
@@ -68,40 +69,6 @@
/** AuthOps instance */
AuthOps authOp;
- // EXPRIMENTAL
- /** try to enlarge cropping area for "oblique" angles */
- boolean wholeRotArea = false;
-
- protected long getLastModified(HttpServletRequest request) {
- accountlog.debug("GetLastModified from " + request.getRemoteAddr()
- + " for " + request.getQueryString());
- long mtime = -1;
- // create new request with defaults
- DigilibRequest dlReq = new DigilibRequest();
- // set with request parameters
- dlReq.setWithRequest(request);
- // find the requested file
- DocuDirent f = findFile(dlReq);
- if (f != null) {
- DocuDirectory dd = (DocuDirectory) f.getParent();
- mtime = dd.getDirMTime() / 1000 * 1000;
- }
- return mtime;
- }
-
- /**
- * Returns the DocuDirent corresponding to the DigilibRequest.
- *
- * @param dlRequest
- * @return
- */
- public DocuDirent findFile(DigilibRequest dlRequest) {
- // find the file(set)
- DocuDirent f = dirCache.getFile(dlRequest.getFilePath(),
- dlRequest.getAsInt("pn"), FileOps.CLASS_IMAGE);
- return f;
- }
-
/**
* Initialisation on first run.
*
@@ -136,7 +103,7 @@
dirCache = (DocuDirCache) dlConfig.getValue("servlet.dir.cache");
// Executor
- imageJobCenter = (DigilibJobCenter) dlConfig
+ imageJobCenter = (DigilibJobCenter) dlConfig
.getValue("servlet.worker.imageexecutor");
denyImgFile = ServletOps.getFile(
@@ -148,7 +115,28 @@
sendFileAllowed = dlConfig.getAsBoolean("sendfile-allowed");
}
- @Override
+ /** Returns modification time relevant to the request.
+ *
+ * @see javax.servlet.http.HttpServlet#getLastModified(javax.servlet.http.HttpServletRequest)
+ */
+ protected long getLastModified(HttpServletRequest request) {
+ accountlog.debug("GetLastModified from " + request.getRemoteAddr()
+ + " for " + request.getQueryString());
+ long mtime = -1;
+ // create new request
+ DigilibRequest dlReq = new DigilibRequest(request);
+ // find the file(set)
+ DocuDirent f = dirCache.getFile(dlReq.getFilePath(),
+ dlReq.getAsInt("pn"), FileOps.CLASS_IMAGE);
+ // find the requested file
+ if (f != null) {
+ DocuDirectory dd = (DocuDirectory) f.getParent();
+ mtime = dd.getDirMTime() / 1000 * 1000;
+ }
+ return mtime;
+ }
+
+
public void processRequest(HttpServletRequest request,
HttpServletResponse response) throws ServletException,
ImageOpException {
@@ -161,21 +149,23 @@
logger.debug("request: " + request.getQueryString());
long startTime = System.currentTimeMillis();
- // define the job information
- ImageJobInformation jobdeclaration = new ImageJobInformation(dlConfig);
- jobdeclaration.setWithRequest(request);
+ // parse request
+ DigilibRequest dlRequest = new DigilibRequest(request);
+ // extract the job information
+ ImageJobDescription jobTicket = new ImageJobDescription(dlRequest, dlConfig);
- // DigilibWorker1 job=null;
ImageWorker job = null;
try {
+ /*
+ * check if we can fast-track without scaling
+ */
+ ImageFile fileToLoad = jobTicket.getFileToLoad();
- ImageFile fileToLoad = jobdeclaration.get_fileToLoad();
-
- /* check permissions */
+ // check permissions
if (useAuthorization) {
// get a list of required roles (empty if no restrictions)
List rolesRequired = authOp.rolesForPath(
- jobdeclaration.getFilePath(), request);
+ jobTicket.getFilePath(), request);
if (rolesRequired != null) {
authlog.debug("Role required: " + rolesRequired);
authlog.debug("User: " + request.getRemoteUser());
@@ -188,20 +178,19 @@
}
// if requested, send image as a file
- if (sendFileAllowed && jobdeclaration.checkSendAsFile()) {
+ if (sendFileAllowed && jobTicket.getSendAsFile()) {
String mt = null;
- if (jobdeclaration.hasOption("mo", "rawfile")) {
+ if (jobTicket.hasOption("rawfile")) {
mt = "application/octet-stream";
}
logger.debug("Sending RAW File as is.");
+ ServletOps.sendFile(fileToLoad.getFile(), mt, response);
logger.info("Done in " + (System.currentTimeMillis() - startTime) + "ms");
- ServletOps.sendFile(fileToLoad.getFile(), mt, response);
return;
}
- // if possible, send the image without actually having to transform
- // it
- if (jobdeclaration.noTransformRequired()) {
+ // if possible, send the image without actually having to transform it
+ if (! jobTicket.isTransformRequired()) {
logger.debug("Sending File as is.");
ServletOps.sendFile(fileToLoad.getFile(), null, response);
logger.info("Done in " + (System.currentTimeMillis() - startTime) + "ms");
@@ -215,7 +204,7 @@
return;
}
// create job
- job = new ImageWorker(dlConfig, jobdeclaration);
+ job = new ImageWorker(dlConfig, jobTicket);
// submit job
Future jobResult = imageJobCenter.submit(job);
// wait for result