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 }