001package gudusoft.gsqlparser.util; 002 003import gudusoft.gsqlparser.EDbVendor; 004import gudusoft.gsqlparser.dlineage.dataflow.model.ModelBindingManager; 005import gudusoft.gsqlparser.dlineage.dataflow.model.SubType; 006import gudusoft.gsqlparser.dlineage.dataflow.model.xml.table; 007import gudusoft.gsqlparser.sqlenv.ESQLDataObjectType; 008import gudusoft.gsqlparser.sqlenv.TSQLEnv; 009 010import java.io.*; 011import java.nio.charset.Charset; 012import java.security.MessageDigest; 013import java.util.ArrayList; 014import java.util.Arrays; 015import java.util.Collections; 016import java.util.List; 017 018public class SQLUtil { 019 private static final Logger logger = LoggerFactory.getLogger(SQLUtil.class); 020 021 public static boolean isEmpty(String value) { 022 return value == null || value.trim().length() == 0; 023 } 024 025 public static String getFileContent(File file) { 026 String charset = null; 027 String sqlfilename = file.getAbsolutePath(); 028 int read = 0; 029 try { 030 FileInputStream fr = new FileInputStream(sqlfilename); 031 byte[] bom = new byte[4]; 032 fr.read(bom, 0, bom.length); 033 034 if ((bom[0] == (byte) 0x00) && (bom[1] == (byte) 0x00) && (bom[2] == (byte) 0xFE) 035 && (bom[3] == (byte) 0xFF)) { 036 charset = "UTF-32BE"; 037 read = 4; 038 } else if ((bom[0] == (byte) 0xFF) && (bom[1] == (byte) 0xFE) && (bom[2] == (byte) 0x00) 039 && (bom[3] == (byte) 0x00)) { 040 charset = "UTF-32LE"; 041 read = 4; 042 } else if ((bom[0] == (byte) 0xEF) && (bom[1] == (byte) 0xBB) && (bom[2] == (byte) 0xBF)) { 043 charset = "UTF-8"; 044 read = 3; 045 } else if ((bom[0] == (byte) 0xFE) && (bom[1] == (byte) 0xFF)) { 046 charset = "UTF-16BE"; 047 read = 2; 048 } else if ((bom[0] == (byte) 0xFF) && (bom[1] == (byte) 0xFE)) { 049 charset = "UTF-16LE"; 050 read = 2; 051 } else { 052 charset = "UTF-8"; 053 read = 0; 054 } 055 056 fr.close(); 057 } catch (IOException e) { 058 logger.error("Check file encoding failed.", e); 059 } 060 061 Long filelength = file.length(); 062 byte[] filecontent = new byte[filelength.intValue()]; 063 try { 064 InputStream in = new BufferedInputStream(new FileInputStream(sqlfilename)); 065 in.read(filecontent); 066 in.close(); 067 } catch (IOException e) { 068 logger.error("read file content failed.", e); 069 } 070 071 byte[] content = new byte[filelength.intValue() - read]; 072 System.arraycopy(filecontent, read, content, 0, content.length); 073 074 try { 075 String fileContent = new String(content, charset == null ? Charset.defaultCharset().name() : charset); 076 return fileContent.replace((char) 160, (char) 32); 077 } catch (UnsupportedEncodingException e) { 078 logger.error("The OS does not support " + charset == null ? Charset.defaultCharset().name() : charset, e); 079 return null; 080 } 081 } 082 083 public static String getInputStreamContent(InputStream is, boolean close) { 084 try { 085 ByteArrayOutputStream out = new ByteArrayOutputStream(4096); 086 byte[] tmp = new byte[4096]; 087 while (true) { 088 int r = is.read(tmp); 089 if (r == -1) 090 break; 091 out.write(tmp, 0, r); 092 } 093 byte[] bytes = out.toByteArray(); 094 if (close) { 095 is.close(); 096 } 097 out.close(); 098 String content = new String(bytes); 099 return content; 100 } catch (IOException e) { 101 logger.error("read inputStream failed.", e); 102 } 103 return null; 104 } 105 106 public static String getFileContent(String filePath) { 107 if (filePath == null) 108 return ""; 109 File file = new File(filePath); 110 if (!file.exists() || file.isDirectory()) 111 return ""; 112 return getFileContent(file); 113 } 114 115 public static String trimColumnStringQuote(String string) { 116 try { 117 if (string == null) 118 return string; 119 120 if (string.indexOf('.') != -1) { 121 List<String> splits = parseNames(string); 122 if (splits.size() > 1) { 123 StringBuilder buffer = new StringBuilder(); 124 for (int i = 0; i < splits.size(); i++) { 125 String segment = splits.get(i); 126 if (parseNames(trimColumnStringQuote(segment)).size() > 1) { 127 buffer.append(segment); 128 } else { 129 buffer.append(trimColumnStringQuote(segment)); 130 } 131 if (i < splits.size() - 1) { 132 buffer.append("."); 133 } 134 } 135 string = buffer.toString(); 136 return string; 137 } 138 } 139 if (string.length() < 2) { 140 return string; 141 } 142 if (string.startsWith("'") && string.endsWith("'")) 143 return string.substring(1, string.length() - 1); 144 else if (string.startsWith("\"") && string.endsWith("\"")) 145 return string.substring(1, string.length() - 1); 146 else if (string.startsWith("`") && string.endsWith("`")) 147 return string.substring(1, string.length() - 1); 148 else if (string.startsWith("[") && string.endsWith("]")) 149 return string.substring(1, string.length() - 1); 150 return string; 151 }catch (Exception e){ 152 return string; 153 } 154 } 155 156// public static List<String> parseNames(String nameString, EDbVendor vendor) { 157// List<String> names = new ArrayList<String>(); 158// if (nameString.startsWith("`") && nameString.endsWith("`")){ 159// nameString = nameString.substring(1,nameString.length()-1); 160// } 161// String[] splits = nameString.trim().split("\\."); 162// 163// for (int i = 0; i < splits.length; i++) { 164// String split = splits[i].trim(); 165// if (TSQLEnv.isDelimitedIdentifier(vendor, split) && !TSQLEnv.endsWithDelimitedIdentifier(vendor, split)) { 166// StringBuilder buffer = new StringBuilder(); 167// buffer.append(splits[i]); 168// while (i < splits.length - 1 169// && !TSQLEnv.endsWithDelimitedIdentifier(vendor, split = splits[++i].trim())) { 170// buffer.append("."); 171// buffer.append(splits[i]); 172// } 173// 174// buffer.append("."); 175// buffer.append(splits[i]); 176// 177// names.add(buffer.toString()); 178// continue; 179// } 180// names.add(splits[i]); 181// } 182// return names; 183// } 184 185 public static List<String> parseNames(String nameString) { 186 return parseNames(nameString, null); 187 } 188 189 // Pre-compiled patterns for better performance 190 private static final java.util.regex.Pattern DOT_PATTERN = java.util.regex.Pattern.compile("\\s*\\.\\s*"); 191 192 public static List<String> parseNames(String nameString, EDbVendor vendor) { 193 if(nameString == null){ 194 return Collections.EMPTY_LIST; 195 } 196 String name = nameString.trim(); 197 List<String> names = new ArrayList<String>(); 198 if (vendor == EDbVendor.dbvbigquery) { 199 if (name.contains("`")) { 200 // Use pre-compiled pattern and avoid unnecessary array creation 201 String[] parts = DOT_PATTERN.split(name.replace("`", "")); 202 for (String part : parts) { 203 names.add(part); 204 } 205 return names; 206 } 207 } 208 try { 209 // Use pre-compiled pattern instead of creating a new one each time 210 String[] splits = DOT_PATTERN.split(nameString); 211 if (name.contains("'")) { 212 for (int i = 0; i < splits.length; i++) { 213 String split = splits[i].trim(); 214 if (split.startsWith("'") && !split.endsWith("'")) { 215 StringBuilder buffer = new StringBuilder(split.length() * 2); 216 buffer.append(splits[i]); 217 while (!(split = splits[++i].trim()).endsWith("'")) { 218 buffer.append("."); 219 buffer.append(splits[i]); 220 if (i == splits.length - 1) { 221 break; 222 } 223 } 224 225 buffer.append("."); 226 buffer.append(splits[i]); 227 228 names.add(buffer.toString()); 229 continue; 230 } 231 names.add(splits[i]); 232 } 233 } else if (name.contains("(")) { 234 for (int i = 0; i < splits.length; i++) { 235 String split = splits[i].trim(); 236 if (split.indexOf("(") != -1 && split.indexOf(")") == -1) { 237 StringBuilder buffer = new StringBuilder(split.length() * 2); 238 buffer.append(splits[i]); 239 while ((split = splits[++i].trim()).indexOf(")")==-1) { 240 buffer.append("."); 241 buffer.append(splits[i]); 242 if (i == splits.length - 1) { 243 break; 244 } 245 } 246 247 buffer.append("."); 248 buffer.append(splits[i]); 249 250 names.add(buffer.toString()); 251 continue; 252 } 253 names.add(splits[i]); 254 } 255 } else if (name.contains("`")) { 256 for (int i = 0; i < splits.length; i++) { 257 String split = splits[i].trim(); 258 if (split.startsWith("`") && !split.endsWith("`")) { 259 StringBuilder buffer = new StringBuilder(split.length() * 2); 260 buffer.append(splits[i]); 261 while (!(split = splits[++i].trim()).endsWith("`")) { 262 buffer.append("."); 263 buffer.append(splits[i]); 264 if (i == splits.length - 1) { 265 break; 266 } 267 } 268 269 buffer.append("."); 270 buffer.append(splits[i]); 271 272 names.add(buffer.toString()); 273 continue; 274 } 275 names.add(splits[i]); 276 } 277 } else if (name.contains("\"")) { 278 for (int i = 0; i < splits.length; i++) { 279 String split = splits[i].trim(); 280 if (split.startsWith("\"") && !split.endsWith("\"")) { 281 StringBuilder buffer = new StringBuilder(split.length() * 2); 282 buffer.append(splits[i]); 283 while (!(split = splits[++i].trim()).endsWith("\"")) { 284 buffer.append("."); 285 buffer.append(splits[i]); 286 if (i == splits.length - 1) { 287 break; 288 } 289 } 290 291 buffer.append("."); 292 buffer.append(splits[i]); 293 294 names.add(buffer.toString()); 295 continue; 296 } 297 names.add(splits[i]); 298 } 299 } else if ((name.contains("[") && name.contains("]"))) { 300 for (int i = 0; i < splits.length; i++) { 301 String split = splits[i].trim(); 302 if (split.startsWith("[") && !split.endsWith("]")) { 303 StringBuilder buffer = new StringBuilder(split.length() * 2); 304 buffer.append(splits[i]); 305 if (i < splits.length - 1) { 306 while (!(split = splits[++i].trim()).endsWith("]")) { 307 buffer.append("."); 308 buffer.append(splits[i]); 309 if (i == splits.length - 1) { 310 break; 311 } 312 } 313 } 314 315 buffer.append("."); 316 buffer.append(splits[i]); 317 318 names.add(buffer.toString()); 319 continue; 320 } 321 names.add(splits[i]); 322 } 323 } else { 324 // Avoid unnecessary object creation from Arrays.asList 325 for (String split : splits) { 326 names.add(split); 327 } 328 } 329 } catch (Throwable e) { 330 names.clear(); 331 names.add(nameString); 332 } 333 return names; 334 } 335 336 public static void main(String[] args) { 337 SQLUtil.parseNames("OPENJSON(aptd.test.ActiviteTypeIDs)"); 338 } 339 340 public static void writeToFile(File file, InputStream source, boolean close) { 341 BufferedInputStream bis = null; 342 BufferedOutputStream fouts = null; 343 try { 344 bis = new BufferedInputStream(source); 345 if (!file.exists()) { 346 if (!file.getParentFile().exists()) { 347 file.getParentFile().mkdirs(); 348 } 349 file.createNewFile(); 350 } 351 fouts = new BufferedOutputStream(new FileOutputStream(file)); 352 byte b[] = new byte[1024]; 353 int i = 0; 354 while ((i = bis.read(b)) != -1) { 355 fouts.write(b, 0, i); 356 } 357 fouts.flush(); 358 fouts.close(); 359 if (close) 360 bis.close(); 361 } catch (IOException e) { 362 logger.error("Write file failed.", e); 363 try { 364 if (fouts != null) 365 fouts.close(); 366 } catch (IOException f) { 367 logger.error("Close output stream failed.", f); 368 } 369 if (close) { 370 try { 371 if (bis != null) 372 bis.close(); 373 } catch (IOException f) { 374 logger.error("Close input stream failed.", f); 375 } 376 } 377 } 378 } 379 380 public static void writeToFile(File file, String string) throws IOException { 381 382 if (!file.exists()) { 383 if (!file.getParentFile().exists()) { 384 file.getParentFile().mkdirs(); 385 } 386 file.createNewFile(); 387 } 388 PrintWriter out = new PrintWriter(new OutputStreamWriter(new FileOutputStream(file))); 389 if (string != null) 390 out.print(string); 391 out.close(); 392 } 393 394 public static void appendToFile(File file, String string) throws IOException { 395 396 if (!file.exists()) { 397 if (!file.getParentFile().exists()) { 398 file.getParentFile().mkdirs(); 399 } 400 file.createNewFile(); 401 } 402 PrintWriter out = new PrintWriter(new OutputStreamWriter(new FileOutputStream(file, true))); 403 if (string != null) 404 out.println(string); 405 out.close(); 406 } 407 408 public static void deltree(File root) { 409 if (root == null || !root.exists()) { 410 return; 411 } 412 413 if (root.isFile()) { 414 root.delete(); 415 return; 416 } 417 418 File[] children = root.listFiles(); 419 if (children != null) { 420 for (int i = 0; i < children.length; i++) { 421 deltree(children[i]); 422 } 423 } 424 425 root.delete(); 426 } 427 428 /** 429 * @param file the filePath 430 * @return the UTFFileHandler.UnicodeInputStream 431 */ 432 public static InputStream getInputStreamWithoutBom(String file) throws IOException { 433 UnicodeInputStream stream = null; 434 FileInputStream fis = new FileInputStream(file); 435 stream = new UnicodeInputStream(fis, null); 436 return stream; 437 } 438 439 /** 440 * This inputstream will recognize unicode BOM marks and will skip bytes if 441 * getEncoding() method is called before any of the read(...) methods. 442 * <p> 443 * Usage pattern: String enc = "ISO-8859-1"; // or NULL to use systemdefault 444 * FileInputStream fis = new FileInputStream(file); UnicodeInputStream uin = 445 * new UnicodeInputStream(fis, enc); enc = uin.getEncoding(); // check and 446 * skip possible BOM bytes InputStreamReader in; if (enc == null) in = new 447 * InputStreamReader(uin); else in = new InputStreamReader(uin, enc); 448 */ 449 public static class UnicodeInputStream extends InputStream { 450 PushbackInputStream internalIn; 451 boolean isInited = false; 452 String defaultEnc; 453 String encoding; 454 455 private static final int BOM_SIZE = 4; 456 457 public UnicodeInputStream(InputStream in, String defaultEnc) { 458 internalIn = new PushbackInputStream(in, BOM_SIZE); 459 this.defaultEnc = defaultEnc; 460 } 461 462 public String getDefaultEncoding() { 463 return defaultEnc; 464 } 465 466 public String getEncoding() { 467 if (!isInited) { 468 try { 469 init(); 470 } catch (IOException ex) { 471 IllegalStateException ise = new IllegalStateException("Init method failed."); 472 ise.initCause(ise); 473 throw ise; 474 } 475 } 476 return encoding; 477 } 478 479 /** 480 * Read-ahead four bytes and check for BOM marks. Extra bytes are unread 481 * back to the stream, only BOM bytes are skipped. 482 */ 483 protected void init() throws IOException { 484 if (isInited) 485 return; 486 487 byte bom[] = new byte[BOM_SIZE]; 488 int n, unread; 489 n = internalIn.read(bom, 0, bom.length); 490 491 if ((bom[0] == (byte) 0x00) && (bom[1] == (byte) 0x00) && (bom[2] == (byte) 0xFE) 492 && (bom[3] == (byte) 0xFF)) { 493 encoding = "UTF-32BE"; 494 unread = n - 4; 495 } else if ((bom[0] == (byte) 0xFF) && (bom[1] == (byte) 0xFE) && (bom[2] == (byte) 0x00) 496 && (bom[3] == (byte) 0x00)) { 497 encoding = "UTF-32LE"; 498 unread = n - 4; 499 } else if ((bom[0] == (byte) 0xEF) && (bom[1] == (byte) 0xBB) && (bom[2] == (byte) 0xBF)) { 500 encoding = "UTF-8"; 501 unread = n - 3; 502 } else if ((bom[0] == (byte) 0xFE) && (bom[1] == (byte) 0xFF)) { 503 encoding = "UTF-16BE"; 504 unread = n - 2; 505 } else if ((bom[0] == (byte) 0xFF) && (bom[1] == (byte) 0xFE)) { 506 encoding = "UTF-16LE"; 507 unread = n - 2; 508 } else { 509 encoding = defaultEnc; 510 unread = n; 511 } 512 513 if (unread > 0) 514 internalIn.unread(bom, (n - unread), unread); 515 516 isInited = true; 517 } 518 519 public void close() throws IOException { 520 internalIn.close(); 521 } 522 523 public int read() throws IOException { 524 return internalIn.read(); 525 } 526 } 527 528 public static boolean compareIdentifier(EDbVendor dbVendor, ESQLDataObjectType sqlDataObjectType, 529 String identifier1, String identifier2) { 530 List<String> segments1 = parseNames(identifier1); 531 List<String> segments2 = parseNames(identifier2); 532 533 if (segments1.size() != segments2.size()) 534 return false; 535 536 boolean supportCatalog = TSQLEnv.supportCatalog(dbVendor); 537 boolean supportSchema = TSQLEnv.supportSchema(dbVendor); 538 539 if(supportCatalog && supportSchema) { 540 if (sqlDataObjectType == ESQLDataObjectType.dotColumn) { 541 if (segments1.size() > 4) { 542 return TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotCatalog, segments1.get(0), 543 segments2.get(0)) 544 && TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotSchema, segments1.get(1), 545 segments2.get(1)) 546 && TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotTable, segments1.get(2), 547 segments2.get(2)) 548 && TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotColumn, mergeSegments(segments1, 3), 549 mergeSegments(segments2, 3)); 550 } else if (segments1.size() == 4) { 551 return TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotCatalog, segments1.get(0), 552 segments2.get(0)) 553 && TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotSchema, segments1.get(1), 554 segments2.get(1)) 555 && TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotTable, segments1.get(2), 556 segments2.get(2)) 557 && TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotColumn, segments1.get(3), 558 segments2.get(3)); 559 } else if (segments1.size() == 3) { 560 return TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotSchema, segments1.get(0), 561 segments2.get(0)) 562 && TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotTable, segments1.get(1), 563 segments2.get(1)) 564 && TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotColumn, segments1.get(2), 565 segments2.get(2)); 566 } else if (segments1.size() == 2) { 567 return TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotTable, segments1.get(0), 568 segments2.get(0)) 569 && TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotColumn, segments1.get(1), 570 segments2.get(1)); 571 } else if (segments1.size() == 1) { 572 return TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotColumn, segments1.get(0), 573 segments2.get(0)); 574 } 575 } else if (sqlDataObjectType == ESQLDataObjectType.dotTable 576 || sqlDataObjectType == ESQLDataObjectType.dotOraclePackage 577 || sqlDataObjectType == ESQLDataObjectType.dotFunction 578 || sqlDataObjectType == ESQLDataObjectType.dotProcedure 579 || sqlDataObjectType == ESQLDataObjectType.dotTrigger) { 580 if (segments1.size() > 3) { 581 return TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotCatalog, segments1.get(0), 582 segments2.get(0)) 583 && TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotSchema, segments1.get(1), 584 segments2.get(1)) 585 && TSQLEnv.compareIdentifier(dbVendor, sqlDataObjectType, mergeSegments(segments1, 2), mergeSegments(segments2, 2)); 586 } else if (segments1.size() == 3) { 587 return TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotCatalog, segments1.get(0), 588 segments2.get(0)) 589 && TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotSchema, segments1.get(1), 590 segments2.get(1)) 591 && TSQLEnv.compareIdentifier(dbVendor, sqlDataObjectType, segments1.get(2), segments2.get(2)); 592 } else if (segments1.size() == 2) { 593 return TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotSchema, segments1.get(0), 594 segments2.get(0)) 595 && TSQLEnv.compareIdentifier(dbVendor, sqlDataObjectType, segments1.get(1), segments2.get(1)); 596 } else if (segments1.size() == 1) { 597 return TSQLEnv.compareIdentifier(dbVendor, sqlDataObjectType, segments1.get(0), segments2.get(0)); 598 } 599 } else if (sqlDataObjectType == ESQLDataObjectType.dotSchema) { 600 if (segments1.size() > 2) { 601 return TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotCatalog, segments1.get(0), 602 segments2.get(0)) 603 && TSQLEnv.compareIdentifier(dbVendor, sqlDataObjectType, mergeSegments(segments1, 1), mergeSegments(segments2, 1)); 604 } else if (segments1.size() == 2) { 605 return TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotCatalog, segments1.get(0), 606 segments2.get(0)) 607 && TSQLEnv.compareIdentifier(dbVendor, sqlDataObjectType, segments1.get(1), segments2.get(1)); 608 } else if (segments1.size() == 1) { 609 return TSQLEnv.compareIdentifier(dbVendor, sqlDataObjectType, segments1.get(0), segments2.get(0)); 610 } 611 } else if (sqlDataObjectType == ESQLDataObjectType.dotCatalog) { 612 if (segments1.size() > 1) { 613 return TSQLEnv.compareIdentifier(dbVendor, sqlDataObjectType, mergeSegments(segments1, 0), mergeSegments(segments2, 0)); 614 } else if (segments1.size() == 1) { 615 return TSQLEnv.compareIdentifier(dbVendor, sqlDataObjectType, segments1.get(0), segments2.get(0)); 616 } 617 } 618 } 619 else if(supportCatalog){ 620 if (sqlDataObjectType == ESQLDataObjectType.dotColumn) { 621 if (segments1.size() > 3) { 622 return TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotCatalog, segments1.get(0), 623 segments2.get(0)) 624 && TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotTable, segments1.get(1), 625 segments2.get(1)) 626 && TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotColumn, mergeSegments(segments1, 2), 627 mergeSegments(segments2, 2)); 628 } else if (segments1.size() == 3) { 629 return TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotCatalog, segments1.get(0), 630 segments2.get(0)) 631 && TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotTable, segments1.get(1), 632 segments2.get(1)) 633 && TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotColumn, segments1.get(2), 634 segments2.get(2)); 635 } else if (segments1.size() == 2) { 636 return TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotTable, segments1.get(0), 637 segments2.get(0)) 638 && TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotColumn, segments1.get(1), 639 segments2.get(1)); 640 } else if (segments1.size() == 1) { 641 return TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotColumn, segments1.get(0), 642 segments2.get(0)); 643 } 644 } else if (sqlDataObjectType == ESQLDataObjectType.dotTable 645 || sqlDataObjectType == ESQLDataObjectType.dotOraclePackage 646 || sqlDataObjectType == ESQLDataObjectType.dotFunction 647 || sqlDataObjectType == ESQLDataObjectType.dotProcedure 648 || sqlDataObjectType == ESQLDataObjectType.dotTrigger) { 649 if (segments1.size() > 2) { 650 return TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotCatalog, segments1.get(0), 651 segments2.get(0)) 652 && TSQLEnv.compareIdentifier(dbVendor, sqlDataObjectType, mergeSegments(segments1, 1), mergeSegments(segments2, 1)); 653 } else if (segments1.size() == 2) { 654 return TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotCatalog, segments1.get(0), 655 segments2.get(0)) 656 && TSQLEnv.compareIdentifier(dbVendor, sqlDataObjectType, segments1.get(1), segments2.get(1)); 657 } else if (segments1.size() == 1) { 658 return TSQLEnv.compareIdentifier(dbVendor, sqlDataObjectType, segments1.get(0), segments2.get(0)); 659 } 660 } else if (sqlDataObjectType == ESQLDataObjectType.dotCatalog || sqlDataObjectType == ESQLDataObjectType.dotSchema) { 661 if (segments1.size() > 1) { 662 return TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotCatalog, mergeSegments(segments1, 0), mergeSegments(segments2, 0)); 663 } else if (segments1.size() == 1) { 664 return TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotCatalog, segments1.get(0), segments2.get(0)); 665 } 666 } 667 } 668 else if(supportSchema){ 669 if (sqlDataObjectType == ESQLDataObjectType.dotColumn) { 670 if (segments1.size() > 3) { 671 return TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotSchema, segments1.get(0), 672 segments2.get(0)) 673 && TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotTable, segments1.get(1), 674 segments2.get(1)) 675 && TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotColumn, mergeSegments(segments1, 2), 676 mergeSegments(segments2, 2)); 677 } else if (segments1.size() == 3) { 678 return TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotSchema, segments1.get(0), 679 segments2.get(0)) 680 && TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotTable, segments1.get(1), 681 segments2.get(1)) 682 && TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotColumn, segments1.get(2), 683 segments2.get(2)); 684 } else if (segments1.size() == 2) { 685 return TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotTable, segments1.get(0), 686 segments2.get(0)) 687 && TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotColumn, segments1.get(1), 688 segments2.get(1)); 689 } else if (segments1.size() == 1) { 690 return TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotColumn, segments1.get(0), 691 segments2.get(0)); 692 } 693 } else if (sqlDataObjectType == ESQLDataObjectType.dotTable 694 || sqlDataObjectType == ESQLDataObjectType.dotOraclePackage 695 || sqlDataObjectType == ESQLDataObjectType.dotFunction 696 || sqlDataObjectType == ESQLDataObjectType.dotProcedure 697 || sqlDataObjectType == ESQLDataObjectType.dotTrigger) { 698 if (segments1.size() > 2) { 699 return TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotSchema, segments1.get(0), 700 segments2.get(0)) 701 && TSQLEnv.compareIdentifier(dbVendor, sqlDataObjectType, mergeSegments(segments1, 1), mergeSegments(segments2, 1)); 702 } else if (segments1.size() == 2) { 703 return TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotSchema, segments1.get(0), 704 segments2.get(0)) 705 && TSQLEnv.compareIdentifier(dbVendor, sqlDataObjectType, segments1.get(1), segments2.get(1)); 706 } else if (segments1.size() == 1) { 707 return TSQLEnv.compareIdentifier(dbVendor, sqlDataObjectType, segments1.get(0), segments2.get(0)); 708 } 709 } else if (sqlDataObjectType == ESQLDataObjectType.dotCatalog || sqlDataObjectType == ESQLDataObjectType.dotSchema) { 710 if (segments1.size() > 1) { 711 return TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotSchema, mergeSegments(segments1, 0), mergeSegments(segments2, 0)); 712 } else if (segments1.size() == 1) { 713 return TSQLEnv.compareIdentifier(dbVendor, ESQLDataObjectType.dotSchema, segments1.get(0), segments2.get(0)); 714 } 715 } 716 } 717 return false; 718 } 719 720 public static String normalizeIdentifier(EDbVendor dbVendor, ESQLDataObjectType objectType, String identifier) { 721 if (identifier == null) 722 return null; 723 String originIdentifier = identifier; 724 identifier = TSQLEnv.normalizeIdentifier(dbVendor, objectType, identifier); 725 boolean collationSensitive = false; 726 switch (objectType) { 727 case dotCatalog: 728 case dotSchema: 729 collationSensitive = TSQLEnv.catalogCollationCaseSensitive[dbVendor.ordinal()]; 730 break; 731 case dotFunction: 732 case dotProcedure: 733 case dotTrigger: 734 case dotTable: 735 case dotOraclePackage: 736 collationSensitive = TSQLEnv.tableCollationCaseSensitive[dbVendor.ordinal()]; 737 break; 738 case dotColumn: 739 collationSensitive = TSQLEnv.columnCollationCaseSensitive[dbVendor.ordinal()]; 740 break; 741 default: 742 collationSensitive = TSQLEnv.defaultCollationCaseSensitive[dbVendor.ordinal()]; 743 break; 744 } 745 if(parseNames(identifier).size()>1) { 746 return collationSensitive ? originIdentifier : originIdentifier.toUpperCase(); 747 } 748 else { 749 return collationSensitive ? identifier : identifier.toUpperCase(); 750 } 751 } 752 753 public static String getIdentifierNormalColumnName(EDbVendor dbVendor, String name) { 754 return getIdentifierNormalName(dbVendor, name, ESQLDataObjectType.dotColumn); 755 } 756 757 public static String getIdentifierNormalTableName(String name) { 758 return getIdentifierNormalName(ModelBindingManager.getGlobalVendor(), name, ESQLDataObjectType.dotTable); 759 } 760 761 public static String getIdentifierNormalTableName(EDbVendor dbVendor, String name) { 762 return getIdentifierNormalName(dbVendor, name, ESQLDataObjectType.dotTable); 763 } 764 765 public static String getIdentifierNormalName(EDbVendor dbVendor, String name, 766 ESQLDataObjectType sqlDataObjectType) { 767 if (name == null) { 768 return null; 769 } 770 if (dbVendor == EDbVendor.dbvmssql || dbVendor == EDbVendor.dbvazuresql) { 771 if (name.indexOf("..") != -1) { 772 if (ModelBindingManager.getGlobalSchema() != null) { 773 name = name.replace("..", "." + ModelBindingManager.getGlobalSchema() + "."); 774 } else { 775 name = name.replace("..", ".dbo."); 776 } 777 } 778 } 779 List<String> segments = parseNames(name); 780 StringBuilder builder = new StringBuilder(); 781 boolean supportCatalog = TSQLEnv.supportCatalog(dbVendor); 782 boolean supportSchema = TSQLEnv.supportSchema(dbVendor); 783 784 if(supportCatalog && supportSchema) { 785 if (sqlDataObjectType == ESQLDataObjectType.dotColumn) { 786 if (segments.size() > 4) { 787 builder.append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotCatalog, segments.get(0))) 788 .append(".") 789 .append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotSchema, segments.get(1))) 790 .append(".") 791 .append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotTable, segments.get(2))) 792 .append(".") 793 .append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotColumn, mergeSegments(segments, 3))); 794 } else if (segments.size() == 4) { 795 builder.append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotCatalog, segments.get(0))) 796 .append(".") 797 .append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotSchema, segments.get(1))) 798 .append(".") 799 .append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotTable, segments.get(2))) 800 .append(".") 801 .append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotColumn, segments.get(3))); 802 } else if (segments.size() == 3) { 803 builder.append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotSchema, segments.get(0))) 804 .append(".") 805 .append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotTable, segments.get(1))) 806 .append(".") 807 .append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotColumn, segments.get(2))); 808 } else if (segments.size() == 2) { 809 builder.append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotTable, segments.get(0))) 810 .append(".") 811 .append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotColumn, segments.get(1))); 812 } else if (segments.size() == 1) { 813 builder.append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotColumn, segments.get(0))); 814 } 815 } else if (sqlDataObjectType == ESQLDataObjectType.dotTable 816 || sqlDataObjectType == ESQLDataObjectType.dotOraclePackage 817 || sqlDataObjectType == ESQLDataObjectType.dotFunction 818 || sqlDataObjectType == ESQLDataObjectType.dotProcedure 819 || sqlDataObjectType == ESQLDataObjectType.dotTrigger) { 820 if (segments.size() > 3) { 821 builder.append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotCatalog, segments.get(0))) 822 .append(".") 823 .append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotSchema, segments.get(1))) 824 .append(".").append(normalizeIdentifier(dbVendor, sqlDataObjectType, mergeSegments(segments, 2))); 825 } else if (segments.size() == 3) { 826 builder.append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotCatalog, segments.get(0))) 827 .append(".") 828 .append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotSchema, segments.get(1))) 829 .append(".").append(normalizeIdentifier(dbVendor, sqlDataObjectType, segments.get(2))); 830 } else if (segments.size() == 2) { 831 builder.append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotSchema, segments.get(0))) 832 .append(".").append(normalizeIdentifier(dbVendor, sqlDataObjectType, segments.get(1))); 833 } else if (segments.size() == 1) { 834 builder.append(normalizeIdentifier(dbVendor, sqlDataObjectType, segments.get(0))); 835 } 836 } else if (sqlDataObjectType == ESQLDataObjectType.dotSchema) { 837 if (segments.size() > 2) { 838 builder.append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotCatalog, segments.get(0))) 839 .append(".").append(normalizeIdentifier(dbVendor, sqlDataObjectType, mergeSegments(segments, 1))); 840 } else if (segments.size() == 2) { 841 builder.append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotCatalog, segments.get(0))) 842 .append(".").append(normalizeIdentifier(dbVendor, sqlDataObjectType, segments.get(1))); 843 } else if (segments.size() == 1) { 844 builder.append(normalizeIdentifier(dbVendor, sqlDataObjectType, segments.get(0))); 845 } 846 } else if (sqlDataObjectType == ESQLDataObjectType.dotCatalog) { 847 if (segments.size() > 1) { 848 builder.append(normalizeIdentifier(dbVendor, sqlDataObjectType, mergeSegments(segments, 0))); 849 } else if (segments.size() == 1) { 850 builder.append(normalizeIdentifier(dbVendor, sqlDataObjectType, segments.get(0))); 851 } 852 } 853 } 854 else if(supportCatalog){ 855 if (sqlDataObjectType == ESQLDataObjectType.dotColumn) { 856 if (segments.size() > 3) { 857 builder.append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotCatalog, segments.get(0))) 858 .append(".") 859 .append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotTable, segments.get(1))) 860 .append(".") 861 .append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotColumn, mergeSegments(segments, 2))); 862 } else if (segments.size() == 3) { 863 builder.append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotCatalog, segments.get(0))) 864 .append(".") 865 .append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotTable, segments.get(1))) 866 .append(".") 867 .append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotColumn, segments.get(2))); 868 } else if (segments.size() == 2) { 869 builder.append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotTable, segments.get(0))) 870 .append(".") 871 .append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotColumn, segments.get(1))); 872 } else if (segments.size() == 1) { 873 builder.append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotColumn, segments.get(0))); 874 } 875 } else if (sqlDataObjectType == ESQLDataObjectType.dotTable 876 || sqlDataObjectType == ESQLDataObjectType.dotOraclePackage 877 || sqlDataObjectType == ESQLDataObjectType.dotFunction 878 || sqlDataObjectType == ESQLDataObjectType.dotProcedure 879 || sqlDataObjectType == ESQLDataObjectType.dotTrigger) { 880 if (segments.size() > 2) { 881 builder.append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotCatalog, segments.get(0))) 882 .append(".").append(normalizeIdentifier(dbVendor, sqlDataObjectType, mergeSegments(segments, 1))); 883 } else if (segments.size() == 2) { 884 builder.append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotCatalog, segments.get(0))) 885 .append(".").append(normalizeIdentifier(dbVendor, sqlDataObjectType, segments.get(1))); 886 } else if (segments.size() == 1) { 887 builder.append(normalizeIdentifier(dbVendor, sqlDataObjectType, segments.get(0))); 888 } 889 } else if (sqlDataObjectType == ESQLDataObjectType.dotSchema || sqlDataObjectType == ESQLDataObjectType.dotCatalog) { 890 if (segments.size() > 1) { 891 builder.append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotCatalog, mergeSegments(segments, 0))); 892 } else if (segments.size() == 1) { 893 builder.append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotCatalog, segments.get(0))); 894 } 895 } 896 } 897 else if(supportSchema){ 898 if (sqlDataObjectType == ESQLDataObjectType.dotColumn) { 899 if (segments.size() > 3) { 900 builder.append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotSchema, segments.get(0))) 901 .append(".") 902 .append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotTable, segments.get(1))) 903 .append(".") 904 .append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotColumn, mergeSegments(segments, 2))); 905 } else if (segments.size() == 3) { 906 builder.append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotSchema, segments.get(0))) 907 .append(".") 908 .append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotTable, segments.get(1))) 909 .append(".") 910 .append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotColumn, segments.get(2))); 911 } else if (segments.size() == 2) { 912 builder.append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotTable, segments.get(0))) 913 .append(".") 914 .append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotColumn, segments.get(1))); 915 } else if (segments.size() == 1) { 916 builder.append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotColumn, segments.get(0))); 917 } 918 } else if (sqlDataObjectType == ESQLDataObjectType.dotTable 919 || sqlDataObjectType == ESQLDataObjectType.dotOraclePackage 920 || sqlDataObjectType == ESQLDataObjectType.dotFunction 921 || sqlDataObjectType == ESQLDataObjectType.dotProcedure 922 || sqlDataObjectType == ESQLDataObjectType.dotTrigger) { 923 if (segments.size() > 2) { 924 builder.append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotSchema, segments.get(0))) 925 .append(".").append(normalizeIdentifier(dbVendor, sqlDataObjectType, mergeSegments(segments, 1))); 926 } else if (segments.size() == 2) { 927 builder.append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotSchema, segments.get(0))) 928 .append(".").append(normalizeIdentifier(dbVendor, sqlDataObjectType, segments.get(1))); 929 } else if (segments.size() == 1) { 930 builder.append(normalizeIdentifier(dbVendor, sqlDataObjectType, segments.get(0))); 931 } 932 } else if (sqlDataObjectType == ESQLDataObjectType.dotSchema || sqlDataObjectType == ESQLDataObjectType.dotCatalog) { 933 if (segments.size() > 1) { 934 builder.append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotSchema, mergeSegments(segments, 0))); 935 } else if (segments.size() == 1) { 936 builder.append(normalizeIdentifier(dbVendor, ESQLDataObjectType.dotSchema, segments.get(0))); 937 } 938 } 939 } 940 return builder.toString(); 941 } 942 943 public static String mergeSegments(List<String> segments, int index) { 944 StringBuilder buffer = new StringBuilder(); 945 for (int i = index; i < segments.size(); i++) { 946 buffer.append(segments.get(i)); 947 if(i<segments.size()-1) { 948 buffer.append("."); 949 } 950 } 951 return buffer.toString(); 952 } 953 954// public static String getIdentifierNormalName(EDbVendor vendor, String name) { 955// if (isEmpty(name)) { 956// return null; 957// } 958// name = name.replaceAll("(?i)null\\.", ""); 959// switch (vendor) { 960// case dbvbigquery: 961// return replaceIdentifierNormalName(name, "`.*?`", "`", true).replaceAll("\\.\\s+", "."); 962// case dbvcouchbase: 963// case dbvhive: 964// case dbvimpala: 965// case dbvmysql: 966// return replaceIdentifierNormalName(name, "`.*?`", "`", true).replaceAll("\\.\\s+", "."); 967// case dbvdax: 968// return replaceIdentifierNormalName(name, "'.*?'", "'", true).replaceAll("\\.\\s+", "."); 969// case dbvdb2: 970// case dbvhana: 971// case dbvinformix: 972// case dbvnetezza: 973// case dbvoracle: 974// case dbvsnowflake: 975// case dbvsybase: 976// case dbvteradata: 977// case dbvvertica: 978// return replaceIdentifierNormalName(name, "\".*?\"", "\"", true).replaceAll("\\.\\s+", "."); 979// case dbvpostgresql: 980// case dbvgreenplum: 981// case dbvredshift: 982// return replaceIdentifierNormalName(name, "\".*?\"", "\"", false).replaceAll("\\.\\s+", "."); 983// case dbvmssql: 984// return replaceIdentifierNormalName(name, "([\"\\[']).*?([\"\\]'])", "[\"\\[\\]']", true) 985// .replaceAll("\\.\\s+", "."); 986// default: 987// return replaceIdentifierNormalName(name, "\".*?\"", "\"", true).replaceAll("\\.\\s+", "."); 988// } 989// } 990// 991// private static String replaceIdentifierNormalName(String content, String match, String replace, boolean toUpper) { 992// Pattern pattern = Pattern.compile(match, Pattern.CASE_INSENSITIVE | Pattern.DOTALL); 993// Matcher matcher = pattern.matcher(content); 994// StringBuilder buffer = new StringBuilder(); 995// int start = 0; 996// while (matcher.find()) { 997// int matchStart = matcher.start(); 998// int macthEnd = matcher.end(); 999// if (start < matchStart) { 1000// if (toUpper) { 1001// buffer.append(content.substring(start, matchStart).toUpperCase()); 1002// } else { 1003// buffer.append(content.substring(start, matchStart).toLowerCase()); 1004// } 1005// } 1006// buffer.append(matcher.group().replaceAll(replace, "")); 1007// start = macthEnd; 1008// } 1009// if (start < content.length()) { 1010// if (toUpper) { 1011// buffer.append(content.substring(start).toUpperCase()); 1012// } else { 1013// buffer.append(content.substring(start).toLowerCase()); 1014// } 1015// } 1016// return buffer.toString(); 1017// } 1018 1019 public static boolean isTempTable(table table) { 1020 if(SubType.temp_table.name().equals(table.getSubType())) { 1021 return true; 1022 } 1023 String tableName = table.getName(); 1024 List<String> segments = parseNames(tableName); 1025 if (tableName.startsWith("@") || segments.get(segments.size() - 1).startsWith("@")) { 1026 return true; 1027 } 1028 if (tableName.startsWith("#") || segments.get(segments.size() - 1).startsWith("#")) { 1029 return true; 1030 } 1031 return false; 1032 } 1033 1034// public static boolean isTempTable(String tableName) { 1035// List<String> segments = parseNames(tableName); 1036// if (tableName.startsWith("@") || segments.get(segments.size() - 1).startsWith("@")) { 1037// return true; 1038// } 1039// if (tableName.startsWith("#") || segments.get(segments.size() - 1).startsWith("#")) { 1040// return true; 1041// } 1042// return false; 1043// } 1044 1045// public static boolean isTempTable(TTable table, EDbVendor vendor) { 1046// switch (vendor) { 1047// case dbvmssql: 1048// return table.getName().startsWith("#"); 1049// default: 1050// return false; 1051// } 1052// } 1053 1054 public static File[] listFiles(File sqlFiles) { 1055 List<File> children = new ArrayList<File>(); 1056 if (sqlFiles != null) 1057 listFiles(sqlFiles, children); 1058 Collections.sort(children); 1059 return children.toArray(new File[0]); 1060 } 1061 1062 public static File[] listFiles(File sqlFiles, FileFilter filter) { 1063 List<File> children = new ArrayList<File>(); 1064 if (sqlFiles != null) 1065 listFiles(sqlFiles, children, filter); 1066 Collections.sort(children); 1067 return children.toArray(new File[0]); 1068 } 1069 1070 public static void listFiles(File rootFile, List<File> children) { 1071 if (rootFile.isFile()) 1072 children.add(rootFile); 1073 else { 1074 File[] files = rootFile.listFiles(); 1075 if (files != null) { 1076 for (int i = 0; i < files.length; i++) { 1077 listFiles(files[i], children); 1078 } 1079 } 1080 } 1081 } 1082 1083 public static void listFiles(File rootFile, List<File> children, FileFilter filter) { 1084 if (rootFile.isFile() && filter.accept(rootFile)) 1085 children.add(rootFile); 1086 else { 1087 File[] files = rootFile.listFiles(filter); 1088 if (files != null) { 1089 for (int i = 0; i < files.length; i++) { 1090 listFiles(files[i], children, filter); 1091 } 1092 } 1093 } 1094 } 1095 1096 public static String readFile(File file) { 1097 StringBuilder stringBuilder = new StringBuilder(); 1098 BufferedReader reader = null; 1099 try { 1100 reader = new BufferedReader(new FileReader(file)); 1101 1102 String line = null; 1103 String ls = System.getProperty("line.separator"); 1104 while ((line = reader.readLine()) != null) { 1105 stringBuilder.append(line); 1106 stringBuilder.append(ls); 1107 } 1108 stringBuilder.deleteCharAt(stringBuilder.length() - 1); 1109 } catch (IOException e) { 1110 logger.error("read file failed.", e); 1111 } finally { 1112 if (reader != null) { 1113 try { 1114 reader.close(); 1115 } catch (IOException e) { 1116 logger.error("close reader failed.", e); 1117 } 1118 } 1119 } 1120 return stringBuilder.toString(); 1121 } 1122 1123 public static String stringToMD5(String plainText) { 1124 byte[] secretBytes = null; 1125 try { 1126 secretBytes = MessageDigest.getInstance("md5").digest(plainText.getBytes("UTF-8")); 1127 StringBuffer sb = new StringBuffer(); 1128 for (int i = 0; i < secretBytes.length; ++i) { 1129 sb.append(Integer.toHexString((secretBytes[i] & 0xFF) | 0x100).substring(1, 3)); 1130 } 1131 return sb.toString(); 1132 } catch (Exception e) { 1133 logger.error("get text md5 value failed.", e); 1134 } 1135 return null; 1136 } 1137 1138 public static String trimSingleQuote(String columnAlias) { 1139 if(columnAlias.startsWith("'") && columnAlias.endsWith("'")) { 1140 return columnAlias.substring(1, columnAlias.length() - 1); 1141 } 1142 return columnAlias; 1143 } 1144 1145 public static String endTrim(String input) { 1146 if (input == null) { 1147 return null; 1148 } 1149 1150 int end = input.length(); 1151 while (end > 0 && Character.isWhitespace(input.charAt(end - 1))) { 1152 end--; 1153 } 1154 1155 return input.substring(0, end); 1156 } 1157 1158 public static void endTrim(StringBuilder buffer) { 1159 int length = buffer.length(); 1160 while (length > 0 && Character.isWhitespace(buffer.charAt(length - 1))) { 1161 length--; // 逐步减少长度 1162 } 1163 buffer.setLength(length); // 直接截断尾部空白字符 1164 } 1165}