KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > mmbase > util > images > ImageConversionRequestProcessor


1 /*
2
3 This software is OSI Certified Open Source Software.
4 OSI Certified is a certification mark of the Open Source Initiative.
5
6 The license (Mozilla version 1.0) can be read at the MMBase site.
7 See http://www.MMBase.org/license
8
9  */

10 package org.mmbase.util.images;
11
12 import java.util.Map JavaDoc;
13 import java.util.List JavaDoc;
14
15 import org.mmbase.module.core.*;
16
17 import org.mmbase.util.Queue;
18
19 import org.mmbase.util.logging.Logger;
20 import org.mmbase.util.logging.Logging;
21
22 /**
23  * An ImageConversionRequest Processor is a daemon Thread which can handle image transformations. Normally a few of these are started.
24  * Each one contains a Queue of Image request jobs it has to do, which is constantly watched for new jobs.
25  *
26  * @author Rico Jansen
27  * @author Michiel Meeuwissen
28  * @version $Id: ImageConversionRequestProcessor.java,v 1.5 2005/11/30 15:58:04 pierre Exp $
29  * @see ImageConversionRequest
30  */

31 public class ImageConversionRequestProcessor implements Runnable JavaDoc {
32
33     private static final Logger log = Logging.getLoggerInstance(ImageConversionRequestProcessor.class);
34     private static int idCounter =0;
35     private int processorId;
36
37     private MMObjectBuilder icaches;
38     private ImageConverter convert;
39     private ImageInformer informer;
40     private Queue queue;
41     private Map JavaDoc table;
42
43     /**
44      * @javadoc
45      */

46     public ImageConversionRequestProcessor(MMObjectBuilder icaches, ImageConverter convert, ImageInformer informer, Queue queue, Map JavaDoc table) {
47         this.icaches = icaches;
48         this.convert = convert;
49         this.queue = queue;
50         this.table = table;
51         this.informer = informer;
52         processorId = idCounter++;
53         start();
54     }
55
56     /**
57      * Starts the thread for this ImageRequestProcessor.
58      */

59     protected void start() {
60         MMBaseContext.startThread(this, "ImageConvert[" + processorId +"]");
61     }
62
63
64     // javadoc inherited (from Runnable)
65
public void run() {
66         MMBase mmbase = icaches.getMMBase();
67         while (!mmbase.isShutdown()) {
68             try {
69                 log.debug("Waiting for request");
70                 ImageConversionRequest req = (ImageConversionRequest) queue.get();
71                 log.debug("Starting request");
72                 processRequest(req);
73                 log.debug("Done with request");
74             } catch (InterruptedException JavaDoc ie) {
75                 log.debug(Thread.currentThread().getName() +" was interrupted.");
76                 continue;
77             } catch (Exception JavaDoc e) {
78                 log.error(Logging.stackTrace(e));
79             }
80         }
81     }
82
83     /**
84      * Takes an ImageConversionRequest object, and performs the conversion.
85      * @param req The ImageConversionRequest wich must be executed.
86      */

87     private void processRequest(ImageConversionRequest req) throws InterruptedException JavaDoc {
88
89         byte[] picture = null;
90         byte[] inputPicture = req.getInput();
91
92         MMObjectNode node = req.getNode();
93         if (node == null) {
94             log.error("No node in request " + req);
95             return;
96         }
97         String JavaDoc ckey = node.getStringValue(Imaging.FIELD_CKEY);
98
99         try {
100             if (inputPicture == null || inputPicture.length == 0) {
101                 if (log.isDebugEnabled()) log.debug("processRequest : input is empty : " + node);
102                 // no node gets created, so node remains 'null'.
103
} else {
104                 if (log.isDebugEnabled()) {
105                     log.debug("processRequest : Converting : " + node );
106                 }
107
108                 List JavaDoc params = req.getParams();
109                 picture = convert.convertImage(inputPicture, req.getInputFormat(), params);
110                 if (picture != null) {
111                     node.setValue(Imaging.FIELD_HANDLE, picture);
112                     if (node.getBuilder().hasField("height")) {
113                         try {
114                             Dimension predicted = (Dimension) node.getFunctionValue("dimension", null);
115                             Dimension dim = Factory.getImageInformer().getDimension(picture);
116                             if (! predicted.equals(dim)) {
117                                 log.warn("Predicted dimension " + predicted + " was not equal to resulting dimension " + dim + " for icache " + node.getNumber());
118                             }
119                             node.setValue("height", dim.y);
120                             node.setValue("width", dim.x);
121                         } catch (java.io.IOException JavaDoc ioe) {
122                             log.warn(ioe);
123                         }
124                     }
125                     node.commit();
126                 } else {
127                     log.warn("processRequest(): Convert problem params : " + params);
128                 }
129                 if (log.isDebugEnabled()) log.debug("processRequest : converting done : " + node.toString());
130             }
131         } finally {
132             synchronized (table){
133                 if (log.isDebugEnabled()) {
134                     log.debug("Setting output " + node + " (" + req.count() + " times requested now)");
135                 }
136                 req.ready();
137                 if (log.isDebugEnabled()) log.debug("Removing key " + node.getStringValue(Imaging.FIELD_CKEY));
138                 table.remove(ckey);
139             }
140         }
141     }
142 }
143
Popular Tags