1 2 22 23 package org.webdocwf.util.loader.generator; 24 25 import javax.xml.parsers.DocumentBuilder ; 26 import javax.xml.parsers.DocumentBuilderFactory ; 27 28 import org.w3c.dom.Document ; 29 import org.w3c.dom.Element ; 30 import org.w3c.dom.NodeList ; 31 import java.io.File ; 32 33 import java.io.*; 34 import java.util.*; 35 36 import org.enhydra.xml.*; 37 import org.webdocwf.util.loader.ConfigReader; 38 import org.webdocwf.util.loader.LoaderException; 39 import org.webdocwf.util.loader.logging.Logger; 40 import org.webdocwf.util.loader.logging.StandardLogger; 41 42 48 public class SearchXmlFile { 49 50 private SearchElement searchDocument; 51 private Document document; 52 private String fileName; 53 private String jdbcType = null; 54 private String sqlType = null; 55 private String javaType = null; 56 private String oidDbType = null; 57 private String versionDbType = null; 58 private String oidDbColumnName = null; 59 private String versionDbColumnName = null; 60 private InputStream is = null; 61 private File file = null; 62 private String octopusPath = null; 63 private String msg = null; 64 private Vector allVendors = new Vector(); 65 private Logger logger = null; 66 73 public SearchXmlFile(String typePath, String path, String confJarStructure) throws LoaderException { 74 75 76 setLogger(); 77 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 81 82 try { 83 octopusPath = System.getProperty("OCTOPUS_HOME"); 84 if (octopusPath == null) { 85 if (confJarStructure != null && !confJarStructure.equalsIgnoreCase("")) { 86 is = getClass().getClassLoader().getResourceAsStream(confJarStructure + "/" + path); 87 } else { 88 is = getClass().getClassLoader().getResourceAsStream("xml/conf/" + path); 89 } 90 } else { 91 if (typePath.equalsIgnoreCase("relative")) { 93 fileName = octopusPath + "/conf/" + path; 94 } else if (typePath.equalsIgnoreCase("absolute")) { 95 fileName = path; 96 if(!(new File (fileName).exists())) { 98 fileName = octopusPath + "/conf/" + path; 99 } 100 } 101 } 102 if (fileName != null) { 103 file = new File (fileName); 104 if (!file.exists()) { 105 msg = "This " + fileName + " file doesn't exists!!"; 106 LoaderException le = new LoaderException("Exception:", (Throwable ) new Exception (msg)); 107 if (this.logger!=null){ 108 this.logger.write("full", "Exception in SearchXmlFile." + le.getStackTraceAsString()); 109 } 110 throw le; 111 } 112 } 113 114 DocumentBuilder builder = factory.newDocumentBuilder(); 115 116 try { 117 if (octopusPath != null) 118 document = builder.parse(file); 119 else 120 document = builder.parse(is); 121 122 } catch (Exception e) { 123 if (fileName != null) 124 msg = "Exception has occurred when application try to parse " + fileName + " file." + "\n"; 125 else 126 msg = "Exception has occurred when application try to parse " + path + " file placed in jar file." + "\n"; 127 LoaderException le = new LoaderException("Exception:" + msg + e.getMessage(), (Throwable ) e); 128 if (this.logger!=null){ 129 this.logger.write("full", "Exception in SearchXmlFile." + msg +"\n" + le.getStackTraceAsString()); 130 } 131 132 throw le; 133 } 134 135 } catch (Exception e) { 136 String msg = "Exception in SearchXmlFile."; 137 LoaderException le = new LoaderException(msg + "\n" + e.getMessage(), (Throwable ) e); 138 if (this.logger!=null){ 139 this.logger.write("full", "Exception in SearchXmlFile." + "\n" + le.getStackTraceAsString()); 140 } 141 throw le; 142 } 143 147 } 148 149 153 public Vector getAllVendors() { 154 setLogger(); 155 searchDocument = (SearchElement) SearchElement.newInstance(document); 159 NodeList databaseVendors = searchDocument.getSubElementsByTagName("Database/Vendor"); 160 if (databaseVendors.getLength() != 0) { 161 for (int i = 0; i < databaseVendors.getLength(); i++) { 162 String vendorName = ((Element ) databaseVendors.item(i)).getAttribute("name"); 163 String vendorPath = getPathToConf(vendorName); 164 allVendors.add(vendorName); 165 } 166 } 167 return allVendors; 171 } 172 173 177 public Vector getAllVendorsPath() { 178 setLogger(); 179 searchDocument = (SearchElement) SearchElement.newInstance(document); 183 Vector allVendorsPath = new Vector(); 184 NodeList databaseVendors = searchDocument.getSubElementsByTagName("Database/Vendor"); 185 if (databaseVendors.getLength() != 0) { 186 for (int i = 0; i < databaseVendors.getLength(); i++) { 187 String vendorName = ((Element ) databaseVendors.item(i)).getAttribute("name"); 188 String vendorPath = getPathToConf(vendorName); 189 allVendorsPath.add(vendorPath); 190 } 191 } 192 return allVendorsPath; 196 } 197 198 202 public Vector getAllDriversForVendor() { 203 setLogger(); 204 Vector allDriversForVendor = new Vector(); 208 Vector drivers = new Vector(); 209 Vector metaDataDriver = new Vector(); 210 String sourceVendor = "false"; 211 searchDocument = (SearchElement) SearchElement.newInstance(document); 212 NodeList driverTag = searchDocument.getSubElementsByTagName("Driver"); 213 214 for (int i = 0; i < driverTag.getLength(); i++) { 215 String driverName = ((Element ) driverTag.item(i)).getAttribute("name"); 216 allDriversForVendor.add(driverName); 217 218 NodeList metaData = ((Element ) driverTag.item(i)).getElementsByTagName("MetaData"); 219 String supportMetaData = ((Element ) metaData.item(0)).getAttribute("value"); 220 221 if (supportMetaData.equalsIgnoreCase("true")) { 222 metaDataDriver.add(driverName); 223 sourceVendor = "true"; 224 } 225 } 226 drivers.add(allDriversForVendor); 227 drivers.add(metaDataDriver); 228 drivers.add(sourceVendor); 229 return drivers; 233 234 } 235 236 242 public String getPathToConf(String database_Type) { 243 setLogger(); 244 searchDocument = (SearchElement) SearchElement.newInstance(document); 248 NodeList databaseType = searchDocument.getSubElementsByCondition("Database/Vendor@name=" + database_Type); 251 if (databaseType.getLength() != 0) { 252 String pathToConf = databaseType.item(0).getFirstChild().getNodeValue(); 253 return pathToConf; 257 } else { 258 return null; 262 } 263 264 } 265 266 274 public void getClassName(String driverName, JdbcParameters jdbcParameters, InputParameters generatorParameters) throws LoaderException { 275 setLogger(); 276 searchDocument = (SearchElement) SearchElement.newInstance(document); 280 NodeList driverTag = null; 281 if (driverName.equalsIgnoreCase("")) { 282 driverTag = searchDocument.getSubElementsByTagName("Driver"); 283 } else { 284 driverTag = searchDocument.getSubElementsByCondition("Driver@name=" + driverName); 285 } 286 if (driverTag.getLength() != 0) { 287 NodeList classNameTag = ((Element ) driverTag.item(0)).getElementsByTagName("ClassName"); 288 if (classNameTag.getLength() == 0) { 289 if (fileName != null) 290 msg = "In " + fileName + " file for this database, you don't have ClassName tag!"; 291 else 292 msg = "In " + octopusPath + " ( in .jar) file for this database, you don't have ClassName tag!"; 293 294 LoaderException le = new LoaderException("Exception:", (Throwable ) new Exception (msg)); 295 if (this.logger!=null){ 296 this.logger.write("full", "Exception:"+"\n"+le.getStackTraceAsString()); 297 } 298 299 throw le; 300 } 301 jdbcParameters.setDriverClassName(((Element ) classNameTag.item(0)).getAttribute("value")); 302 303 NodeList connectionTag = ((Element ) driverTag.item(0)).getElementsByTagName("Connection"); 304 if (connectionTag.getLength() == 0) { 305 if (fileName != null) 306 msg = "In " + fileName + " file for this database, you don't have Connection tag!"; 307 else 308 msg = "In " + octopusPath + " ( in .jar) file for this database, you don't have Connection tag!"; 309 LoaderException le = new LoaderException("Exception:", (Throwable ) new Exception (msg)); 310 if (this.logger!=null){ 311 this.logger.write("full", "Exception:"+"\n"+le.getStackTraceAsString()); 312 } 313 throw le; 314 } 315 jdbcParameters.setConnection(((Element ) connectionTag.item(0)).getAttribute("value")); 316 } else { 328 if (fileName != null) 329 msg = "In " + fileName + " file for this database, specified driver name (" + driverName + ") is not valid!"; 330 else 331 msg = "In " + octopusPath + " ( in .jar) file for this database, specified driver name (" + driverName + ") is not valid!"; 332 LoaderException le = new LoaderException("Exception:", (Throwable ) new Exception (msg)); 333 if (this.logger!=null){ 334 this.logger.write("full", "Exception:"+"\n"+le.getStackTraceAsString()); 335 } 336 337 throw le; 338 } 339 } 343 344 public Vector getFileSystemDatabase(String driverName) throws LoaderException { 345 setLogger(); 346 Vector driverProperties = new Vector(); 350 String strFileSystemDatabase = ""; 351 String strConnection = ""; 352 353 searchDocument = (SearchElement) SearchElement.newInstance(document); 354 NodeList driverTag = null; 355 if (driverName.equalsIgnoreCase("")) { 356 driverTag = searchDocument.getSubElementsByTagName("Driver"); 357 } else { 358 driverTag = searchDocument.getSubElementsByCondition("Driver@name=" + driverName); 359 } 360 if (driverTag.getLength() != 0) { 361 NodeList fileSystemDatabaseTag = ((Element ) driverTag.item(0)).getElementsByTagName("FileSystemDatabase"); 363 if (fileSystemDatabaseTag.getLength() == 0) { 364 if (fileName != null) 365 msg = "In " + fileName + " file for this database, you don't have FileSystemDatabase tag!"; 366 else 367 msg = "In " + octopusPath + " ( in .jar) file for this database, you don't have FileSystemDatabase tag!"; 368 LoaderException le = new LoaderException("Exception:", (Throwable ) new Exception (msg)); 369 if (this.logger!=null){ 370 this.logger.write("full", "Exception:"+le.getStackTraceAsString()); 371 } 372 throw le; 373 } else { 374 strFileSystemDatabase = ((Element ) fileSystemDatabaseTag.item(0)).getAttribute("value"); 375 } 376 377 NodeList connectionTag = ((Element ) driverTag.item(0)).getElementsByTagName("Connection"); 379 if (connectionTag.getLength() == 0) { 380 if (fileName != null) 381 msg = "In " + fileName + " file for this database, you don't have Connection tag!"; 382 else 383 msg = "In " + octopusPath + " ( in .jar) file for this database, you don't have Connection tag!"; 384 LoaderException le = new LoaderException("Exception:", (Throwable ) new Exception (msg)); 385 if (this.logger!=null){ 386 this.logger.write("full", "Exception:"+le.getStackTraceAsString()); 387 } 388 389 throw le; 390 } else { 391 strConnection = ((Element ) connectionTag.item(0)).getAttribute("value"); 392 } 393 394 } else { 395 if (fileName != null) 396 msg = "In " + fileName + " file for this database, specified driver name (" + driverName + ") is not valid!"; 397 else 398 msg = "In " + octopusPath + " ( in .jar) file for this database, specified driver name (" + driverName + ") is not valid!"; 399 LoaderException le = new LoaderException("Exception:", (Throwable ) new Exception (msg)); 400 if (this.logger!=null){ 401 this.logger.write("full", "Exception:"+le.getStackTraceAsString()); 402 } 403 throw le; 404 } 405 driverProperties.add(strFileSystemDatabase); 406 driverProperties.add(strConnection); 407 return driverProperties; 411 } 412 413 public String getMaxConstraintLength(String driverName) throws LoaderException { 414 setLogger(); 415 String maxConstraintLength = "-1"; 419 searchDocument = (SearchElement) SearchElement.newInstance(document); 420 NodeList driverTag = null; 421 if (driverName.equalsIgnoreCase("")) { 422 driverTag = searchDocument.getSubElementsByTagName("Driver"); 423 } else { 424 driverTag = searchDocument.getSubElementsByCondition("Driver@name=" + driverName); 425 } 426 if (driverTag.getLength() != 0) { 427 try { 428 NodeList maxConstraintLengthTag = ((Element ) driverTag.item(0)).getElementsByTagName("MaxConstraintLength"); 429 430 maxConstraintLength = ((Element ) maxConstraintLengthTag.item(0)).getAttribute("value"); 431 432 } catch (Exception ex) { 433 if (fileName != null) 434 msg = "In " + fileName + " file for this database, you don't have maxConstraintLenght tag!"; 435 else 436 msg = "In " + octopusPath + " ( in .jar) file for this database, you don't have maxConstraintLenght tag!"; 437 LoaderException le = new LoaderException("Exception:", new Exception (msg)); 438 if (this.logger!=null){ 439 this.logger.write("full", "Exception:"+"\n"+le.getStackTraceAsString()); 440 } 441 442 throw le; 443 } 444 445 } 446 return maxConstraintLength; 450 } 451 452 458 public String getAlterTablePrimaryKey(String driverName) throws LoaderException { 459 setLogger(); 460 searchDocument = (SearchElement) SearchElement.newInstance(document); 464 NodeList driverTag = null; 465 if (driverName.equalsIgnoreCase("")) { 466 driverTag = searchDocument.getSubElementsByTagName("Driver"); 467 } else { 468 driverTag = searchDocument.getSubElementsByCondition("Driver@name=" + driverName); 469 } 470 if (driverTag.getLength() != 0) { 471 NodeList alterTableTag = ((Element ) driverTag.item(0)).getElementsByTagName("AlterTablePrimaryKey"); 472 if (alterTableTag.getLength() == 0) { 473 if (fileName != null) 474 msg = "In " + fileName + " file for this database, you don't have AlterTablePrimaryKey tag!"; 475 else 476 msg = "In " + octopusPath + " ( in .jar) file for this database, you don't have AlterTablePrimaryKey tag!"; 477 LoaderException le = new LoaderException("Exception:", (Throwable ) new Exception (msg)); 478 if (this.logger!=null){ 479 this.logger.write("full", "Exception:"+le.getStackTraceAsString()); 480 } 481 throw le; 482 } else { 483 String ret = ((Element ) alterTableTag.item(0)).getAttribute("value"); 484 return ret; 488 } 489 490 } else { 491 if (fileName != null) 492 msg = "In " + fileName + " file for this database, specified driver name (" + driverName + ") is not valid!"; 493 else 494 msg = "In " + octopusPath + " ( in .jar) file for this database, specified driver name (" + driverName + ") is not valid!"; 495 LoaderException le = new LoaderException("Exception:", (Throwable ) new Exception (msg)); 496 if (this.logger!=null){ 497 this.logger.write("full", "Exception:"+le.getStackTraceAsString()); 498 } 499 throw le; 500 } 501 502 } 503 504 511 public String getJDBCFromSQLType(String sql_Type) throws LoaderException { 512 setLogger(); 513 searchDocument = (SearchElement) SearchElement.newInstance(document); 517 sql_Type = Utils.replaceAll(sql_Type, " ", ConfigReader.SPACE_ESCAPE); 519 NodeList SQLTypeTag = searchDocument.getSubElementsByTagName("SQLType/" + sql_Type.toUpperCase()); 520 if (SQLTypeTag.getLength() != 0) { 521 jdbcType = SQLTypeTag.item(0).getFirstChild().getNodeValue(); 522 } else { 523 String msg = "This type of data (" + sql_Type + ") doesn't exists in the source table conf file!"; 524 LoaderException le = new LoaderException("Exception:", new Exception (msg)); 525 if (this.logger!=null){ 526 this.logger.write("full", "Exception:"+le.getStackTraceAsString()); 527 } 528 529 throw le; 530 } 531 return jdbcType; 535 } 536 537 543 public Hashtable getHasSize() throws LoaderException { 544 setLogger(); 545 Hashtable resHashtable = new Hashtable(); 549 searchDocument = (SearchElement) SearchElement.newInstance(document); 550 NodeList SQLTypesTagX = searchDocument.getSubElementsByTagName("SQLType"); 551 NodeList SQLTypesTag = SQLTypesTagX.item(0).getChildNodes(); 552 if (SQLTypesTag.getLength() != 0) { 553 for (int i = 0; i < SQLTypesTag.getLength(); i++) { 554 if (!(SQLTypesTag.item(i) instanceof org.enhydra.xml.SearchElement)) 555 continue; 556 String hasSize = ((Element ) SQLTypesTag.item(i)).getAttribute("hasSize"); 557 if (hasSize == null || hasSize.equalsIgnoreCase("")) 558 hasSize = "false"; 559 String nodeName = ((Element ) SQLTypesTag.item(i)).getNodeName(); 560 nodeName = Utils.replaceAll(nodeName, ConfigReader.SPACE_ESCAPE, " "); 561 resHashtable.put(nodeName, hasSize); 562 } 563 } else { 564 String msg = "Exception in method getHasSize in class SearchXmlFile."; 565 LoaderException le = new LoaderException("Exception:", (Throwable ) new Exception (msg)); 566 if (this.logger!=null){ 567 this.logger.write("full", "Error:"+le.getStackTraceAsString()); 568 } 569 throw le; 570 } 571 return resHashtable; 575 } 576 581 public Hashtable getIsDecimal() throws LoaderException { 582 setLogger(); 583 Hashtable resHashtable = new Hashtable(); 587 searchDocument = (SearchElement) SearchElement.newInstance(document); 588 NodeList SQLTypesTagX = searchDocument.getSubElementsByTagName("SQLType"); 589 NodeList SQLTypesTag = SQLTypesTagX.item(0).getChildNodes(); 590 if (SQLTypesTag.getLength() != 0) { 591 for (int i = 0; i < SQLTypesTag.getLength(); i++) { 592 if (!(SQLTypesTag.item(i) instanceof org.enhydra.xml.SearchElement)) 593 continue; 594 String hasSize = ((Element ) SQLTypesTag.item(i)).getAttribute("isDecimal"); 595 if (hasSize == null || hasSize.equalsIgnoreCase("")) 596 hasSize = "false"; 597 String nodeName = ((Element ) SQLTypesTag.item(i)).getNodeName(); 598 nodeName = Utils.replaceAll(nodeName, ConfigReader.SPACE_ESCAPE, " "); 599 resHashtable.put(nodeName, hasSize); 600 } 601 } else { 602 String msg = "Exception in method getIsDecimal in class SearchXmlFile."; 603 LoaderException le = new LoaderException("Exception:", new Exception (msg)); 604 if (this.logger!=null){ 605 this.logger.write("full", "Error:"+le.getStackTraceAsString()); 606 } 607 throw le; 608 } 609 return resHashtable; 613 } 614 621 public String getSQLFromJDBCType(String jdbc_Type) throws LoaderException { 622 setLogger(); 623 searchDocument = (SearchElement) SearchElement.newInstance(document); 627 NodeList JDBCTypeTag = searchDocument.getSubElementsByTagName("JDBCType/" + jdbc_Type.toUpperCase()); 628 if (JDBCTypeTag.getLength() != 0) { 629 sqlType = JDBCTypeTag.item(0).getFirstChild().getNodeValue(); 630 } else { 631 String msg = "This type of data (" + jdbc_Type + ") doesn't exists on the target table conf file!"; 632 LoaderException le = new LoaderException("Exception:", new Exception (msg)); 633 if (this.logger!=null){ 634 this.logger.write("full", "Error:"+le.getStackTraceAsString()); 635 } 636 throw le; 637 } 638 return sqlType; 642 } 643 644 651 public String getJAVAType(String java_Type) throws LoaderException { 652 setLogger(); 653 searchDocument = (SearchElement) SearchElement.newInstance(document); 657 java_Type = Utils.replaceAll(java_Type, " ", ConfigReader.SPACE_ESCAPE); 658 NodeList JAVATypeTag = searchDocument.getSubElementsByTagName("JAVAType/" + java_Type.toUpperCase()); 659 if (JAVATypeTag.getLength() != 0) { 660 javaType = JAVATypeTag.item(0).getFirstChild().getNodeValue(); 661 } else { 662 String msg = "This type of data (" + java_Type + ") doesn't exists in Java Type class!"; 663 LoaderException le = new LoaderException("Exception:", new Exception (msg)); 664 if (this.logger!=null){ 665 this.logger.write("full", "Error:"+le.getStackTraceAsString()); 666 } 667 throw le; 668 } 669 return javaType; 673 } 674 675 681 public String getOidDB() throws LoaderException { 682 setLogger(); 683 searchDocument = (SearchElement) SearchElement.newInstance(document); 687 NodeList OidDb = searchDocument.getSubElementsByTagName("OidDbType"); 688 if (OidDb.getLength() != 0) { 689 this.oidDbType = OidDb.item(0).getFirstChild().getNodeValue(); 690 } else { 691 String msg = "You must cofigure your conf file for this Oid type!"; 692 LoaderException le = new LoaderException("Exception:", new Exception (msg)); 693 if (this.logger!=null){ 694 this.logger.write("full", "Error:"+le.getStackTraceAsString()); 695 } 696 throw le; 697 } 698 return oidDbType; 702 } 703 704 710 public String getVersionDb() throws LoaderException { 711 setLogger(); 712 searchDocument = (SearchElement) SearchElement.newInstance(document); 716 NodeList VersionDb = searchDocument.getSubElementsByTagName("VersionDbType"); 717 if (VersionDb.getLength() != 0) { 718 this.versionDbType = VersionDb.item(0).getFirstChild().getNodeValue(); 719 } else { 720 String msg = "You must cofigure yoor conf file for this Version type!"; 721 LoaderException le = new LoaderException("Exception:", new Exception (msg)); 722 if (this.logger!=null){ 723 this.logger.write("full", "Error:"+le.getStackTraceAsString()); 724 } 725 throw le; 726 } 727 return versionDbType; 731 } 732 733 739 public String getOidDbColumn() throws LoaderException { 740 setLogger(); 741 searchDocument = (SearchElement) SearchElement.newInstance(document); 745 NodeList OidDbColumn = searchDocument.getSubElementsByTagName("OidDbColumnName"); 746 if (OidDbColumn.getLength() != 0) { 747 this.oidDbColumnName = OidDbColumn.item(0).getFirstChild().getNodeValue(); 748 } else { 749 String msg = "You must cofigure yoor conf file for this Oid name!"; 750 LoaderException le = new LoaderException("Exception:", new Exception (msg)); 751 if (this.logger!=null){ 752 this.logger.write("full", "Error:"+le.getStackTraceAsString()); 753 } 754 throw le; 755 } 756 return oidDbColumnName; 760 } 761 762 768 public String getVersionDbColumn() throws LoaderException { 769 setLogger(); 770 searchDocument = (SearchElement) SearchElement.newInstance(document); 774 NodeList VersionDbColumn = searchDocument.getSubElementsByTagName("VersionDbColumnName"); 775 if (VersionDbColumn.getLength() != 0) { 776 this.versionDbColumnName = VersionDbColumn.item(0).getFirstChild().getNodeValue(); 777 } else { 778 String msg = "You must cofigure yoor conf file for this Version name!"; 779 LoaderException le = new LoaderException("Exception:", new Exception (msg)); 780 if (this.logger!=null){ 781 this.logger.write("full", "Error:"+le.getStackTraceAsString()); 782 } 783 throw le; 784 } 785 return versionDbColumnName; 789 } 790 791 796 public String getDriverName() { 797 setLogger(); 798 searchDocument = (SearchElement) SearchElement.newInstance(document); 802 NodeList driverTag = searchDocument.getSubElementsByTagName("Driver"); 803 return ((Element ) driverTag.item(0)).getAttribute("name"); 807 808 } 809 810 public String getExcludedTables() throws LoaderException { 811 setLogger(); 812 String ret = ""; 816 searchDocument = (SearchElement) SearchElement.newInstance(document); 817 NodeList excludeTableTag = searchDocument.getSubElementsByTagName("ExcludeTables"); 818 if (excludeTableTag.getLength() != 0) { 819 if (excludeTableTag.item(0).getFirstChild() != null) 820 ret = excludeTableTag.item(0).getFirstChild().getNodeValue(); 821 else 822 ret = ""; 823 } else { 824 String msg = "ExcludeTables tag doesn't exist in source conf file!"; 825 LoaderException le = new LoaderException("Exception:", (Throwable ) new Exception (msg)); 826 if (this.logger!=null){ 827 this.logger.write("full", "Error:"+le.getStackTraceAsString()); 828 } 829 throw le; 830 } 831 return ret; 835 } 836 840 private void setLogger() { 841 this.logger = StandardLogger.getCentralLogger(); 842 } 843 } 844 | Popular Tags |