1 7 package org.mmbase.applications.packaging.packagehandlers; 8 9 import java.io.InputStream ; 10 import java.util.Iterator ; 11 import java.util.jar.JarEntry ; 12 import java.util.jar.JarFile ; 13 14 import org.mmbase.applications.packaging.installhandlers.installStep; 15 import org.mmbase.applications.packaging.util.ExtendedDocumentReader; 16 import org.mmbase.module.core.MMBase; 17 import org.mmbase.module.core.MMObjectBuilder; 18 import org.mmbase.module.core.MMObjectNode; 19 import org.mmbase.module.corebuilders.RelDef; 20 import org.mmbase.module.corebuilders.TypeDef; 21 import org.mmbase.module.corebuilders.TypeRel; 22 import org.mmbase.util.XMLEntityResolver; 23 import org.mmbase.util.logging.Logger; 24 import org.mmbase.util.logging.Logging; 25 import org.w3c.dom.Element ; 26 import org.xml.sax.InputSource ; 27 28 33 public class CloudModelPackage extends BasicPackage implements PackageInterface { 34 35 private static Logger log = Logging.getLoggerInstance(CloudModelPackage.class); 36 37 40 public final static String DTD_CLOUDMODEL_1_0 = "cloudmodel_1_0.dtd"; 41 42 45 public final static String PUBLIC_ID_CLOUDMODEL_1_0 = "-//MMBase//DTD cloudmodel config 1.0//EN"; 46 47 48 52 public static void registerPublicIDs() { 53 XMLEntityResolver.registerPublicID(PUBLIC_ID_CLOUDMODEL_1_0, DTD_CLOUDMODEL_1_0, CloudModelPackage.class); 54 } 55 56 57 62 public boolean install() { 63 boolean result = true; 64 try { 65 66 installStep step = getNextInstallStep(); 68 step.setUserFeedBack("cloud/model installer started"); 69 70 setProgressBar(1000); 71 increaseProgressBar(100); 72 step = getNextInstallStep(); 75 step.setUserFeedBack("receiving package .."); 76 JarFile jf = getJarFile(); 77 if (jf != null) { 78 step.setUserFeedBack("receiving package ... done (" + jf + ")"); 79 increaseProgressBar(100); 80 82 step = getNextInstallStep(); 84 step.setUserFeedBack("checking dependencies .."); 85 if (dependsInstalled(jf, step)) { 86 step.setUserFeedBack("checking dependencies ... done"); 87 increaseProgressBar(100); 88 90 step = getNextInstallStep(); 92 step.setUserFeedBack("Opening model.xml file .."); 93 ExtendedDocumentReader reader = getModelReader(jf); 94 if (reader != null) { 95 step.setUserFeedBack("Opening model.xml file ... done"); 96 97 step = getNextInstallStep(); 98 step.setUserFeedBack("updating builders.."); 99 increaseProgressBar(100); 100 if (installNeededBuilders(jf, reader, step)) { 102 step.setUserFeedBack("updating builders... done"); 103 increaseProgressBar(100); 104 } else { 106 step.setUserFeedBack("updating builders... failed"); 107 step = getNextInstallStep(); 108 step.setUserFeedBack("cloud/model installer ended"); 109 return false; 110 } 111 112 step = getNextInstallStep(); 113 step.setUserFeedBack("updating relation defs.."); 114 increaseProgressBar(100); 115 if (installNeededRelDefs(jf, reader, step)) { 117 step.setUserFeedBack("updating relation defs... done"); 118 increaseProgressBar(100); 119 } else { 121 step.setUserFeedBack("updating relation defs... failed"); 122 step.setType(installStep.TYPE_ERROR); 123 step = getNextInstallStep(); 124 step.setUserFeedBack("cloud/model installer ended"); 125 return false; 126 } 127 128 increaseProgressBar(100); 129 131 step = getNextInstallStep(); 132 step.setUserFeedBack("updating allowed relations"); 133 installAllowedRelations(jf, reader, step); 134 step = getNextInstallStep(); 135 step.setUserFeedBack("updating allowed relations done"); 136 137 increaseProgressBar(100); 138 140 step = getNextInstallStep(); 142 step.setUserFeedBack("updating mmbase registry .."); 143 updateRegistryInstalled(); 144 step.setUserFeedBack("updating mmbase registry ... done"); 145 increaseProgressBar(100); 146 } else { 148 step.setUserFeedBack("Opening model.xml file ... failed"); 149 step.setType(installStep.TYPE_ERROR); 150 } 151 152 } else { 153 step.setUserFeedBack("checking dependencies ... failed"); 154 step.setType(installStep.TYPE_ERROR); 155 result = false; 156 } 157 } else { 158 step.setUserFeedBack("getting the mmp package...failed (server down or removed disk ? )"); 159 step.setType(installStep.TYPE_ERROR); 160 try { 161 Thread.sleep(2000); 162 } catch(Exception ee) {} 163 } 164 165 166 step = getNextInstallStep(); 168 step.setUserFeedBack("cloud/model installer ended"); 169 170 } catch (Exception e) { 171 log.error("install crash on : " + this); 172 result = false; 173 } 174 return result; 175 } 176 177 178 183 public boolean uninstall() { 184 try { 185 186 installStep step = getNextInstallStep(); 188 step.setUserFeedBack("cloud/model uninstaller started"); 189 190 step = getNextInstallStep(); 192 step.setUserFeedBack("updating mmbase registry .."); 193 updateRegistryUninstalled(); 194 step.setUserFeedBack("updating mmbase registry ... done"); 195 196 step = getNextInstallStep(); 198 step.setUserFeedBack("cloud/model installer ended"); 199 200 } catch (Exception e) { 201 log.error("install crash on : " + this); 202 } 203 return true; 204 } 205 206 207 208 216 private boolean installNeededRelDefs(JarFile jf, ExtendedDocumentReader reader, installStep step) { 217 MMBase mmb = MMBase.getMMBase(); 218 for (Iterator ns = reader.getChildElements("cloudmodel.neededreldeflist", "reldef"); 219 ns.hasNext(); ) { 220 Element n = (Element ) ns.next(); 221 String buildername = n.getAttribute("builder"); 222 String source = n.getAttribute("source"); 223 String target = n.getAttribute("target"); 224 String direction = n.getAttribute("direction"); 225 String guisourcename = n.getAttribute("guisourcename"); 226 String guitargetname = n.getAttribute("guitargetname"); 227 228 int builder = -1; 230 if (RelDef.usesbuilder) { 231 if (buildername == null) { 233 buildername = source; 234 } 235 236 builder = mmb.getTypeDef().getIntValue(buildername); 237 } 238 if ("unidirectional".equals(direction)) { 240 if (!installRelDef(source, target, 1, guisourcename, guitargetname, builder, step)) { 241 return false; 242 } 243 } else { 244 if (!installRelDef(source, target, 2, guisourcename, guitargetname, builder, step)) { 245 return false; 246 } 247 } 248 249 } 250 return true; 251 } 252 253 254 262 private boolean installAllowedRelations(JarFile jf, ExtendedDocumentReader reader, installStep step) { 263 for (Iterator ns = reader.getChildElements("cloudmodel.allowedrelationlist", "relation"); 264 ns.hasNext(); ) { 265 Element n = (Element ) ns.next(); 266 String from = n.getAttribute("from"); 267 String to = n.getAttribute("to"); 268 String type = n.getAttribute("type"); 269 270 installStep substep = step.getNextInstallStep(); 271 substep.setUserFeedBack("checking allowed relation " + from + " " + to + " " + type + ".."); 272 if (getBundleStep()!=null) getBundleStep().setUserFeedBack("calling package installer "+getName()+".. allowed relation " + from + " " + to + " " + type); 273 if (installTypeRel(from, to, type, -1)) { 274 substep.setUserFeedBack("checking allowed relation " + from + " " + to + " " + type + ".. installed"); 275 } else { 276 substep.setUserFeedBack("checking allowed relation " + from + " " + to + " " + type + ".. failed"); 277 substep.setType(installStep.TYPE_ERROR); 278 } 279 } 280 return true; 281 } 282 283 284 292 private boolean installNeededBuilders(JarFile jf, ExtendedDocumentReader reader, installStep step) { 293 for (Iterator ns = reader.getChildElements("cloudmodel.neededbuilderlist", "builder"); 294 ns.hasNext(); ) { 295 Element n3 = (Element ) ns.next(); 296 297 String name = reader.getElementValue(n3); 298 299 installStep substep = step.getNextInstallStep(); 300 substep.setUserFeedBack("checking builder " + name + " .."); 301 if (getBundleStep()!=null) getBundleStep().setUserFeedBack("calling package installer "+getName()+"..checking builder "+ name); 302 303 MMBase mmb = MMBase.getMMBase(); 304 305 MMObjectBuilder bul = mmb.getMMObject(name); 306 if (bul == null) { 308 String path = mmb.getBuilderPath(name, ""); 310 if (path != null) { 311 substep.setUserFeedBack("checking builder " + name + " .. failed, builder on system but not active. Please turn the builder on in xml file"); 312 substep.setType(installStep.TYPE_ERROR); 313 continue; 314 } 315 316 MMObjectBuilder objectTypes = mmb.getTypeDef(); 318 if (objectTypes == null) { 319 substep.setUserFeedBack("checking builder " + name + " .. failed, could not find the typedef builder."); 320 substep.setType(installStep.TYPE_ERROR); 321 return false; 322 } 323 MMObjectNode type = objectTypes.getNewNode("system"); 325 type.setValue("name", name); 327 328 JarEntry je = jf.getJarEntry("builders/" + name + ".xml"); 330 if (je == null) je = jf.getJarEntry("builders\\" + name + ".xml"); 331 try { 332 InputStream input = jf.getInputStream(je); 333 334 org.w3c.dom.Document config = null; 335 try { 336 config = ExtendedDocumentReader.getDocumentBuilder(ExtendedDocumentReader.class).parse(new InputSource (input)); 337 } catch (org.xml.sax.SAXException se) { 338 substep.setUserFeedBack("checking builder " + name + " .. failed,A XML parsing error occurred (" + se.toString() + "). Check the log for details."); 339 substep.setType(installStep.TYPE_ERROR); 340 return false; 341 } catch (java.io.IOException ioe) { 342 substep.setUserFeedBack("checking builder " + name + " .. failed,A file I/O error occurred (" + ioe.toString() + "). Check the log for details."); 343 substep.setType(installStep.TYPE_ERROR); 344 return false; 345 } 346 type.setValue("config", config); 347 348 } catch (Exception e) { 349 substep.setUserFeedBack("checking builder " + name + " .. failed, can't open builder.xml in cloudmodel jar"); 350 substep.setType(installStep.TYPE_ERROR); 351 return false; 352 } 353 try { 355 objectTypes.insert("system", type); 356 } catch (Exception e) { 357 e.printStackTrace(); 358 } 359 substep.setUserFeedBack("checking builder " + name + " ...installed"); 361 } else { 362 substep.setUserFeedBack("checking builder " + name + " ...allready installed"); 363 substep.setType(installStep.TYPE_WARNING); 364 } 365 366 } 367 return true; 368 } 369 370 371 377 private ExtendedDocumentReader getModelReader(JarFile jf) { 378 try { 379 JarEntry je = jf.getJarEntry("model.xml"); 380 if (je != null) { 381 InputStream input = jf.getInputStream(je); 382 ExtendedDocumentReader reader = new ExtendedDocumentReader(new InputSource (input), CloudModelPackage.class); 383 if (reader != null) { 384 return reader; 385 } 386 } 387 } catch (Exception e) { 388 log.error("problem opending model.xml file"); 389 } 390 return null; 391 } 392 393 394 395 407 private boolean installRelDef(String sname, String dname, int dir, String sguiname, String dguiname, int builder, installStep step) { 408 MMBase mmb = MMBase.getMMBase(); 409 RelDef reldef = mmb.getRelDef(); 410 if (reldef != null) { 411 installStep substep = step.getNextInstallStep(); 412 substep.setUserFeedBack("checking reldef " + sname + "/" + dname + " .."); 413 if (getBundleStep()!=null) getBundleStep().setUserFeedBack("calling package installer "+getName()+"..checking reldef " + sname + "/" + dname + " .."); 414 if (reldef.getNumberByName(sname + "/" + dname) == -1) { 415 MMObjectNode node = reldef.getNewNode("system"); 416 node.setValue("sname", sname); 417 node.setValue("dname", dname); 418 node.setValue("dir", dir); 419 node.setValue("sguiname", sguiname); 420 node.setValue("dguiname", dguiname); 421 if (RelDef.usesbuilder) { 422 if (builder <= 0) { 424 builder = mmb.getInsRel().getNumber(); 425 } 426 node.setValue("builder", builder); 427 } 428 int id = reldef.insert("system", node); 429 if (id != -1) { 430 substep.setUserFeedBack("checking reldef " + sname + "/" + dname + " ..installed"); 431 } else { 432 substep.setUserFeedBack("checking reldef " + sname + "/" + dname + " .. not installed"); 433 substep.setType(installStep.TYPE_ERROR); 434 return false; 435 } 436 } else { 437 substep.setUserFeedBack("checking reldef " + sname + "/" + dname + " .. allready installed"); 438 substep.setType(installStep.TYPE_WARNING); 439 } 440 } else { 441 installStep substep = step.getNextInstallStep(); 442 substep.setUserFeedBack("Can't use reldef !"); 443 substep.setType(installStep.TYPE_ERROR); 444 return false; 445 } 446 return true; 447 } 448 449 450 451 460 private boolean installTypeRel(String sname, String dname, String rname, int count) { 461 MMBase mmb = MMBase.getMMBase(); 462 TypeRel typerel = mmb.getTypeRel(); 463 if (typerel != null) { 464 TypeDef typedef = mmb.getTypeDef(); 465 if (typedef == null) { 466 return false; 468 } 469 RelDef reldef = mmb.getRelDef(); 470 if (reldef == null) { 471 return false; 473 } 474 475 int rnumber = reldef.getNumberByName(rname); 477 if (rnumber == -1) { 478 return false; 480 } 481 482 int snumber = typedef.getIntValue(sname); 484 if (snumber == -1) { 485 return false; 487 } 488 489 int dnumber = typedef.getIntValue(dname); 491 if (dnumber == -1) { 492 return false; 494 } 495 496 if (!typerel.contains(snumber, dnumber, rnumber, TypeRel.STRICT)) { 497 MMObjectNode node = typerel.getNewNode("system"); 498 node.setValue("snumber", snumber); 499 node.setValue("dnumber", dnumber); 500 node.setValue("rnumber", rnumber); 501 node.setValue("max", count); 502 int id = typerel.insert("system", node); 503 if (id != -1) { 504 log.debug("TypeRel (" + sname + "," + dname + "," + rname + ") installed"); 505 } else { 506 return false; 508 } 509 } 510 return true; 511 } else { 512 return false; 514 } 515 } 516 517 } 518 519 | Popular Tags |