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}