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 018import java.util.Calendar; 019 020import org.opengion.fukurou.util.ErrorMessage; 021import org.opengion.fukurou.util.StringUtil; 022import org.opengion.hayabusa.db.AbstractDBType; 023import org.opengion.hayabusa.db.DBTypeCheckUtil; 024import org.opengion.fukurou.util.HybsDateUtil; 025 026/** 027 * 文字列の時間属性(時:分:秒)の半角の時間を扱う為の、カラム属性を定義します。 028 * 029 * HHmmss に対応している必要があります。 030 * (HHmmのデータでも利用可能です) 031 * ただし、日付の整合性チェックは行いませんが、valueAdd( String value )での 032 * 日付の加算時には、正式な日付データにて加算します。 033 * 034 * タイプチェックとして、以下の条件を判定します。 035 * ・文字列長は、直接計算で文字数との比較 036 * ・日付使用文字チェック「('0' > c || '9' < c)以外」エラー 037 * ・文字パラメータの 正規表現チェック 038 * 039 * @og.group データ属性 040 * @og.rev 5.4.3.6 (2012/01/20) タイプチェックが抜けているので追加 041 * 042 * @version 4.0 043 * @author Kazuhiko Hasegawa 044 * @since JDK5.0, 045 */ 046public class DBType_HMS extends AbstractDBType { 047 //* このプログラムのVERSION文字列を設定します。 {@value} */ 048 private static final String VERSION = "5.6.1.0 (2013/02/01)" ; 049 050 /** 051 * String引数の文字列を+1した文字列を返します。 052 * これは、英字の場合(A,B,C など)は、B,C,D のように,最終桁の文字コードを 053 * +1 します。 054 * 文字列が数字タイプの場合は, 数字に変換して、+1 します。(桁上がりもあり) 055 * 混在タイプの場合は,最後の桁だけを確認して +1します。 056 * 引数が null の場合と、ゼロ文字列("")の場合は,物理的初期設定値(String getDefault()) 057 * の値を返します。 058 * 059 * @param value String引数の文字列 060 * 061 * @return String引数の文字列を+1した文字列 062 */ 063 @Override 064 public String valueAdd( final String value ) { 065 if( value == null || value.length() == 0 ) { return getDefault(); } 066 067 int hour = Integer.parseInt( value.substring( 0,2 ) ); 068 069 // 先頭に 00 を付加する為に、数字の 100 を加算している。 070 if( hour < 24 ) { hour = 101 + hour; } 071 else { hour = 100; } 072 073 String rtn = hour + value.substring( 2 ); 074 075 return rtn.substring( 1 ); 076 } 077 078 /** 079 * String引数の文字列に、第2引数に指定の文字列(数字、日付等)を加算して返します。 080 * 081 * ここでは、HHmmss 形式のデータに、時間を加算します。 082 * 083 * この HMS は、引数に、日付単位を指定できます。単位は、HHmmss 形式の 084 * 1文字を指定します。大文字、小文字も識別します。value="5H" とすれば、5時間、value="5m" 085 * とすれば、5分 追加します。 086 * 指定しない場合は、時を加算します。 087 * 088 * ここのデータは、時間が繰り越しても、日付に影響しません。 089 * また、24時間を超えた場合は、00 時に戻ります。 090 * 091 * @og.rev 5.6.0.3 (2012/01/24) ADD に、引数の値を加算する機能を追加します。 092 * @og.rev 5.6.1.0 (2013/02/01) 加算する引数に、日付単位('H','m','s')を指定可能にします。 093 * 094 * @param value String引数 095 * @param add 加算する時間文字列(単位付き:['H','m','s']) 096 * 097 * @return 引数の文字列に時間を加算します。 098 */ 099 @Override 100 public String valueAdd( final String value,final String add ) { 101 if( value == null || value.length() == 0 ) { return getDefault(); } 102 103 // 日付文字列にダミーの年月日を追加しておく。 104 return HybsDateUtil.getDatePlus( ("20100101" + value),add,Calendar.HOUR_OF_DAY,"HHmmss" ); 105 } 106 107 /** 108 * エディターで編集されたデータを登録する場合に、データそのものを 109 * 変換して、実登録データを作成します。 110 * 例えば,大文字のみのフィールドなら、大文字化します。 111 * 実登録データの作成は、DBType オブジェクトを利用しますので, 112 * これと Editor とがアンマッチの場合は、うまくデータ変換 113 * されない可能性がありますので、注意願います。 114 * 115 * @param value (一般に編集データとして登録されたデータ) 116 * 117 * @return 修正後の文字列(一般にデータベースに登録するデータ) 118 */ 119 @Override 120 public String valueSet( final String value ) { 121 if( value == null || value.length() == 0 ) { return ""; } 122 return StringUtil.lTrim0( StringUtil.deleteChar( value,':' ) ); 123 } 124 125 /** 126 * データが登録可能かどうかをチェックします。 127 * データがエラーの場合は、そのエラー内容を返します。 128 * 129 * @og.rev 5.2.3.6 (2012/01/20) 数値のみに限定するために追加 130 * @og.rev 5.6.0.3 (2012/01/24) ADD に、引数の値を加算する機能を追加します。 131 * 132 * @param key キー 133 * @param value 値 134 * @param sizeX 整数部分の文字列の長さ 135 * @param sizeY 少数部分の文字列の長さ 136 * @param typeParam dbType パラメータ 137 * @param isStrict 厳密にチェックするかどうか[true:する/false:標準的] 138 * 139 * @return エラー内容 140 */ 141 @Override 142 public ErrorMessage valueCheck( final String key ,final String value , 143 final int sizeX ,final int sizeY ,final String typeParam ,final boolean isStrict) { 144 String checkVal = valueSet(value); // :は念のため外しておく 145 146 ErrorMessage msg = new ErrorMessage(); 147 if( checkVal == null || checkVal.length() == 0 ) { return msg; } 148 149 int len = (sizeY == 0) ? sizeX : sizeX + sizeY + 1; 150 if( isStrict ) { 151 if( len != checkVal.length() ) { 152 // 文字列の長さが指定の長さと異なります。 153 msg.addMessage( 0,ErrorMessage.NG,"ERR0011", key,value, String.valueOf( value.length() ), String.valueOf( len ) ); 154 } 155 } 156 else { 157 if( len < checkVal.length() ) { 158 // 文字列の長さが指定の長さよりも長いです。 159 msg.addMessage( 0,ErrorMessage.NG,"ERR0006",key,value, 160 String.valueOf( value.length() ),String.valueOf( len ) ); 161 } 162 } 163 164 // 5.6.0.3 (2012/01/24) 文字の範囲チェック 165 String check = DBTypeCheckUtil.rangeCheck( checkVal, '0', '9' ); 166 if( check != null ) { 167 // 指定の文字以外の文字が使われています。 168 msg.addMessage( 0,ErrorMessage.NG,"ERR0009", key,check ); 169 } 170 171 // 5.6.0.3 (2012/01/24) 時分秒の整合性チェック 172 check = DBTypeCheckUtil.hmsFormatCheck( checkVal ); 173 if( check != null ) { 174 // 指定の文字以外の文字が使われています。 175 msg.addMessage( 0,ErrorMessage.NG,"ERR0009", key,check ); 176 } 177 178 // 3.6.0.0 (2004/09/22) dbType パラメータを使用したマッチチェック 179 check = DBTypeCheckUtil.matcheCheck( checkVal,typeParam ); 180 if( check != null ) { 181 // 指定の文字以外の文字が使われています。 182 msg.addMessage( 0,ErrorMessage.NG,"ERR0009", key,check ); 183 } 184 185 return msg; 186 } 187}