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