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