001    /*
002     * Copyright (c) 2009 The openGion Project.
003     *
004     * Licensed under the Apache License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     *     http://www.apache.org/licenses/LICENSE-2.0
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
013     * either express or implied. See the License for the specific language
014     * governing permissions and limitations under the License.
015     */
016    package org.opengion.hayabusa.io;
017    
018    import java.io.PrintWriter;
019    import java.util.List;
020    import java.util.Locale;
021    import java.util.Map;
022    import java.util.Map.Entry;
023    
024    import org.opengion.hayabusa.common.HybsSystem;
025    import org.opengion.hayabusa.common.HybsSystemException;
026    import org.opengion.hayabusa.db.DBTableModel;
027    import org.opengion.hayabusa.db.DBColumn;
028    import org.opengion.fukurou.util.StringUtil;
029    import org.opengion.fukurou.util.HybsEntry;
030    
031    /**
032     * 区åˆ?‚Šæ–?­—指å®?初期値:タãƒ?ゼロカンマファイルの書きå?しクラスですã?
033     *
034     * ラベル?Œ名前,データの出力部のみオーバã?ライドすれã??Œ各種出力フォーマットに合わせた
035     * サブクラスを実現する事が可能ですã?
036     * ゼロカンマファイルとは、EXCELのゼロサプレス対策としてã€??ゼロのæ–?­—型ãƒ??タをå?力すã‚?
037     * 時に、å?頭にカンãƒ?')を付けて、ゼロが削除(見えなくなã‚?現象を抑止してã�?‚‹ファイルですã?
038     *
039     * こã?クラスは,可変長タブ区åˆ?‚Šæ–?­—ファイルの出力機è?を実現してã�?�¾すã?
040     *
041     * @og.group ファイル出åŠ?
042     *
043     * @version  4.0
044     * @author       Kazuhiko Hasegawa
045     * @since    JDK5.0,
046     */
047    public abstract class AbstractTableWriter implements TableWriter {
048            /** こã?プログラãƒ??VERSIONæ–?­—å?を設定しますã?       {@value} */
049            private static final String VERSION = "5.6.6.1 (2013/07/12)" ;
050    
051            private String  separator          = TAB_SEPARATOR;             // é ?›®区åˆ?‚Šæ–?­?
052            private String  headerSequence = HybsSystem.sys( "WRITER_HEADER_SEQUENCE" ) ;
053            protected int   numberOfColumns = -1;                   // 4.0.0 (2005/01/31) 出力対象のカラãƒ?•°
054            private boolean append                  = false;                                // 3.5.4.2 (2003/12/15)
055    
056            protected DBTableModel    table         = null;
057            protected DBColumn[]      dbColumn      = null;         // table に対するカラãƒ?‚ªブジェクãƒ?キャãƒ?‚·ュ)
058            protected int[]                   clmNo         = null;         // 出力対象のカラãƒ?•ª号配å?
059            private   String                  lang          = null;
060    
061            // 5.1.6.0 (2010/05/01) dbType の簡易的な設å®?
062            protected int[]                   dbType        = null;
063            /** dbType の簡易的な設å®?{@value} */
064            public static final int STRING  = 0;
065            /** dbType の簡易的な設å®?{@value} */
066            public static final int NVAR    = 1;
067            /** dbType の簡易的な設å®?{@value} */
068            public static final int NUMBER  = 2;
069    
070            // 4.0.0 (2005/11/30) 新規追åŠ?
071            private String    columns       = null;  // 外部æŒ?®šã?カラãƒ?��
072            // 3.5.4.5 (2004/01/23) エンコード文字å?æŒ?®?
073            private String          encode          = null;
074    
075            // 3.7.0.2 (2005/02/14) 行番号æƒ??をã?出力すã‚?true)/しなã�?false)を指å®?
076            private boolean         useNumber       = true;
077    
078            private boolean   useRenderer   = false;        // 5.2.1.0 (2010/10/01)
079    
080            /**
081             * DBTableModel から å�?½¢式ã?ãƒ??タを作æ?して,PrintWriter に書きå?しますã?
082             * こã?メソãƒ?ƒ‰は、EXCEL 書きå?し時に使用しますã?
083             *
084             * @see #isExcel()
085             */
086            abstract public void writeDBTable();
087    
088            /**
089             * DBTableModel から ãƒ??タを作æ?して,PrintWriter に書きå?しますã?
090             *
091             * @param       writer PrintWriterオブジェクãƒ?
092             */
093            abstract public void writeDBTable( final PrintWriter writer );
094    
095            /**
096             * numberOfColumns と DBColumn をå?期化しますã?
097             * å†?ƒ¨çš?�«、DBTableModel、lang , columns を使用してã€?
098             * numberOfColumns 、dbColumn、clmNo の値をå?期化しますã?
099             * カラãƒ?�Œ?‘é?目もなã�??合ã?è¨?ª?lnag)が未æŒ?®šã?DBTableModelが未æŒ?®?null)
100             * の場合ã?、false を返しますã?そã?場合ã?、以下ã?処ç�??正常に行えませんã€?
101             * ãƒ??タが0件の場合ã?、å?ç�?‚’行いますã?通常、ã?ãƒ?ƒ€ーのみのファイルã‚?
102             * 作æ?することになりますã?(これを雛形として、取込ãƒ??タを登録する事が可能)
103             *
104             * @og.rev 4.0.0.0 (2005/12/31) 外部æŒ?®šã?カラãƒ?��を使用
105             * @og.rev 5.1.6.0 (2010/05/01) DbType の初期値を設定するã?
106             *
107             * @return      初期化æ?功:true / 失敗:false
108             */
109            protected boolean createDBColumn() {
110    
111                    boolean rtnFlag = false;
112                    if( lang != null && table != null ) {
113                            if( columns != null ) {
114                                    String[] clms = StringUtil.csv2Array( columns );
115                                    numberOfColumns = clms.length;
116                                    clmNo = new int[numberOfColumns];
117                                    for( int i=0; i<numberOfColumns; i++ ) {
118                                            int no = table.getColumnNo( clms[i] );
119                                            clmNo[i] = no;
120                                    }
121                            }
122                            else {
123                                    numberOfColumns = table.getColumnCount();
124                                    clmNo = new int[numberOfColumns];
125                                    for( int i=0; i<numberOfColumns; i++ ) {
126                                            clmNo[i] = i;
127                                    }
128                            }
129    
130                            dbColumn = table.getDBColumns();
131                            rtnFlag = (numberOfColumns > 0);     // カラãƒ?�Œ?‘é?目以上あれã?成功
132    
133                            // 5.1.6.0 (2010/05/01) DbType の初期値を設定するã?
134                            dbType = new int[numberOfColumns];
135                            for( int i=0; i<numberOfColumns; i++ ) {
136                                    String type = dbColumn[clmNo[i]].getDbType();
137    
138                                    if( "NVAR".equals( type ) ) {
139                                            dbType[i] = NVAR;
140                                    }
141                                    else if( "S9".equals( type ) || "R".equals( type )  ) {
142                                            dbType[i] = NUMBER;
143                                    }
144                                    else {
145                                            dbType[i] = STRING;
146                                    }
147                            }
148                    }
149                    return rtnFlag;
150            }
151    
152            /**
153             * PrintWriter に DBTableModelのヘッãƒ??æƒ??を書き込みますã?
154             *
155             * @og.rev 3.1.1.0 (2003/03/28) 同期メソãƒ?ƒ‰(synchronized付き)を非同期に変更するã€?
156             *
157             * @param       writer PrintWriterオブジェクãƒ?
158             */
159            protected void writeHeader( final PrintWriter writer ) {
160                    // ここでは処ç�?‚’行いませんã€?
161            }
162    
163            /**
164             * PrintWriter に DBTableModelのラベルæƒ??を書き込みますã?
165             * 第ä¸?‚«ラãƒ?›®は、ラベルæƒ??を示ã�?"#Label" を書き込みますã?
166             * こã?行ã?、å?力形式に無関係に、TableWriter.TAB_SEPARATOR で区åˆ?‚‰れますã?
167             *
168             * @og.rev 3.1.1.0 (2003/03/28) 同期メソãƒ?ƒ‰(synchronized付き)を非同期に変更するã€?
169             * @og.rev 3.7.0.2 (2005/02/14) 行番号æƒ??をã?出力すã‚?true)/しなã�?false)を指å®?
170             * @og.rev 4.0.0.0 (2005/12/31) 外部æŒ?®šã?カラãƒ?��を使用
171             *
172             * @param       table DBTableModelオブジェクãƒ?
173             * @param       writer PrintWriterオブジェクãƒ?
174             */
175            protected void writeLabel( final DBTableModel table,final PrintWriter writer ) {
176                    if( useNumber ) {
177                            writer.print( "#Label" );
178                            writer.print( separator );
179                    }
180                    else {
181                            writer.print( "#" );
182                    }
183    
184                    for( int i=0; i<numberOfColumns; i++ ) {
185                            if( i != 0 ) { writer.print( separator ); }
186                            int clm = clmNo[i];
187                            writer.print( dbColumn[clm].getLabel() );
188                    }
189                    writer.println();
190            }
191    
192            /**
193             * PrintWriter に DBTableModelのé ?›®名情報を書き込みますã?
194             * 第ä¸?‚«ラãƒ?›®はã€??目名情報を示ã�?"#Name" を書き込みますã?
195             * こã?行ã?、å?力形式に無関係に、TableWriter.TAB_SEPARATOR で区åˆ?‚‰れますã?
196             *
197             * @og.rev 3.1.1.0 (2003/03/28) 同期メソãƒ?ƒ‰(synchronized付き)を非同期に変更するã€?
198             * @og.rev 3.7.0.2 (2005/02/14) 行番号æƒ??をã?出力すã‚?true)/しなã�?false)を指å®?
199             *
200             * @param       table DBTableModelオブジェクãƒ?
201             * @param       writer PrintWriterオブジェクãƒ?
202             */
203            protected void writeName( final DBTableModel table,final PrintWriter writer ) {
204                    if( useNumber ) {
205                            writer.print( "#Name" );
206                            writer.print( separator );
207                    }
208                    else {
209                            writer.print( "#" );
210                    }
211    
212                    for( int i=0; i<numberOfColumns; i++ ) {
213                            if( i != 0 ) { writer.print( separator ); }
214                            int clm = clmNo[i];
215                            writer.print( table.getColumnName(clm) );
216                    }
217                    writer.println();
218            }
219    
220            /**
221             * PrintWriter に DBTableModelのサイズæƒ??を書き込みますã?
222             * 第ä¸?‚«ラãƒ?›®は、サイズæƒ??を示ã�?"#Size" を書き込みますã?
223             * こã?行ã?、å?力形式に無関係に、TableWriter.TAB_SEPARATOR で区åˆ?‚‰れますã?
224             *
225             * @og.rev 3.1.1.0 (2003/03/28) 同期メソãƒ?ƒ‰(synchronized付き)を非同期に変更するã€?
226             * @og.rev 3.5.5.5 (2004/04/23) DBColumn の size と maxlength の 意味を変更
227             * @og.rev 3.7.0.2 (2005/02/14) 行番号æƒ??をã?出力すã‚?true)/しなã�?false)を指å®?
228             *
229             * @param       table DBTableModelオブジェクãƒ?
230             * @param       writer PrintWriterオブジェクãƒ?
231             */
232            protected void writeSize( final DBTableModel table,final PrintWriter writer ) {
233                    if( useNumber ) {
234                            writer.print( "#Size" );
235                            writer.print( separator );
236                    }
237                    else {
238                            writer.print( "#" );
239                    }
240    
241                    for( int i=0; i<numberOfColumns; i++ ) {
242                            if( i != 0 ) { writer.print( separator ); }
243                            int clm = clmNo[i];
244                            writer.print( dbColumn[clm].getTotalSize() );   // 4.0.0 (2005/01/31) メソãƒ?ƒ‰名変更
245                    }
246                    writer.println();
247            }
248    
249            /**
250             * PrintWriter に DBTableModelのクラス名情報を書き込みますã?
251             * 第ä¸?‚«ラãƒ?›®は、サイズæƒ??を示ã�?"#Class" を書き込みますã?
252             * こã?行ã?、å?力形式に無関係に、TableWriter.TAB_SEPARATOR で区åˆ?‚‰れますã?
253             *
254             * @og.rev 3.1.1.0 (2003/03/28) 同期メソãƒ?ƒ‰(synchronized付き)を非同期に変更するã€?
255             *
256             * @param       table DBTableModelオブジェクãƒ?
257             * @param       writer PrintWriterオブジェクãƒ?
258             */
259            protected void writeClass( final DBTableModel table,final PrintWriter writer ) {
260                    if( useNumber ) {
261                            writer.print( "#Class" );
262                            writer.print( separator );
263                    }
264                    else {
265                            writer.print( "#" );
266                    }
267    
268                    for( int i=0; i<numberOfColumns; i++ ) {
269                            if( i != 0 ) { writer.print( separator ); }
270                            int clm = clmNo[i];
271                            writer.print( dbColumn[clm].getClassName() );
272                    }
273                    writer.println();
274            }
275    
276            /**
277             * PrintWriter に セパレーターを書き込みますã?
278             * 第ä¸?‚«ラãƒ?›®は、サイズæƒ??を示ã�?"#----" を書き込みますã?
279             * こã?行ã?、å?力形式に無関係に、TableWriter.TAB_SEPARATOR で区åˆ?‚‰れますã?
280             *
281             * @og.rev 3.1.1.0 (2003/03/28) 同期メソãƒ?ƒ‰(synchronized付き)を非同期に変更するã€?
282             * @og.rev 3.7.0.2 (2005/02/14) 行番号æƒ??をã?出力すã‚?true)/しなã�?false)を指å®?
283             *
284             * @param       table DBTableModelオブジェクãƒ?
285             * @param       writer PrintWriterオブジェクãƒ?
286             */
287            protected void writeSeparator( final DBTableModel table,final PrintWriter writer ) {
288                    String sep = "----" ;
289                    if( useNumber ) {
290                            writer.print( "#----" );
291                            writer.print( separator );
292                    }
293                    else {
294                            writer.print( "#" );
295                    }
296    
297                    for( int i=0; i<numberOfColumns; i++ ) {
298                            if( i != 0 ) { writer.print( separator ); }
299                            writer.print( sep );
300                    }
301                    writer.println();
302            }
303    
304            /**
305             * PrintWriter に DBTableModelのãƒ??ブルæƒ??を書き込みますã?
306             * こã?クラスでは?Œデータã‚?ãƒ?ƒ–ルコーãƒ??ション(")で囲みますã?
307             * PrintWriter に DBTableModelのãƒ??ブルæƒ??を書き込みますã?
308             *
309             * @og.rev 2.0.0.5 (2002/09/30) 先é?ã�? でかつ数字タイãƒ?S9 or R)でなã�??合に ' をå?力するよã�?�«修正ã€?
310             * @og.rev 2.3.1.2 (2003/01/28) ãƒ??タ出力時に、改行が余å?に出されるç®?‰€を修正ã€?
311             * @og.rev 3.1.0.0 (2003/03/20) DBColumn から、getDbType() キーを直接取り出ã�?
312             * @og.rev 3.1.1.0 (2003/03/28) 同期メソãƒ?ƒ‰(synchronized付き)を非同期に変更するã€?
313             * @og.rev 3.3.3.1 (2003/07/18) ファイルリーãƒ?ライト時に後ろスペã?スの除去を行いますã?
314             * @og.rev 3.7.0.2 (2005/02/14) 行番号æƒ??をã?出力すã‚?true)/しなã�?false)を指å®?
315             * @og.rev 3.8.0.1 (2005/06/17) DBTypeã�?NVAR の場合ã?、å?のUnicodeに戻しますã?
316             * @og.rev 5.1.6.0 (2010/05/01) DbType の初期値(dbType)を利用するã€?
317             * @og.rev 5.2.1.0 (2010/10/01) こã?メソãƒ?ƒ‰は、abstract 化しますã?
318             *
319             * @param       table DBTableModelオブジェクãƒ?
320             * @param       writer PrintWriterオブジェクãƒ?
321             */
322            abstract protected void writeData( final DBTableModel table,final PrintWriter writer ) ;
323    //      protected void writeData( final DBTableModel table,final PrintWriter writer ) {
324    //              int numberOfRows =      table.getRowCount();
325    //
326    //              for( int row=0; row<numberOfRows; row++ ) {
327    //                      if( useNumber ) {
328    //                              writer.print( row+1 );
329    //                              writer.print( separator );
330    //                      }
331    //
332    //                      for( int i=0; i<numberOfColumns; i++ ) {
333    //                              if( i != 0 ) { writer.print( separator ); }
334    //
335    //                              int clm = clmNo[i];
336    //                              String val = table.getValue(row,clm);
337    ////                            if( "NVAR".equals( dbColumn[clm].getDbType()) ) {
338    //                              if( dbType[i] == NVAR ) {
339    //                                      val = StringUtil.getReplaceEscape( val );
340    //                              }
341    //
342    //                              if( val != null && val.length() > 0 && val.charAt(0) == '0' &&
343    ////                                    NUMBER_TYPE_LIST.indexOf( dbColumn[clm].getDbType() ) < 0 ) {
344    //                                      dbType[i] == NUMBER ) {
345    //                                              writer.print( "'" );            // 開始日などの 00000000 を文字å?タイプで渡ã�?
346    //                              }
347    //                              writer.print( StringUtil.rTrim( val ) );
348    //                      }
349    //                      writer.println();
350    //              }
351    //      }
352    
353            /**
354             * DBTableModel をセãƒ?ƒˆしますã?
355             *
356             * @og.rev 3.1.1.0 (2003/03/28) 同期メソãƒ?ƒ‰(synchronized付き)を非同期に変更するã€?
357             * @og.rev 3.5.4.2 (2003/12/15) lang 引数も同時に設定しますã?
358             *
359             * @param       table DBTableModelオブジェクãƒ?
360             * @param       lang è¨?ªžコーãƒ?
361             */
362            public void setDBTableModel( final DBTableModel table, final String lang ) {
363                    this.table = table;
364                    this.lang = lang;
365            }
366    
367            /**
368             * å†?ƒ¨の DBTableModel を返しますã?
369             *
370             * @return      DBTableModelオブジェクãƒ?
371             */
372            public DBTableModel getDBTableModel() {
373                    return table;
374            }
375    
376            /**
377             * DBTableModelの出力é?をセãƒ?ƒˆしますã?
378             * Label,Name,Size,Class,Data のå�?ƒ•ィールドã?頭æ–?­—ã?アルファベットで
379             * 出力é?を設定しますã?
380             *
381             * なお,å?力é?にæŒ?®šしなã�??目は出力されません
382             *
383             * @og.rev 3.1.1.0 (2003/03/28) 同期メソãƒ?ƒ‰(synchronized付き)を非同期に変更するã€?
384             *
385             * @param       hs 出力é? (LNSCD など)
386             */
387            public void setHeaderSequence( final String hs ) {
388                    if( hs != null ) { headerSequence = hs ; }
389            }
390    
391            /**
392             * DBTableModelの出力é?を返しますã?
393             * Label,Name,Size,Class,Data のå�?ƒ•ィールドã?頭æ–?­—ã?アルファベットで
394             * 出力é?を設定しますã?
395             *
396             * なお,å?力é?にæŒ?®šしなã�??目は出力されません
397             *
398             * @return      出力é? (LNSCD など)
399             */
400            public String getHeaderSequence() {
401                    return headerSequence ;
402            }
403    
404            /**
405             * ãƒ??タを書き込ã‚??合ã?,区åˆ?‚Šæ–?­—をセãƒ?ƒˆしますã?
406             *
407             * @og.rev 3.1.1.0 (2003/03/28) 同期メソãƒ?ƒ‰(synchronized付き)を非同期に変更するã€?
408             *
409             * @param       sep 区åˆ?‚Šæ–?­?
410             */
411            public void setSeparator( final String sep ) {
412                    if( sep != null ) { this.separator = sep; }
413            }
414    
415            /**
416             * ãƒ??タを書き込ã‚??合ã?,区åˆ?‚Šæ–?­—を返しますã?
417             *
418             * @return      区åˆ?‚Šæ–?­?
419             */
420            public String getSeparator() {
421                    return separator;
422            }
423    
424            /**
425             * DBTableModelのãƒ??タとして書き込ã‚?�¨きに、追åŠ?ƒ¢ードで書き込ã‚?�‹どã�?�‹を設定しますã?
426             * 初期値は、false(新規モーãƒ?ですã?
427             *
428             * @og.rev 3.5.4.2 (2003/12/15) 新規追åŠ?
429             *
430             * @param       flag    [true:追åŠ?ƒ¢ーãƒ?false:新規モード]
431             */
432            public void setAppend( final boolean flag ) {
433                    append = flag;
434            }
435    
436            /**
437             * DBTableModelのãƒ??タとして書き込ã‚?�¨きに、追åŠ?ƒ¢ードで書き込ã‚?�‹どã�?�‹を取得しますã?
438             * 初期値は、false(新規モーãƒ?ですã?
439             *
440             * @og.rev 3.5.4.2 (2003/12/15) 新規追åŠ?
441             *
442             * @return      true(追åŠ?ƒ¢ーãƒ?/false(新規モーãƒ?
443             */
444            public boolean isAppend() {
445                    return append ;
446            }
447    
448            /**
449             * DBTableModelのãƒ??タとして読み込ã‚?�¨きã?シート名を設定しますã?
450             * 初期値はã€?Sheet1" ですã?
451             * これは、EXCEL追åŠ?©Ÿè?として実è£?�•れてã�?�¾すã?
452             * ※ こã?クラスでは実è£?�•れてã�?�¾せんã€?
453             *
454             * @og.rev 3.5.4.2 (2003/12/15) 新規追åŠ?
455             * @og.rev 3.5.4.3 (2004/01/05) 実è£?»?­¢(TableWriter_Excel へ移å‹?
456             *
457             * @param   sheetName シート名
458             */
459            public void setSheetName( final String sheetName ) {
460                    String errMsg = "こã?メソãƒ?ƒ‰は、EXCEL追åŠ?©Ÿè?ですã?で、使用できませんã€?;
461                    throw new UnsupportedOperationException( errMsg );
462            }
463    
464            /**
465             * EXCEL雛型参è?ファイルのシート名を設定しますã?
466             * これは、EXCEL追åŠ?©Ÿè?として実è£?�•れてã�?�¾すã?
467             *
468             * EXCELファイルを書きå?す時にã€?››型として参ç?するシート名を指定しますã?
469             * これにより、è¤?•°の形式ã?異なるデータをé?次書きå?したã‚?appendモードを併用)する
470             * ことã‚??シートをæŒ?®šして新規にEXCELを作æ?する場合にフォーãƒ?‚’設定する事が可能になりますã?
471             * 初期値は、null(第ä¸?‚·ーãƒ? ですã?
472             * ※ こã?クラスでは実è£?�•れてã�?�¾せんã€?
473             *
474             * @og.rev 3.5.4.3 (2004/01/05) 新規追åŠ?
475             *
476             * @param   sheetName シート名
477             */
478            public void setRefSheetName( final String sheetName )  {
479                    String errMsg = "こã?メソãƒ?ƒ‰は、EXCEL追åŠ?©Ÿè?ですã?で、使用できませんã€?;
480                    throw new UnsupportedOperationException( errMsg );
481            }
482    
483            /**
484             * こã?クラスがã?EXCEL対応機è?を持ってã�?‚‹かどã�?�‹を返しますã?
485             *
486             * EXCEL対応機è?とは、シート名のセãƒ?ƒˆã€?››型参照ファイル名ã?セãƒ?ƒˆã€?
487             * 書き込みå…?ƒ•ァイルのFileオブジェクト取得などの、特殊機è?ですã?
488             * 本来は、インターフェースをå?けるべきとè€?�ˆますが、taglib クラス等ã?
489             * 関係があり、問ã�?�ˆわせによる条件åˆ?²�で対応しますã?
490             *
491             * @og.rev 3.5.4.3 (2004/01/05) 新規追åŠ?
492             *
493             * @return      EXCEL対応機è?を持ってã�?‚‹かどã�?�‹(ここでは、false固定でã�?
494             */
495            public boolean isExcel() {
496                    return false;
497            }
498    
499            /**
500             * 出力å?ファイル名をセãƒ?ƒˆしますã?(DIR + Filename)
501             * これは、EXCEL追åŠ?©Ÿè?として実è£?�•れてã�?�¾すã?
502             * ※ こã?クラスでは実è£?�•れてã�?�¾せんã€?
503             * こã?メソãƒ?ƒ‰では、å¿?�š、UnsupportedOperationException がã?throw されますã?
504             *
505             * @og.rev 3.5.4.3 (2004/01/05) 新規作æ?
506             *
507             * @param   filename EXCEL雛型参è?ファイルå�?
508             */
509            public void setFilename( final String filename ) {
510                    String errMsg = "こã?メソãƒ?ƒ‰は、EXCEL追åŠ?©Ÿè?ですã?で、使用できませんã€?;
511                    throw new UnsupportedOperationException( errMsg );
512            }
513    
514            /**
515             * EXCEL雛型参è?ファイル名をセãƒ?ƒˆしますã?(DIR + Filename)
516             * これは、EXCEL追åŠ?©Ÿè?として実è£?�•れてã�?�¾すã?
517             * ※ こã?クラスでは実è£?�•れてã�?�¾せんã€?
518             * こã?メソãƒ?ƒ‰では、å¿?�š、UnsupportedOperationException がã?throw されますã?
519             *
520             * @og.rev 3.5.4.3 (2004/01/05) 新規作æ?
521             *
522             * @param   filename EXCEL雛型参è?ファイルå�?
523             */
524            public void setRefFilename( final String filename ) {
525                    String errMsg = "こã?メソãƒ?ƒ‰は、EXCEL追åŠ?©Ÿè?ですã?で、使用できませんã€?;
526                    throw new UnsupportedOperationException( errMsg );
527            }
528    
529            /**
530             * EXCEL出力時のãƒ?ƒ•ォルトフォント名を設定しますã?
531             * これは、EXCEL追åŠ?©Ÿè?として実è£?�•れてã�?�¾すã?
532             *
533             * EXCELファイルを書きå?す時に、デフォルトフォント名を指定しますã?
534             * フォント名は、EXCELのフォント名をそのまま使用してくださいã€?
535             * å†?ƒ¨çš?�«、POI の org.apache.poi.hssf.usermodel.HSSFFont#setFontName( String )
536             * に設定されますã?
537             * 初期値は、シスãƒ?ƒ リソース の TABLE_WRITER_DEFAULT_FONT_NAME ですã?
538             *
539             * ※ こã?クラスでは実è£?�•れてã�?�¾せんã€?
540             * こã?メソãƒ?ƒ‰では、å¿?�š、UnsupportedOperationException がã?throw されますã?
541             *
542             * @og.rev 3.8.5.3 (2006/08/07) 新規追åŠ?
543             *
544             * @param   fontName フォント名
545             */
546            public void setFontName( final String fontName ) {
547                    String errMsg = "こã?メソãƒ?ƒ‰は、EXCEL追åŠ?©Ÿè?ですã?で、使用できませんã€?;
548                    throw new UnsupportedOperationException( errMsg );
549            }
550    
551            /**
552             * EXCEL出力時のãƒ?ƒ•ォルトフォントã?イント数を設定しますã?
553             * これは、EXCEL追åŠ?©Ÿè?として実è£?�•れてã�?�¾すã?
554             *
555             * EXCELファイルを書きå?す時に、デフォルトã?イント数を指定しますã?
556             * å†?ƒ¨çš?�«、POI の org.apache.poi.hssf.usermodel.HSSFFont#setFontHeightInPoints( short )
557             * に設定されますã?
558             * 初期値は、シスãƒ?ƒ リソース の TABLE_WRITER_DEFAULT_FONT_POINTS ですã?
559             *
560             * ※ こã?クラスでは実è£?�•れてã�?�¾せんã€?
561             * こã?メソãƒ?ƒ‰では、å¿?�š、UnsupportedOperationException がã?throw されますã?
562             *
563             * @og.rev 3.8.5.3 (2006/08/07) 新規追åŠ?
564             *
565             * @param       point   フォントã?イント数
566             */
567            public void setFontPoint( final short point ) {
568                    String errMsg = "こã?メソãƒ?ƒ‰は、EXCEL追åŠ?©Ÿè?ですã?で、使用できませんã€?;
569                    throw new UnsupportedOperationException( errMsg );
570            }
571    
572            /**
573             * 読み取りå…?ƒ•ァイルのエンコード文字å?を指定しますã?
574             * ファイルは、BufferedReader で受け取る為、本来は、エンコードã?不要ですがã€?
575             * 固定長ファイルの読み取り時ã?バイトコードå?割時に、指定ã?エンコードで
576             * åˆ?‰²するå¿?¦�がありますã?(例えば、半角文字ã?、Shift_JIS ではã€?¼‘バイãƒ?
577             *
578             * @og.rev 3.5.4.5 (2004/01/23) 新規作æ?
579             *
580             * @param   enc ファイルのエンコード文字å?
581             */
582            public void setEncode( final String enc ) {
583                    encode = enc;
584            }
585    
586            /**
587             * 読み取りå…?ƒ•ァイルのエンコード文字å?を取得しますã?
588             * ファイルは、BufferedReader で受け取る為、本来は、エンコードã?不要ですがã€?
589             * 固定長ファイルの読み取り時ã?バイトコードå?割時に、指定ã?エンコードで
590             * åˆ?‰²するå¿?¦�がありますã?(例えば、半角文字ã?、Shift_JIS ではã€?¼‘バイãƒ?
591             *
592             * @og.rev 3.5.4.5 (2004/01/23) 新規作æ?
593             *
594             * @return      ファイルのエンコード文字å?
595             */
596            protected String getEncode() {
597                    return encode;
598            }
599    
600            /**
601             * 行番号æƒ??をã?出力すã‚?true)/しなã�?false)を指定しますã?
602             *
603             * 通常のフォーマットでは、各行ã?先é?に行番号をå?力しますã?
604             * これはã€?NAME 属æ?を使用する場合には、å¿?�š出力するå¿?¦�がありますã?
605             * (#NAME 属æ?は、読み取り時には、å¿??ですã?)
606             * こã?、å?頭の行番号が不要な場å�?つまりã?他ã?シスãƒ?ƒ へのãƒ??タ出力ã?
607             * こã?シスãƒ?ƒ ではã€?NAME 属æ?がå?力されなã�?�Ÿめã?読み込みできませんã€?
608             * こã?行番号をå?力しなã�?‚ˆã�?�«できますã?
609             * 初期値は、true(出力すã‚? ですã?
610             *
611             * @og.rev 3.7.0.2 (2005/02/14) 新規追åŠ?
612             *
613             * @param   useNumber 行番号æƒ??ã‚?[true:出力すã‚?false:しない]
614             */
615            public void setUseNumber( final boolean useNumber ) {
616                    this.useNumber = useNumber;
617            }
618    
619            /**
620             * 行番号æƒ??をã?出力すã‚?true)/しなã�?false)を返しますã?
621             *
622             * 通常のフォーマットでは、各行ã?先é?に行番号をå?力しますã?
623             * これはã€?NAME 属æ?を使用する場合には、å¿?�š出力するå¿?¦�がありますã?
624             * (#NAME 属æ?は、読み取り時には、å¿??ですã?)
625             * こã?、å?頭の行番号が不要な場å�?つまりã?他ã?シスãƒ?ƒ へのãƒ??タ出力ã?
626             * こã?シスãƒ?ƒ ではã€?NAME 属æ?がå?力されなã�?�Ÿめã?読み込みできませんã€?
627             * こã?行番号をå?力しなã�?‚ˆã�?�«できますã?
628             * 初期値は、true(出力すã‚? ですã?
629             *
630             * @og.rev 3.7.0.2 (2005/02/14) 新規追åŠ?
631             *
632             * @return   行番号æƒ??をã?出力すã‚?true)/しなã�?false)
633             */
634            protected boolean isUseNumber() {
635                    return useNumber;
636            }
637    
638            /**
639             * パラメーターリストをセãƒ?ƒˆしますã?
640             * å†?ƒ¨は、HybsEntry クラスを持ってã�?�¾すã?
641             * 引数がã?null の場合ã?、何もしませんã€?
642             * ※ こã?クラスでは実è£?�•れてã�?�¾せんã€?
643             *
644             * @og.rev 4.0.0.0 (2005/01/31) 新規追åŠ?
645             *
646             * @param   listParam   パラメーターリスãƒ?
647             */
648            public void setParam( final List<HybsEntry> listParam ) {
649                    String errMsg = "こã?メソãƒ?ƒ‰は、XML追åŠ?©Ÿè?ですã?で、使用できませんã€?;
650                    throw new UnsupportedOperationException( errMsg );
651            }
652    
653            /**
654             * 出力å?ファイルのカラãƒ??をã?外部(タグ)よりCSV形式ã?æ–?­—å?でæŒ?®šしますã?
655             * ただしã?æŒ?®šã?カラãƒ?��は、DBTableModel上に存在してã�?‚‹å¿?¦�がありますã?
656             *
657             * @og.rev 4.0.0.0 (2005/11/30) 新規追åŠ?
658             *
659             * @param   clms 出力å?ファイルのカラãƒ??(カンマ区åˆ?‚Šæ–?­?
660             */
661            public void setColumns( final String clms ) {
662                    columns = clms ;
663            }
664    
665            /**
666             * 書込処ç�?�§コードリソースのラベル変換を行うかどã�?�‹[true/false]を指定しますã?
667             *
668             * コードリソースをそのままの値で出力すると、数字や記号になり何が書かれてã�?‚‹のã�?
669             * 不æ?になりますã?
670             * これは、コードリソースをラベルに変換して出力するかどã�?�‹を指定しますã?
671             * 当然、コードã?ユニã?クですが、ラベルはユニã?クになるかどã�?�‹保障はされてã�?�¾せんので
672             * TableReader 系で読み込ã‚??合には、リスクが発生しますã?
673             * またã?TableReader 系で読み込ã‚??合にもã?ラベルからコードを求めるé?変換を行うようにã€?
674             * setUseRenderer メソãƒ?ƒ‰でæŒ?®šするå¿?¦�がありますã?
675             *
676             * 従来は、TableWriter 系に、TableWriter_Renderer 系のクラスを作って対応してã�?�¾したがã?
677             * こã?メソãƒ?ƒ‰の属æ?値のフラグで、制御しますã?
678             *
679             * @og.rev 5.2.1.0 (2010/10/01) 新規作æ?
680             *
681             * @param       useRenderer     コードリソースのラベル変換を行うかどã�?�‹ [true:行う/false:行わない]
682             */
683            public void setUseRenderer( final boolean useRenderer ) {
684                    this.useRenderer = useRenderer;
685            }
686    
687            /**
688             * 書きå?しå?ç�?�§コードリソースのラベル変換を行うかどã�?�‹を返しますã?
689             * 初期値は、false(行わなã�? ですã?
690             *
691             * @og.rev 5.2.1.0 (2010/10/01) 新規作æ?
692             *
693             * @return      ラベル変換を行うかどã�?�‹(true:行う/false:行わなã�?
694             */
695            protected boolean isUseRenderer() {
696                    return useRenderer ;
697            }
698    
699            /**
700             * ãƒ??タã‚?ãƒ?ƒ–ルコーãƒ??ション(")で囲みますã?
701             *
702             * こã?処ç�?�§は、前後をãƒ?ƒ–ルクオートで囲ã�?�Ÿめã?改行ã?有無は判定すã‚?
703             * å¿?¦�ã?ありませんã€?
704             * ãƒ?ƒ–ルクオートを含ã‚??合ã?、その直前にãƒ?ƒ–ルクオートを強制çš?�«追åŠ?�—ますã?
705             *
706             * @param        data å…??Stringæ–?­—å?
707             *
708             * @return       ãƒ?ƒ–ルコーãƒ??ションで囲まれたæ–?­—å?
709             */
710            protected String quotation( final String data ) {
711                    return "\"" + StringUtil.replace( data,"\"","\"\"" ) + "\"" ;
712            }
713    
714            /**
715             * ãƒ??タに対して 改行ã?ãƒ?ƒ–ルクオート等ã?処ç�?‚’行いますã?
716             *
717             * これは、データの前後をãƒ?ƒ–ルクオートで括ã‚?quotation(String)と異なã‚?
718             * 前後には、ダブルクオーãƒ?を追åŠ?�—ませんã€?
719             * ただしã?以下ã??’つの条件で処ç�?‚’行いますã?
720             * ?‘.改行を含ã‚??合ã?、ダブルクオートを強制çš?�«前後に追åŠ?�™るã?
721             * ?’.ダブルクオートを含ã‚??合ã?、その直前にãƒ?ƒ–ルクオートを強制çš?�«追åŠ?�™るã?
722             *
723             * @og.rev 5.2.2.0 (2010/11/01) 新規追åŠ?
724             *
725             * @param        data å…??Stringæ–?­—å?
726             *
727             * @return       改行ã?ãƒ?ƒ–ルクオート等ã?処ç�?
728             */
729            protected String quotation2( final String data ) {
730                    String rtn = StringUtil.replace( data,"\"","\"\"" );
731                    if( rtn != null && rtn.indexOf( HybsSystem.CR ) >= 0 ) {
732                            rtn = "\"" + rtn + "\"" ;
733                    }
734    
735                    return rtn ;
736            }
737    
738            /**
739             * keys の整合æ?チェãƒ?‚¯を行いますã?
740             *
741             * キーかkeysMapのどちらかã�?null の場合ã?、何もしませんã€?
742             * チェãƒ?‚¯するキーは、å?部で大æ–?­—に変換しておきますã?
743             * keysMap に登録するキーは、大æ–?­—で登録しておいてくださいã€?
744             * ここのチェãƒ?‚¯では、キーマップに存在しなければ、エラーになりますã?
745             *
746             * @og.rev 5.6.6.1 (2013/07/12) keys の整合æ?チェãƒ?‚¯を行いますã?
747             *
748             * @param   key チェãƒ?‚¯するキーæ–?­—å?(null の場合ã?、å?ç�?�—なã�?
749             * @param   keysMap 利用可能なキーのマッãƒ?大æ–?­—に統ä¸?
750             */
751            protected void checkParam( final String key,final Map<String,String> keysMap ) {
752                    // key ã�?keysMap かどちらかã�?null の場合ã?、å?ç�?‚’行わなã�??
753                    if( key == null || keysMap == null ) { return; }
754    
755                    String upKey = key.toUpperCase(Locale.JAPAN);
756    
757                    if( ! keysMap.containsKey( upKey ) ) {
758                            String BR = "<br />" + HybsSystem.CR ;
759                            StringBuilder errMsg = new StringBuilder();
760                            errMsg.append( BR )
761                                      .append( "æŒ?®šã?キーは、この tableWriter では、使用できませんã€? ).append( BR )
762                                      .append( "  class=[" ).append( getClass().getName() ).append( "]" ).append( BR )
763                                      .append( "  key  =[" ).append( key                              ).append( "]" ).append( BR )
764                                      .append( "  ======== usage keys ======== " ).append( BR ) ;
765                            for( Map.Entry<String, String> entry : keysMap.entrySet() ) {
766                                    errMsg.append( "  " ).append( entry.getKey() ).append( " : " )
767                                                                             .append( entry.getValue() ).append( BR ) ;
768                            }
769                            errMsg.append( "  ============================ " ).append( BR );
770    
771                            throw new HybsSystemException( errMsg.toString() );
772                    }
773            }
774    }