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