001 002package gudusoft.gsqlparser.pp.stmtformatter; 003 004import gudusoft.gsqlparser.TCustomSqlStatement; 005import gudusoft.gsqlparser.TGSqlParser; 006import gudusoft.gsqlparser.TSourceToken; 007import gudusoft.gsqlparser.TSourceTokenList; 008import gudusoft.gsqlparser.TStatementList; 009import gudusoft.gsqlparser.pp.mediator.MediatorFactory; 010import gudusoft.gsqlparser.pp.output.OutputConfig; 011import gudusoft.gsqlparser.pp.output.OutputConfigFactory; 012import gudusoft.gsqlparser.pp.para.GFmtOpt; 013import gudusoft.gsqlparser.pp.para.styleenums.TCompactMode; 014import gudusoft.gsqlparser.pp.print.IPrinter; 015import gudusoft.gsqlparser.pp.print.PrinterFactory; 016import gudusoft.gsqlparser.pp.processor.ProcessorFactory; 017import gudusoft.gsqlparser.pp.stmtformatter.builder.AbstractStmtFormatterBuilder; 018import gudusoft.gsqlparser.pp.stmtformatter.builder.comm.AllStmtsFormatterBuilder; 019import gudusoft.gsqlparser.pp.stmtformatter.builder.comm.AlterTableStmtFormatterBuilder; 020import gudusoft.gsqlparser.pp.stmtformatter.builder.comm.CommonStmtFormatterBuilder; 021import gudusoft.gsqlparser.pp.stmtformatter.builder.comm.CompactModeStmtFormatterBuilder; 022import gudusoft.gsqlparser.pp.stmtformatter.builder.comm.CreateTableStmtFormatterBuilder; 023import gudusoft.gsqlparser.pp.stmtformatter.builder.comm.CreateViewStmtFormatterBuilder; 024import gudusoft.gsqlparser.pp.stmtformatter.builder.comm.DeclareStmtFormatterBuilder; 025import gudusoft.gsqlparser.pp.stmtformatter.builder.comm.DeleteStmtFormatterBuilder; 026import gudusoft.gsqlparser.pp.stmtformatter.builder.comm.ExecuteStmtFormatterBuilder; 027import gudusoft.gsqlparser.pp.stmtformatter.builder.comm.GoStmtFormatterBuilder; 028import gudusoft.gsqlparser.pp.stmtformatter.builder.comm.IfStmtFormatterBuilder; 029import gudusoft.gsqlparser.pp.stmtformatter.builder.comm.InsertStmtFormatterBuilder; 030import gudusoft.gsqlparser.pp.stmtformatter.builder.comm.MergeStmtFormatterBuilder; 031import gudusoft.gsqlparser.pp.stmtformatter.builder.comm.PlsqlBlockStmtFormatterBuilder; 032import gudusoft.gsqlparser.pp.stmtformatter.builder.comm.PlsqlIfStmtFormatterBuilder; 033import gudusoft.gsqlparser.pp.stmtformatter.builder.comm.PlsqlStmtFormatterBuilder; 034import gudusoft.gsqlparser.pp.stmtformatter.builder.comm.ReturnStmtFormatterBuilder; 035import gudusoft.gsqlparser.pp.stmtformatter.builder.comm.SelectStmtFormatterBuilder; 036import gudusoft.gsqlparser.pp.stmtformatter.builder.comm.SetStmtFormatterBuilder; 037import gudusoft.gsqlparser.pp.stmtformatter.builder.comm.UpdateStmtFormatterBuilder; 038import gudusoft.gsqlparser.pp.stmtformatter.type.AbstractStmtFormatter; 039import gudusoft.gsqlparser.pp.stmtformatter.type.comm.AllStmtsFormatter; 040import gudusoft.gsqlparser.pp.stmtformatter.type.comm.AlterTableStmtFormatter; 041import gudusoft.gsqlparser.pp.stmtformatter.type.comm.CommonStmtFormatter; 042import gudusoft.gsqlparser.pp.stmtformatter.type.comm.CompactModeStmtFormatter; 043import gudusoft.gsqlparser.pp.stmtformatter.type.comm.CreateTableStmtFormatter; 044import gudusoft.gsqlparser.pp.stmtformatter.type.comm.CreateViewStmtFormatter; 045import gudusoft.gsqlparser.pp.stmtformatter.type.comm.DeclareStmtFormatter; 046import gudusoft.gsqlparser.pp.stmtformatter.type.comm.DeleteStmtFormatter; 047import gudusoft.gsqlparser.pp.stmtformatter.type.comm.ExecuteStmtFormatter; 048import gudusoft.gsqlparser.pp.stmtformatter.type.comm.GoStmtFormatter; 049import gudusoft.gsqlparser.pp.stmtformatter.type.comm.IfStmtFormatter; 050import gudusoft.gsqlparser.pp.stmtformatter.type.comm.InsertStmtFormatter; 051import gudusoft.gsqlparser.pp.stmtformatter.type.comm.MergeStmtFormatter; 052import gudusoft.gsqlparser.pp.stmtformatter.type.comm.PlsqlBlockStmtFormatter; 053import gudusoft.gsqlparser.pp.stmtformatter.type.comm.PlsqlIfStmtFormatter; 054import gudusoft.gsqlparser.pp.stmtformatter.type.comm.PlsqlStmtFormatter; 055import gudusoft.gsqlparser.pp.stmtformatter.type.comm.ReturnStmtFormatter; 056import gudusoft.gsqlparser.pp.stmtformatter.type.comm.SelectStmtFormatter; 057import gudusoft.gsqlparser.pp.stmtformatter.type.comm.SetStmtFormatter; 058import gudusoft.gsqlparser.pp.stmtformatter.type.comm.UpdateStmtFormatter; 059import gudusoft.gsqlparser.pp.utils.SourceTokenOperator; 060import gudusoft.gsqlparser.stmt.TAlterTableStatement; 061import gudusoft.gsqlparser.stmt.TCommonBlock; 062import gudusoft.gsqlparser.stmt.TCreateTableSqlStatement; 063import gudusoft.gsqlparser.stmt.TCreateViewSqlStatement; 064import gudusoft.gsqlparser.stmt.TDeleteSqlStatement; 065import gudusoft.gsqlparser.stmt.TIfStmt; 066import gudusoft.gsqlparser.stmt.TInsertSqlStatement; 067import gudusoft.gsqlparser.stmt.TMergeSqlStatement; 068import gudusoft.gsqlparser.stmt.TSelectSqlStatement; 069import gudusoft.gsqlparser.stmt.TStoredProcedureSqlStatement; 070import gudusoft.gsqlparser.stmt.TUpdateSqlStatement; 071import gudusoft.gsqlparser.stmt.mssql.TMssqlBlock; 072import gudusoft.gsqlparser.stmt.mssql.TMssqlDeclare; 073import gudusoft.gsqlparser.stmt.mssql.TMssqlExecute; 074import gudusoft.gsqlparser.stmt.mssql.TMssqlGo; 075import gudusoft.gsqlparser.stmt.mssql.TMssqlIfElse; 076import gudusoft.gsqlparser.stmt.mssql.TMssqlReturn; 077import gudusoft.gsqlparser.stmt.mssql.TMssqlSet; 078 079import java.io.ByteArrayOutputStream; 080import java.io.OutputStream; 081import java.util.ArrayList; 082import java.util.List; 083import java.util.Map; 084import java.util.concurrent.ConcurrentHashMap; 085 086public class FormatterFactory 087{ 088 089 /** 090 * all formatters 091 */ 092 private volatile static Map<String, AbstractStmtFormatter> formatter = new ConcurrentHashMap<String, AbstractStmtFormatter>( ); 093 094 private static Object object = new Object( ); 095 096 private static OutputConfig outputConfig; 097 098 /** 099 * create select statment formatter 100 * 101 * @param opt 102 * options 103 * @return instance 104 */ 105 public static SelectStmtFormatter createSelectStmtFormatter( GFmtOpt opt ) 106 { 107 return createFormatter( opt, 108 SelectStmtFormatter.class, 109 new IFormatterBuilderCreator<SelectStmtFormatter>( ) { 110 111 public AbstractStmtFormatterBuilder<SelectStmtFormatter> create( ) 112 { 113 return new SelectStmtFormatterBuilder( ); 114 } 115 } ); 116 } 117 118 public static InsertStmtFormatter createInsertStmtFormatter( GFmtOpt opt ) 119 { 120 return createFormatter( opt, 121 InsertStmtFormatter.class, 122 new IFormatterBuilderCreator<InsertStmtFormatter>( ) { 123 124 public AbstractStmtFormatterBuilder<InsertStmtFormatter> create( ) 125 { 126 return new InsertStmtFormatterBuilder( ); 127 } 128 } ); 129 } 130 131 public static DeleteStmtFormatter createDeleteStmtFormatter( GFmtOpt opt ) 132 { 133 return createFormatter( opt, 134 DeleteStmtFormatter.class, 135 new IFormatterBuilderCreator<DeleteStmtFormatter>( ) { 136 137 public AbstractStmtFormatterBuilder<DeleteStmtFormatter> create( ) 138 { 139 return new DeleteStmtFormatterBuilder( ); 140 } 141 } ); 142 } 143 144 public static UpdateStmtFormatter createUpdateStmtFormatter( GFmtOpt opt ) 145 { 146 return createFormatter( opt, 147 UpdateStmtFormatter.class, 148 new IFormatterBuilderCreator<UpdateStmtFormatter>( ) { 149 150 public AbstractStmtFormatterBuilder<UpdateStmtFormatter> create( ) 151 { 152 return new UpdateStmtFormatterBuilder( ); 153 } 154 } ); 155 } 156 157 public static CreateTableStmtFormatter createCreateTableStmtFormatter( 158 GFmtOpt opt ) 159 { 160 return createFormatter( opt, 161 CreateTableStmtFormatter.class, 162 new IFormatterBuilderCreator<CreateTableStmtFormatter>( ) { 163 164 public AbstractStmtFormatterBuilder<CreateTableStmtFormatter> create( ) 165 { 166 return new CreateTableStmtFormatterBuilder( ); 167 } 168 } ); 169 } 170 171 public static DeclareStmtFormatter createDeclareStmtFormatter( GFmtOpt opt ) 172 { 173 return createFormatter( opt, 174 DeclareStmtFormatter.class, 175 new IFormatterBuilderCreator<DeclareStmtFormatter>( ) { 176 177 public AbstractStmtFormatterBuilder<DeclareStmtFormatter> create( ) 178 { 179 return new DeclareStmtFormatterBuilder( ); 180 } 181 } ); 182 } 183 184 public static ExecuteStmtFormatter createExecuteStmtFormatter( GFmtOpt opt ) 185 { 186 return createFormatter( opt, 187 ExecuteStmtFormatter.class, 188 new IFormatterBuilderCreator<ExecuteStmtFormatter>( ) { 189 190 public AbstractStmtFormatterBuilder<ExecuteStmtFormatter> create( ) 191 { 192 return new ExecuteStmtFormatterBuilder( ); 193 } 194 } ); 195 } 196 197 public static SetStmtFormatter createSetStmtFormatter( GFmtOpt opt ) 198 { 199 return createFormatter( opt, 200 SetStmtFormatter.class, 201 new IFormatterBuilderCreator<SetStmtFormatter>( ) { 202 203 public AbstractStmtFormatterBuilder<SetStmtFormatter> create( ) 204 { 205 return new SetStmtFormatterBuilder( ); 206 } 207 } ); 208 } 209 210 public static IfStmtFormatter createIfStmtFormatter( GFmtOpt opt ) 211 { 212 return createFormatter( opt, 213 IfStmtFormatter.class, 214 new IFormatterBuilderCreator<IfStmtFormatter>( ) { 215 216 public AbstractStmtFormatterBuilder<IfStmtFormatter> create( ) 217 { 218 return new IfStmtFormatterBuilder( ); 219 } 220 } ); 221 } 222 223 public static PlsqlIfStmtFormatter createPlsqlIfStmtFormatter( GFmtOpt opt ) 224 { 225 return createFormatter( opt, 226 PlsqlIfStmtFormatter.class, 227 new IFormatterBuilderCreator<PlsqlIfStmtFormatter>( ) { 228 229 public AbstractStmtFormatterBuilder<PlsqlIfStmtFormatter> create( ) 230 { 231 return new PlsqlIfStmtFormatterBuilder( ); 232 } 233 } ); 234 } 235 236 public static PlsqlStmtFormatter createPlsqlStmtFormatter( GFmtOpt opt ) 237 { 238 return createFormatter( opt, 239 PlsqlStmtFormatter.class, 240 new IFormatterBuilderCreator<PlsqlStmtFormatter>( ) { 241 242 public AbstractStmtFormatterBuilder<PlsqlStmtFormatter> create( ) 243 { 244 return new PlsqlStmtFormatterBuilder( ); 245 } 246 } ); 247 } 248 249 public static GoStmtFormatter createGoStmtFormatter( GFmtOpt opt ) 250 { 251 return createFormatter( opt, 252 GoStmtFormatter.class, 253 new IFormatterBuilderCreator<GoStmtFormatter>( ) { 254 255 public AbstractStmtFormatterBuilder<GoStmtFormatter> create( ) 256 { 257 return new GoStmtFormatterBuilder( ); 258 } 259 } ); 260 } 261 262 public static CompactModeStmtFormatter createCompactModeStmtFormatter( 263 GFmtOpt opt ) 264 { 265 return createFormatter( opt, 266 CompactModeStmtFormatter.class, 267 new IFormatterBuilderCreator<CompactModeStmtFormatter>( ) { 268 269 public AbstractStmtFormatterBuilder<CompactModeStmtFormatter> create( ) 270 { 271 return new CompactModeStmtFormatterBuilder( ); 272 } 273 } ); 274 } 275 276 public static ReturnStmtFormatter createReturnStmtFormatter( GFmtOpt opt ) 277 { 278 return createFormatter( opt, 279 ReturnStmtFormatter.class, 280 new IFormatterBuilderCreator<ReturnStmtFormatter>( ) { 281 282 public AbstractStmtFormatterBuilder<ReturnStmtFormatter> create( ) 283 { 284 return new ReturnStmtFormatterBuilder( ); 285 } 286 } ); 287 } 288 289 public static CreateViewStmtFormatter createCreateViewStmtFormatter( 290 GFmtOpt opt ) 291 { 292 return createFormatter( opt, 293 CreateViewStmtFormatter.class, 294 new IFormatterBuilderCreator<CreateViewStmtFormatter>( ) { 295 296 public AbstractStmtFormatterBuilder<CreateViewStmtFormatter> create( ) 297 { 298 return new CreateViewStmtFormatterBuilder( ); 299 } 300 } ); 301 } 302 303 public static AlterTableStmtFormatter createAlterTableStatement( GFmtOpt opt ) 304 { 305 return createFormatter( opt, 306 AlterTableStmtFormatter.class, 307 new IFormatterBuilderCreator<AlterTableStmtFormatter>( ) { 308 309 public AbstractStmtFormatterBuilder<AlterTableStmtFormatter> create( ) 310 { 311 return new AlterTableStmtFormatterBuilder( ); 312 } 313 } ); 314 } 315 316 /** 317 * the callback interface to achieve the formatter builder 318 * 319 * @author zhoujun 320 * 321 */ 322 public interface IFormatterBuilderCreator<E extends AbstractStmtFormatter> 323 { 324 325 AbstractStmtFormatterBuilder<E> create( ); 326 } 327 328 /** 329 * create the formatter 330 * 331 * @param <E> 332 * @param opt 333 * @param clazz 334 * @param creater 335 * @return 336 */ 337 public static <E extends AbstractStmtFormatter> E createFormatter( 338 GFmtOpt opt, Class<E> clazz, IFormatterBuilderCreator<E> creater ) 339 { 340 String id = opt.sessionId + clazz.getName( ); 341 if ( !formatter.containsKey( id ) ) 342 { 343 synchronized ( FormatterFactory.class ) 344 { 345 if ( !formatter.containsKey( id ) ) 346 { 347 AbstractStmtFormatterBuilder builder = creater.create( ); 348 builder.setOption( opt ); 349 formatter.put( id, builder.build( ) ); 350 } 351 } 352 } 353 return (E) formatter.get( id ); 354 } 355 356 public static void processStatement( GFmtOpt option, TCustomSqlStatement sql ) 357 { 358 if ( option.compactMode == TCompactMode.Cpmugly ) 359 { 360 FormatterFactory.createCompactModeStmtFormatter( option ) 361 .format( sql ); 362 return; 363 } 364 365 if ( isNotNeedFormat( sql ) ) 366 { 367 return; 368 } 369 if ( sql instanceof TSelectSqlStatement ) 370 { 371 FormatterFactory.createSelectStmtFormatter( option ) 372 .format( (TSelectSqlStatement) sql ); 373 } 374 else if ( sql instanceof TInsertSqlStatement ) 375 { 376 FormatterFactory.createInsertStmtFormatter( option ) 377 .format( (TInsertSqlStatement) sql ); 378 } 379 else if ( sql instanceof TDeleteSqlStatement ) 380 { 381 FormatterFactory.createDeleteStmtFormatter( option ) 382 .format( (TDeleteSqlStatement) sql ); 383 } 384 else if ( sql instanceof TUpdateSqlStatement ) 385 { 386 FormatterFactory.createUpdateStmtFormatter( option ) 387 .format( (TUpdateSqlStatement) sql ); 388 } 389 else if ( sql instanceof TCreateTableSqlStatement ) 390 { 391 FormatterFactory.createCreateTableStmtFormatter( option ) 392 .format( (TCreateTableSqlStatement) sql ); 393 } 394 else if ( sql instanceof TMssqlDeclare ) 395 { 396 FormatterFactory.createDeclareStmtFormatter( option ) 397 .format( (TMssqlDeclare) sql ); 398 } 399 else if ( sql instanceof TMssqlExecute ) 400 { 401 FormatterFactory.createExecuteStmtFormatter( option ) 402 .format( (TMssqlExecute) sql ); 403 } 404 else if ( sql instanceof TStoredProcedureSqlStatement ) 405 { 406 FormatterFactory.createPlsqlStmtFormatter( option ) 407 .format( (TStoredProcedureSqlStatement) sql ); 408 } 409 else if ( sql instanceof TMssqlSet ) 410 { 411 FormatterFactory.createSetStmtFormatter( option ) 412 .format( (TMssqlSet) sql ); 413 } 414 else if ( sql instanceof TMssqlIfElse ) 415 { 416 FormatterFactory.createIfStmtFormatter( option ) 417 .format( (TMssqlIfElse) sql ); 418 } 419 else if ( sql instanceof TMssqlGo ) 420 { 421 FormatterFactory.createGoStmtFormatter( option ) 422 .format( (TMssqlGo) sql ); 423 } 424 else if ( sql instanceof TMssqlReturn ) 425 { 426 FormatterFactory.createReturnStmtFormatter( option ) 427 .format( (TMssqlReturn) sql ); 428 } 429 else if ( sql instanceof TCreateViewSqlStatement ) 430 { 431 FormatterFactory.createCreateViewStmtFormatter( option ) 432 .format( (TCreateViewSqlStatement) sql ); 433 } 434 else if ( sql instanceof TAlterTableStatement ) 435 { 436 FormatterFactory.createAlterTableStatement( option ) 437 .format( (TAlterTableStatement) sql ); 438 } 439 else if ( sql instanceof TMergeSqlStatement ) 440 { 441 FormatterFactory.createMergeSqlStatement( option ) 442 .format( (TMergeSqlStatement) sql ); 443 } 444 else if ( sql instanceof TIfStmt ) 445 { 446 FormatterFactory.createPlsqlIfStmtFormatter( option ) 447 .format( (TIfStmt) sql ); 448 } 449 else 450 { 451 FormatterFactory.createCommonStatement( option ).format( sql ); 452 } 453 } 454 455 private static AbstractStmtFormatter<TCommonBlock> createPlsqlBlockStmtFormatter( 456 GFmtOpt opt ) 457 { 458 return createFormatter( opt, 459 PlsqlBlockStmtFormatter.class, 460 new IFormatterBuilderCreator<PlsqlBlockStmtFormatter>( ) { 461 462 public AbstractStmtFormatterBuilder<PlsqlBlockStmtFormatter> create( ) 463 { 464 return new PlsqlBlockStmtFormatterBuilder( ); 465 } 466 } ); 467 } 468 469 private static MergeStmtFormatter createMergeSqlStatement( GFmtOpt opt ) 470 { 471 return createFormatter( opt, 472 MergeStmtFormatter.class, 473 new IFormatterBuilderCreator<MergeStmtFormatter>( ) { 474 475 public AbstractStmtFormatterBuilder<MergeStmtFormatter> create( ) 476 { 477 return new MergeStmtFormatterBuilder( ); 478 } 479 } ); 480 } 481 482 private static CommonStmtFormatter createCommonStatement( GFmtOpt opt ) 483 { 484 return createFormatter( opt, 485 CommonStmtFormatter.class, 486 new IFormatterBuilderCreator<CommonStmtFormatter>( ) { 487 488 public AbstractStmtFormatterBuilder<CommonStmtFormatter> create( ) 489 { 490 return new CommonStmtFormatterBuilder( ); 491 } 492 } ); 493 } 494 495 public static boolean isNotNeedFormat( TCustomSqlStatement sql ) 496 { 497 if ( sql == null ) 498 { 499 // the null statement needn't formatting. 500 return true; 501 } 502 if ( sql.getStartToken( ) != null ) 503 { 504 TSourceToken t = sql.getStartToken( ); 505 return isNotNeedFormat( t ); 506 } 507 return false; 508 } 509 510 public static boolean isNotNeedFormat( TSourceToken t ) 511 { 512 if ( t == null ) 513 { 514 return false; 515 } 516 TSourceTokenList bts = t.getTokensBefore( ); 517 if ( bts.size( ) > 0 ) 518 { 519 for ( int i = 0; i < bts.size( ); i++ ) 520 { 521 if ( SourceTokenOperator.createNoFormatFlagToken( ) 522 .equals( bts.get( i ) ) ) 523 { 524 return true; 525 } 526 } 527 } 528 return false; 529 } 530 531 public static void processBlockStmt( GFmtOpt opt, TMssqlBlock stmt, 532 TSourceToken ifToken ) 533 { 534 TSourceToken startToken = stmt.getStartToken( ); 535 TSourceToken endToken = stmt.getEndToken( ); 536 if ( startToken == null || endToken == null ) 537 { 538 return; 539 } 540 int curBeginIndent = SourceTokenOperator.curColumnNumberVT( ifToken ); 541 if ( opt.beStyleBlockLeftBEOnNewline ) 542 { 543 curBeginIndent += opt.beStyleBlockLeftBEIndentSize; 544 // process the begin token 545 SourceTokenOperator.addBefore( opt, 546 startToken, 547 SourceTokenOperator.createReturnSourceToken( ) ); 548 SourceTokenOperator.addBefore( opt, 549 startToken, 550 SourceTokenOperator.createWhitespaceSourceToken( curBeginIndent ) ); 551 } 552 // process the end token 553 int curEndIndent = SourceTokenOperator.curColumnNumberVT( ifToken ) 554 + ( opt.beStyleBlockLeftBEOnNewline ? opt.beStyleBlockLeftBEIndentSize 555 : opt.beStyleBlockRightBEIndentSize ); 556 SourceTokenOperator.addBefore( opt, 557 endToken, 558 SourceTokenOperator.createReturnSourceToken( ) ); 559 SourceTokenOperator.addBefore( opt, 560 endToken, 561 SourceTokenOperator.createWhitespaceSourceToken( curEndIndent ) ); 562 563 TStatementList list = stmt.getBodyStatements( ); 564 565 // first, process the indent for the first statement 566 if ( list != null && list.size( ) > 0 ) 567 { 568 int curBlockIndent = curEndIndent + opt.beStyleBlockIndentSize; 569 TCustomSqlStatement bstmt = list.get( 0 ); 570 TSourceToken bstartToken = bstmt.getStartToken( ); 571 if ( bstartToken != null ) 572 { 573 SourceTokenOperator.addBefore( opt, 574 bstartToken, 575 SourceTokenOperator.createReturnSourceToken( ) ); 576 SourceTokenOperator.addBefore( opt, 577 bstartToken, 578 SourceTokenOperator.createWhitespaceSourceToken( curBlockIndent ) ); 579 } 580 } 581 // second, process all the empty lines between the statements 582 AllStmtsFormatter.processEmptyLine( list, opt, true ); 583 584 // third, format the statements in the begin-end block 585 if ( list != null && list.size( ) > 0 ) 586 { 587 // int curBlockIndent = curEndIndent + opt.beStyleBlockIndentSize; 588 for ( int i = 0; i < list.size( ); i++ ) 589 { 590 TCustomSqlStatement bstmt = list.get( i ); 591 // TSourceToken bstartToken = bstmt.getStartToken(); 592 // if (bstartToken != null) { 593 // SourceTokenOperator.addBefore(opt, bstartToken, 594 // SourceTokenOperator.createReturnSourceToken()); 595 // if (i != 0 && opt.insertBlankLineInBatchSqls) { 596 // TCustomSqlStatement preBstmt = list.get(i - 1); 597 // TSourceToken preBEndToken = preBstmt.getEndToken(); 598 // if (preBEndToken != null) { 599 // SourceTokenOperator.addAfter(opt, preBstmt.getEndToken(), 600 // SourceTokenOperator.createReturnSourceToken()); 601 // } 602 // } 603 // SourceTokenOperator.addBefore(opt, bstartToken, 604 // SourceTokenOperator.createWhitespaceSourceToken(curBlockIndent)); 605 // 606 // } 607 FormatterFactory.processStatement( opt, bstmt ); 608 609 } 610 } 611 612 } 613 614 public static String pp( TGSqlParser parser, GFmtOpt option ) 615 { 616 if (option.removeComment) { 617 parser = SqlFormatter.preHandleRemoveComment(parser); 618 } 619 OutputStream o = new ByteArrayOutputStream( ); 620 IPrinter printer = PrinterFactory.createTextPrinter( o ); 621 622 FormatterFactory.createAllStmtsFormatter( option ) 623 .beforeFormat( parser.sqlstatements ); 624 625 for ( int i = 0; i < parser.sqlstatements.size( ); i++ ) 626 { 627 TCustomSqlStatement sql = parser.sqlstatements.get( i ); 628 processStatement( option, sql ); 629 } 630 if ( parser.sqlstatements != null && parser.sqlstatements.size( ) > 0 ) 631 { 632 FormatterFactory.createAllStmtsFormatter( option ) 633 .doFormat( parser.sqlstatements ); 634 FormatterFactory.createAllStmtsFormatter( option ) 635 .afterFormat( parser.sqlstatements ); 636 637 if ( outputConfig == null ) 638 { 639 outputConfig = OutputConfigFactory.getOutputConfig( option, 640 parser.getDbVendor( ) ); 641 } 642 643 printer.setOutputConfig( outputConfig ); 644 printer.print( parser.sqlstatements.get( 0 ).getStartToken( ).container ); 645 } 646 647 clearAllObject( option.sessionId ); 648 return o.toString( ); 649 650 } 651 652 public static OutputConfig getOutputConfig( ) 653 { 654 return outputConfig; 655 } 656 657 public static void setOutputConfig( OutputConfig outputConfig ) 658 { 659 FormatterFactory.outputConfig = outputConfig; 660 } 661 662 public static AllStmtsFormatter createAllStmtsFormatter( GFmtOpt option ) 663 { 664 return AllStmtsFormatterBuilder.create( option ); 665 } 666 667 public static void clearAllObject( String sessionId ) 668 { 669 FormatterFactory.clear( sessionId ); 670 ProcessorFactory.clear( sessionId ); 671 MediatorFactory.clear( sessionId ); 672 } 673 674 public static void clear( String sessionId ) 675 { 676 synchronized ( object ) 677 { 678 List<String> removedKeys = new ArrayList<String>( ); 679 for ( String key : formatter.keySet( ) ) 680 { 681 if ( key.startsWith( sessionId ) ) 682 { 683 removedKeys.add( key ); 684 } 685 } 686 for ( String key : removedKeys ) 687 { 688 formatter.remove( key ); 689 } 690 } 691 } 692}