| 1 10 package org.mmbase.util.images; 11 12 import java.util.Map ; 13 import java.util.List ; 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 31 public class ImageConversionRequestProcessor implements Runnable { 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 table; 42 43 46 public ImageConversionRequestProcessor(MMObjectBuilder icaches, ImageConverter convert, ImageInformer informer, Queue queue, Map 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 59 protected void start() { 60 MMBaseContext.startThread(this, "ImageConvert[" + processorId +"]"); 61 } 62 63 64 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 ie) { 75 log.debug(Thread.currentThread().getName() +" was interrupted."); 76 continue; 77 } catch (Exception e) { 78 log.error(Logging.stackTrace(e)); 79 } 80 } 81 } 82 83 87 private void processRequest(ImageConversionRequest req) throws InterruptedException { 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 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 } else { 104 if (log.isDebugEnabled()) { 105 log.debug("processRequest : Converting : " + node ); 106 } 107 108 List 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 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 |