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.taglib;
017    
018    import org.opengion.fukurou.util.ErrMsg;
019    import org.opengion.fukurou.util.ErrorMessage;
020    import org.opengion.hayabusa.html.ViewForm;
021    import org.opengion.hayabusa.html.ViewFormFactory;
022    import org.opengion.hayabusa.resource.ResourceManager;
023    import org.opengion.hayabusa.db.DBTableModel;
024    import org.opengion.hayabusa.db.DBTableModelUtil;
025    import org.opengion.hayabusa.db.DBColumn;
026    
027    import java.util.Arrays;
028    import java.util.Comparator;
029    
030    /**
031     *  Taglib で共通的に使用され?ユー?リ?クラスです?
032     *
033     * 全てのメソ?は?<del>protected</del>パッケージプライベ?トな
034     *  static 宣?れて?す?
035     *
036     * @og.rev 3.1.1.0 (2003/03/28) 新規作?
037     * @og.group そ?他部?
038     *
039     * @version  4.0
040     * @author       Kazuhiko Hasegawa
041     * @since    JDK5.0,
042     */
043    final class TaglibUtil  {
044            static final String VIEW_ID = "HYBS_VIEW" ;             // 3.5.6.4 (2004/07/16)
045            static final String LINK_ID = "HYBS_LINK" ;             // 3.5.6.4 (2004/07/16)
046            static final String MARK_ID = "HYBS_MARK" ;             // 3.5.6.4 (2004/07/16)
047    
048            private static int tagId = 0;
049    
050            /**
051             *      ?ォルトコンストラクターをprivateにして?
052             *      オブジェクト?生?をさせな??する?
053             *
054             */
055            private TaglibUtil() {}
056    
057            /**
058             * チェ?ボックスのラベルを関連つけるための id 値を返します?
059             *
060             * InputTag と OrderByTag 全体で、呼び出される?度に連番をつけて返します?
061             * ユニ?クな番号になる様にする事が目?ので?9999 で? にクリアします?
062             * 別スレ?による同時アクセスで整合?が?綻(同じ番号が返る)しても?
063             * 問題ありません?単独のスレ??ユニ?クになれ?よい?
064             *
065             * @return  ユニ?クな id 値
066             */
067            static String getTagId() {
068                    String id = "ID" + ( tagId++ );
069    
070                    if( tagId >= 100000 ) { tagId = 0; }
071                    return ( id );
072            }
073    
074            /**
075             * ErrorMessage オブジェクトと、ResourceManager より、表示用 HTML??ブルを作?します?
076             * これは、従来?各Taglibパッケージで使用して?した、ErrorMessage オブジェクトを?
077             * HTML??ブル形式で表示する為に、DBUtilクラス??ViewFormクラスなど、?のクラス?
078             * ?に?合わせて使用して?したが??の static メソ?にまとめたも?です?
079             *
080             * @og.rev 3.5.5.2 (2004/04/02) 新規追?
081             * @og.rev 3.5.6.1 (2004/06/25) lang ?コー?属?を削除します?
082             * @og.rev 3.5.6.2 (2004/07/05) setBgColorCycle の引数定義を変更
083             * @og.rev 3.8.0.4 (2005/08/08) setUseScrollBar の追?ヘッ??固定?スクロールバ?を?さな?
084             * @og.rev 3.8.9.5 (2007/09/12) PG名?ス?プ名追?開発ガイドライン対?
085             * @og.rev 4.0.0.0 (2005/01/31) ResourceManager getMessage 関数を使用
086             * @og.rev 4.0.0.0 (2007/10/18) メ?ージリソース統? getResource().getMessage > getResource().getLabel )
087             * @og.rev 4.3.2.0 (2008/09/11) 行番号?ート?メ?ージのラベル(短)化?コメント??
088             * @og.rev 4.3.4.5 (2009/01/08) 対応方?概要説?が存在すれば表示する
089             * @og.rev 4.3.7.6 (2009/07/15) 対応方法?パラメータ対?
090             *
091             * @param   errMsg  ErrorMessageオブジェク?
092             * @param   resource ResourceManager リソースマネージャー
093             *
094             * @return  HTML の??ブルタグに変換後???(無ければ、ゼロストリング)
095             */
096            static String makeHTMLErrorTable( final ErrorMessage errMsg,final ResourceManager resource ) {
097                    if( errMsg == null ) { return ""; }
098    
099                    final String[] names ;
100                    if( errMsg.isSetPgStep() ) {
101                            // names = new String[] { "ROW_NO","KEKKA","MSGID","MESSAGE","PG","STEP" }; // 3.8.9.5 (2007/09/12)
102                            names = new String[] { "ROW_NO","KEKKA","MSGID","MESSAGE", "PG","STEP" }; // 3.8.9.5 (2007/09/12)
103                    }
104                    else {
105                            names = new String[] { "ROW_NO","KEKKA","MSGID","MESSAGE" };
106                    }
107    
108                    int clmSize = names.length;
109    
110                    DBTableModel errTable = DBTableModelUtil.newDBTable();
111                    errTable.init( clmSize );
112    
113                    for( int i=0; i<clmSize; i++ ) {
114                            DBColumn dbColumn = resource.makeDBColumn( names[i] );
115                            errTable.setDBColumn( i,dbColumn );
116                    }
117    
118                    // 4.3.2.0 (2008/09/11) 行番号?ー?
119                    ErrMsg[] errMsgs = errMsg.toArray();
120                    Arrays.sort( errMsgs, errComp );
121    
122                    int tableRow = 0; // 4.3.4.5 (2009/01/08) ??ブルモ?の行番号
123    
124                    for( int i=0; i<errMsg.size(); i++ ) {
125                            ErrMsg err = errMsgs[i];
126                            String[] clmVals = new String[clmSize];
127                            clmVals[0] = String.valueOf( err.getNo() );
128                            clmVals[1] = String.valueOf( err.getKekka() );
129                            clmVals[2] = err.getId();
130                            clmVals[3] = resource.getLabel( err );
131                            if( errMsg.isSetPgStep() ) {
132                                    clmVals[4] = err.getPg();
133                                    clmVals[5] = err.getStep();
134                            }
135                            errTable.addColumnValues( clmVals );
136                            // errTable.setRowWritable( i,false );  // 書込み禁止
137                            errTable.setRowWritable( tableRow, false );     // 4.3.4.5 (2009/01/08) 書込み禁止
138    
139                            // 対応方?概要説?が存在すれば直下に?追??4.3.4.5 (2009/01/08)
140                            // String desc = resource.getDescription( clmVals[2] );
141                            String desc = resource.getDescription( err ); // 4.3.7.6 (2009/07/15)
142                            if( desc != null && desc.length() > 0 ){
143                                    tableRow++;
144                                    String[] descVals = new String[clmSize];
145                                    descVals[3] = desc;
146                                    errTable.addColumnValues( descVals );
147                                    errTable.setRowWritable( tableRow, false );
148                            }
149    
150                            tableRow++;
151                    }
152    
153    //              for( int i=0; i<errMsg.size(); i++ ) {
154    //                      String[] clmVals = new String[clmSize];
155    //                      clmVals[0] = String.valueOf( errMsg.getNo(i) );
156    //                      clmVals[1] = String.valueOf( errMsg.getKekka(i) );
157    //                      clmVals[2] = errMsg.getId(i);
158    //                      ErrMsg err = errMsg.getErrMsg( i );                             // 4.0.0 (2005/01/31)
159    ////                    clmVals[3] = resource.getMessage( err );                // 4.0.0 (2005/01/31)
160    //                      clmVals[3] = resource.getLabel( err );                  // 4.0.0 (2005/01/31)
161    //                      if( errMsg.isSetPgStep() ) {
162    //                              clmVals[4] = errMsg.getPg(i); // 3.8.9.5 (2007/09/12)
163    //                              clmVals[5] = errMsg.getStep(i); // 3.8.9.5 (2007/09/12)
164    //                      }
165    //                      errTable.addColumnValues( clmVals );
166    //                      errTable.setRowWritable( i,false );     // 書込み禁止
167    //              }
168    
169                    // ここまでが?DBTableModel の作?。以下?、View での表示
170    
171                    ViewForm form = ViewFormFactory.newInstance( "HTMLTable" );
172    
173                    form.init( errTable );
174                    if( ! errMsg.isOK() )  {        // 正常以?
175                            form.setBgColorCycle( -1 * errMsg.getKekka() ); // エラー処?のゼブラ模?
176                            form.setNumberType( "delete" );                 // 番号?出さな??
177                            form.setUseTableSorter( false );                // ソート用リンクは出さな??
178    //                      form.setUseScrollBar( false,null );             // 4.0.0 (2005/01/31) スクロールバ?用のDIV要?出力しな??
179                            form.setUseScrollBar( false );                  // 4.0.0 (2005/01/31) スクロールバ?用のDIV要?出力しな??
180                    }
181    
182                    return form.create();
183            }
184    
185            /**
186             * ErrorMessage オブジェクトと、ResourceManager より、表示用 HTML??ブルを作?します?
187             * こ?メソ?では、エラーメ?ージ及?エラーコードを?形式で表示します?
188             *
189             * @param   errMsg  ErrorMessageオブジェク?
190             * @param   resource ResourceManager リソースマネージャー
191             *
192             * @return  HTML の??ブルタグに変換後???(無ければ、ゼロストリング)
193             */
194            static String makeHTMLSimpleErrorList( final ErrorMessage errMsg,final ResourceManager resource ) {
195                    if( errMsg == null ) { return ""; }
196    
197                    String[] names = new String[] { "MESSAGE" };
198    
199                    int clmSize = names.length;
200    
201                    DBTableModel errTable = DBTableModelUtil.newDBTable();
202                    errTable.init( clmSize );
203    
204                    for( int i=0; i<clmSize; i++ ) {
205                            DBColumn dbColumn = resource.makeDBColumn( names[i] );
206                            errTable.setDBColumn( i,dbColumn );
207                    }
208    
209                    ErrMsg[] errMsgs = errMsg.toArray();
210                    Arrays.sort( errMsgs, errComp );
211    
212                    for( int i=0; i<errMsg.size(); i++ ) {
213                            ErrMsg err = errMsgs[i];
214                            String[] clmVals = new String[clmSize];
215                            clmVals[0] = resource.getShortLabel( err.getId() ) + "(" + err.getId() + ")";
216                            errTable.addColumnValues( clmVals );
217                            errTable.setRowWritable( i,false );
218                    }
219    
220                    // ここまでが?DBTableModel の作?。以下?、View での表示
221                    ViewForm form = ViewFormFactory.newInstance( "HTMLSimpleList" );
222                    form.init( errTable );
223    
224                    if( ! errMsg.isOK() )  {        // 正常以?
225                            form.setBgColorCycle( -1 * errMsg.getKekka() ); // エラー処?のゼブラ模?
226                    }
227    
228                    return form.create();
229            }
230    
231            /**
232             * ????から、数字部のみ取り出して、変換して返します?
233             *
234             * 例えば?200px" ?200 に変換します?
235             *
236             * @og.rev 4.0.0.0 (20065/12/05) 新規作?
237             *
238             * @param       inStr   入力する文字?
239             *
240             * @return  変換後?数?
241             */
242            static int changeInt( final String inStr ) {
243                    if( inStr == null || inStr.length() == 0 ) { return 0; }
244    
245                    int adrs;
246                    for( adrs=0; adrs<inStr.length(); adrs++ ) {
247                            char ch = inStr.charAt(adrs);
248                            if( ch < '0' || ch > '9' ) { break; }
249                    }
250    
251                    if( adrs == 0 ) { return 0; }
252    
253                    return Integer.parseInt( inStr.substring( 0,adrs ) );
254            }
255    
256            // 4.3.2.0 (2008/09/11) 行番号?ート?ための、Comparator オブジェク?
257            private static final Comparator<? super ErrMsg> errComp =
258                    new Comparator<ErrMsg>() {
259                            public int compare( final ErrMsg err1,final ErrMsg err2 ) {
260                                    return err1.getNo() - err2.getNo() ;
261                            }
262                    } ;
263    
264    }