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}