1 7 package org.mmbase.applications.packaging.packagehandlers; 8 9 import java.io.DataInputStream ; 10 import java.io.InputStream ; 11 import java.util.Enumeration ; 12 import java.util.Iterator ; 13 import java.util.Collection ; 14 import java.util.jar.JarEntry ; 15 import java.util.jar.JarFile ; 16 17 import org.mmbase.applications.packaging.installhandlers.installStep; 18 import org.mmbase.applications.packaging.util.ExtendedDocumentReader; 19 import org.mmbase.bridge.Field; 20 import org.mmbase.module.core.MMBase; 21 import org.mmbase.module.core.MMObjectBuilder; 22 import org.mmbase.module.core.MMObjectNode; 23 import org.mmbase.core.CoreField; 24 import org.mmbase.module.corebuilders.InsRel; 25 import org.mmbase.module.corebuilders.RelDef; 26 import org.mmbase.util.XMLEntityResolver; 27 import org.mmbase.util.logging.Logger; 28 import org.mmbase.util.logging.Logging; 29 import org.w3c.dom.Element ; 30 import org.xml.sax.InputSource ; 31 32 36 public class DataApps1Package extends BasicPackage implements PackageInterface { 37 38 private static final Logger log = Logging.getLoggerInstance(DataApps1Package.class); 39 40 43 public final static String DTD_DATASET_1_0 = "dataset_1_0.dtd"; 44 47 public final static String DTD_OBJECTSET_1_0 = "objectset_1_0.dtd"; 48 51 public final static String DTD_RELATIONSET_1_0 = "relationset_1_0.dtd"; 52 53 56 public final static String PUBLIC_ID_DATASET_1_0 = "-//MMBase//DTD dataset config 1.0//EN"; 57 60 public final static String PUBLIC_ID_OBJECTSET_1_0 = "-//MMBase//DTD objectset config 1.0//EN"; 61 64 public final static String PUBLIC_ID_RELATIONSET_1_0 = "-//MMBase//DTD relationset config 1.0//EN"; 65 66 67 71 public static void registerPublicIDs() { 72 XMLEntityResolver.registerPublicID(PUBLIC_ID_DATASET_1_0, DTD_DATASET_1_0, DataApps1Package.class); 73 XMLEntityResolver.registerPublicID(PUBLIC_ID_OBJECTSET_1_0, DTD_OBJECTSET_1_0, DataApps1Package.class); 74 XMLEntityResolver.registerPublicID(PUBLIC_ID_RELATIONSET_1_0, DTD_RELATIONSET_1_0, DataApps1Package.class); 75 } 76 77 78 83 public boolean install() { 84 try { 85 86 installStep step = getNextInstallStep(); 88 step.setUserFeedBack("data/apps1 installer started"); 89 90 step = getNextInstallStep(); 92 step.setUserFeedBack("receiving package .."); 93 setProgressBar(1000); 94 96 JarFile jf = getJarFile(); 97 if (jf != null) { 98 step.setUserFeedBack("receiving package ... done (" + jf + ")"); 99 increaseProgressBar(100); 100 102 step = getNextInstallStep(); 104 step.setUserFeedBack("checking dependencies .."); 105 106 if (dependsInstalled(jf, step)) { 107 increaseProgressBar(100); 108 110 step.setUserFeedBack("checking dependencies ... done"); 111 112 step = getNextInstallStep(); 114 step.setUserFeedBack("loading datasets .."); 115 if (installDataSets(jf, step)) { 116 step.setUserFeedBack("loading datasets ... done"); 117 } else { 118 step.setUserFeedBack("loading datasets ... failed"); 119 } 120 increaseProgressBar(200); 121 123 step = getNextInstallStep(); 125 step.setUserFeedBack("updating mmbase registry .."); 126 updateRegistryInstalled(); 127 increaseProgressBar(100); 128 step.setUserFeedBack("updating mmbase registry ... done"); 130 131 } else { 132 step.setUserFeedBack("checking dependencies ... failed"); 133 setState("failed"); 134 return false; 135 } 136 } else { 137 step.setUserFeedBack("getting the mmp package...failed (server down or removed disk ? )"); 138 step.setType(installStep.TYPE_ERROR); 139 try { 140 Thread.sleep(2000); 141 } catch(Exception ee) {} 142 } 143 144 145 increaseProgressBar(100); 146 step = getNextInstallStep(); 149 step.setUserFeedBack("data/apps1 installer ended"); 150 151 } catch (Exception e) { 152 log.error("install crash on : " + this); 153 } 154 return true; 155 } 156 157 158 163 public boolean uninstall() { 164 try { 165 166 installStep step = getNextInstallStep(); 168 step.setUserFeedBack("data/apps1 uninstaller started"); 169 170 step = getNextInstallStep(); 172 step.setUserFeedBack("updating mmbase registry .."); 173 updateRegistryUninstalled(); 174 step.setUserFeedBack("updating mmbase registry ... done"); 175 176 step = getNextInstallStep(); 178 step.setUserFeedBack("data/apps1 installer ended"); 179 180 } catch (Exception e) { 181 log.error("install crash on : " + this); 182 } 183 return true; 184 } 185 186 187 194 private boolean installDataSets(JarFile jf, installStep step) { 195 MMBase mmb = MMBase.getMMBase(); 196 installStep substep = step.getNextInstallStep(); 197 substep.setUserFeedBack("Opening data.xml .."); 198 increaseProgressBar(100); 199 try { 201 JarEntry je = jf.getJarEntry("data.xml"); 202 if (je != null) { 203 InputStream input = jf.getInputStream(je); 204 ExtendedDocumentReader reader = new ExtendedDocumentReader(new InputSource (input), DataApps1Package.class); 205 substep.setUserFeedBack("Opening data.xml ... done"); 206 increaseProgressBar(100); 207 for (Iterator ns = reader.getChildElements("dataset.objectsets", "objectset"); ns.hasNext(); ) { 209 Element n = (Element ) ns.next(); 210 String path = n.getAttribute("path"); 211 substep = step.getNextInstallStep(); 212 substep.setUserFeedBack("loading objects " + path + ".."); 213 if (installObjectSet(jf, path)) { 214 substep.setUserFeedBack("loading objects " + path + "... done "); 215 } else { 216 substep.setUserFeedBack("loading objects " + path + "... failed, see logfile what happend"); 217 step.setType(installStep.TYPE_ERROR); 218 return false; 219 } 220 221 } 222 increaseProgressBar(100); 223 for (Iterator ns = reader.getChildElements("dataset.relationsets", "relationset"); ns.hasNext(); ) { 225 Element n = (Element ) ns.next(); 226 String name = n.getAttribute("name"); 227 String path = n.getAttribute("path"); 228 installRelationSet(jf, path); 229 230 } 231 } 232 } catch (Exception e) { 233 substep.setUserFeedBack("Opening data.xml ... failed"); 234 substep.setType(installStep.TYPE_ERROR); 235 log.error("problem opending data.xml file"); 236 } 237 increaseProgressBar(100); 238 return true; 240 } 241 242 243 244 250 private boolean installObjectSet(JarFile jf, String path) { 251 MMBase mmb = MMBase.getMMBase(); 252 MMObjectBuilder syncbul = mmb.getMMObject("syncnodes"); 253 if (syncbul != null) { 254 JarEntry je = jf.getJarEntry(path); 255 if (je == null) { 256 if (path.indexOf('/') != -1 ) { 257 path.replace('/','\\'); 258 } 259 if (path.indexOf('\\') != -1 ) { 260 path.replace('\\','/'); 261 } 262 je = jf.getJarEntry(path); 263 } 264 if (je != null) { 265 try { 266 InputStream input = jf.getInputStream(je); 267 ExtendedDocumentReader nodereader = new ExtendedDocumentReader(new InputSource (input), DataApps1Package.class); 268 Element nr = nodereader.getElementByPath("objectset"); 269 String type = nr.getAttribute("type"); 270 String exportsource = nr.getAttribute("exportsource"); 271 installStep step = getNextInstallStep(); 272 step.setUserFeedBack("installing dataset : " + type + " .."); 273 int timestamp = -1; 274 try { 275 timestamp = Integer.parseInt(nr.getAttribute("timestamp")); 276 } catch (Exception e) {} 277 for (Iterator ns = nodereader.getChildElements("objectset", "object"); 278 ns.hasNext(); ) { 279 Element n = (Element ) ns.next(); 280 String exportnumber = n.getAttribute("number"); 281 MMObjectBuilder bul = mmb.getMMObject(type); 282 String query = "exportnumber==" + exportnumber + "+exportsource=='" + exportsource + "'"; 283 Enumeration b = syncbul.search(query); 284 if (b.hasMoreElements()) { 285 MMObjectNode syncnode = (MMObjectNode) b.nextElement(); 286 log.info("node allready installed : " + exportnumber); 287 } else { 288 log.info("node installing !! : " + exportnumber); 289 MMObjectNode loadednode = createNewObject(nodereader, bul, n, jf); 290 MMObjectNode localnode = getExistingContentNode(loadednode, bul); 291 if (localnode == null) { 292 int localnumber = loadednode.insert(loadednode.getStringValue("owner")); 293 MMObjectNode syncnode = syncbul.getNewNode("import"); 294 syncnode.setValue("exportsource", exportsource); 295 syncnode.setValue("exportnumber", exportnumber); 296 syncnode.setValue("timestamp", timestamp); 297 syncnode.setValue("localnumber", localnumber); 298 syncnode.insert("import"); 299 } else { 300 MMObjectNode syncnode = syncbul.getNewNode("import"); 301 syncnode.setValue("exportsource", exportsource); 302 syncnode.setValue("exportnumber", exportnumber); 303 syncnode.setValue("timestamp", timestamp); 304 syncnode.setValue("localnumber", localnode.getNumber()); 305 syncnode.insert("import"); 306 } 307 } 308 } 309 step.setUserFeedBack("installing objectset : " + type + " ...done"); 310 } catch (Exception e) { 311 log.error("can't read node xml from jar file"); 312 e.printStackTrace(); 313 return false; 314 } 315 } 316 return true; 317 } else { 318 return false; 319 } 320 } 321 322 323 332 private MMObjectNode createNewObject(ExtendedDocumentReader nodereader, MMObjectBuilder bul, Element n, JarFile jf) { 333 String owner = n.getAttribute("owner"); 334 String alias = n.getAttribute("alias"); 335 336 if (owner == null) { 337 owner = "import"; 338 } 339 MMObjectNode newnode = bul.getNewNode(owner); 340 if (alias != null) { 341 newnode.setAlias(alias); 342 } 343 344 for (Iterator ns2 = nodereader.getChildElements(n, "field"); 345 ns2.hasNext(); ) { 346 Element n2 = (Element ) ns2.next(); 347 String field = n2.getAttribute("name"); 348 org.w3c.dom.Node n3 = n2.getFirstChild(); 349 String value = null; 350 if (n3 != null) { 351 value = n3.getNodeValue(); 352 } 353 354 int type = bul.getDBType(field); 355 if (type != -1) { 356 if (type == Field.TYPE_STRING || type == Field.TYPE_XML) { 357 if (value == null) { 358 value = ""; 359 } 360 newnode.setValue(field, value); 361 } else if (type == Field.TYPE_NODE) { 362 try { 363 newnode.setValue(field, Integer.parseInt(value)); 364 } catch (Exception e) { 365 log.warn("error setting node-field " + e); 366 newnode.setValue(field, -1); 367 } 368 } else if (type == Field.TYPE_INTEGER) { 369 try { 370 newnode.setValue(field, Integer.parseInt(value)); 371 } catch (Exception e) { 372 log.warn("error setting integer-field " + e); 373 newnode.setValue(field, -1); 374 } 375 } else if (type == Field.TYPE_FLOAT) { 376 try { 377 newnode.setValue(field, Float.parseFloat(value)); 378 } catch (Exception e) { 379 log.warn("error setting float-field " + e); 380 newnode.setValue(field, -1); 381 } 382 } else if (type == Field.TYPE_DOUBLE) { 383 try { 384 newnode.setValue(field, Double.parseDouble(value)); 385 } catch (Exception e) { 386 log.warn("error setting double-field " + e); 387 newnode.setValue(field, -1); 388 } 389 } else if (type == Field.TYPE_LONG) { 390 try { 391 newnode.setValue(field, Long.parseLong(value)); 392 } catch (Exception e) { 393 log.warn("error setting long-field " + e); 394 newnode.setValue(field, -1); 395 } 396 } else if (type == Field.TYPE_BYTE) { 397 String filename = n2.getAttribute("file"); 398 JarEntry je = jf.getJarEntry("data/" + filename); 399 if (je != null) { 400 int buffersize = (int) je.getSize(); 401 byte[] buffer = new byte[buffersize]; 402 try { 403 DataInputStream in = new DataInputStream (jf.getInputStream(je)); 404 in.readFully(buffer, 0, buffersize); 405 } catch (Exception e) { 406 log.error("Jar file (handle) read error"); 407 e.printStackTrace(); 408 } 409 newnode.setValue(field, buffer); 410 } 411 } else { 412 log.error("FieldDefs not found for #" + type + " was not known for field with name: '" + field + "' and with value: '" + value + "'"); 413 } 414 } 415 } 416 return newnode; 417 } 418 419 420 426 private MMObjectNode getExistingContentNode(MMObjectNode newnode, MMObjectBuilder bul) { 427 String checkQ = ""; 428 Collection vec = bul.getFields(); 429 for (Iterator h = vec.iterator(); h.hasNext(); ) { 430 CoreField def = (CoreField) h.next(); 431 if (def.isUnique()) { 432 int type = def.getType(); 433 String name = def.getName(); 434 if (type == Field.TYPE_STRING) { 435 String value = newnode.getStringValue(name); 436 if (checkQ.equals("")) { 437 checkQ += name + "=='" + value + "'"; 438 } else { 439 checkQ += "+" + name + "=='" + value + "'"; 440 } 441 } 442 } 443 } 444 if (!checkQ.equals("")) { 445 Enumeration r = bul.search(checkQ); 446 if (r.hasMoreElements()) { 447 MMObjectNode oldnode = (MMObjectNode) r.nextElement(); 448 return oldnode; 449 } 450 } 451 return null; 452 } 453 454 455 461 private boolean installRelationSet(JarFile jf, String path) { 462 MMBase mmb = MMBase.getMMBase(); 463 RelDef reldef = mmb.getRelDef(); 464 MMObjectBuilder syncbul = mmb.getMMObject("syncnodes"); 465 if (syncbul != null) { 466 JarEntry je = jf.getJarEntry(path); 467 if (je != null) { 468 try { 469 InputStream input = jf.getInputStream(je); 470 ExtendedDocumentReader nodereader = new ExtendedDocumentReader(new InputSource (input), DataApps1Package.class); 471 Element nr = nodereader.getElementByPath("relationset"); 472 String type = nr.getAttribute("type"); 473 String exportsource = nr.getAttribute("exportsource"); 474 installStep step = getNextInstallStep(); 475 step.setUserFeedBack("installing relationset : " + type + " .."); 476 int timestamp = -1; 477 try { 478 timestamp = Integer.parseInt(nr.getAttribute("timestamp")); 479 } catch (Exception e) {} 480 for (Iterator ns = nodereader.getChildElements("relationset", "relation"); 481 ns.hasNext(); ) { 482 Element n = (Element ) ns.next(); 483 String exportnumber = n.getAttribute("number"); 484 String snumber = n.getAttribute("snumber"); 485 String dnumber = n.getAttribute("dnumber"); 486 String rtype = n.getAttribute("rtype"); 487 String dir = n.getAttribute("dir"); 488 489 MMObjectBuilder bul = mmb.getMMObject(type); 490 491 Enumeration b = syncbul.search("exportnumber==" + exportnumber + "+exportsource=='" + exportsource + "'"); 492 if (b.hasMoreElements()) { 493 MMObjectNode syncnode = (MMObjectNode) b.nextElement(); 494 log.debug("relation allready installed : " + exportnumber); 495 } else { 496 MMObjectNode loadednode = createNewObject(nodereader, bul, n, jf); 497 b = syncbul.search("exportnumber==" + snumber + "+exportsource=='" + exportsource + "'"); 499 int realsnumber = -1; 500 if (b.hasMoreElements()) { 501 MMObjectNode n2 = (MMObjectNode) b.nextElement(); 502 realsnumber = n2.getIntValue("localnumber"); 503 } 504 505 int realdnumber = -1; 507 b = syncbul.search("exportnumber==" + dnumber + "+exportsource=='" + exportsource + "'"); 508 if (b.hasMoreElements()) { 509 MMObjectNode n2 = (MMObjectNode) b.nextElement(); 510 realdnumber = n2.getIntValue("localnumber"); 511 } 512 513 int realrnumber = reldef.getNumberByName(rtype); 515 if (InsRel.usesdir) { 517 int realdir = 0; 518 if (dir != null) { 519 if ("unidirectional".equals(dir)) { 520 realdir = 1; 521 } else if ("bidirectional".equals(dir)) { 522 realdir = 2; 523 } else { 524 log.error("invalid 'dir' attribute encountered in " + bul.getTableName() + " value=" + dir); 525 } 526 } 527 if (realdir == 0) { 528 MMObjectNode relnode = reldef.getNode(realrnumber); 529 if (relnode != null) { 530 realdir = relnode.getIntValue("dir"); 531 } 532 } 533 if (realdir != 1) { 534 realdir = 2; 535 } 536 loadednode.setValue("dir", realdir); 537 } 538 539 loadednode.setValue("snumber", realsnumber); 540 loadednode.setValue("dnumber", realdnumber); 541 loadednode.setValue("rnumber", realrnumber); 542 543 int localnumber = -1; 544 if (realsnumber != -1 && realdnumber != -1) { 545 localnumber = loadednode.insert(loadednode.getStringValue("admin")); 546 if (localnumber != -1) { 547 MMObjectNode syncnode = syncbul.getNewNode("import"); 548 syncnode.setValue("exportsource", exportsource); 549 syncnode.setValue("exportnumber", exportnumber); 550 syncnode.setValue("timestamp", timestamp); 551 syncnode.setValue("localnumber", localnumber); 552 syncnode.insert("import"); 553 } 554 } else { 555 log.error("Cannot sync relation (exportnumber==" + exportnumber + ", snumber:" + snumber + ", dnumber:" + dnumber + ")"); 556 } 557 } 558 } 559 step.setUserFeedBack("installing relationset : " + type + " ...done"); 560 } catch (Exception e) { 561 log.error("can't read node xml from jar file"); 562 e.printStackTrace(); 563 return false; 564 } 565 } 566 return true; 567 } else { 568 return false; 569 } 570 } 571 572 } 573 574 | Popular Tags |