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.plugin.column;
017    
018    // import java.text.DateFormat;
019    // import java.text.SimpleDateFormat;
020    // import java.util.Locale;
021    import java.util.Calendar;
022    
023    import org.opengion.fukurou.model.NativeType;
024    import org.opengion.fukurou.util.ErrorMessage;
025    import org.opengion.fukurou.util.HybsDateUtil;
026    import org.opengion.hayabusa.common.HybsSystemException;
027    import org.opengion.hayabusa.db.AbstractDBType;
028    import org.opengion.hayabusa.db.DBTypeCheckUtil;
029    
030    /**
031     * æ–?­—å?ã®æ—¥ä»˜å±žæ?(å¹´/æœ?æ—¥)ã®åŠè§’ã?日付を扱ã?‚ºã®ã€ã‚«ãƒ©ãƒ?±žæ?を定義ã—ã¾ã™ã?
032     *
033     * yyyyMMdd ã«å¯¾å¿œã—ã¦ã?‚‹å¿?¦ãŒã‚りã¾ã™ã?
034     * ãŸã ã—ã?日付ã?æ•´åˆæ?ãƒã‚§ãƒ?‚¯ã¯è¡Œã„ã¾ã›ã‚“ãŒã?valueAdd( String value )ã«ã‚ˆã‚‹
035     * 日付ã?åŠ?®—時ã«ã¯æ­£å¼ãªæ—¥ä»˜ã§åŠ?®—ã•れã¾ã™ã?
036     *
037     * タイプãƒã‚§ãƒ?‚¯ã¨ã—ã¦ã€ä»¥ä¸‹ã?æ¡ä»¶ã‚’判定ã—ã¾ã™ã?
038     * ・æ–?­—å?é•·ã¯ã€ç›´æŽ¥è¨ˆç®—ã§æ–?­—æ•°ã¨ã®æ¯”è¼?
039     * ・日付使用æ–?­—ãƒã‚§ãƒ?‚¯ã€?'0' > c || '9' < c)以外ã?エラー
040     * ・æ–?­—パラメータ㮠正è¦è¡¨ç¾ãƒã‚§ãƒ?‚¯
041     *
042     * @og.group ãƒ??タ属æ?
043     *
044     * @version  4.0
045     * @author   Kazuhiko Hasegawa
046     * @since    JDK5.0,
047     */
048    public class DBType_YMD extends AbstractDBType {
049            //* ã“ã?プログラãƒ??VERSIONæ–?­—å?を設定ã—ã¾ã™ã?       {@value} */
050            private static final String VERSION = "5.6.6.0 (2013/07/05)" ;
051    
052            /**
053             * NATIVEã®åž‹ã?識別コードを返ã—ã¾ã™ã?
054             *
055             * @og.rev 3.5.4.7 (2004/02/06) æ–°è¦ä½œæ?
056             * @og.rev 4.1.1.2 (2008/02/28) Enumåž?fukurou.model.NativeType)ã«å¤‰æ›´
057             *
058             * @return  NATIVEã®åž‹ã?識別コーãƒ?DBType ã§è¦å®?
059             * @see org.opengion.fukurou.model.NativeType
060             */
061            @Override
062            public NativeType getNativeType() {
063                    return NativeType.CALENDAR;
064            }
065    
066            /**
067             * åŠè§’スペã?スã§å›ºå®šé•·(åŠè§’æ›ç®—ã?æ•°)ã«å¤‰æ›ã—ãŸæ–?­—å?ã‚’è¿”ã—ã¾ã™ã?
068             * ãªãŠã?エラーãƒã‚§ãƒ?‚¯ã¯è¡Œã‚れã¾ã›ã‚“ã€?
069             * 実行å‰ã«ã€å¿?š valueCheck( String value ,int len ) ãŒè¡Œã‚れるå¿?¦ãŒã‚りã¾ã™ã?
070             *
071             * @og.rev 3.5.4.5 (2004/01/23) エンコード指定ã«å¤‰æ›´ã—ã¾ã™ã?
072             *
073             * @param   value    ?¦?©?¬?¬åŸ‹ã‚ã™ã‚‹æ–?­—å?
074             * @param   sizeX    整数部åˆ??æ–?­—å?ã®é•·ã?
075             * @param   sizeY    少数部åˆ??æ–?­—å?ã®é•·ã?
076             * @param   encode   固定長ã§å¤‰æ›ã™ã‚‹æ–?­—エンコーãƒ?
077             *
078             * @return  ?¦?©?¬?¬åŸ‹ã‚ã—ãŸæ–°ã—ã„æ–?­—å?
079             */
080            @Override
081            public String valueFill( final String value ,final int sizeX ,final int sizeY,final String encode ) {
082                    if( value != null && value.length() >= sizeX ) {
083                            return value.substring( 0, sizeX );
084                    }
085    
086                    String errMsg = "æŒ?®šæ–‡å­—ãŒä¸æ­£ã§ã™ã?value=[" + value + "] length=[" + sizeX + "]";
087                    throw new HybsSystemException( errMsg );
088            }
089    
090            /**
091             * Stringå¼•æ•°ã®æ–?­—å?を+1ã—ãŸæ–‡å­—å?ã‚’è¿”ã—ã¾ã™ã?
092             * ã“ã“ã§ã¯ã€yyyyMMdd å½¢å¼ã?ãƒ??ã‚¿ã«ã€?¼‹ï¼?ã™ã‚‹ã®ã§ã€æ—¥ã‚’+1ã—ã¾ã™ã?
093             * 
094             * 引数ã?null ã®å ´åˆã¨ã€ã‚¼ãƒ­æ–?­—å?("")ã®å ´åˆã?,物ç?š„åˆæœŸè¨­å®šå?(String getDefault())
095             * ã®å€¤ã‚’è¿”ã—ã¾ã™ã?
096             * ãれ以外ã?å ´åˆã?ã€æ—¥ä»˜è¨ˆç®—を行ã„ã€æ—¥ã‚’加算ã—ã¾ã™ã?よã£ã¦ã€å¹´æœˆæ—¥ãƒ•ォーマットã«
097             * åˆã‚ãªã?ƒ‡ãƒ¼ã‚¿ã‚’指定ã—ãŸå?åˆã?ã€ã‚¨ãƒ©ãƒ¼ã«ãªã‚Šã¾ã™ã?ã§ã€ã”注æ„ãã?•ã??
098             *
099             * @og.rev 3.6.0.0 (2004/09/17) æ—¥ã®åŠ?®—ロジãƒ?‚¯ã®èª¤ã‚Šä¿®æ­£ã€?roll â‡?add)
100             * @og.rev 5.5.7.2 (2012/10/09) HybsDateUtil を利用ã™ã‚‹ã‚ˆã†ã«ä¿®æ­£ã—ã¾ã™ã?
101             *
102             * @param       value   Stringå¼•æ•°ã®æ–?­—å?
103             *
104             * @return  Stringå¼•æ•°ã®æ–?­—å?を+1ã—ãŸæ–‡å­—å?
105             */
106            @Override
107            public String valueAdd( final String value ) {
108                    if( value == null || value.length() == 0 ) { return getDefault(); }
109    
110                    return HybsDateUtil.getDatePlus( value , 1 );
111    
112    //              Calendar cal = Calendar.getInstance();
113    // 
114    //              int year  = Integer.parseInt( value.substring( 0,4 ) );
115    //              int month = Integer.parseInt( value.substring( 4,6 ) ) - 1;
116    //              int date  = Integer.parseInt( value.substring( 6,8 ) );
117    // 
118    //              cal.set( year,month,date );
119    //              cal.add( Calendar.DATE, 1 );            // æ—¥ã«ã¡ã‚’1日åŠ?®—ã—ã¾ã™ã?
120    // 
121    //              DateFormat formatter = new SimpleDateFormat( "yyyyMMdd",Locale.JAPAN );
122    //              return formatter.format( cal.getTime() );
123            }
124    
125            /**
126             * Stringå¼•æ•°ã®æ–?­—å?ã«ã€ç¬¬?’å¼•æ•°ã«æŒ?®šã?æ–?­—å?(æ•°å­—ã?日付ç­?を加算ã—ã¦è¿”ã—ã¾ã™ã?
127             *
128             * ã“ã“ã§ã¯ã€yyyyMMdd å½¢å¼ã?ãƒ??ã‚¿ã«ã€æ—¥ä»˜ã‚’åŠ?®—ã—ã¾ã™ã?
129             *
130             * ã“ã? YMD ã¯ã€å¼•æ•°ã«ã€æ—¥ä»˜å˜ä½ã‚’æŒ?®šã§ãã¾ã™ã?å˜ä½ã?ã€yyyyMMdd å½¢å¼ã?
131             * ?‘文字をæŒ?®šã—ã¾ã™ã?大æ–?­—ã?å°æ–‡å­—も識別ã—ã¾ã™ã?value="5M" ã¨ã™ã‚Œã°ã€?¼•ã‹æœˆã?value="5d"
132             * ã¨ã™ã‚Œã°ã€?¼•æ—¥ 追åŠ?—ã¾ã™ã?
133             * æŒ?®šã—ãªã??åˆã?ã€æ—¥ã‚’加算ã—ã¾ã™ã?
134             * 
135             * 引数ã?null ã®å ´åˆã¨ã€ã‚¼ãƒ­æ–?­—å?("")ã®å ´åˆã?,物ç?š„åˆæœŸè¨­å®šå?(String getDefault())
136             * ã®å€¤ã‚’è¿”ã—ã¾ã™ã?
137             * ãれ以外ã?å ´åˆã?ã€æ—¥ä»˜è¨ˆç®—を行ã„ã€æ—¥ã‚’加算ã—ã¾ã™ã?よã£ã¦ã€å¹´æœˆæ—¥ãƒ•ォーマットã«
138             * åˆã‚ãªã?ƒ‡ãƒ¼ã‚¿ã‚’指定ã—ãŸå?åˆã?ã€ã‚¨ãƒ©ãƒ¼ã«ãªã‚Šã¾ã™ã?ã§ã€ã”注æ„ãã?•ã??
139             *
140             * @og.rev 5.6.0.3 (2012/01/24) ADD ã«ã€å¼•æ•°ã®å€¤ã‚’加算ã™ã‚‹æ©Ÿè?を追åŠ?—ã¾ã™ã?
141             * @og.rev 5.6.1.0 (2013/02/01) åŠ?®—ã™ã‚‹å¼•æ•°ã«ã€æ—¥ä»˜å˜ä½?'y','M','d')を指定å¯èƒ½ã«ã—ã¾ã™ã?
142             *
143             * @param   value  String引数
144             * @param   add    åŠ?®—ã™ã‚‹æ—¥ä»˜æ–‡å­—å?(å˜ä½ã¨ã—ã¦ã€y,M,d を指定ã§ãã¾ã?
145             *
146             * @return  å¼•æ•°ã®æ–?­—å?ã«ã€æ—¥ä»˜ã‚’åŠ?®—ã—ã¾ã?
147             */
148            @Override
149            public String valueAdd( final String value,final String add ) {
150                    if( value == null || value.length() == 0 ) { return getDefault(); }
151    
152                    return HybsDateUtil.getDatePlus( value,add,Calendar.DATE,"yyyyMMdd" );
153    
154    //              int addSu = 1;  // åˆæœŸå€¤(add ã?null ã‚?Empty ã®å ´åˆã?ã€?¼‹ï¼‘ã¨ãªã‚?
155    //              if( add != null && !add.isEmpty() ) {
156    //                      addSu = Integer.parseInt( add );
157    //              }
158    
159    //              return HybsDateUtil.getDatePlus( value , addSu );
160            }
161    
162            /**
163             * エãƒ?‚£ã‚¿ãƒ¼ã§ç·¨é›?•れãŸãƒ??タを登録ã™ã‚‹å ´åˆã«ã€ãƒ‡ãƒ¼ã‚¿ãã?ã‚‚ã?ã‚?
164             * 変æ›ã—ã¦ã€å®Ÿç™»éŒ²ãƒ??タを作æ?ã—ã¾ã™ã?
165             * ã“ã?メソãƒ?ƒ‰ã§ã¯ã€sizeX ã¨ç„¡é–¢ä¿‚ã« ?˜ã‚±ã‚¿ã® yyyyMMdd å½¢å¼ã?
166             * 日付データã«ãƒ•ォーマットã«çµ±ä¸?—ã¾ã™ã?
167             * 引数ã?null ã®å ´åˆã¨ã€ã‚¼ãƒ­æ–?­—å?("")ã®å ´åˆã?,物ç?š„åˆæœŸè¨­å®šå?(String getDefault())
168             * ã®å€¤ã‚’è¿”ã—ã¾ã™ã?
169             *
170             * @og.rev 5.5.7.2 (2012/10/09) HybsDateUtil を利用ã™ã‚‹ã‚ˆã†ã«ä¿®æ­£ã—ã¾ã™ã?
171             * @og.rev 5.6.6.0 (2013/07/05) parseDate を改é€?—ã€æ—¥ä»˜ã?æ¡æ•°æŒ?®šã‚’厳å¯?«åˆ¤å®šã—ã¾ã™ã?
172             *
173             * @param       value   (ä¸?ˆ¬ã«ç·¨é›?ƒ‡ãƒ¼ã‚¿ã¨ã—ã¦ç™»éŒ²ã•れãŸãƒ‡ãƒ¼ã‚¿)
174             * @return  修正後ã?æ–?­—å?(ä¸?ˆ¬ã«ãƒ??タベã?スã«ç™»éŒ²ã™ã‚‹ãƒ??ã‚¿)
175             */
176            @Override
177            public String valueSet( final String value ) {
178                    if( value == null || value.length() == 0 ) { return getDefault(); }
179    
180                    return HybsDateUtil.parseDate( value , 8 );             // ä¸è¦ãªè¨˜å·ç­‰ã‚’削除ã—ã?æ¡æ•°ã‚’ãã‚ãˆã‚‹ã?
181    
182    //              String rtn = ( value == null ) ? "" : value.trim();
183    // 
184    //              if( rtn.length() == 6 ) { rtn = "20" + rtn ; }
185    //              else if( rtn.length() > 8 ) { rtn = rtn.substring(0,8) ; }
186    //              else if( rtn.startsWith( "0000" ) ) { rtn = "00000101"; }
187    //              else if( rtn.startsWith( "9999" ) ) { rtn = "99991231"; }
188    // 
189    //              return rtn;
190            }
191    
192            /**
193             * ãƒ??ã‚¿ãŒç™»éŒ²å¯èƒ½ã‹ã©ã?‹ã‚’ãƒã‚§ãƒ?‚¯ã—ã¾ã™ã?
194             * ãƒ??ã‚¿ãŒã‚¨ãƒ©ãƒ¼ã®å ´åˆã?ã€ãã®ã‚¨ãƒ©ãƒ¼å†?®¹ã‚’è¿”ã—ã¾ã™ã?
195             *
196             * @og.rev 3.6.0.0 (2004/09/22) dbType パラメータを引数ã«è¿½åŠ?
197             * @og.rev 5.2.2.0 (2010/11/01) 厳å¯?«ãƒã‚§ãƒ?‚¯(isStrict=true)ã™ã‚‹ãƒ•ラグを追åŠ?
198             * @og.rev 5.6.0.3 (2012/01/24) 日付ãƒã‚§ãƒ?‚¯ã®æ•´åˆæ?ã¾ã§å«ã‚ãŸãƒã‚§ãƒ?‚¯ã‚’å?れるã€?
199             *
200             * @param   key         キー
201             * @param   value       値
202             * @param   sizeX       整数部åˆ??æ–?­—å?ã®é•·ã?
203             * @param   sizeY       少数部åˆ??æ–?­—å?ã®é•·ã?
204             * @param   typeParam   dbType パラメータ
205             * @param   isStrict    厳å¯?«ãƒã‚§ãƒ?‚¯ã™ã‚‹ã‹ã©ã?‹[true:ã™ã‚‹/false:標準的]
206             *
207             * @return  エラーå†?®¹
208             */
209    //      public ErrorMessage valueCheck( final String key ,final String value ,
210    //                                                                      final int sizeX ,final int sizeY ,final String param ) {
211            @Override
212            public ErrorMessage valueCheck( final String key ,final String value ,
213                                                                            final int sizeX ,final int sizeY ,final String typeParam ,final boolean isStrict) {
214    
215                    ErrorMessage msg = new ErrorMessage();
216                    if( value == null || value.length() == 0 ) { return msg; }
217    
218                    int len = (sizeY == 0) ? sizeX : sizeX + sizeY + 1;
219                    // 5.2.2.0 (2010/11/01) 厳å¯?«ãƒã‚§ãƒ?‚¯(isStrict=true)ã™ã‚‹ãƒ•ラグを追åŠ?
220                    if( isStrict ) {
221                            if( len != value.length() ) {
222                                    // æ–?­—å?ã®é•·ã•ãŒæŒ?®šã?é•·ã•ã¨ç•°ãªã‚Šã¾ã™ã?
223                                    msg.addMessage( 0,ErrorMessage.NG,"ERR0011", key,value, 
224                                                                                    String.valueOf( value.length() ), String.valueOf( len ) );
225                            }
226                    }
227                    else {
228                            if( len < value.length() ) {
229                                    // æ–?­—å?ã®é•·ã•ãŒæŒ?®šã?é•·ã•よりも長ã?§ã™ã?
230                                    msg.addMessage( 0,ErrorMessage.NG,"ERR0006",key,value,
231                                                                                    String.valueOf( value.length() ),String.valueOf( len ) );
232                            }
233                    }
234    
235    //              StringBuilder val = new StringBuilder();
236    //              boolean isError = false;
237    //              for( int i=0; i<value.length(); i++ ) {
238    //                      char ch = value.charAt( i );
239    //                      if( ('0' > ch || '9' < ch) ) {
240    //                              val.append( "<span class=\"NG\">" ).append( ch ).append( "</span>" );
241    //                              isError = true;
242    //                      }
243    //                      else {
244    //                              val.append( ch );
245    //                      }
246    //              }
247    //              if( isError ) {
248    //                      // æŒ?®šã?æ–?­—以外ã?æ–?­—ãŒä½¿ã‚れã¦ã?¾ã™ã?
249    //                      msg.addMessage( 0,ErrorMessage.NG,"ERR0009", key,val.toString() );
250    //              }
251    
252                    // 5.6.0.3 (2012/01/24) æ–?­—ã?ç¯?›²ãƒã‚§ãƒ?‚¯
253                    String check = DBTypeCheckUtil.rangeCheck( value, '0', '9' );
254                    if( check != null ) {
255                            // æŒ?®šã?æ–?­—以外ã?æ–?­—ãŒä½¿ã‚れã¦ã?¾ã™ã?
256                            msg.addMessage( 0,ErrorMessage.NG,"ERR0009", key,check );
257                    }
258    
259                    // 5.6.0.3 (2012/01/24) 日付文字ã?æ•´åˆæ?ãƒã‚§ãƒ?‚¯
260                    // "0000","9999" ã§å§‹ã¾ã‚‹æ—¥ä»˜ã?未æ¡ä»¶è¨±å¯ã€?
261                    check = DBTypeCheckUtil.ymdFormatCheck( value );
262                    if( check != null ) {
263                            // æŒ?®šã?æ–?­—以外ã?æ–?­—ãŒä½¿ã‚れã¦ã?¾ã™ã?
264                            msg.addMessage( 0,ErrorMessage.NG,"ERR0009", key,check );
265                    }
266    
267                    // 3.6.0.0 (2004/09/22) dbType パラメータを使用ã—ãŸãƒžãƒƒãƒãƒã‚§ãƒ?‚¯
268                    check = DBTypeCheckUtil.matcheCheck( value,typeParam );
269                    if( check != null ) {
270                            // æŒ?®šã?æ–?­—以外ã?æ–?­—ãŒä½¿ã‚れã¦ã?¾ã™ã?
271                            msg.addMessage( 0,ErrorMessage.NG,"ERR0009", key,check );
272                    }
273    
274                    return msg;
275            }
276    }