1 7 package org.mmbase.applications.packaging.projects.editors.cloudmodel; 8 9 import java.io.BufferedWriter ; 10 import java.io.File ; 11 import java.io.FileOutputStream ; 12 import java.io.OutputStreamWriter ; 13 import java.io.Writer ; 14 import java.util.ArrayList ; 15 import java.util.Enumeration ; 16 import java.util.HashMap ; 17 import java.util.Iterator ; 18 import java.util.Map ; 19 20 import org.mmbase.applications.packaging.util.ExtendedDocumentReader; 21 import org.mmbase.util.XMLEntityResolver; 22 import org.mmbase.util.logging.Logger; 23 import org.mmbase.util.logging.Logging; 24 import org.w3c.dom.Element ; 25 import org.w3c.dom.NamedNodeMap ; 26 27 32 public class Model { 33 34 private static Logger log = Logging.getLoggerInstance(Model.class); 35 36 39 public final static String DTD_PACKAGING_CLOUD_MODEL_1_0 = "packaging_cloud_model_1_0.dtd"; 40 41 public final static String DTD_BUILDER_1_1 = "builder_1_1.dtd"; 42 43 46 public final static String PUBLIC_ID_PACKAGING_CLOUD_MODEL_1_0 = "-//MMBase//DTD packaging_cloud_model config 1.0//EN"; 47 48 public final static String PUBLIC_ID_BUILDER_1_1 = "-//MMBase//DTD builder config 1.1//EN"; 49 50 private ArrayList neededbuilders = new ArrayList (); 51 52 private ArrayList neededreldefs = new ArrayList (); 53 54 private ArrayList allowedrelations = new ArrayList (); 55 56 private String path; 57 58 61 public static void registerPublicIDs() { 62 XMLEntityResolver.registerPublicID(PUBLIC_ID_PACKAGING_CLOUD_MODEL_1_0, 63 "DTD_PACKAGING_CLOUD_MODEL_1_0", Model.class); 64 XMLEntityResolver.registerPublicID(PUBLIC_ID_BUILDER_1_1, "DTD_BUILDER_1_1", Model.class); 65 } 66 67 public Model(String modelfilename) { 68 modelfilename = modelfilename.replace('/', File.separatorChar); 69 modelfilename = modelfilename.replace('\\', File.separatorChar); 70 this.path = modelfilename; 71 readModel(modelfilename); 72 } 73 74 public Iterator getNeededBuilders() { 75 return neededbuilders.iterator(); 76 } 77 78 public NeededBuilder getNeededBuilder(String buildername) { 79 Iterator nbl = getNeededBuilders(); 80 while (nbl.hasNext()) { 81 NeededBuilder nb = (NeededBuilder) nbl.next(); 82 if (nb.getName().equals(buildername)) { return nb; } 83 } 84 return null; 85 } 86 87 public Iterator getNeededRelDefs() { 88 return neededreldefs.iterator(); 89 } 90 91 public Iterator getAllowedRelations() { 92 return allowedrelations.iterator(); 93 } 94 95 public boolean addNeededBuilder(String builder, String maintainer, String version) { 96 NeededBuilder nb = new NeededBuilder(); 97 nb.setName(builder); 98 nb.setMaintainer(maintainer); 99 nb.setVersion(version); 100 neededbuilders.add(nb); 101 writeModel(); 102 return true; 103 } 104 105 public boolean deleteNeededBuilder(String builder, String maintainer, String version) { 106 Iterator nbl = getNeededBuilders(); 107 while (nbl.hasNext()) { 108 NeededBuilder nb = (NeededBuilder) nbl.next(); 109 if (nb.getName().equals(builder) && nb.getMaintainer().equals(maintainer) 110 && nb.getVersion().equals(version)) { 111 neededbuilders.remove(nb); 112 writeModel(); 113 return true; 114 } 115 } 116 return false; 117 } 118 119 public boolean addNeededRelDef(String source, String target, String direction, 120 String guisourcename, String guitargetname, String builder) { 121 NeededRelDef nr = new NeededRelDef(); 122 nr.setSource(source); 123 nr.setTarget(target); 124 nr.setDirection(direction); 125 nr.setGuiSourceName(guisourcename); 126 nr.setGuiTargetName(guitargetname); 127 nr.setBuilderName(builder); 128 neededreldefs.add(nr); 129 writeModel(); 130 return true; 131 } 132 133 public boolean deleteNeededRelDef(String source, String target, String direction, 134 String guisourcename, String guitargetname, String builder) { 135 Iterator nrl = getNeededRelDefs(); 136 while (nrl.hasNext()) { 137 NeededRelDef nr = (NeededRelDef) nrl.next(); 138 if (nr.getSource().equals(source) && nr.getTarget().equals(target) 139 && nr.getDirection().equals(direction) 140 && nr.getGuiSourceName().equals(guitargetname) 141 && nr.getGuiTargetName().equals(guitargetname) 142 && nr.getBuilderName().equals(builder)) { 143 allowedrelations.remove(nr); 144 writeModel(); 145 return true; 146 } 147 } 148 return true; 149 } 150 151 public boolean addAllowedRelation(String from, String to, String type) { 152 AllowedRelation ar = new AllowedRelation(); 153 ar.setFrom(from); 154 ar.setTo(to); 155 ar.setType(type); 156 allowedrelations.add(ar); 157 writeModel(); 158 return true; 159 } 160 161 public boolean deleteAllowedRelation(String from, String to, String type) { 162 Iterator arl = getAllowedRelations(); 163 while (arl.hasNext()) { 164 AllowedRelation ar = (AllowedRelation) arl.next(); 165 if (ar.getFrom().equals(from) && ar.getTo().equals(to) && ar.getType().equals(type)) { 166 allowedrelations.remove(ar); 167 writeModel(); 168 return true; 169 } 170 } 171 return false; 172 } 173 174 private void readModel(String path) { 175 File file = new File (path); 176 if (file.exists()) { 177 ExtendedDocumentReader reader = new ExtendedDocumentReader(path, Model.class); 178 if (reader != null) { 179 for (Iterator ns = reader.getChildElements("cloudmodel.neededbuilderlist", 180 "builder"); ns.hasNext();) { 181 Element n = (Element ) ns.next(); 182 String name = reader.getElementValue(n); 183 NeededBuilder nb = new NeededBuilder(); 184 nb.setName(name); 185 NamedNodeMap nm = n.getAttributes(); 186 if (nm != null) { 187 org.w3c.dom.Node n2 = nm.getNamedItem("version"); 188 if (n2 != null) { 189 nb.setVersion(n2.getNodeValue()); 190 } 191 n2 = nm.getNamedItem("maintainer"); 192 if (n2 != null) { 193 nb.setMaintainer(n2.getNodeValue()); 194 } 195 } 196 neededbuilders.add(nb); 197 readBuilder(nb); 199 } 200 for (Iterator ns = reader.getChildElements("cloudmodel.neededreldeflist", "reldef"); ns 201 .hasNext();) { 202 Element n = (Element ) ns.next(); 203 NeededRelDef nr = new NeededRelDef(); 204 NamedNodeMap nm = n.getAttributes(); 205 if (nm != null) { 206 org.w3c.dom.Node n2 = nm.getNamedItem("source"); 207 if (n2 != null) { 208 nr.setSource(n2.getNodeValue()); 209 } 210 n2 = nm.getNamedItem("target"); 211 if (n2 != null) { 212 nr.setTarget(n2.getNodeValue()); 213 } 214 n2 = nm.getNamedItem("direction"); 215 if (n2 != null) { 216 nr.setDirection(n2.getNodeValue()); 217 } 218 n2 = nm.getNamedItem("guisourcename"); 219 if (n2 != null) { 220 nr.setGuiSourceName(n2.getNodeValue()); 221 } 222 n2 = nm.getNamedItem("guitargetname"); 223 if (n2 != null) { 224 nr.setGuiTargetName(n2.getNodeValue()); 225 } 226 n2 = nm.getNamedItem("builder"); 227 if (n2 != null) { 228 nr.setBuilderName(n2.getNodeValue()); 229 } 230 } 231 neededreldefs.add(nr); 232 } 233 234 for (Iterator ns = reader.getChildElements("cloudmodel.allowedrelationlist", 235 "relation"); ns.hasNext();) { 236 Element n = (Element ) ns.next(); 237 AllowedRelation ar = new AllowedRelation(); 238 NamedNodeMap nm = n.getAttributes(); 239 if (nm != null) { 240 org.w3c.dom.Node n2 = nm.getNamedItem("from"); 241 if (n2 != null) { 242 ar.setFrom(n2.getNodeValue()); 243 } 244 n2 = nm.getNamedItem("to"); 245 if (n2 != null) { 246 ar.setTo(n2.getNodeValue()); 247 } 248 n2 = nm.getNamedItem("type"); 249 if (n2 != null) { 250 ar.setType(n2.getNodeValue()); 251 } 252 } 253 allowedrelations.add(ar); 254 } 255 } 256 } 257 } 258 259 private void readBuilder(NeededBuilder nb) { 260 String builderpath = path.substring(0, path.length() - 4) + "/" + nb.getName() + ".xml"; 261 File file = new File (builderpath); 262 if (file.exists()) { 263 ExtendedDocumentReader reader = new ExtendedDocumentReader(builderpath, Model.class); 264 if (reader != null) { 265 org.w3c.dom.Node n = reader.getElementByPath("builder"); 266 if (n != null) { 267 NamedNodeMap nm = n.getAttributes(); 268 if (nm != null) { 269 org.w3c.dom.Node n2 = nm.getNamedItem("name"); 270 if (n2 != null) { 271 nb.setName(n2.getNodeValue()); 272 } 273 n2 = nm.getNamedItem("maintainer"); 274 if (n2 != null) { 275 nb.setMaintainer(n2.getNodeValue()); 276 } 277 n2 = nm.getNamedItem("version"); 278 if (n2 != null) { 279 nb.setVersion(n2.getNodeValue()); 280 } 281 n2 = nm.getNamedItem("extends"); 282 if (n2 != null) { 283 nb.setExtends(n2.getNodeValue()); 284 } 285 } 286 } 287 n = reader.getElementByPath("builder.status"); 288 if (n != null) { 289 org.w3c.dom.Node n2 = n.getFirstChild(); 290 if (n2 != null) { 291 nb.setStatus(n2.getNodeValue()); 292 } 293 } 294 n = reader.getElementByPath("builder.searchage"); 295 if (n != null) { 296 org.w3c.dom.Node n2 = n.getFirstChild(); 297 if (n2 != null) { 298 nb.setSearchAge(n2.getNodeValue()); 299 } 300 } 301 n = reader.getElementByPath("builder.classfile"); 302 if (n != null) { 303 org.w3c.dom.Node n2 = n.getFirstChild(); 304 if (n2 != null) { 305 nb.setClassName(n2.getNodeValue()); 306 } 307 } 308 for (Iterator ns = reader.getChildElements("builder.names", "singular"); ns 309 .hasNext();) { 310 Element n4 = (Element ) ns.next(); 311 String name = reader.getElementValue(n4); 312 NamedNodeMap nm = n4.getAttributes(); 313 if (nm != null) { 314 String language = "unknown"; 315 org.w3c.dom.Node n2 = nm.getNamedItem("xml:lang"); 316 if (n2 != null) { 317 language = n2.getNodeValue(); 318 } 319 nb.setSingularName(language, name); 320 } 321 } 322 for (Iterator ns = reader.getChildElements("builder.names", "plural"); ns.hasNext();) { 323 Element n4 = (Element ) ns.next(); 324 String name = reader.getElementValue(n4); 325 NamedNodeMap nm = n4.getAttributes(); 326 if (nm != null) { 327 String language = "unknown"; 328 org.w3c.dom.Node n2 = nm.getNamedItem("xml:lang"); 329 if (n2 != null) { 330 language = n2.getNodeValue(); 331 } 332 nb.setPluralName(language, name); 333 } 334 } 335 for (Iterator ns = reader.getChildElements("builder.descriptions", "description"); ns 336 .hasNext();) { 337 Element n4 = (Element ) ns.next(); 338 String description = reader.getElementValue(n4); 339 NamedNodeMap nm = n4.getAttributes(); 340 if (nm != null) { 341 String language = "unknown"; 342 org.w3c.dom.Node n2 = nm.getNamedItem("xml:lang"); 343 if (n2 != null) { 344 language = n2.getNodeValue(); 345 } 346 nb.setDescription(language, description); 347 } 348 } 349 for (Iterator ns = reader.getChildElements("builder.fieldlist", "field"); ns 350 .hasNext();) { 351 Element n4 = (Element ) ns.next(); 352 decodeField(nb, n4); 353 } 354 } 355 } 356 } 357 358 private void decodeField(NeededBuilder nb, Element n) { 359 NeededBuilderField nbf = new NeededBuilderField(); 360 org.w3c.dom.NodeList l = n.getElementsByTagName("description"); 361 for (int i = 0; i < l.getLength(); i++) { 362 org.w3c.dom.Node n2 = l.item(i); 363 NamedNodeMap nm = n2.getAttributes(); 364 if (nm != null) { 365 org.w3c.dom.Node n3 = nm.getNamedItem("xml:lang"); 366 if (n3 != null) { 367 nbf.setDescription(n3.getNodeValue(), n2.getFirstChild().getNodeValue()); 368 } 369 } 370 } 371 l = n.getElementsByTagName("guiname"); 372 for (int i = 0; i < l.getLength(); i++) { 373 org.w3c.dom.Node n2 = l.item(i); 374 NamedNodeMap nm = n2.getAttributes(); 375 if (nm != null) { 376 org.w3c.dom.Node n3 = nm.getNamedItem("xml:lang"); 377 if (n3 != null) { 378 nbf.setGuiName(n3.getNodeValue(), n2.getFirstChild().getNodeValue()); 379 } 380 } 381 } 382 l = n.getElementsByTagName("guitype"); 383 if (l.getLength() > 0) { 384 org.w3c.dom.Node n2 = l.item(0); 385 if (n2 != null) { 386 nbf.setGuiType(n2.getFirstChild().getNodeValue()); 387 } 388 } 389 l = n.getElementsByTagName("input"); 390 if (l.getLength() > 0) { 391 org.w3c.dom.Node n2 = l.item(0); 392 if (n2 != null) { 393 try { 394 nbf.setEditorInputPos(Integer.parseInt(n2.getFirstChild().getNodeValue())); 395 } 396 catch (Exception e) { 397 log.info("builder.field.editor.input not a number"); 398 } 399 } 400 } 401 l = n.getElementsByTagName("list"); 402 if (l.getLength() > 0) { 403 org.w3c.dom.Node n2 = l.item(0); 404 if (n2 != null) { 405 try { 406 nbf.setEditorListPos(Integer.parseInt(n2.getFirstChild().getNodeValue())); 407 } 408 catch (Exception e) { 409 log.info("builder.field.editor.list not a number"); 410 } 411 } 412 } 413 l = n.getElementsByTagName("search"); 414 if (l.getLength() > 0) { 415 org.w3c.dom.Node n2 = l.item(0); 416 if (n2 != null) { 417 try { 418 nbf.setEditorSearchPos(Integer.parseInt(n2.getFirstChild().getNodeValue())); 419 } 420 catch (Exception e) { 421 log.info("builder.field.editor.search not a number"); 422 } 423 } 424 } 425 l = n.getElementsByTagName("name"); 426 if (l.getLength() > 0) { 427 org.w3c.dom.Node n2 = l.item(0); 428 if (n2 != null) { 429 nbf.setDBName(n2.getFirstChild().getNodeValue()); 430 } 431 } 432 l = n.getElementsByTagName("type"); 433 if (l.getLength() > 0) { 434 org.w3c.dom.Node n2 = l.item(0); 435 if (n2 != null) { 436 nbf.setDBType(n2.getFirstChild().getNodeValue()); 437 } 438 NamedNodeMap nm = n2.getAttributes(); 439 if (nm != null) { 440 org.w3c.dom.Node n3 = nm.getNamedItem("state"); 441 if (n3 != null) { 442 nbf.setDBState(n3.getNodeValue()); 443 } 444 n3 = nm.getNamedItem("size"); 445 if (n3 != null) { 446 try { 447 nbf.setDBSize(Integer.parseInt(n3.getNodeValue())); 448 } 449 catch (Exception e) { 450 log.info("builder.field.editor.search not a number"); 451 } 452 } 453 n3 = nm.getNamedItem("key"); 454 if (n3 != null) { 455 if (n3.getNodeValue().equals("true") || n3.getNodeValue().equals("TRUE")) { 456 nbf.setDBKey(true); 457 } 458 else { 459 nbf.setDBKey(false); 460 } 461 } 462 n3 = nm.getNamedItem("notnull"); 463 if (n3 != null) { 464 if (n3.getNodeValue().equals("true") || n3.getNodeValue().equals("TRUE")) { 465 nbf.setDBNotNull(true); 466 } 467 else { 468 nbf.setDBNotNull(false); 469 } 470 } 471 } 472 } 473 nb.addField(nbf); 474 475 } 476 477 public boolean writeModel() { 478 String body = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"; 479 body += "<!DOCTYPE cloudmodel PUBLIC \"-//MMBase/DTD cloudmodel 1.0//EN\" \"http://www.mmbase.org/dtd/cloudmodel_1_0.dtd\">\n"; 480 481 body += "<cloudmodel>\n"; 482 body += "\t<neededbuilderlist>\n"; 483 Iterator nbl = getNeededBuilders(); 484 while (nbl.hasNext()) { 485 NeededBuilder nb = (NeededBuilder) nbl.next(); 486 body += "\t\t<builder maintainer=\"" + nb.getMaintainer() + "\" version=\"" 487 + nb.getVersion() + "\">" + nb.getName() + "</builder>\n"; 488 writeBuilder(nb); 489 } 490 body += "\t</neededbuilderlist>\n\n"; 491 492 body += "\t<neededreldeflist>\n"; 493 Iterator rdl = getNeededRelDefs(); 494 while (rdl.hasNext()) { 495 NeededRelDef nr = (NeededRelDef) rdl.next(); 496 body += "\t\t<reldef source=\"" + nr.getSource() + "\" target=\"" + nr.getTarget() 497 + "\" direction=\"" + nr.getDirection() + "\" guisourcename=\"" 498 + nr.getGuiSourceName() + "\" guitargetname=\"" + nr.getGuiTargetName() 499 + "\" builder=\"" + nr.getBuilderName() + "\" />\n"; 500 } 501 body += "\t</neededreldeflist>\n\n"; 502 503 body += "\t<allowedrelationlist>\n"; 504 Iterator arl = getAllowedRelations(); 505 while (arl.hasNext()) { 506 AllowedRelation ar = (AllowedRelation) arl.next(); 507 body += "\t\t<relation from=\"" + ar.getFrom() + "\" to=\"" + ar.getTo() + "\" type=\"" 508 + ar.getType() + "\" />\n"; 509 510 } 511 body += "\t</allowedrelationlist>\n\n"; 512 513 body += "</cloudmodel>\n"; 514 515 String dirsp = path.substring(0, path.lastIndexOf(File.separator)); 517 File dirs = new File (dirsp); 518 if (!dirs.exists()) { 519 dirs.mkdirs(); 520 } 521 522 try { 524 Writer out = new BufferedWriter (new OutputStreamWriter (new FileOutputStream (path), 525 "UTF8")); 526 out.write(body); 527 out.flush(); 528 out.close(); 529 } 530 catch (Exception e) { 531 log.error(Logging.stackTrace(e)); 532 } 533 return true; 534 } 535 536 private boolean writeBuilder(NeededBuilder nb) { 537 String builderpath = path.substring(0, path.length() - 4) + "/" + nb.getName() + ".xml"; 538 String body = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"; 539 body += "<!DOCTYPE builder PUBLIC \"-//MMBase/DTD builder 1.1//EN\" \"http://www.mmbase.org/dtd/builder_1_1.dtd\">\n"; 540 541 body += "<builder name=\"" + nb.getName() + "\" maintainer=\"" + nb.getMaintainer() 542 + "\" version=\"" + nb.getVersion() + "\" extends=\"" + nb.getExtends() + "\">\n"; 543 body += "\t<status>" + nb.getStatus() + "</status>\n"; 544 if (!nb.getClassName().equals("Dummy")) { 545 body += "\t<classfile>" + nb.getClassName() + "</classfile>\n"; 546 } 547 body += "\t<searchage>" + nb.getSearchAge() + "</searchage>\n"; 548 body += "\t<names>\n"; 549 body += "\t\t<!-- singles per language as defined by ISO 639 -->\n"; 550 HashMap sn = nb.getSingularNames(); 551 Iterator snk = sn.entrySet().iterator(); 552 while (snk.hasNext()) { 553 Map.Entry entry = (Map.Entry ) snk.next(); 554 String key = (String ) entry.getKey(); 555 String value = (String ) entry.getValue(); 556 body += "\t\t<singular xml:lang=\"" + key + "\">" + value + "</singular>\n"; 557 } 558 body += "\t\t<!-- singles per language as defined by ISO 639 -->\n"; 559 HashMap pn = nb.getPluralNames(); 560 Iterator pnk = pn.entrySet().iterator(); 561 while (pnk.hasNext()) { 562 Map.Entry entry = (Map.Entry ) pnk.next(); 563 String key = (String ) entry.getKey(); 564 String value = (String ) entry.getValue(); 565 body += "\t\t<plural xml:lang=\"" + key + "\">" + value + "</plural>\n"; 566 } 567 body += "\t</names>\n"; 568 body += "\t<!-- <descriptions> small description of the builder for human reading -->\n"; 569 body += "\t<descriptions>\n"; 570 Map de = nb.getDescriptions(); 571 Iterator dek = de.entrySet().iterator(); 572 while (dek.hasNext()) { 573 Map.Entry entry = (Map.Entry ) dek.next(); 574 String key = (String ) entry.getKey(); 575 String value = (String ) entry.getValue(); 576 body += "\t\t<description xml:lang=\"" + key + "\">" + value + "</description>\n"; 577 } 578 body += "\t</descriptions>\n"; 579 body += "\t<fieldlist>\n"; 580 Iterator fl = nb.getFields(); 581 int pos = 3; 582 while (fl.hasNext()) { 583 NeededBuilderField nbf = (NeededBuilderField) fl.next(); 584 body += "\t\t<!-- POS " + (pos++) + " : <field> '" + nbf.getDBName() + "' -->\n"; 585 body += "\t\t<field>\n"; 586 body += "\t\t\t<descriptions>\n"; 587 588 de = nbf.getDescriptions(); 589 dek = de.entrySet().iterator(); 590 while (dek.hasNext()) { 591 Map.Entry entry = (Map.Entry ) dek.next(); 592 String key = (String ) entry.getKey(); 593 String value = (String ) entry.getValue(); 594 body += "\t\t\t\t<description xml:lang=\"" + key + "\">" + value 595 + "</description>\n"; 596 } 597 body += "\t\t\t</descriptions>\n"; 598 body += "\t\t\t<gui>\n"; 599 de = nbf.getGuiNames(); 600 dek = de.entrySet().iterator(); 601 while (dek.hasNext()) { 602 Map.Entry entry = (Map.Entry ) dek.next(); 603 String key = (String ) entry.getKey(); 604 String value = (String ) entry.getValue(); 605 body += "\t\t\t\t<guiname xml:lang=\"" + key + "\">" + value + "</guiname>\n"; 606 } 607 body += "\t\t\t\t<guitype>" + nbf.getGuiType() + "</guitype>\n"; 608 body += "\t\t\t</gui>\n"; 609 body += "\t\t\t<!-- editor related -->\n"; 610 body += "\t\t\t<editor>\n"; 611 body += "\t\t\t\t<positions>\n"; 612 body += "\t\t\t\t\t<!-- position in the input area of the editor -->\n"; 613 body += "\t\t\t\t\t<input>" + nbf.getEditorInputPos() + "</input>\n"; 614 body += "\t\t\t\t\t<!-- position in list area of the editor -->\n"; 615 body += "\t\t\t\t\t<list>" + nbf.getEditorListPos() + "</list>\n"; 616 body += "\t\t\t\t\t<!-- position in search area of the editor -->\n"; 617 body += "\t\t\t\t\t<search>" + nbf.getEditorSearchPos() + "</search>\n"; 618 619 body += "\t\t\t\t</positions>\n"; 620 body += "\t\t\t</editor>\n"; 621 body += "\t\t\t<!-- database related -->\n"; 622 body += "\t\t\t<db>\n"; 623 body += "\t\t\t\t<!-- name of the field in the database -->\n"; 624 body += "\t\t\t\t<name>" + nbf.getDBName() + "</name>\n"; 625 body += "\t\t\t\t<!-- MMBase datatype and demands on it -->\n"; 626 if (nbf.getDBSize() == -1) { 627 body += "\t\t\t\t<type state=\"" + nbf.getDBState() + "\" notnull=\"" 628 + nbf.getDBNotNull() + "\" key=\"" + nbf.getDBKey() + "\">" 629 + nbf.getDBType() + "</type>\n"; 630 } 631 else { 632 body += "\t\t\t\t<type state=\"" + nbf.getDBState() + "\" size=\"" 633 + nbf.getDBSize() + "\" notnull=\"" + nbf.getDBNotNull() + "\" key=\"" 634 + nbf.getDBKey() + "\">" + nbf.getDBType() + "</type>\n"; 635 } 636 body += "\t\t\t</db>\n"; 637 body += "\t\t</field>\n"; 638 } 639 body += "\t</fieldlist>\n"; 640 body += "</builder>\n"; 641 642 String dirsp = builderpath.substring(0, builderpath.lastIndexOf(File.separator)); 644 File dirs = new File (dirsp); 645 if (!dirs.exists()) { 646 dirs.mkdirs(); 647 } 648 649 try { 651 Writer out = new BufferedWriter (new OutputStreamWriter ( 652 new FileOutputStream (builderpath), "UTF8")); 653 out.write(body); 654 out.flush(); 655 out.close(); 656 } 657 catch (Exception e) { 658 log.error(Logging.stackTrace(e)); 659 } 660 return true; 661 } 662 663 } 664 | Popular Tags |