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}