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 }