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.hayabusa.common.HybsSystem; 019 import org.opengion.fukurou.util.StringUtil; 020 021 /** 022 * ?¤?¢ã‚«ãƒ©ãƒ??属æ?ãƒã‚§ãƒ?‚¯ã«ä½¿ç”¨ã•れるメソãƒ?ƒ‰ã‚’集ç´?—ãŸã?クラスã§ã™ã? 023 * 024 * 全変数ã¯ã€public static final 宣è¨?•れã¦ãŠã‚Šã€å?メソãƒ?ƒ‰ã¯ã€public static synchronized 宣è¨?•れã¦ã?¾ã™ã? 025 * 026 * @og.group ãƒ??タ属æ? 027 * 028 * @version 4.0 029 * @author Kazuhiko Hasegawa 030 * @since JDK5.0, 031 */ 032 public final class DBTypeCheckUtil { 033 /** String ã‚?Byte[]ã«å¤‰æ›ã™ã‚‹ã‚³ãƒ¼ãƒ? 034 * 例ï¼? "MS932" , "JISAutoDetect" ,"JIS", "EUC_JP", "MS932", "SJIS" , "Windows-31J" , "Shift_JIS" 035 */ 036 private static final String CODE = HybsSystem.sys( "DB_ENCODE" ); 037 038 // 5.3.9.0 (2011/09/01) æ–?—æ•°ãƒã‚§ãƒ?‚¯æ–¹å¼ã?æŒ?®? 039 private static final boolean USE_TEXT_LEN ; 040 static { 041 String useTextLen = HybsSystem.sys( "DB_USE_TEXT_LENGTH" ); 042 if( useTextLen != null ) { 043 USE_TEXT_LEN = Boolean.valueOf( useTextLen ).booleanValue(); 044 } 045 else { 046 USE_TEXT_LEN = false; 047 } 048 } 049 050 /** 051 * オブジェクトを作らã›ãªã?‚ºã®ã€private コンストラクタ 052 */ 053 private DBTypeCheckUtil() {} 054 055 /** 056 * æ–?—å?ã«ä½¿ã‚れã¦ã?‚‹æ–?—ã?ç¯?›²ãƒã‚§ãƒ?‚¯ã‚’行ã„ã¾ã™ã? 057 * 058 * æœ?°æ–‡å—ã‹ã‚‰æœ€å¤§æ–?—ã?ãŠã‚ˆã³ã€è¨±å¯ã•れる文å—ã‚’æŒ?®šã—ã¾ã™ã? 059 * ãれ以外ã?ã€ã‚¨ãƒ©ãƒ¼ã¨åˆ¤å®šã•れã¾ã™ã? 060 * ã“ã“ã§åˆ¤å®šã•れる以外ã«ç´°ã‹ã„制é™ã‚’ã‹ã‘ãŸã„å ´åˆã?ã€åˆ¥ã®ãƒã‚§ãƒ?‚¯ã¨ä½µç”¨ã—ã¦ãã ã•ã„ã€? 061 * 062 * @og.rev 5.6.0.3 (2012/01/24) æ–°è¦è¿½åŠ? 063 * 064 * @param value å…??æ–?—å? 065 * @param minCh 許å¯ã•れる文å—ã?æœ?°å?(å«ã‚? 066 * @param maxCh 許å¯ã•れる文å—ã?æœ?¤§å€¤(å«ã‚? 067 * 068 * @return ç¯?›²ãƒã‚§ãƒ?‚¯ã‚¨ãƒ©ãƒ¼æ–?—å?(æ£å¸¸æ™‚ã?ã€null) 069 */ 070 public static String rangeCheck( final String value ,final char minCh ,final char maxCh ) { 071 StringBuilder val = new StringBuilder(); 072 boolean isError = false; 073 for( int i=0; i<value.length(); i++ ) { 074 char ch = value.charAt( i ); 075 if( minCh <= ch && ch <= maxCh ) { 076 val.append( ch ); 077 } 078 else { 079 val.append( "<span class=\"NG\">" ).append( ch ).append( "</span>" ); 080 isError = true; 081 } 082 } 083 084 return ( isError ? val.toString() : null ); 085 } 086 087 /** 088 * æ–?—å?ã®é•·ã?整数部)ã‚’ãƒã‚§ãƒ?‚¯ã—ã¾ã™ã? 089 * 090 * @param value å…??æ–?—å? 091 * @param sizeX 整数部åˆ??æ–?—å?ã®é•·ã? 092 * @param sizeY 少数部åˆ??æ–?—å?ã®é•·ã? 093 * 094 * @return エラーæ–?—å?é•·ã?æ£å¸¸æ™‚ã?ã€null) 095 */ 096 public static String sizeXCheck( final String value ,final int sizeX ,final int sizeY ) { 097 int valuesizeX; 098 int pos = value.indexOf( '.' ); 099 if( pos >= 0 ) { 100 valuesizeX = pos; 101 } 102 else { 103 valuesizeX = value.length(); 104 } 105 if( value.charAt(0) == '-' ) { valuesizeX--; } 106 107 if( valuesizeX > sizeX ) { 108 // 整数部ã®é•·ã•ãŒæŒ?®šã?é•·ã•よりも長ã?§ã™ã? 109 return String.valueOf(valuesizeX); 110 } else { 111 return null; 112 } 113 } 114 115 /** 116 * æ–?—å?ã®é•·ã?å°æ•°éƒ¨)ã‚’ãƒã‚§ãƒ?‚¯ã—ã¾ã™ã? 117 * 118 * @param value å…??æ–?—å? 119 * @param sizeX 整数部åˆ??æ–?—å?ã®é•·ã? 120 * @param sizeY 少数部åˆ??æ–?—å?ã®é•·ã? 121 * 122 * @return エラーæ–?—å?é•·ã?æ£å¸¸æ™‚ã?ã€null) 123 */ 124 public static String sizeYCheck( final String value ,final int sizeX ,final int sizeY ) { 125 if( sizeY == 0 ) { 126 return null; 127 } 128 int valuesizeY; 129 int pos = value.indexOf( '.' ); 130 if( pos >= 0 ) { 131 valuesizeY = value.length() - pos - 1; 132 } 133 else { 134 valuesizeY = 0; 135 } 136 137 if( valuesizeY > sizeY ) { 138 // 少数部ã®é•·ã•ãŒæŒ?®šã?é•·ã•よりも長ã?§ã™ã? 139 return String.valueOf(valuesizeY); 140 } else { 141 return null; 142 } 143 } 144 145 /** 146 * æ–?—å?ã®å°æ•°ç‚¹ã®ä½ç½®ã‚’ãƒã‚§ãƒ?‚¯ã—ã¾ã™ã? 147 * å°æ•°ç‚¹(.)ãŒã??’ç®?‰€ä»¥ä¸Šå˜åœ¨ã™ã‚‹(å˜åœ¨ã™ã‚‹ä½ç½®ãŒç•°ãªã‚?å ´åˆã‚¨ãƒ©ãƒ¼ 148 * 149 * @param value å…??æ–?—å? 150 * 151 * @return エラーæ–?—å?(æ£å¸¸æ™‚ã?ã€null) 152 */ 153 public static String decimalPointCheck( final String value ) { 154 String rtn = null; 155 if( value.indexOf( '.' ) != value.lastIndexOf( '.' ) ) { 156 rtn = changeErrorPath( value, '.' ); 157 } 158 return rtn ; 159 } 160 161 /** 162 * æ–?—å?ã®ç¬¦å·ã®ä½ç½®ã‚’ãƒã‚§ãƒ?‚¯ã—ã¾ã™ã? 163 * マイナス(-)ãŒã?å˜åœ¨ã—ãªã?‹ã€å?é 以外ã?å ´åˆã?ã€ã‚¨ãƒ©ãƒ¼ 164 * 165 * @param value å…??æ–?—å? 166 * 167 * @return エラーæ–?—å?(æ£å¸¸æ™‚ã?ã€null) 168 */ 169 public static String decimalCodeCheck( final String value ) { 170 String rtn = null; 171 if( value.lastIndexOf( '-' ) > 0 ) { 172 rtn = changeErrorPath( value, '-' ); 173 } 174 return rtn ; 175 } 176 177 /** 178 * æ–?—å?ã®æ•´åˆæ?(æ•´æ•°)ã‚’ãƒã‚§ãƒ?‚¯ã—ã¾ã™ã? 179 * ?~9ãŠã‚ˆã?マイナス(-)を許å¯ã—ã¾ã™ã? 180 * 181 * @param value å…??æ–?—å? 182 * 183 * @return エラーæ–?—å?(æ£å¸¸æ™‚ã?ã€null) 184 */ 185 public static String numberFormatCheck( final String value ) { 186 boolean isError = false; 187 int i = 0; 188 char ch; 189 while( i<value.length() ) { 190 ch = value.charAt( i ); 191 if( ( '0'>ch || '9'<ch ) && ( '-'!=ch ) ) { 192 isError = true; 193 break; 194 } 195 i++; 196 } 197 if( isError ) { 198 StringBuilder val = new StringBuilder(); 199 for( i=0; i<value.length(); i++ ) { 200 ch = value.charAt( i ); 201 if( ( '0'>ch || '9'<ch ) && ( '-'!=ch ) ) { 202 val.append( "<span class=\"NG\">" ).append( ch ).append( "</span>" ); 203 } 204 else { 205 val.append( ch ); 206 } 207 } 208 return val.toString(); 209 } else { 210 return null; 211 } 212 } 213 214 /** 215 * æ–?—å?ã®æ•´åˆæ?(å°æ•°)ã‚’ãƒã‚§ãƒ?‚¯ã—ã¾ã™ã? 216 * ?~9ã?マイナス(-)ãŠã‚ˆã³å°æ•°ç‚¹(.)を許å¯ã—ã¾ã™ã? 217 * 218 * og.rev 4.2.4.0 (2008/06/26) '.' or '-' ã®ã¿ã¯ã‚¨ãƒ©ãƒ¼ 219 * 220 * @param value å…??æ–?—å? 221 * 222 * @return エラーæ–?—å?(æ£å¸¸æ™‚ã?ã€null) 223 */ 224 public static String decimalFormatCheck( final String value ) { 225 boolean isError = false; 226 int i = 0; 227 char ch; 228 while( i<value.length() ) { 229 ch = value.charAt( i ); 230 if( ( '0'>ch || '9'<ch ) && ( '.'!=ch ) && ( '-'!=ch ) ) { 231 isError = true; 232 break; 233 } 234 i++; 235 } 236 237 // 4.2.4.0 (2008/06/26) '.' or '-' ã®ã¿ã¯ã‚¨ãƒ©ãƒ¼ 238 if( ( value.length() ==1 ) && ( value.charAt( 0 ) == '.' || value.charAt( 0 ) == '-' ) ) { 239 isError = true; 240 } 241 242 if( isError ) { 243 StringBuilder val = new StringBuilder(); 244 for( i=0; i<value.length(); i++ ) { 245 ch = value.charAt( i ); 246 if( ( '0'>ch || '9'<ch ) && ( '.'!=ch ) && ( '-'!=ch ) ) { 247 val.append( "<span class=\"NG\">" ).append( ch ).append( "</span>" ); 248 } 249 else { 250 val.append( ch ); 251 } 252 } 253 return val.toString(); 254 } else { 255 return null; 256 } 257 } 258 259 /** 260 * 日付文å—å?ã®æ•´åˆæ?ã‚’ãƒã‚§ãƒ?‚¯ã—ã¾ã™ã? 261 * 262 * æ•´åˆæ?ã¨ã?£ã¦ã‚‚ã?DBType_DATE ã®ã‚ˆã†ãªå޳å¯?ªãƒã‚§ãƒ?‚¯ã¯ã€è¡Œã„ã¾ã›ã‚“ã€? 263 * ã“ã“ã§ã¯ã€yyyyMM(?–æ¡?ã€yyyyMMdd(?˜æ¡?ã€yyyyMMddHHmmss(?‘ï¼”æ¡? ã®?“種類ã?ã¿ 264 * 対象ã«ã—ã¾ã™ã? 265 * "0000XXXX" , "9999XXXX" ã¯ã€å¸¸ã«è¨±å¯ã•れã¾ã™ã? 266 * æœˆã¨æ—¥ã®é–¢ä¿‚ã‚‚ã€ã‚りã¾ã›ã‚“。ï¼?0130231 㯠OK?? 267 * ã‚ãã¾ã§ã€æœˆã¯ã€???2 ã®ç¯?›²ã€æ—¥ã¯ã€???1ã®ç¯?›²ãƒã‚§ãƒ?‚¯ã§ã™ã? 268 * 269 * 厳å¯?ªæ—¥ä»˜ãƒã‚§ãƒ?‚¯ã‚’行ã„ãŸã„å ´åˆã?ã€DBType_DATE を使用ã—ã¦ãã ã•ã„ã€? 270 * 271 * @og.rev 5.6.0.3 (2012/01/24) æ–°è¦è¿½åŠ? 272 * 273 * @param value å…??æ–?—å?(nullã¯ä¸å¯) 274 * 275 * @return エラーæ–?—å?(æ£å¸¸æ™‚ã?ã€null) 276 */ 277 public static String ymdFormatCheck( final String value ) { 278 if( value.startsWith( "0000" ) || value.startsWith( "9999" ) ) { return null; } // ç„¡æ¡ä»¶ OK 279 280 int len = value.length() ; 281 if( len >= 6 ) { // 月ã?ãƒã‚§ãƒ?‚¯ 282 String val = ymdhmsCheck( value,4,6,1,12 ); 283 if( val != null ) { return val; } 284 } 285 286 if( len >= 8 ) { // æ—¥ã®ãƒã‚§ãƒ?‚¯ 287 String val = ymdhmsCheck( value,6,8,1,31 ); 288 if( val != null ) { return val; } 289 } 290 291 if( len >= 10 ) { // 時ã?ãƒã‚§ãƒ?‚¯ 292 String val = ymdhmsCheck( value,8,10,0,24 ); // 240000 ã¯è¨±å¯ã—ã¾ã™ã? 293 if( val != null ) { return val; } 294 } 295 296 if( len >= 12 ) { // åˆ??ãƒã‚§ãƒ?‚¯ 297 String val = ymdhmsCheck( value,10,12,0,60 ); // 60åˆ??許å¯ã—ã¾ã™ã? 298 if( val != null ) { return val; } 299 } 300 301 if( len == 14 ) { // ç§’ã?ãƒã‚§ãƒ?‚¯ 302 String val = ymdhmsCheck( value,12,14,0,60 ); // ã?‚‹ã?§’ã¨ã¯è¨?„ã¾ã›ã‚“ãŒã?60ç§’ã?許å¯ã—ã¾ã™ã? 303 if( val != null ) { return val; } 304 } 305 306 return null; 307 } 308 309 /** 310 * 時刻æ–?—å?ã®æ•´åˆæ?ã‚’ãƒã‚§ãƒ?‚¯ã—ã¾ã™ã? 311 * 312 * æ•´åˆæ?ã¨ã?£ã¦ã‚‚ã?DBType_DATE ã®ã‚ˆã†ãªå޳å¯?ªãƒã‚§ãƒ?‚¯ã¯ã€è¡Œã„ã¾ã›ã‚“ã€? 313 * ã“ã“ã§ã¯ã€HHmmss(?–æ¡? ã®ã¿å¯¾è±¡ã«ã—ã¾ã™ã? 314 * 315 * @og.rev 5.6.0.3 (2012/01/24) æ–°è¦è¿½åŠ? 316 * 317 * @param value å…??æ–?—å?(nullã¯ä¸å¯) 318 * 319 * @return エラーæ–?—å?(æ£å¸¸æ™‚ã?ã€null) 320 */ 321 public static String hmsFormatCheck( final String value ) { 322 int len = value.length() ; 323 324 if( len >= 2 ) { // 時ã?ãƒã‚§ãƒ?‚¯ 325 String val = ymdhmsCheck( value,0,2,0,24 ); // 240000 ã¯è¨±å¯ã—ã¾ã™ã? 326 if( val != null ) { return val; } 327 } 328 329 if( len >= 4 ) { // åˆ??ãƒã‚§ãƒ?‚¯ 330 String val = ymdhmsCheck( value,2,4,0,60 ); // 60åˆ??許å¯ã—ã¾ã™ã? 331 if( val != null ) { return val; } 332 } 333 334 if( len == 6 ) { // ç§’ã?ãƒã‚§ãƒ?‚¯ 335 String val = ymdhmsCheck( value,4,6,0,60 ); // ã?‚‹ã?§’ã¨ã¯è¨?„ã¾ã›ã‚“ãŒã?60ç§’ã?許å¯ã—ã¾ã™ã? 336 if( val != null ) { return val; } 337 } 338 339 return null; 340 } 341 342 /** 343 * 月ã?æ—¥ã€æ™‚ã€å?ã€ç§?ã®ãƒã‚§ãƒ?‚¯ç”¨ãƒ¡ã‚½ãƒ?ƒ‰ 344 * 345 * åŒã˜ã‚ˆã†ãªãƒ‘ターンã§ãƒã‚§ãƒ?‚¯ã™ã‚‹ç‚ºã€å?通メソãƒ?ƒ‰åŒ–ã—ã¦ãŠãã¾ã™ã? 346 * 347 * @param value å…??æ–?—å? 348 * @param st ãƒã‚§ãƒ?‚¯é–‹å§‹æ¡æ•° 349 * @param ed ãƒã‚§ãƒ?‚¯çµ‚äº?¡æ•° (val.length() ã‚’è¶?ˆãªã?º? 350 * @param minSu 許å¯ç¯?›²ã®æœ?°å? 351 * @param maxSu 許å¯ç¯?›²ã®æœ?¤§å€¤ 352 * 353 * @return エラーæ–?—å??ˆæ£å¸¸ãªå ´åˆã?ã€null?? 354 */ 355 public static String ymdhmsCheck( final String value, final int st , final int ed , final int minSu , final int maxSu ) { 356 String rtn = null; 357 358 int dt = Integer.parseInt( value.substring( st,ed ) ); 359 if( dt < minSu || maxSu < dt ) { 360 rtn = value.substring( 0,st ) + "<span class=\"NG\">" + value.substring( st,ed ) + "</span>" + value.substring( ed ) ; 361 } 362 return rtn; 363 } 364 365 /** 366 * æ–?—å?ã®ã‚¨ãƒ©ãƒ¼æ–?—å?ã‚’è¿”ã—ã¾ã™ã? 367 * 368 * @param val å…??æ–?—å? 369 * @param inChar エラー対象æ–?? 370 * 371 * @return エラーæ–?—å? 372 */ 373 private static String changeErrorPath( final String val, final char inChar ) { 374 StringBuilder buf = new StringBuilder(); 375 for( int i=0; i<val.length(); i++ ) { 376 char ch = val.charAt( i ); 377 if( inChar==ch ) { 378 buf.append( "<span class=\"NG\">" ).append( ch ).append( "</span>" ); 379 } else { 380 buf.append( ch ); 381 } 382 } 383 return buf.toString(); 384 } 385 386 /** 387 * æ–?—å?ã®é•·ã•ã‚’ãƒã‚§ãƒ?‚¯ã—ã¾ã™ã? 388 * ãƒã‚¤ãƒˆæ•°ã«æ›ç®—ã—ã¦æ¯”è¼?ƒã‚§ãƒ?‚¯ã—ã¾ã™ã? 389 * 390 * @og.rev 3.0.1.3 (2003/03/11) メソãƒ?ƒ‰æ–°è¦è¿½åŠ? 391 * @og.rev 3.5.5.3 (2004/04/09) StringUtil ã® CODE を使用ã—ãŸãƒ¡ã‚½ãƒ?ƒ‰ã‚’削除ã™ã‚‹ã€? 392 * @og.rev 5.3.9.0 (2011/09/01) DB_USE_TEXT_LENGTH ã‚’è?æ…®ã—ãŸã€?½¢æ–?—æ•°?£ã€?½¢ãƒã‚¤ãƒˆæ•°?£ãƒã‚§ãƒ?‚¯ 393 * 394 * @param value å…??æ–?—å? 395 * @param len æ–?—å?ã®é•·ã? 396 * 397 * @return エラーæ–?—å?(æ£å¸¸æ™‚ã?ã€null) 398 */ 399 public static String byteLengthCheck( final String value ,final int len ) { 400 String rtn = null; 401 402 // 5.3.9.0 (2011/09/01) ?¢æ–?—æ•°?£ã€?½¢ãƒã‚¤ãƒˆæ•°?£ãƒã‚§ãƒ?‚¯ 403 final int valLen ; 404 if( USE_TEXT_LEN ) { // true:?¢æ–?—æ•°?£ãƒã‚§ãƒ?‚¯æ–¹å¼? 405 valLen = value.length(); 406 } 407 else { // false:?¢ãƒã‚¤ãƒˆæ•°?£ãƒã‚§ãƒ?‚¯æ–¹å¼? 408 byte[] byteValue = StringUtil.makeByte( value,CODE ); // 3.5.5.3 (2004/04/09) 409 valLen = byteValue.length; 410 } 411 412 // byte[] byteValue = StringUtil.makeByte( value,CODE ); // 3.5.5.3 (2004/04/09) 413 414 // if( byteValue.length > len ) { 415 // rtn = String.valueOf( byteValue.length ); 416 // } 417 418 if( valLen > len ) { 419 rtn = String.valueOf( valLen ); 420 } 421 422 return rtn ; 423 } 424 425 /** 426 * æ–?—å?ã®æ•´åˆæ?ã‚’ã?dbType パラメータを利用ã—ã¦ãƒã‚§ãƒ?‚¯ã—ã¾ã™ã? 427 * regex ãŒã?null ã¾ãŸã?ã€?•·ã•ゼãƒã®æ–?—å?ã®å ´åˆã?ã€ãªã«ã‚‚ã—ã¾ã›ã‚“ã€? 428 * 429 * @og.rev 3.6.0.0 (2004/09/22) æ–°è¦ä½œæ? 430 * 431 * @param value å…??æ–?—å? 432 * @param regex ãƒã‚§ãƒ?‚¯ã™ã‚‹æ£è¦è¡¨ç¾æ–?—å? 433 * 434 * @return エラーæ–?—å?(æ£å¸¸æ™‚ã?ã€null) 435 */ 436 public static String matcheCheck( final String value,final String regex ) { 437 if( regex == null || regex.length() == 0 ) { return null; } 438 439 if( value.matches( regex ) ) { 440 return null; 441 } 442 else { 443 return "<span class=\"NG\">" + value + "</span> regex=" + regex ; 444 } 445 } 446 }