1 10 11 package org.mmbase.module.builders.vwms; 12 13 import java.util.*; 14 import java.io.*; 15 16 import org.mmbase.module.core.*; 17 import org.mmbase.util.*; 18 import org.mmbase.module.builders.*; 19 import org.mmbase.util.images.Imaging; 20 import org.mmbase.util.logging.*; 21 22 35 36 public class ImageMaster extends Vwm implements MMBaseObserver,VwmServiceInterface { 37 38 private static Logger log = Logging.getLoggerInstance(ImageMaster.class.getName()); 40 41 Hashtable properties; 42 43 boolean first=true; 45 46 Object syncobj=new Object (); 48 53 Vector files=new Vector(); 54 57 ImagePusher pusher; 58 61 private int maxSweep=16; 62 63 66 public ImageMaster() { 67 log.info("VWM ImageMaster started"); 68 } 69 70 83 public boolean probeCall() { 84 if (first) { 85 first=false; 86 if (pusher==null) { 88 pusher=new ImagePusher(this); 89 log.info("ImageMaster -> Starting Image pusher"); 90 } 91 } else { 92 try { 93 Netfiles bul=(Netfiles)Vwms.getMMBase().getMMObject("netfiles"); 94 Enumeration e=bul.search("WHERE service='images' AND subservice='main' AND status="+Netfiles.STATUS_REQUEST+" ORDER BY number DESC"); 97 int i=0; 98 while (e.hasMoreElements() && i<maxSweep) { 99 MMObjectNode node=(MMObjectNode)e.nextElement(); 100 fileChange(""+node.getIntValue("number"),"c"); 101 i++; 102 } 103 try { Thread.sleep(1500); } catch(InterruptedException x) {} 104 Enumeration f=bul.search("WHERE service='images' AND subservice='mirror' AND status="+Netfiles.STATUS_REQUEST+" ORDER BY number DESC"); 105 i=0; 106 while (f.hasMoreElements() && i<maxSweep) { 107 MMObjectNode node=(MMObjectNode)f.nextElement(); 108 fileChange(""+node.getIntValue("number"),"c"); 109 i++; 110 } 111 } catch(Exception e) { 112 log.error("probeCall exception "+e); 113 log.error(Logging.stackTrace(e)); 114 } 115 } 116 return true; 117 } 118 119 127 public boolean nodeRemoteChanged(String machine,String number,String builder,String ctype) { 128 return(nodeChanged(machine,number,builder,ctype)); 129 } 130 131 139 public boolean nodeLocalChanged(String machine,String number,String builder,String ctype) { 140 return nodeChanged(machine,number,builder,ctype); 141 } 142 143 152 public boolean nodeChanged(String machine,String number,String builder, String ctype) { 153 log.debug("sees that : "+number+" has changed type="+ctype+" of type:"+builder+" by machine:"+machine); 154 return true; 155 } 156 157 166 public boolean fileChange(String service,String subservice,String filename) { 167 filename=URLEscape.unescapeurl(filename); 168 log.debug("fileChange -> "+filename); 169 if (subservice.equals("main")) { 171 handleMainCheck(service,subservice,filename); 172 } 173 return true; 174 } 175 176 184 public boolean fileChange(String number, String ctype) { 185 Netfiles bul=(Netfiles)Vwms.getMMBase().getMMObject("netfiles"); 188 MMObjectNode filenode=bul.getNode(number); 189 if (filenode!=null) { 190 String service=filenode.getStringValue("service"); 192 String subservice=filenode.getStringValue("subservice"); 193 int status=filenode.getIntValue("status"); 194 195 log.debug("fileChange "+number+" "+subservice+" "+status); 196 197 if (subservice.equals("main")) { 199 handleMain(filenode,status,ctype); 200 } else if (subservice.equals("mirror")) { 201 handleMirror(filenode,status,ctype); 202 } 203 } 204 return(true); 205 } 206 207 213 public ByteFieldContainer getCkeyNode(ImageCaches bul, String ckey) { 214 log.debug("getting ckey node with " + ckey); 215 int pos = 0; 216 while (Character.isDigit(ckey.charAt(pos))) pos ++; 217 int nodeNumber = Integer.parseInt(ckey.substring(0, pos)); 218 String template = ckey.substring(pos); 219 if (template.charAt(0) == '=') template = template.substring(1); 220 MMObjectNode node = bul.getCachedNode(nodeNumber, template); 221 if (node == null) { 222 log.debug("cached node not found for key (" + ckey + "), returning null"); 224 return null; 225 } 226 byte data[] = node.getByteValue(Imaging.FIELD_HANDLE); 228 if (data == null) { 229 String msg = 233 "The node(#" + node.getNumber() + ") which should contain the cached result for ckey:" + ckey + 234 " had as value <null>, this means that something is really wro ng.(how can we have an cache node with node value in it?)"; 235 log.error(msg); 236 throw new RuntimeException (msg); 237 } 238 ByteFieldContainer result = new ByteFieldContainer(node.getNumber(), data); 239 return result; 240 } 241 242 251 public boolean handleMirror(MMObjectNode filenode,int status,String ctype) { 252 if (filenode==null) { 253 log.error("ERROR: handleMirror filenode null!"); 254 return true; 255 } 256 257 log.debug("Node "+filenode+" status "+status+" type "+ctype); 258 switch(status) { 259 case Netfiles.STATUS_REQUEST: log.debug("status=="+Netfiles.STATUS_REQUEST); 261 filenode.setValue("status",Netfiles.STATUS_ON_ITS_WAY); 262 filenode.commit(); 263 log.debug("Starting real work"); 264 String filename=filenode.getStringValue("filename"); 266 if ((filename==null) || filename.equals("")) { 267 log.error("handleMirror: filename null"); 268 return true; 269 } 270 log.debug("handleMirror"+filename); 271 String dstserver=filenode.getStringValue("mmserver"); 272 273 ImageCaches bul=(ImageCaches)Vwms.getMMBase().getMMObject("icaches"); 275 if (bul==null) { 276 log.error("ImageCaches builder is null"); 277 return true; 278 } 279 280 String mimetype = "image/jpeg"; 282 String ckey=filename.substring(8); 286 int pos=ckey.lastIndexOf("."); 287 if (pos!=-1) { 288 ckey=ckey.substring(0,pos); 289 StringTokenizer st = new StringTokenizer(ckey,"+\n\r"); 292 Vector ckeyVec = new Vector(); 293 while (st.hasMoreTokens()) { 294 ckeyVec.addElement(st.nextElement()); 295 } 296 Images imagesBuilder = (Images)Vwms.getMMBase().getMMObject("images"); 297 if (imagesBuilder==null) { 298 log.error("handleMirror images builder not found"); 299 return true; 300 } 301 mimetype = getImageMimeType(imagesBuilder, ckeyVec); 302 ckey=path2ckey(ckey, imagesBuilder); 304 } 305 306 log.debug("handleMirror: ckey "+ckey); 307 ByteFieldContainer container = getCkeyNode(bul, ckey); 308 if (container == null) { 309 log.debug("handleMirror: no icaches entry yet"); 310 } 311 byte[] filebuf = container.value; 312 log.debug("request size "+filebuf.length); 313 String srcpath=getProperty("test1:path"); saveImageAsisFile(srcpath,filename,filebuf,mimetype); 316 317 String sshpath=getProperty("sshpath"); 319 String dstuser=getProperty(dstserver+":user"); 320 String dsthost=getProperty(dstserver+":host"); 321 String dstpath=getProperty(dstserver+":path"); 322 323 330 files.addElement(new aFile2Copy(dstuser,dsthost,dstpath,srcpath,filename,sshpath)); 332 333 335 filenode.setValue("status",Netfiles.STATUS_DONE); 336 filenode.commit(); 337 break; 338 case Netfiles.STATUS_ON_ITS_WAY: break; 340 case Netfiles.STATUS_DONE: break; 342 default: 343 log.error("This cannot happen, contact your system administrator"); 344 break; 345 } 346 return true; 347 } 348 349 357 public boolean handleMain(MMObjectNode filenode,int status,String ctype) { 358 switch(status) { 359 case Netfiles.STATUS_REQUEST: filenode.setValue("status",Netfiles.STATUS_ON_ITS_WAY); 361 filenode.commit(); 362 doMainRequest(filenode); 364 filenode.setValue("status",Netfiles.STATUS_DONE); 365 filenode.commit(); 366 break; 367 case Netfiles.STATUS_ON_ITS_WAY: break; 369 case Netfiles.STATUS_DONE: break; 371 default: 372 log.error("This cannot happen, contact your system administrator"); 373 break; 374 } 375 return true; 376 } 377 378 385 public boolean doMainRequest(MMObjectNode filenode) { 386 log.debug("doMainRequest for "+filenode.getIntValue("number")+" "+filenode.getStringValue("filename")); 387 String filename = filenode.getStringValue("filename"); 390 String service = filenode.getStringValue("service"); 391 392 Netfiles bul=(Netfiles)Vwms.getMMBase().getMMObject("netfiles"); 394 Enumeration e=bul.search("WHERE filename='"+filename+"' AND service='"+service+"' AND subservice='mirror'"); 395 if (!e.hasMoreElements()) { 396 log.debug("doMainRequest: No mirror nodes found for : "+filenode.toString()+" !!"); 397 } 398 while (e.hasMoreElements()) { 399 MMObjectNode mirrornode=(MMObjectNode)e.nextElement(); 400 log.debug("doMainRequest sending change for "+mirrornode.getIntValue("number")); 401 mirrornode.setValue("status",Netfiles.STATUS_REQUEST); 402 mirrornode.commit(); 403 } 404 return true; 405 } 406 407 417 public synchronized void handleMainCheck(String service,String subservice,String filename) { 418 Netfiles bul=(Netfiles)Vwms.getMMBase().getMMObject("netfiles"); 419 Enumeration e=bul.search("WHERE filename='"+filename+"' AND service='"+service+"' AND subservice='"+subservice+"'"); 420 if (e.hasMoreElements()) { 421 log.debug("handleMainCheck: existing file"); 422 MMObjectNode mainnode=(MMObjectNode)e.nextElement(); 423 int currentstatus=mainnode.getIntValue("status"); 424 if (currentstatus>Netfiles.STATUS_ON_ITS_WAY) { mainnode.setValue("status",Netfiles.STATUS_REQUEST); 426 mainnode.commit(); 427 } 428 } else { 429 log.debug("handleMainCheck: new file"); 430 MMObjectNode mainnode=bul.getNewNode("system"); 431 mainnode.setValue("filename",filename); 432 mainnode.setValue("mmserver","test1"); mainnode.setValue("service",service); 434 mainnode.setValue("subservice",subservice); 435 mainnode.setValue("status",Netfiles.STATUS_DONE); 436 mainnode.setValue("filesize",-1); 437 bul.insert("system",mainnode); 438 439 mainnode=bul.getNewNode("system"); 442 mainnode.setValue("filename",filename); 443 mainnode.setValue("mmserver","omroep"); mainnode.setValue("service",service); 445 mainnode.setValue("subservice","mirror"); 446 mainnode.setValue("status",Netfiles.STATUS_REQUEST); 447 mainnode.setValue("filesize",-1); 448 bul.insert("system",mainnode); 449 } 450 } 451 452 459 public String getProperty(String key) { 460 if (properties==null) initProperties(); 461 return (String )properties.get(key); 462 } 463 464 468 private void initProperties() { 469 properties=new Hashtable(); 470 properties.put("sshpath","/usr/local/bin"); 471 properties.put("omroep:user","vpro"); 472 properties.put("omroep:host","vpro.omroep.nl"); 473 properties.put("omroep:path","/bigdisk/htdocs/"); 474 properties.put("test1:path","/usr/local/log/james/scancache/PAGE"); 475 } 476 477 485 private boolean saveImageAsisFile(String path,String filename,byte[] value, String mimetype) { 486 String header="Status: 200 OK"; 487 header+="\r\nContent-type: "+mimetype; 489 header+="\r\nContent-length: "+value.length; 490 header+="\r\n\r\n"; 491 492 File sfile = new File(path+filename); 493 try { 494 DataOutputStream scan = new DataOutputStream(new FileOutputStream(sfile)); 495 scan.writeBytes(header); 496 scan.write(value); 497 scan.flush(); 498 scan.close(); 499 } catch(Exception e) { 500 log.error(e.getMessage()); 501 log.error(Logging.stackTrace(e)); 502 } 503 return true; 504 } 505 506 512 private String path2ckey(String path, Images imageBuilder) { 513 StringTokenizer tok = new StringTokenizer(path,"+\n\r"); 514 String ckey=tok.nextToken(); 515 while (tok.hasMoreTokens()) { 517 String key=tok.nextToken(); 518 ckey+=key; 519 } 520 return ckey; 521 } 522 523 530 private String getImageMimeType(Images images, List params) { 531 String format = null; 532 String key; 533 534 536 for (Iterator e = params.iterator() ;e.hasNext();) { 537 key = (String )e.next(); 538 539 if(key != null && key.length() > 2) { 541 if(key.startsWith("f(")) { 543 int pos = key.lastIndexOf(')'); 545 format = key.substring(2, pos); 547 break; 548 } 549 } 550 } 551 if (format == null) format = images.getDefaultImageType(); 552 String mimetype = Imaging.getMimeTypeByExtension(format); 553 if (log.isDebugEnabled()) { 554 log.debug("getImageMimeType: getMMBase().getMimeType(" + format + ") = " + mimetype); 555 } 556 return mimetype; 557 } 558 559 } 560 | Popular Tags |