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    }