    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.fukurou.util.StringUtil;                            // 6.9.2.1 (2018/03/12)
    021import org.opengion.hayabusa.html.ViewForm;
    022import org.opengion.hayabusa.html.ViewFormFactory;
    023import org.opengion.hayabusa.resource.ResourceManager;
    024import org.opengion.hayabusa.db.DBTableModel;
    025import org.opengion.hayabusa.db.DBTableModelUtil;
    026import org.opengion.hayabusa.db.DBColumn;
    027
    028import java.util.Arrays;
    029import java.util.Comparator;
    030
    031/**
    032 *  Taglib で共通的に使用される ユーティリティクラスです。
    033 *
    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 */
    043final class TaglibUtil  {
    044        /* default */ /** VIEW */ static final String VIEW_ID = "HYBS_VIEW" ;           // 3.5.6.4 (2004/07/16)
    045        /* default */ /** LINK */ static final String LINK_ID = "HYBS_LINK" ;           // 3.5.6.4 (2004/07/16)
    046        /* default */ /** MARK */ static final String MARK_ID = "HYBS_MARK" ;           // 3.5.6.4 (2004/07/16)
    047
    048        private static int tagId        ;
    049
    050        // 4.3.2.0 (2008/09/11) 行番号順ソートのための、Comparator オブジェクト
    051        private static final Comparator<? super ErrMsg> ERR_COMP =              // 6.4.1.1 (2016/01/16) errComp  → ERR_COMP  refactoring
    052                new Comparator<ErrMsg>() {
    053                        /**
    054                         * 順序付けのために2つの引数を比較します。
    055                         *
    056                         * Comparator インタフェースの実装です。
    057                         *
    058                         * @param       s1      比較対象の最初のErrMsg
    059                         * @param       s2      比較対象の2番目のErrMsg
    060                         * @return      最初の引数が2番目の引数より小さい場合は負の整数、両方が等しい場合は0、最初の引数が2番目の引数より大きい場合は正の整数。
    061                         */
    062                        @Override
    063                        public int compare( final ErrMsg err1,final ErrMsg err2 ) {
    064                                return err1.getNo() - err2.getNo() ;
    065                        }
    066                } ;
    067
    068        /**
    069         *      デフォルトコンストラクターをprivateにして、
    070         *      オブジェクトの生成をさせないようにする。
    071         *
    072         */
    073        private TaglibUtil() {}
    074
    075        /**
    076         * チェックボックスのラベルを関連つけるための id 値を返します。
    077         *
    078         * InputTag と OrderByTag 全体で、呼び出される都度に連番をつけて返します。
    079         * ユニークな番号になる様にする事が目的なので、99999 で、0 にクリアします。
    080         * 別スレッドによる同時アクセスで整合性が破綻(同じ番号が返る)しても、
    081         * 問題ありません。(単独のスレッド内でユニークになればよい。)
    082         *
    083         * @return  ユニークな id 値
    084         */
    085        /* default */ static String getTagId() {
    086                final String id = "ID" + ( tagId++ );
    087
    088                if( tagId >= 100000 ) { tagId = 0; }
    089                return id ;
    090        }
    091
    092        /**
    093         * ErrorMessage オブジェクトと、ResourceManager より、表示用 HTMLテーブルを作成します。
    094         * これは、従来，各Taglibパッケージで使用していました、ErrorMessage オブジェクトを、
    095         * HTMLテーブル形式で表示する為に、DBUtilクラスや、ViewFormクラスなど、複数のクラスを
    096         * 複雑に組み合わせて使用していましたが、一つの static メソッドにまとめたものです。
    097         *
    098         * @og.rev 7.0.7.0 (2019/12/13) useSLabel 属性を追加。
    099         *
    100         * @param   errMsg  ErrorMessageオブジェクト
    101         * @param   resource リソースマネージャー
    102         *
    103         * @return  HTMLのテーブルタグに変換後の文字列(無ければ、ゼロストリング)
    104         * @og.rtnNotNull
    105         */
    106        /* default */ static String makeHTMLErrorTable( final ErrorMessage errMsg,final ResourceManager resource ) {
    107                return makeHTMLErrorTable( errMsg,resource , false );                           // 通常ラベル使用
    108        }
    109
    110        /**
    111         * ErrorMessage オブジェクトと、ResourceManager より、表示用 HTMLテーブルを作成します。
    112         * これは、従来，各Taglibパッケージで使用していました、ErrorMessage オブジェクトを、
    113         * HTMLテーブル形式で表示する為に、DBUtilクラスや、ViewFormクラスなど、複数のクラスを
    114         * 複雑に組み合わせて使用していましたが、一つの static メソッドにまとめたものです。
    115         *
    116         * @og.rev 3.5.5.2 (2004/04/02) 新規追加
    117         * @og.rev 3.5.6.1 (2004/06/25) lang 言語コード 属性を削除します。
    118         * @og.rev 3.5.6.2 (2004/07/05) setBgColorCycle の引数定義を変更
    119         * @og.rev 3.8.0.4 (2005/08/08) setUseScrollBar の追加(ヘッダー固定のスクロールバーを出さない)
    120         * @og.rev 3.8.9.5 (2007/09/12) PG名、ステップ名追加(開発ガイドライン対応)
    121         * @og.rev 4.0.0.0 (2005/01/31) ResourceManager getMessage 関数を使用
    122         * @og.rev 4.0.0.0 (2007/10/18) メッセージリソース統合( getResource().getMessage ⇒ getResource().getLabel )
    123         * @og.rev 4.3.2.0 (2008/09/11) 行番号順ソート、メッセージのラベル(短)化、コメント出力
    124         * @og.rev 4.3.4.5 (2009/01/08) 対応方法(概要説明)が存在すれば表示する
    125         * @og.rev 4.3.7.6 (2009/07/15) 対応方法のパラメータ対応
    126         * @og.rev 6.0.2.5 (2014/10/31) エラーメッセージに、preタグを付けます。
    127         * @og.rev 6.2.2.0 (2015/03/27) interface に変更タイプ と、書込み許可を追加
    128         * @og.rev 6.4.5.2 (2016/05/06) Exception: の後ろに改行を入れます(クラス名が長いと、メッセージが見えにくいため)。
    129         * @og.rev 6.8.1.1 (2017/07/22) makeNthChild 処理時に、自身のﾃｰﾌﾞﾙと区別するために、viewClass を追加します。
    130         * @og.rev 6.9.2.1 (2018/03/12) エラーメッセージのタグ情報を、パースします。
    131         * @og.rev 6.9.3.1 (2018/04/02) エラーメッセージのタグ情報のパースは、JasperException 以降から、改行２つまでの間のみとする。
    132         * @og.rev 7.0.7.0 (2019/12/13) useSLabel 属性を追加。
    133         * @og.rev 7.0.7.2 (2020/01/09) メッセージを比較して、同じなら出力しない。
    134         * @og.rev 7.2.9.0 (2020/10/12) getRawShortLabel → getShortErrorMsg メソッド名変更
    135         *
    136         * @param   errMsg  ErrorMessageオブジェクト
    137         * @param   resource リソースマネージャー
    138         * @param   useSLabel SLABEL利用 [true:利用する/false:利用しない]
    139         *
    140         * @return  HTMLのテーブルタグに変換後の文字列(無ければ、ゼロストリング)
    141         * @og.rtnNotNull
    142         */
    143//      /* default */ static String makeHTMLErrorTable( final ErrorMessage errMsg,final ResourceManager resource ) {
    144        /* default */ static String makeHTMLErrorTable( final ErrorMessage errMsg,final ResourceManager resource, final boolean useSLabel ) {
    145                if( errMsg == null ) { return ""; }
    146
    147                final String[] names ;
    148                if( errMsg.isSetPgStep() ) {
    149                        // names = new String[] { "ROW_NO","KEKKA","MSGID","MESSAGE","PG","STEP" }; // 3.8.9.5 (2007/09/12)
    150                        names = new String[] { "ROW_NO","KEKKA","MSGID","MESSAGE", "PG","STEP" }; // 3.8.9.5 (2007/09/12)
    151                }
    152                else {
    153                        names = new String[] { "ROW_NO","KEKKA","MSGID","MESSAGE" };
    154                }
    155
    156                final int clmSize = names.length;
    157
    158                final DBTableModel errTable = DBTableModelUtil.newDBTable();
    159                errTable.init( clmSize );
    160
    161                for( int i=0; i<clmSize; i++ ) {
    162                        final DBColumn dbColumn = resource.makeDBColumn( names[i] );
    163                        errTable.setDBColumn( i,dbColumn );
    164                }
    165
    166                // 4.3.2.0 (2008/09/11) 行番号順ソート
    167                final ErrMsg[] errMsgs = errMsg.toArray();
    168                Arrays.sort( errMsgs, ERR_COMP );
    169
    170                for( int i=0; i<errMsg.size(); i++ ) {
    171                        final ErrMsg err = errMsgs[i];
    172                        String[] clmVals = new String[clmSize];
    173                        clmVals[0] = String.valueOf( err.getNo() );
    174                        clmVals[1] = String.valueOf( err.getKekka() );
    175                        clmVals[2] = err.getId();
    176
    177                        // 6.9.3.1 (2018/04/02) エラーメッセージのタグ情報のパースは、JasperException 以降から、改行２つまでの間のみとする。
    178//                      String tmpVals3 = resource.getLabel( err );
    179//                      String tmpVals3 = useSLabel ? resource.getRawShortLabel( err ) : resource.getLabel( err );              // 7.0.7.0 (2019/12/13) useSLabel 属性を追加。
    180                        String tmpVals3 = useSLabel ? resource.getShortErrorMsg( err ) : resource.getLabel( err );              // 7.2.9.0 (2020/10/12) メソッド名変更
    181
    182                        if( tmpVals3 != null ) {
    183                                tmpVals3 = tmpVals3.trim();
    184        //                      // 7.0.7.2 (2020/01/09) Exception: で改行処理を中断する。
    185        //                      if( tmpVals3.contains( "Exception:" ) ) {
    186        //                              tmpVals3 = tmpVals3.replaceAll( "Exception: " , "Exception:\n" );
    187        //                      }
    188                                final int idx0 = tmpVals3.indexOf( "JasperException" );         // JSP画面のｴﾗｰ
    189                                if( idx0 >= 0 ) {
    190                                        final int idx1 = tmpVals3.indexOf( "\n\n",idx0 );               // 改行２つ
    191                                        if( idx1 >= 0 ) {
    192                                                tmpVals3 = tmpVals3.substring( 0,idx0 ) +
    193                                                                        StringUtil.htmlFilter( tmpVals3.substring( idx0,idx1 ) ) +
    194                                                                        tmpVals3.substring( idx1 );
    195                                        }
    196                                        else {
    197                                                tmpVals3 = tmpVals3.substring( 0,idx0 ) +
    198                                                                        StringUtil.htmlFilter( tmpVals3.substring( idx0 ) );
    199                                        }
    200                                }
    201                                clmVals[3] = "<pre>" + tmpVals3 + "</pre>";
    202                        }
    203
    204//                      // 6.0.2.5 (2014/10/31) エラーメッセージに、preタグを付けます。
    205//                      clmVals[3] = "<pre>" + resource.getLabel( err ) + "</pre>";
    206//      //              clmVals[3] = "<pre>" + StringUtil.htmlFilter( resource.getLabel( err ) ) + "</pre>";            // 6.9.2.1 (2018/03/12)
    207//
    208//                      // 6.4.5.2 (2016/05/06) Exception: の後ろに改行を入れます(クラス名が長いと、メッセージが見えにくいため)。
    209//                      if( clmVals[3].contains( "Exception:" ) ) {
    210//                              clmVals[3] = clmVals[3].replaceAll( "Exception: " , "Exception:\n" );
    211//                      }
    212
    213                        if( errMsg.isSetPgStep() ) {
    214                                clmVals[4] = err.getPg();
    215                                clmVals[5] = err.getStep();
    216                        }
    217                        errTable.addColumnValues( clmVals , null , false );             // 6.2.2.0 (2015/03/27)
    218
    219                        // 7.0.7.0 (2019/12/13) useSLabel 属性を追加。対応方法(概要説明)は、useSLabel=true時には、出しません。
    220                        if( !useSLabel ) {
    221                                // 対応方法(概要説明)が存在すれば直下に一行追加する 4.3.4.5 (2009/01/08)
    222                                // String desc = resource.getDescription( clmVals[2] );
    223                                final String desc = resource.getDescription( err );             // 4.3.7.6 (2009/07/15)
    224//                              if( desc != null && desc.length() > 0 ){
    225                                // 7.0.7.2 (2020/01/09) メッセージを比較して、同じなら出力しない。
    226//                              if( desc != null && desc.length() > 0 ){
    227                                if( desc != null && desc.length() > 0 && !desc.trim().equals( tmpVals3 ) ){
    228                                        String[] descVals = new String[clmSize];
    229//                                      descVals[3] = desc;
    230//                                      descVals[3] = "<pre>" + desc + "</pre>";                                // 7.0.7.0 (2019/12/13) pre を付けます。
    231                                        descVals[3] = "<pre>" + desc.trim() + "</pre>";                 // 7.0.7.2 (2020/01/09) trim()追加
    232                                        errTable.addColumnValues( descVals , null , false );    // 6.2.2.0 (2015/03/27)
    233                                }
    234                        }
    235                }
    236
    237                // ここまでが、DBTableModel の作成。以下は、View での表示
    238
    239                final ViewForm form = ViewFormFactory.newInstance( "HTMLTable" );
    240
    241                form.init( errTable );
    242                if( ! errMsg.isOK() )  {                                                                // 正常以外
    243                        form.setViewClass( "errorView" );                                       // 6.4.6.1 (2016/06/03)
    244                        form.setBgColorCycle( -1 * errMsg.getKekka() );         // エラー処理時のゼブラ模様
    245                        form.setNumberType( "delete" );                                         // 番号欄を出さない。
    246                        form.setUseTableSorter( false );                                        // ソート用リンクは出さない。
    247                        form.setUseScrollBar( false );                                          // 4.0.0 (2005/01/31) スクロールバー用のDIV要素を出力しない。
    248                }
    249
    250                return form.create();
    251        }
    252
    253        /**
    254         * ErrorMessage オブジェクトと、ResourceManager より、表示用 HTMLテーブルを作成します。
    255         * このメソッドでは、エラーメッセージ及びエラーコードを一覧形式で表示します。
    256         *
    257         * @og.rev 7.0.7.0 (2019/12/13) useSLabel 属性を追加。
    258         *
    259         * @param   errMsg  ErrorMessageオブジェクト
    260         * @param   resource リソースマネージャー
    261         *
    262         * @return  HTMLのテーブルタグに変換後の文字列(無ければ、ゼロストリング)
    263         * @og.rtnNotNull
    264         */
    265        /* default */ static String makeHTMLSimpleErrorList( final ErrorMessage errMsg,final ResourceManager resource ) {
    266                return makeHTMLSimpleErrorList( errMsg,resource,false );                                // 通常ラベル使用
    267        }
    268
    269        /**
    270         * ErrorMessage オブジェクトと、ResourceManager より、表示用 HTMLテーブルを作成します。
    271         * このメソッドでは、エラーメッセージ及びエラーコードを一覧形式で表示します。
    272         *
    273         * @og.rev 6.2.2.0 (2015/03/27) interface に変更タイプ と、書込み許可を追加
    274         * @og.rev 7.0.7.0 (2019/12/13) useSLabel 属性を追加。
    275         * @og.rev 7.1.0.1 (2020/02/07) ShortLabelの引数対応で、RawShortLabel を使います。
    276         * @og.rev 7.2.9.0 (2020/10/12) getRawShortLabel → getShortErrorMsg メソッド名変更
    277         *
    278         * @param   errMsg  ErrorMessageオブジェクト
    279         * @param   resource リソースマネージャー
    280         * @param   useSLabel SLABEL利用 [true:利用する/false:利用しない]
    281         *
    282         * @return  HTMLのテーブルタグに変換後の文字列(無ければ、ゼロストリング)
    283         * @og.rtnNotNull
    284         */
    285//      /* default */ static String makeHTMLSimpleErrorList( final ErrorMessage errMsg,final ResourceManager resource ) {
    286        /* default */ static String makeHTMLSimpleErrorList( final ErrorMessage errMsg,final ResourceManager resource, final boolean useSLabel ) {
    287                if( errMsg == null ) { return ""; }
    288
    289                final String[] names = new String[] { "MESSAGE" };
    290
    291                final int clmSize = names.length;
    292
    293                final DBTableModel errTable = DBTableModelUtil.newDBTable();
    294                errTable.init( clmSize );
    295
    296                for( int i=0; i<clmSize; i++ ) {
    297                        final DBColumn dbColumn = resource.makeDBColumn( names[i] );
    298                        errTable.setDBColumn( i,dbColumn );
    299                }
    300
    301                final ErrMsg[] errMsgs = errMsg.toArray();
    302                Arrays.sort( errMsgs, ERR_COMP );
    303
    304                for( int i=0; i<errMsg.size(); i++ ) {
    305                        final ErrMsg err = errMsgs[i];
    306                        String[] clmVals = new String[clmSize];
    307                        // 7.0.7.0 (2019/12/13) useSLabel 属性を追加。
    308//                      clmVals[0] = resource.getShortLabel( err.getId() ) + "(" + err.getId() + ")";
    309//                      clmVals[0] = useSLabel ? resource.getRawShortLabel( err ) : resource.getShortLabel( err.getId() ) + "(" + err.getId() + ")";
    310
    311                        // 7.1.0.1 (2020/02/07) ShortLabelの引数対応で、RawShortLabel を使います。
    312//                      clmVals[0] = resource.getRawShortLabel( err );
    313                        clmVals[0] = resource.getShortErrorMsg( err );                  // 7.2.9.0 (2020/10/12) メソッド名変更
    314                        if( !useSLabel ) { clmVals[0] = clmVals[0] + "(" + err.getId() + ")"; }
    315
    316                        errTable.addColumnValues( clmVals , null , false );             // 6.2.2.0 (2015/03/27)
    317                }
    318
    319                // ここまでが、DBTableModel の作成。以下は、View での表示
    320                final ViewForm form = ViewFormFactory.newInstance( "HTMLSimpleList" );
    321                form.init( errTable );
    322
    323                if( ! errMsg.isOK() )  {        // 正常以外
    324                        form.setBgColorCycle( -1 * errMsg.getKekka() ); // エラー処理時のゼブラ模様
    325                }
    326
    327                return form.create();
    328        }
    329}