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 */ 016package 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; 023import java.util.Calendar; 024 025import org.opengion.fukurou.model.NativeType; 026import org.opengion.fukurou.util.ErrorMessage; 027import org.opengion.fukurou.util.HybsDateUtil; 028 029import org.opengion.hayabusa.common.HybsSystemException; 030import org.opengion.hayabusa.db.AbstractDBType; 031import 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 */ 052public 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 FILL埋めする文字列 073 * @param sizeX 整数部分の文字列の長さ 074 * @param sizeY 少数部分の文字列の長さ 075 * @param encode 固定長で変換する文字エンコード 076 * 077 * @return FILL埋めした新しい文字列 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 するので、日を+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引数の文字列に、第2引数に指定の文字列(数字、日付等)を加算して返します。 130 * 131 * ここでは、yyyyMMdd 形式のデータに、日付を加算します。 132 * 133 * この DATE は、引数に、日付単位を指定できます。単位は、yyyyMMdd 形式の 134 * 1文字を指定します。大文字、小文字も識別します。value="5M" とすれば、5か月、value="5d" 135 * とすれば、5日 追加します。 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 の場合は、+1となる) 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}