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 */
016 package org.opengion.hayabusa.db;
017
018 import org.opengion.fukurou.model.NativeType;
019 import org.opengion.fukurou.util.ErrorMessage;
020 import org.opengion.fukurou.util.StringUtil;
021
022 /**
023 * ä¸?ˆ¬çš?ªåŠè§’æ–‡å—å?を扱ã?‚ºã®ã€ã‚«ãƒ©ãƒ?±žæ?を定義ã—ã¾ã™ã?
024 *
025 * åŠè§’æ–‡å—å?ã¨ã¯ã€ã? c < 0x20 || c > 0x7e 以外ã?ã§ã®ã¿
026 * æ§‹æ?ã•ã‚ŒãŸæ–‡å—å?ã®ã“ã¨ã§ã™ã?
027 *
028 * タイプãƒã‚§ãƒ?‚¯ã¨ã—ã¦ã€ä»¥ä¸‹ã?æ¡ä»¶ã‚’判定ã—ã¾ã™ã?
029 * ・æ–?—å?é•·ã¯ã€Byteæ›ç®—ã§ã®æ–?—æ•°ã¨ã®æ¯”è¼?
030 * ・åŠè§’æ–‡å—å?ãƒã‚§ãƒ?‚¯ã€?c < 0x20 || c > 0x7e 以外ã?エラー
031 * ・æ–?—パラメータ㮠æ£è¦è¡¨ç¾ãƒã‚§ãƒ?‚¯
032 * ・クãƒã‚¹ã‚µã‚¤ãƒˆã‚¹ã‚¯ãƒªãƒ—ティングãƒã‚§ãƒ?‚¯
033 *
034 * @og.group ãƒ??タ属æ?
035 *
036 * @version 4.0
037 * @author Kazuhiko Hasegawa
038 * @since JDK5.0,
039 */
040 public abstract class AbstractDBType implements DBType {
041
042 private final String defValue ; // ãƒ??ã‚¿ã®ãƒ?ƒ•ォルトå?
043
044 /**
045 * ãƒ?ƒ•ォルトコンストラクター
046 *
047 * @og.rev 4.0.0.0 (2005/01/31) type å»?¢
048 */
049 public AbstractDBType() {
050 this( "" ); // ãƒ??ã‚¿ã®ãƒ?ƒ•ォルトå?
051 }
052
053 /**
054 * コンストラクター
055 *
056 * å?‚µãƒ–クラスã®ã‚¿ã‚¤ãƒ—å?ã¨ãƒ?ƒ•ォルトå?ã‚’è¨å®šã—ã¦ã€ã‚ªãƒ–ジェクトを構築ã—ã¾ã™ã?
057 *
058 * @og.rev 4.0.0.0 (2005/01/31) type å»?¢
059 *
060 * @param defValue ãƒ??ã‚¿ã®ãƒ?ƒ•ォルトå?
061 */
062 public AbstractDBType( final String defValue ) {
063 this.defValue = defValue;
064 }
065
066 /**
067 * NATIVEã®åž‹ã?è˜åˆ¥ã‚³ãƒ¼ãƒ‰ã‚’è¿”ã—ã¾ã™ã?
068 *
069 * @og.rev 3.5.4.7 (2004/02/06) æ–°è¦ä½œæ?
070 * @og.rev 4.1.1.2 (2008/02/28) Enumåž?fukurou.model.NativeType)ã«å¤‰æ›´
071 *
072 * @return NATIVEã®åž‹ã?è˜åˆ¥ã‚³ãƒ¼ãƒ?DBType ã§è¦å®?
073 * @see org.opengion.fukurou.model.NativeType
074 */
075 public NativeType getNativeType() {
076 // return NATIVE_STRING;
077 return NativeType.STRING;
078 }
079
080 /**
081 * åŠè§’スペã?スã§å›ºå®šé•·(åŠè§’æ›ç®—ã?æ•°)ã«å¤‰æ›ã—ãŸæ–?—å?ã‚’è¿”ã—ã¾ã™ã?
082 *
083 * åŠè§’スペã?ス埋ã‚ã¯ã€æ–‡å—ãŒåŠè§’ã?全角混在ã§ã‚‚ã‹ã¾ã?¾ã›ã‚“ã€?
084 * ãªãŠã?エラーãƒã‚§ãƒ?‚¯ã¯è¡Œã‚れã¾ã›ã‚“ã€?
085 * 実行å‰ã«ã€å¿?š valueCheck( String value ,int len ) を行ã†å¿?¦ãŒã‚りã¾ã™ã?
086 *
087 * @og.rev 3.5.4.5 (2004/01/23) エンコード指定ã«å¤‰æ›´ã—ã¾ã™ã?
088 *
089 * @param value ?¦?©?¬?¬åŸ‹ã‚ã™ã‚‹æ–?—å?
090 * @param sizeX 整数部åˆ??æ–?—å?ã®é•·ã?
091 * @param sizeY 少数部åˆ??æ–?—å?ã®é•·ã?
092 * @param encode 固定長ã§å¤‰æ›ã™ã‚‹æ–?—エンコーãƒ?
093 *
094 * @return ?¦?©?¬?¬åŸ‹ã‚ã—ãŸæ–°ã—ã„æ–?—å?
095 */
096 public String valueFill( final String value ,final int sizeX ,final int sizeY,final String encode ) {
097 int len = (sizeY == 0) ? sizeX : sizeX + sizeY + 1;
098
099 return StringUtil.stringFill( value,len,encode );
100 }
101
102 /**
103 * ãã?DBTypeã®,ãƒ?ƒ•ォルトã?値(物ç?š„åˆæœŸè¨å®šå?)ã‚’è¿”ã—ã¾ã™ã?
104 *
105 * ä¸?ˆ¬ã«ã€æ–‡å—å?ã®å ´åˆã?,ゼãƒã‚¹ãƒˆãƒªãƒ³ã‚°"" æ•°å—ã?å ´åˆã? "0" ã§ã™ã?
106 *
107 * @return 物ç?š„åˆæœŸè¨å®šå?
108 */
109 public String getDefault() {
110 return defValue;
111 }
112
113 /**
114 * Stringå¼•æ•°ã®æ–?—å?を+1ã—ãŸæ–‡å—å?ã‚’è¿”ã—ã¾ã™ã?
115 *
116 * ã“れã¯ã€è‹±å—ã?å ´å?A,B,C ãªã©)ã¯ã€B,C,D ã®ã‚ˆã†ã«,æœ?µ‚æ¡ã?æ–?—コードを
117 * ?‹ï¼?ã—ã¾ã™ã?
118 * æ–?—å?ãŒæ•°å—タイプã?å ´åˆã?, æ•°å—ã«å¤‰æ›ã—ã¦ã€?1 ã—ã¾ã™ã?
119 * æœ?µ‚æ¡ãŒã€?9","z","Z" ãŠã‚ˆã³ã€ãã®å…¨è§’æ–‡å—ã?å ´åˆã?"0","a","Z" ãŠã‚ˆã³ã€ãã®å…¨è§’æ–‡å—ã«
120 * 変æ›å¾Œã?ã²ã¨ã¤ä¸Šã?æ¡ã§ã€åŒæ§˜ã? ?‹ï¼?æ“作を行ã„ã¾ã™ã?
121 * æœ?‚‚上ä½ã?æ¡ãŒã€ã“れらã®ç¹°ã‚Šä¸ŠãŒã‚Šæ¡ã?å ´åˆã?ã€ã™ã¹ã¦ã®æ¡ãŒåˆæœŸåŒ–ã•れãŸçŠ¶æ…‹ã«æˆ»ã‚Šã¾ã™ã?
122 * 例�23 �124 , ABC �ABD , 789 �790 , XYZ �XXZ ,
123 * ABC123 �ABC124 , AB99 �AC00 , 12ZZ99 �13AA00 , ZZZZ �AAAA
124 * 引数ã?null ã®å ´åˆã¨ã€ã‚¼ãƒæ–?—å?("")ã®å ´åˆã?,物ç?š„åˆæœŸè¨å®šå?(String getDefault())
125 * ã®å€¤ã‚’è¿”ã—ã¾ã™ã?
126 *
127 * @og.rev 4.0.0.0 (2005/01/31) ?¡??½??方法を変更(汎用çš?ª?¡??½?
128 *
129 * @param value String引数
130 *
131 * @return å¼•æ•°ã®æ–?—å?を+1ã—ãŸæ–‡å—å?ã€?
132 */
133 public String valueAdd( final String value ) {
134 if( value == null || value.length() == 0 ) { return getDefault(); }
135
136 char[] chs = value.toCharArray() ;
137
138 for( int i=chs.length-1; i>=0; i-- ) {
139 boolean over = true;
140 switch( chs[i] ) {
141 case '9' : chs[i] = '0' ; break;
142 case 'z' : chs[i] = 'a' ; break;
143 case 'Z' : chs[i] = 'A' ; break;
144 case '?? : chs[i] = '??; break;
145 case '?? : chs[i] = '??; break;
146 case '?º' : chs[i] = '?¡'; break;
147 default : chs[i]++; over=false; break;
148 }
149 if( !over ) { break; } // ã‚ャリーオーãƒã?ã—ã¦ã?ªã‘れã°ã€çµ‚äº?
150 }
151
152 return new String( chs );
153 }
154
155 /**
156 * Stringå¼•æ•°ã®æ–?—å?ã«ã€ç¬¬?’å¼•æ•°ã«æŒ?®šã?æ–?—å?(æ•°å—ã?日付ç?ã‚’åŠ ç®—ã—ã¦è¿”ã—ã¾ã™ã?
157 *
158 * ã“れã¯ã€valueAdd( String ) ã¨æœ¬è³ªçš?«ã¯åŒã˜å‹•ãã‚’ã—ã¾ã™ãŒã€ä»»æ„ã?æ–?—å?ã‚’åŠ ç®—ã™ã‚?
159 * ãŸã‚ã€ä¸»ã¨ã—ã¦ã€æ•°å—ç³»ã‚?—¥ä»˜ç³»ã® DBType ã«ã®ã¿å®Ÿè£?—ã¾ã™ã?
160 * 実è£?Œãªã??åˆã?ã€UnsupportedOperationException ã‚?throw ã—ã¾ã™ã?
161 *
162 * 第?’引数 ãŒã?null ã®å ´åˆã?ã€?¼‹ï¼?ã™ã‚‹ valueAdd( String )ãŒå‘¼ã°ã‚Œã¾ã™ã?
163 * ã“れã¯ã€å°?¥çš?«ã¯ã€valueAdd( String ) ã‚’ç„¡ãã™ã“ã¨ã‚’æ„味ã—ã¾ã™ã?
164 *
165 * @og.rev 5.6.0.3 (2012/01/24) ADD ã«ã€å¼•æ•°ã®å€¤ã‚’åŠ ç®—ã™ã‚‹æ©Ÿè?を追åŠ?—ã¾ã™ã?
166 *
167 * @param value String引数
168 * @param add åŠ?®—ã™ã‚‹æ–‡å—å?(null ã®å ´åˆã?ã€å¾“æ¥ã¨åŒã˜ã€?1 ã—ã¾ã™ã?)
169 *
170 * @return å¼•æ•°ã®æ–?—å?第?’å¼•æ•°ã«æŒ?®šã?æ–?—å?(æ•°å—ã?日付ç?ã‚’åŠ ç®—ã—ãŸæ–‡å—å?ã€?
171 * @throws UnsupportedOperationException 実è£?Œå˜åœ¨ã—ãªã??å?
172 */
173 public String valueAdd( final String value,final String add ) {
174 if( add == null || add.isEmpty() ) { return valueAdd( value ); }
175
176 String errMsg = "ã“ã?クラスã§ã¯ã€å¼•数付ã?ä»»æ„ã?åŠ?®—ã?実è£?•れã¦ã?¾ã›ã‚“ã€?
177 + getClass().getName() + " Action=[ADD]"
178 + " oldValue=[" + value + "] newValue=[" + add + "]" ;
179 throw new UnsupportedOperationException( errMsg );
180 }
181
182 /**
183 * エãƒ?‚£ã‚¿ãƒ¼ã§ç·¨é›?•れãŸãƒ??タを登録ã™ã‚‹å ´åˆã«ã€ãƒ‡ãƒ¼ã‚¿ãã?ã‚‚ã?を変æ›ã—ã¦ã€å®Ÿç™»éŒ²ãƒ??タを作æ?ã—ã¾ã™ã?
184 *
185 * 例ãˆã°,大æ–?—ã?ã¿ã®ãƒ•ィールドãªã‚‰ã?大æ–?—化ã—ã¾ã™ã?
186 * 実登録ãƒ??ã‚¿ã®ä½œæ?ã¯ã€DBType オブジェクトを利用ã—ã¾ã™ã?ã§,
187 * ã“れ㨠CellEditor ã¨ãŒã‚¢ãƒ³ãƒžãƒƒãƒã?å ´åˆã?ã€ã†ã¾ãデータ変æ›
188 * ã•れãªã?¯èƒ½æ€§ãŒã‚りã¾ã™ã?ã§ã€æ³¨æ„願ã„ã¾ã™ã?
189 *
190 * @og.rev 3.3.3.0 (2003/07/09) å‰å¾Œã?スペã?スをå–り除ã?¦ãŠãã€?
191 * @og.rev 3.3.3.1 (2003/07/18) 後ã‚スペã?スをå–り除ãã?(StringUtil#rTrim)
192 *
193 * @param value (ä¸?ˆ¬ã«ç·¨é›?ƒ‡ãƒ¼ã‚¿ã¨ã—ã¦ç™»éŒ²ã•れãŸãƒ‡ãƒ¼ã‚¿)
194 *
195 * @return ä¿®æ£å¾Œã?æ–?—å?(ä¸?ˆ¬ã«ãƒ??タベã?スã«ç™»éŒ²ã™ã‚‹ãƒ??ã‚¿)
196 */
197 public String valueSet( final String value ) {
198 return StringUtil.rTrim( value );
199 }
200
201 /**
202 * action ã§æŒ?®šã•れãŸã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã—ã¦ã€å?ã®å¤‰æ›ã‚’行ã„ã¾ã™ã?
203 *
204 * oldValue(æ—§ãƒ??ã‚¿)ã¯ã€å?ã®DBTableModelã«è¨å®šã•れã¦ã?Ÿå€¤ã§ã™ã?通常ã¯ã€?
205 * ã“ã?値を使用ã—ã¦ã‚«ãƒ©ãƒ?¯Žã«å¤‰æ›ã‚’行ã„ã¾ã™ã?newValue(æ–°ãƒ??ã‚¿)ã¯ã€å¼•æ•°ã§
206 * æŒ?®šã•ã‚ŒãŸæ–°ã—ã„値ã§ã™ã?ã“ã?値ã«ã¯ã€ãƒ‘ラメータを指定ã—ã¦å¤‰æ›æ–¹æ³•ã‚’
207 * 制御ã™ã‚‹ã“ã¨ã‚‚å¯èƒ½ã§ã™ã?
208 * æŒ?®šã?アクションãŒã‚«ãƒ©ãƒ?§å‡¦ç?§ããªã??åˆã?ã€ã‚¨ãƒ©ãƒ¼ã«ãªã‚Šã¾ã™ã?
209 *
210 * @param action アクションコマン�
211 * @param oldValue 入力データ(旧�?タ)
212 * @param newValue 入力データ(新�?タ)
213 *
214 * @return 実行後ã?ãƒ??ã‚¿
215 */
216 public String valueAction( final String action,final String oldValue,final String newValue ) {
217 String errMsg = "ã“ã?クラスã§ã¯ã€ã“ã®ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã¯å®Ÿè£?•れã¦ã?¾ã›ã‚“ã€?
218 + getClass().getName() + " Action=[" + action + "]"
219 + " oldValue=[" + oldValue + "] newValue=[" + newValue + "]" ;
220 throw new UnsupportedOperationException( errMsg );
221 }
222
223 /**
224 * ãƒ??ã‚¿ãŒç™»éŒ²å¯èƒ½ã‹ã©ã?‹[true/false]ã‚’ãƒã‚§ãƒ?‚¯ã—ã¾ã™ã?
225 *
226 * ãƒ??ã‚¿ãŒã‚¨ãƒ©ãƒ¼ã®å ´åˆã?ã€ãã®ã‚¨ãƒ©ãƒ¼å†?®¹ã‚’è¿”ã—ã¾ã™ã?
227 *
228 * @og.rev 2.1.1.1 (2002/11/15) HTMLã‚¿ã‚°ãƒã‚§ãƒ?‚¯ã®ãƒ¡ã‚½ãƒ?ƒ‰ã®å…±æœ‰åŒ–ã€?
229 * @og.rev 3.0.1.3 (2003/03/11) DBTypeCheckUtilクラスを利用ã™ã‚‹ã‚ˆã†ã«ä¿®æ£
230 * @og.rev 3.6.0.0 (2004/09/22) dbType パラメータを引数ã«è¿½åŠ?
231 * @og.rev 5.2.2.0 (2010/11/01) 厳å¯?«ãƒã‚§ãƒ?‚¯(isStrict=true)ã™ã‚‹ãƒ•ラグを追åŠ?
232 *
233 * @param key ã‚ー
234 * @param value 値
235 * @param sizeX 整数部åˆ??æ–?—å?ã®é•·ã?
236 * @param sizeY 少数部åˆ??æ–?—å?ã®é•·ã?
237 * @param typeParam dbType パラメータ
238 * @param isStrict 厳å¯?«ãƒã‚§ãƒ?‚¯ã™ã‚‹ã‹ã©ã?‹ [true:ã™ã‚‹/false:標準的]
239 *
240 * @return エラーå†?®¹
241 */
242 // public ErrorMessage valueCheck( final String key ,final String value ,
243 // final int sizeX ,final int sizeY ,final String typeParam ) {
244 public ErrorMessage valueCheck( final String key ,final String value ,
245 final int sizeX ,final int sizeY ,final String typeParam ,final boolean isStrict) {
246
247 ErrorMessage msg = new ErrorMessage();
248 if( value == null || value.length() == 0 ) { return msg; }
249
250 int len = (sizeY == 0) ? sizeX : sizeX + sizeY + 1;
251 if( len < value.length() ) {
252 // æ–?—å?ã®é•·ã•ãŒæŒ?®šã?é•·ã•よりも長ã?§ã™ã?
253 msg.addMessage( 0,ErrorMessage.NG,"ERR0006",key,value,
254 String.valueOf( value.length() ),String.valueOf( len ) );
255 }
256
257 StringBuilder val = new StringBuilder();
258 boolean isError = false;
259 for( int i=0; i<value.length(); i++ ) {
260 char ch = value.charAt( i );
261 if( ch < 0x20 || ch > 0x7e ) {
262 val.append( "<span class=\"NG\">" ).append( ch ).append( "</span>" );
263 isError = true;
264 }
265 else {
266 val.append( ch );
267 }
268 }
269 if( isError ) {
270 // æŒ?®šã?æ–?—以外ã?æ–?—ãŒä½¿ã‚れã¦ã?¾ã™ã?
271 msg.addMessage( 0,ErrorMessage.NG,"ERR0009", key,val.toString() );
272 }
273
274 // 3.6.0.0 (2004/09/22) dbType パラメータを使用ã—ãŸãƒžãƒƒãƒãƒã‚§ãƒ?‚¯
275 String check = DBTypeCheckUtil.matcheCheck( value,typeParam );
276 if( check != null ) {
277 // æŒ?®šã?æ–?—以外ã?æ–?—ãŒä½¿ã‚れã¦ã?¾ã™ã?
278 msg.addMessage( 0,ErrorMessage.NG,"ERR0009", key,check );
279 }
280
281 // クãƒã‚¹ã‚µã‚¤ãƒˆã‚¹ã‚¯ãƒªãƒ—ティング対ç–ï¼?<', '>' ã¯ç™»éŒ²ã•ã›ãªã??
282 msg = xssCheck( key ,value, msg );
283 return msg;
284 }
285
286 /**
287 * HTMLã‚¿ã‚°ã‹ã©ã?‹ã‚’ãƒã‚§ãƒ?‚¯ã—ã¾ã™ã?
288 *
289 * クãƒã‚¹ã‚µã‚¤ãƒˆã‚¹ã‚¯ãƒªãƒ—ティング対ç–ã¨ã—ã¦ã€?<', '>' ã¯ç™»éŒ²ã•ã›ãªã??
290 *
291 * @og.rev 2.1.1.1 (2002/11/15) HTMLã‚¿ã‚°ãƒã‚§ãƒ?‚¯ã®ãƒ¡ã‚½ãƒ?ƒ‰ã®å…±æœ‰åŒ–ã€?
292 *
293 * @param key ã‚¿ã‚°ã®ã‚ー
294 * @param value 対象ã®å€¤
295 * @param msg ErrorMessageオブジェク�
296 *
297 * @return エラーå†?®¹(エラーを追åŠ?—ãŸã?ErrorMessageオブジェクãƒ?
298 */
299 protected ErrorMessage xssCheck( final String key ,final String value, final ErrorMessage msg ) {
300 StringBuilder val = new StringBuilder();
301 boolean isError = false;
302 for( int i=0; i<value.length(); i++ ) {
303 char ch = value.charAt( i );
304 if( ch == '<' || ch == '>' ) {
305 val.append( "<span class=\"NG\">" ).append( ch ).append( "</span>" );
306 isError = true;
307 }
308 else {
309 val.append( ch );
310 }
311 }
312 if( isError ) {
313 // HTMLã‚¿ã‚°ã¯ç™»éŒ²ã§ãã¾ã›ã‚“ã€?
314 msg.addMessage( 0,ErrorMessage.NG,"ERR0010", key,val.toString() );
315 }
316 return msg;
317 }
318 }