    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.db;
    017
    018import java.util.regex.Matcher;                                                 // 5.10.4.0 (2018/10/05) 暗号化処理追加
    019import java.util.regex.Pattern;                                                 // 5.10.4.0 (2018/10/05) 暗号化処理追加
    020
    021import org.opengion.hayabusa.common.HybsSystem;
    022import org.opengion.fukurou.util.StringFormat;
    023import org.opengion.fukurou.util.StringUtil;                    // 5.9.0.1 (2015/09/11)
    024import org.opengion.fukurou.security.HybsCryptography;  // 5.10.4.0 (2018/10/05) 暗号化処理追加
    025import static org.opengion.fukurou.system.HybsConst.BUFFER_MIDDLE;      // 5.10.4.0 (2018/10/05)
    026
    027/**
    028 * 動的プルダウンなどで利用されるイベントカラムの各種情報を保持するための
    029 * 管理クラスです。
    030 *
    031 * 内容を置き換えるカラム(子カラム)の名前をキーに、イベントカラム(親カラム)や、
    032 * イベント発行時の処理URL等を管理します。
    033 *
    034 * これらの情報は、ColumnTagやSelectTag、ViewFormTagなどで登録され、その結果を
    035 * JavaScriptのコードとして出力します。(common/eventColumn.jsp)
    036 *
    037 * ここで出力された情報をイベント発行時に、JavaScriptが参照し、処理URLに渡す
    038 * ことで、動的な項目の入れ替えを実現しています。
    039 *
    040 * @og.rev 5.1.7.0 (2010/06/01) 新規追加
    041 * @og.rev 5.9.0.1 (2015/09/11) アンダースコア対応
    042 *
    043 * @version  4.0
    044 * @author   Hiroki Nakamura
    045 * @since    JDK5.0,
    046 */
    047public class DBEventColumn {
    048
    049        private static final String EVENT_COLUMN_URL = HybsSystem.sys( "JSP" ) + "/" + HybsSystem.sys( "EVENT_COLUMN_URL" );
    050
    051        private final String name                       ;       // 内容を置き換えるカラム(子カラム)
    052        private final String eventColumn        ;       // イベントカラム(親カラム・CSV形式)
    053        private final String eventValue         ;       // 6.3.3.0 (2015/07/25) eventValue 追加
    054        private final String eventUrl           ;       // イベント発行時の処理URL
    055        private final String renderer           ;       // 子カラムのレンデラー
    056        private final String editor                     ;       // 子カラムのエディター
    057        private final String rendParam          ;       // 子カラムの表示パラメーター
    058        private final String editParam          ;       // 子カラムの編集パラメーター
    059        private final String valParam           ;       // 6.3.3.0 (2015/07/25) rendParam,editParam で使用する変数化された親カラム
    060
    061        private final Pattern trgPattern        = Pattern.compile( "(?<=\\{@)[^.]+?(?=\\})" );          // 5.10.4.0 (2018/10/05)
    062        private final boolean flgEncrypt        = HybsSystem.sysBool( "EVENT_SQL_ENCRYPT" );            // 5.10.4.0 (2018/10/05)
    063        private final HybsCryptography hc       = flgEncrypt ? new HybsCryptography() : null ;          // 5.10.4.0 (2018/10/05)
    064
    065        /**
    066         * 初期情報を含んだ新規オブジェクトを作成します。
    067         * このコンストラクタではflgEncryptをfalseとして扱う。
    068         *
    069         * @og.rev 6.3.3.0 (2015/07/25) eventValue 追加
    070         * @og.rev 5.9.0.1 (2015/09/11) アンダースコア対応
    071         * @og.rev 5.10.4.0 (2018/10/05) 暗号化対応
    072         *
    073         * @param name 内容を置き換えるカラム(子カラム)
    074         * @param eventColumn イベントカラム(親カラム・CSV形式)
    075         * @param eventValue 子カラムの値SQL
    076         * @param eventUrl イベント発行時の処理URL
    077         * @param renderer 子カラムのレンデラー
    078         * @param editor 子カラムのエディター
    079         * @param rendParam 子カラムの表示パラメーター
    080         * @param editParam 子カラムの編集パラメーター
    081         */
    082        public DBEventColumn( final String name, final String eventColumn, final String eventValue, final String eventUrl,
    083                                                        final String renderer, final String editor, final String rendParam, final String editParam ) {
    084                this.name                       = name;
    085                this.eventColumn        = eventColumn;
    086                this.eventValue         = eventValue;                                                           // 6.3.3.0 (2015/07/25)
    087                // 6.4.2.1 (2016/02/05) PMD refactoring. Useless parentheses.
    088                this.eventUrl           = eventUrl != null && eventUrl.length() > 0 ? eventUrl : EVENT_COLUMN_URL;       // 5.1.9.0 (2010/08/01) 動的プルダウン不具合対応
    089                this.renderer           = renderer;
    090                this.editor                     = editor;
    091                this.rendParam          = rendParam;
    092                this.editParam          = editParam;
    093
    094                valParam = "{@" + evColReplace( eventColumn ).replace( ",", "}:{@" ) + "}" ;    // 5.9.0.1 (2015/09/11)
    095
    096//              // 5.10.4.0 (2018/10/05) 暗号化対応
    097//              this.flgEncrypt = HybsSystem.sysBool("EVENT_SQL_ENCRYPT");
    098//              if(flgEncrypt) {
    099//                      this.hc = new HybsCryptography();
    100//              }
    101        }
    102
    103        /**
    104         * 内容を置き換えるカラム(子カラム)を返します。
    105         *
    106         * @return 内容を置き換えるカラム(子カラム)
    107         */
    108        public String getName() { return name; }
    109
    110        /**
    111         * イベントカラム(親カラム・CSV形式)を返します。
    112         *
    113         * @return イベントカラム(親カラム・CSV形式)
    114         */
    115        public String getEventColumn() { return eventColumn; }
    116
    117        /**
    118         * イベント発行時の処理URLを返します。
    119         *
    120         * @og.rev 5.1.8.0 (2010/07/01) getEventUrl ⇒ getEventURL に変更
    121         *
    122         * @return イベント発行時の処理URL
    123         */
    124        public String getEventURL() { return eventUrl; }
    125
    126        /**
    127         * 子カラムのレンデラーを返します。
    128         *
    129         * @return 子カラムのレンデラー
    130         */
    131        public String getRenderer() { return renderer; }
    132
    133        /**
    134         * 子カラムのエディターを返します。
    135         *
    136         * @return 子カラムのエディター
    137         */
    138        public String getEditor() { return editor; }
    139
    140        /**
    141         * 子カラムの表示パラメーターを返します。
    142         *
    143         * @og.rev 5.10.4.0 (2018/10/05) 暗号化処理追加
    144         *
    145         * @return 子カラムの表示パラメーター
    146         * @og.rtnNotNull
    147         */
    148        public String getRendParam() {
    149                final StringFormat sf = new StringFormat(
    150                                                        rendParam
    151                                                        ,valParam               // 6.3.3.0 (2015/07/25)
    152                                                        ,name );
    153                // 5.10.4.0 (2018/10/05)
    154//              return sf.format();
    155//              if(flgEncrypt) {
    156//                      return hc.encrypt(sf.format());
    157//              }else {
    158//                      return sf.format();
    159//              }
    160                return flgEncrypt ? hc.encrypt( sf.format() ) : sf.format();
    161        }
    162
    163        /**
    164         * 子カラムの編集パラメーターを返します。
    165         *
    166         * @og.rev 5.10.4.0 (2018/10/05) 暗号化処理追加
    167         *
    168         * @return 子カラムの編集パラメーター
    169         * @og.rtnNotNull
    170         */
    171        public String getEditParam() {
    172                final StringFormat sf = new StringFormat(
    173                                                        editParam
    174                                                        ,valParam               // 6.3.3.0 (2015/07/25)
    175                                                        ,name );
    176                // 5.10.4.0 (2018/10/05)
    177//              return sf.format();
    178//              if(flgEncrypt) {
    179//                      return hc.encrypt(sf.format());
    180//              }else {
    181//                      return sf.format();
    182//              }
    183                return flgEncrypt ? hc.encrypt( sf.format() ) : sf.format();
    184        }
    185
    186        /**
    187         * 子カラムの値SQLを返します。
    188         *
    189         * @og.rev 6.3.3.0 (2015/07/25) eventValue 追加
    190         *
    191         * @return 子カラムの値SQL
    192         * @og.rtnNotNull
    193         */
    194        public String getEventValue() {
    195                final StringFormat sf = new StringFormat(
    196                                                        eventValue
    197                                                        ,valParam               // 6.3.3.0 (2015/07/25)
    198                                                        ,name );
    199                return sf.format();
    200        }
    201
    202        /**
    203         * CSV形式のカラム名から先頭のアンダースコアを外します。
    204         *
    205         * @og.rev 5.9.0.1 (2015/09/11) 新規作成
    206         * @og.rev 6.8.5.0 (2018/01/09) StringUtil.csv2Array のデフォルトメソッドを使用します。
    207         *
    208         * @param inStr CSV形式イベントカラム
    209         * @return 先頭アンダースコアを外したCSV形式文字列
    210         */
    211        private String evColReplace( final String inStr ){
    212                final String[] to;
    213                if( inStr != null && inStr.indexOf( ',' ) >= 0 ) {
    214                        to = StringUtil.csv2Array( inStr );                                     // 6.8.5.0 (2018/01/09)
    215                }
    216                else {
    217                        to = new String[] { inStr };
    218                }
    219
    220                for( int i=0; i<to.length; i++ ) {
    221                        if( to[i].charAt( 0 ) == '_'){
    222                                to[i] = to[i].substring( 1 );
    223                        }
    224                }
    225
    226                return StringUtil.array2csv( to );
    227        }
    228
    229        /**
    230         * 文字列から{&#064;XXX}のXXXを抜き出して、CSVに変換する。
    231         *
    232         * @og.rev 5.10.4.0 (2018/10/05) 新規作成
    233         *
    234         * @param trg 変換対象文字列
    235         * @return CSV文字列
    236         */
    237        private String getTrgCsv( final String trg ) {
    238                if( trg == null || trg.length() == 0 ) { return ""; }
    239
    240                final Matcher mtch = trgPattern.matcher( trg );
    241                final StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE );
    242                while( mtch.find() ) {
    243                        if( rtn.length() != 0 ) {
    244                                rtn.append( ',' );
    245                        }
    246                        rtn.append( mtch.group() );
    247                }
    248
    249                return rtn.toString();
    250        }
    251
    252        /**
    253         * レンデラーパラメータのキーリストを渡します。
    254         * 復号化後の値設定に利用します。
    255         *
    256         * @og.rev 5.10.4.0 (2018/10/05) 新規作成
    257         *
    258         * @return レンデラーパラメータのキーリスト
    259         */
    260        public String getRendParamKeys() {
    261                // 暗号化しない、またはrendParamが空の場合は、空文字を返す
    262                if( !flgEncrypt || rendParam == null || rendParam.length() == 0 ) { return ""; }
    263
    264                final StringFormat sf = new StringFormat(
    265                                rendParam
    266//                              ,"{@" + evColReplace(evCol).replace( ",", "}:{@" ) + "}"
    267                                ,valParam               // 6.3.3.0 (2015/07/25)
    268                                ,name );
    269
    270                return getTrgCsv( sf.format() );
    271        }
    272
    273        /**
    274         * エディターパラメータのキーリストを渡します。
    275         * 復号化後の値設定に利用します。
    276         *
    277         * @og.rev 5.10.4.0 (2018/10/05) 新規作成
    278         *
    279         * @return エディターパラメータのキーリスト
    280         */
    281        public String getEditParamKeys() {
    282                // 暗号化しない、またはrendParamが空の場合は、空文字を返す
    283                if( !flgEncrypt || editParam == null || editParam.length() == 0 ) { return ""; }
    284
    285                final StringFormat sf = new StringFormat(
    286                                editParam
    287//                              ,"{@" + evColReplace(evCol).replace( ",", "}:{@" ) + "}"
    288                                ,valParam               // 6.3.3.0 (2015/07/25)
    289                                ,name );
    290
    291                return getTrgCsv( sf.format() );
    292        }
    293
    294        /**
    295         * 暗号化フラグを渡します。
    296         *
    297         * @og.rev 5.10.4.0 (2018/10/05) 新規作成
    298         *
    299         * @return 暗号化フラグ
    300         */
    301//      public Boolean isFlgEncrypt() {
    302        public boolean isFlgEncrypt() {
    303                return flgEncrypt;
    304        }
    305}