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}