1 10 package org.mmbase.util.images; 11 12 import java.util.*; 13 import org.mmbase.util.Queue; 14 15 import org.mmbase.module.core.MMObjectNode; 16 17 import org.mmbase.util.logging.Logging; 18 import org.mmbase.util.logging.Logger; 19 20 26 27 28 public class Factory { 29 private static final Logger log = Logging.getLoggerInstance(Factory.class); 30 31 32 33 private static ImageInformer imageInformer; 34 protected static Map params = new HashMap(); 35 36 39 protected static final Class DEFAULT_IMAGECONVERTER = ImageMagickImageConverter.class; 40 protected static final Class DEFAULT_IMAGEINFORMER = DummyImageInformer.class; 41 42 protected static int maxConcurrentRequests = 2; 43 44 45 protected static final int maxRequests = 32; 46 protected static Queue imageRequestQueue = new Queue(maxRequests); 47 protected static Map imageRequestTable = new Hashtable(maxRequests); 48 protected static ImageConversionRequestProcessor ireqprocessors[]; 49 50 53 protected static String defaultImageFormat = "jpeg"; 54 55 56 public static void init(Map properties, org.mmbase.module.core.MMObjectBuilder imageCaches) { 57 params.putAll(properties); 58 59 String tmp = (String ) properties.get("MaxConcurrentRequests"); 60 if (tmp != null) { 61 try { 62 maxConcurrentRequests = Integer.parseInt(tmp); 63 } catch (NumberFormatException e) { 64 } 66 } 67 68 tmp = (String ) params.get("ImageConvert.DefaultImageFormat"); 69 if (tmp != null && ! tmp.equals("")) { 70 defaultImageFormat = tmp; 71 } 72 73 74 ImageConverter imageConverter = loadImageConverter(); 75 imageInformer = loadImageInformer(); 76 log.info("Got " + imageInformer); 77 78 imageConverter.init(params); 79 imageInformer.init(params); 80 81 82 ireqprocessors = new ImageConversionRequestProcessor[maxConcurrentRequests]; 84 log.info("Starting " + maxConcurrentRequests + " Converters for " + imageConverter); 85 for (int i = 0; i < maxConcurrentRequests; i++) { 86 ireqprocessors[i] = new ImageConversionRequestProcessor(imageCaches, imageConverter, imageInformer, imageRequestQueue, imageRequestTable); 87 } 88 } 89 90 91 public static String getDefaultImageFormat() { 92 return defaultImageFormat; 93 } 94 95 96 private static ImageConverter loadImageConverter() { 97 98 String className = DEFAULT_IMAGECONVERTER.getName(); 99 String tmp = (String ) params.get("ImageConvertClass"); 100 if (tmp != null) className = tmp; 101 102 103 if (className.equals("org.mmbase.module.builders.ConvertImageMagick")) { 105 className = "org.mmbase.util.images.ImageMagickImageConverter"; 106 } 107 if (className.equals("org.mmbase.module.builders.ConvertJAI")) { 108 className = "org.mmbase.util.images.JAIImageConverter"; 109 } 110 if (className.equals("org.mmbase.module.builders.ConvertDummy")) { 111 className = "org.mmbase.util.images.DummyImageConverter"; 112 } 113 ImageConverter ici = null; 114 115 try { 116 Class cl = Class.forName(className); 117 ici = (ImageConverter) cl.newInstance(); 118 log.service("loaded '" + className+"' for image Factory"); 119 } catch (ClassNotFoundException e) { 120 log.error("is classname in " + params.get("configfile") + " correct? ('not found class " + className + "')"); 121 log.error(Logging.stackTrace(e)); 122 } catch (InstantiationException e) { 123 log.error("something went wrong ('could not instantiate class " + className + "')"); 124 log.error(Logging.stackTrace(e)); 125 } catch (java.lang.IllegalAccessException e) { 126 log.error("something went wrong ('illegal access class " + className + "')"); 127 log.error(Logging.stackTrace(e)); 128 } catch (NoClassDefFoundError e) { 129 log.error("are all lib's available? ('missing class used by class" + className + "')"); 130 log.error(Logging.stackTrace(e)); 131 } 132 return ici; 133 } 134 135 private static ImageInformer loadImageInformer() { 136 String className = DEFAULT_IMAGEINFORMER.getName(); 137 String tmp = (String ) params.get("ImageInformerClass"); 138 if (tmp != null) className = tmp; 139 140 ImageInformer ii = null; 141 142 try { 143 Class cl = Class.forName(className); 144 ii = (ImageInformer) cl.newInstance(); 145 log.service("loaded '" + className+"' for image Factory"); 146 } catch (ClassNotFoundException e) { 147 log.error("is classname in " + params.get("configfile") + " correct? ('not found class " + className + "')"); 148 log.error(Logging.stackTrace(e)); 149 } catch (InstantiationException e) { 150 log.error("something went wrong ('could not instantiate class " + className + "')"); 151 log.error(Logging.stackTrace(e)); 152 } catch (java.lang.IllegalAccessException e) { 153 log.error("something went wrong ('illegal access class " + className + "')"); 154 log.error(Logging.stackTrace(e)); 155 } catch (NoClassDefFoundError e) { 156 log.error("are all lib's available? ('missing class used by class" + className + "')"); 157 log.error(Logging.stackTrace(e)); 158 } 159 if (ii == null) ii = new DummyImageInformer(); 160 return ii; 161 } 162 163 public static ImageInformer getImageInformer() { 164 return imageInformer; 165 } 166 167 168 171 public static ImageConversionRequest getImageConversionRequest(List pars, byte[] in, String format, MMObjectNode icacheNode) { 172 ImageConversionRequest req; 173 String ckey = icacheNode.getStringValue(Imaging.FIELD_CKEY); 174 synchronized(imageRequestTable) { 176 req = (ImageConversionRequest) imageRequestTable.get(ckey); 177 if (req != null) { 178 log.info("A conversion is already in progress (" + ckey + ")... (requests=" + ( req.count() + 1) + ")"); 179 } else { 180 req = new ImageConversionRequest(pars, in, format, icacheNode); 181 imageRequestTable.put(ckey, req); 182 imageRequestQueue.append(req); 183 } 184 } 185 return req; 186 } 187 188 public static Imaging.CKey getCKey(int nodeNumber, String template) { 189 return new Imaging.CKey(nodeNumber, template); 190 } 191 192 } 193 | Popular Tags |