1 10 package org.mmbase.module.builders; 11 12 import java.util.*; 13 import org.mmbase.module.core.*; 14 import org.mmbase.util.functions.*; 15 import org.mmbase.util.images.*; 16 import org.mmbase.util.UriParser; 17 import org.mmbase.storage.search.*; 18 import org.mmbase.storage.search.implementation.*; 19 import org.mmbase.util.logging.*; 20 import javax.servlet.http.HttpServletResponse ; 21 import javax.servlet.http.HttpServletRequest ; 22 23 31 public class ImageCaches extends AbstractImages { 32 33 private static final Logger log = Logging.getLoggerInstance(ImageCaches.class); 34 35 public static final String FIELD_ID = "id"; 36 37 public final static Parameter[] WAIT_PARAMETERS = Parameter.EMPTY; 38 39 static final String GUI_IMAGETEMPLATE = "s(100x60)"; 40 41 private boolean checkLegacyCkey = true; 42 43 private boolean fixLegacyCkeys = true; 44 45 public ImageCaches() { 46 } 47 48 public boolean init() { 49 if (oType != -1) return true; if (!super.init()) return false; 51 52 checkLegacyCkey = ! "false".equals(getInitParameter("LegacyCKey")); 53 fixLegacyCkeys = ! "false".equals(getInitParameter("FixLegacyCKey")); 54 return true; 55 } 56 57 62 private MMObjectNode originalImage(MMObjectNode node) { 63 return getNode(node.getIntValue(FIELD_ID)); 64 } 65 66 protected StringBuffer getFileName(MMObjectNode node, StringBuffer buf) { 67 MMObjectNode originalImage = originalImage(node); 68 Images images = (Images) originalImage.getBuilder(); 69 images.getFileName(originalImage, buf); 70 String ext = getImageFormat(node); 71 if (images.storesImageType()) { if (! ext.equals(images.getImageFormat(originalImage))) { 73 buf.append('.').append(ext); 74 } 75 } else { 76 buf.append('.').append(ext); 77 } 78 return buf; 79 } 80 protected boolean addFileName(MMObjectNode node, String servlet) { 81 if (super.addFileName(node, servlet)) return true; 82 MMObjectNode originalImage = originalImage(node); 83 Images images = (Images) originalImage.getBuilder(); 84 return images.addFileName(originalImage, servlet); 85 } 86 87 92 93 protected String getGUIIndicatorWithAlt(MMObjectNode node, String alt, Parameters a) { 94 StringBuffer servlet = new StringBuffer (); 95 HttpServletRequest req = (HttpServletRequest ) a.get(Parameter.REQUEST); 96 if (req != null) { 97 servlet.append(getServletPath(UriParser.makeRelative(new java.io.File (req.getServletPath()).getParent(), "/"))); 98 } else { 99 servlet.append(getServletPath()); 100 } 101 String ses = (String ) a.get("session"); 102 servlet.append(usesBridgeServlet && ses != null ? "session=" + ses + "+" : ""); 103 MMObjectNode origNode = originalImage(node); 104 String imageThumb; 105 HttpServletResponse res = (HttpServletResponse ) a.get(Parameter.RESPONSE); 106 String heightAndWidth = ""; 107 if (origNode != null) { 108 109 List cacheArgs = new Parameters(Images.CACHE_PARAMETERS).set("template", GUI_IMAGETEMPLATE); 110 MMObjectNode thumb = (MMObjectNode) origNode.getFunctionValue("cachednode", cacheArgs); 111 heightAndWidth = ""; imageThumb = servlet.toString() + thumb.getNumber(); 114 if (res != null) { 115 imageThumb = res.encodeURL(imageThumb); 116 } 117 } else { 118 imageThumb = ""; 119 } 120 String title; 121 String field = (String ) a.get("field"); 122 if (field == null || "".equals(field)) { 123 title = ""; 125 } else { 126 if (storesDimension()) { 127 title = " title=\"" + getMimeType(node) + " " + getDimension(node) + "\""; 128 } else { 129 title = " title=\"" + getMimeType(node) + "\""; 130 } 131 } 132 133 String image = servlet.toString() + node.getNumber(); 134 if (res != null) image = res.encodeURL(image); 135 return "<a HREF=\"" + image + "\" class=\"mm_gui\" onclick=\"window.open(this.href); return false;\"><img SRC=\"" + imageThumb + "\" border=\"0\" " + heightAndWidth + "alt=\"" + 136 org.mmbase.util.transformers.Xml.XMLAttributeEscape(alt, '\"') + 137 "\"" + title + " /></a>"; 138 } 139 140 protected String getSGUIIndicatorForNode(MMObjectNode node, Parameters a) { 142 MMObjectNode origNode = originalImage(node); 143 return getGUIIndicatorWithAlt(node, (origNode != null ? origNode.getStringValue("title") : ""), a); 144 } 145 146 154 public void waitForConversion(MMObjectNode node) { 155 log.debug("Wating for conversion?"); 156 if (node.isNull(Imaging.FIELD_HANDLE)) { 157 log.service("Waiting for conversion"); 158 String ckey = node.getStringValue(Imaging.FIELD_CKEY); 160 String template = Imaging.parseCKey(ckey).template; 161 List params = Imaging.parseTemplate(template); 162 MMObjectNode image = originalImage(node); 163 image.getBuilder().clearBlobCache(image.getNumber()); 165 byte[] bytes = image.getByteValue(Imaging.FIELD_HANDLE); 166 String format = ((AbstractImages) image.getBuilder()).getImageFormat(image); 167 ImageConversionRequest req = Factory.getImageConversionRequest(params, bytes, format, node); 169 req.waitForConversion(); 170 171 } else { 172 log.debug("no"); 173 } 174 } 175 176 177 183 public MMObjectNode getCachedNode(int imageNumber, String template) { 184 log.debug("Getting cached noded for " + template + " and image " + imageNumber); 185 List nodes; 186 try { 187 NodeSearchQuery query = new NodeSearchQuery(this); 188 query.setMaxNumber(2); StepField ckeyField = query.getField(getField(Imaging.FIELD_CKEY)); 190 Object ckey = Factory.getCKey(imageNumber, template); 191 BasicFieldValueConstraint bfvc = new BasicFieldValueConstraint(ckeyField, ckey.toString()); 192 bfvc.setCaseSensitive(true); 193 query.setConstraint(bfvc); 194 nodes = getNodes(query); 195 } catch (SearchQueryException e) { 196 log.error(e.toString()); 197 return null; 198 } 199 200 201 if (nodes.size() > 1) { 202 log.warn("Found more then one cached image with key ("+ template +")"); 203 } 204 205 if (nodes.size() == 0) { 206 log.debug("Did not find cached images with key ("+ template +")"); 207 if (checkLegacyCkey) { 208 return getLegacyCachedNode(imageNumber, template); 209 } else { 210 return null; 211 } 212 213 } else { 214 return (MMObjectNode) nodes.get(0); 215 } 216 } 217 223 protected MMObjectNode getLegacyCachedNode(int imageNumber, String template) { 224 List params = Imaging.parseTemplate(template); 225 String legacyCKey = "" + imageNumber + getLegacyCKey(params); 226 log.info("Trying legacy " + legacyCKey); 227 List legacyNodes; 228 try { 229 NodeSearchQuery query = new NodeSearchQuery(this); 230 query.setMaxNumber(2); StepField ckeyField = query.getField(getField(Imaging.FIELD_CKEY)); 232 query.setConstraint(new BasicFieldValueConstraint(ckeyField, legacyCKey)); 233 legacyNodes = getNodes(query); 234 if (legacyNodes.size() == 0) { 235 log.debug("Did not find cached images with key (" + legacyCKey + ")"); 236 } 237 if (legacyNodes.size() > 1) { 238 log.warn("Found more then one cached image with key (" + legacyCKey + ")"); 239 } 240 MMObjectNode legacyNode = null; 241 Iterator i = legacyNodes.iterator(); 242 String ckey = Factory.getCKey(imageNumber, template).toString(); 244 while (i.hasNext()) { 245 legacyNode = (MMObjectNode) i.next(); 246 if (fixLegacyCkeys) { 247 legacyNode.setValue(Imaging.FIELD_CKEY, ckey); legacyNode.commit(); 249 } 250 } 251 return legacyNode; 252 } catch (SearchQueryException e) { 253 log.error(e.toString()); 254 return null; 255 } 256 } 257 258 265 protected void invalidate(MMObjectNode imageNode) { 266 if (log.isDebugEnabled()) { 267 log.debug("Going to invalidate the node, where the original node # " + imageNode.getNumber()); 268 } 269 List nodes; 272 try { 273 NodeSearchQuery query = new NodeSearchQuery(this); 274 StepField idField = query.getField(getField(FIELD_ID)); 275 query.setConstraint(new BasicFieldValueConstraint(idField, new Integer (imageNode.getNumber()))); 276 nodes = getNodes(query); 277 } catch (SearchQueryException e) { 278 log.error(e.toString()); 279 nodes = new java.util.ArrayList (); } 281 282 Iterator i = nodes.iterator(); 283 while(i.hasNext()) { 284 MMObjectNode invalidNode = (MMObjectNode) i.next(); 286 removeNode(invalidNode); 287 if (log.isDebugEnabled()) { 288 log.debug("deleted node with number#" + invalidNode.getNumber()); 289 } 290 } 291 292 293 294 } 295 296 302 public void removeNode(MMObjectNode node) { 303 String ckey = node.getStringValue(Imaging.FIELD_CKEY); 304 log.service("Icaches: removing node " + node.getNumber() + " " + ckey); 305 ((Images) mmb.getBuilder("images")).invalidateTemplateCacheNumberCache(node.getIntValue(FIELD_ID)); 306 super.removeNode(node); 308 309 } 310 311 314 protected String getImageFormat(MMObjectNode node) { 315 if (storesImageType()) { 316 String iType = node.getStringValue(FIELD_ITYPE); 317 if(iType.equals("")) { 318 if (! node.isNull(Imaging.FIELD_HANDLE)) { return super.getImageFormat(node); 321 } 322 } else { 323 return iType; 324 } 325 } 326 log.debug("Not found, using ckey"); 328 329 String ckey = node.getStringValue(Imaging.FIELD_CKEY); 331 int fi = ckey.indexOf("f("); 332 if (fi > -1) { 333 int fi2 = ckey.indexOf(")", fi); 334 if (fi2 > -1) { 336 return ckey.substring(fi + 2, fi2); 337 } else { 338 return Factory.getDefaultImageFormat(); 341 } 342 } else { 343 String r = Factory.getDefaultImageFormat(); 344 if (r.equals("asis")) { 345 MMObjectNode original = originalImage(node); 346 if (original != null) { 347 return ((AbstractImages) original.getBuilder()).getImageFormat(original); 348 } else { 349 log.warn("Could not find original image for " + node); 350 return r; 351 } 352 } else { 353 return r; 354 } 355 } 356 359 } 360 361 365 protected Dimension getDimensionForEmptyHandle(MMObjectNode node) { 366 String ckey = node.getStringValue(Imaging.FIELD_CKEY); 367 String template = Imaging.parseCKey(ckey).template; 368 List params = Imaging.parseTemplate(template); 369 MMObjectNode orig = originalImage(node); 370 Dimension origDimension = ((Images) orig.getBuilder()).getDimension(orig); 371 return Imaging.predictDimension(origDimension, params); 372 } 373 374 375 public String getMimeType(List params) { 376 return getMimeType(getNode("" + params.get(0))); 377 } 378 379 public int insert(String owner, MMObjectNode node) { 380 int res = super.insert(owner, node); 381 ((Images) mmb.getMMObject("images")).invalidateTemplateCacheNumberCache(node.getStringValue(Imaging.FIELD_CKEY)); 383 return res; 384 } 385 386 387 391 392 protected Object executeFunction(MMObjectNode node, String function, List args) { 393 if (function.equals("wait")) { 394 waitForConversion(node); 395 return node; 396 } else { 397 return super.executeFunction(node, function, args); 398 } 399 } 400 401 409 private String getLegacyCKey(List params) { 410 if (params == null || params.size() == 0) { 411 log.debug("no parameters"); 412 return null; 413 } 414 StringBuffer sckey = new StringBuffer (""); 416 Iterator enumeration=params.iterator(); 417 while(enumeration.hasNext()) { 418 sckey.append(enumeration.next().toString()); 419 } 420 String ckey = ""; 422 try { 423 ckey = new String (sckey.toString().trim().getBytes("US-ASCII")).replace('"', 'X').replace('\'', 'X'); 424 } catch (java.io.UnsupportedEncodingException e) { 425 log.error(e.toString()); 426 } 427 432 if(log.isDebugEnabled()) log.debug("using ckey " + ckey); 433 if(ckey.length() > 0) { 434 return ckey; 435 } else { 436 log.debug("empty parameters"); 437 return null; 438 } 439 } 440 441 } 442 443 | Popular Tags |