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