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 org.opengion.fukurou.util.ErrorMessage;
019    import org.opengion.fukurou.util.StringUtil;
020    import org.opengion.hayabusa.db.AbstractDBType;
021    import org.opengion.hayabusa.db.DBTypeCheckUtil;
022    
023    /**
024     * 半角数字ã? NUMBER を扱ã�?‚ºの、カラãƒ?±žæ?を定義しますã?
025     *
026     * '0' ??'9' ,'-' ,'.',',' でのみ構æ?されてã�?‚‹æ–?­—型カラãƒ?±žæ?を定義しますã?
027     * S9 と異なりã?カンãƒ?,'が含まれてã�?�¦ã‚?OK としã?ãƒ??タからも取り除きませんã€?
028     *
029     * タイプチェãƒ?‚¯として、以下ã?条件を判定しますã?
030     * ・?�~9ã?マイナス(-)、小数点(.)およびカンãƒ?,)を許可
031     * ・æ–?­—å?の長さチェãƒ?‚¯
032     * ・小数点の位置チェãƒ?‚¯
033     * ・符号の位置チェãƒ?‚¯
034     * ・æ–?­—パラメータの 正規表現チェãƒ?‚¯
035     *
036     * @og.group ãƒ??タ属æ?
037     *
038     * @version  4.0
039     * @author       Kazuhiko Hasegawa
040     * @since    JDK5.0,
041     */
042    public class DBType_X9 extends AbstractDBType {
043            //* こã?プログラãƒ??VERSIONæ–?­—å?を設定しますã?       {@value} */
044            private static final String VERSION = "5.2.2.0 (2010/11/01)" ;
045    
046            /**
047             * 半角0文字ã?固定長でFILL埋めされた文字å?を返しますã?
048             * なおã?エラーチェãƒ?‚¯は行われませんã€?
049             * 実行前に、å¿?�š valueCheck( String value ,int len ) が行われるå¿?¦�がありますã?
050             *
051             * @og.rev 3.5.4.5 (2004/01/23) エンコード指定に変更しますã?
052             *
053             * @param       value    ?¦?©?¬?¬埋めするæ–?­—å?
054             * @param       sizeX    整数部åˆ??æ–?­—å?の長ã�?
055             * @param       sizeY    少数部åˆ??æ–?­—å?の長ã�?
056             * @param       encode   エンコード指å®?
057             *
058             * @return      ?¦?©?¬?¬埋めした新しいæ–?­—å?
059             */
060            @Override
061            public String valueFill( final String value ,final int sizeX ,final int sizeY,final String encode ) {
062                    int len = (sizeY == 0) ? sizeX : sizeX + sizeY + 1;
063    
064                    // 注æ„?マイナス記号の処ç�?�Œまã�?�§すã?
065                    return StringUtil.intFill( value,len );
066            }
067    
068            /**
069             * String引数のæ–?­—å?を+1した文字å?を返しますã?
070             * これは、文字型数字タイプã?場合ã?, マイナス、カンマã?ピリオドを避けてã€?
071             * +1 しますã?(桁上がりもあり)
072             * ãƒ??タの値がã?マイナスの場合ã?、結果çš?�«マイナスしてã�?��ますã?
073             * カンマ編é›?12,345,678 など)があるå?合に、桁上がりしてもã?カンマã?追åŠ?�•れませんã€?
074             * マイナス時ã?桁上がりには、対応してã�?�¾すã?
075             * 引数ã�?null の場合と、ゼロæ–?­—å?("")の場合ã?,物ç�?š„初期設定å?(String getDefault())
076             * の値を返しますã?
077             *
078             * @param       value   String引数のæ–?­—å?
079             *
080             * @return      String引数のæ–?­—å?を+1した文字å?
081             */
082            @Override
083            public String valueAdd( final String value ) {
084                    if( value == null || value.length() == 0 ) { return getDefault(); }
085                    char[] chs = value.toCharArray() ;
086                    boolean over = false;
087                    for( int i=chs.length-1; i>=0; i-- ) {
088                            if( chs[i] == '-' || chs[i] == '.' || chs[i] == ',' ) { continue; }
089                            if( chs[i] == '9' ) { chs[i] = '0'; over = true; }
090                            else { chs[i]++; over = false; break; }
091                    }
092                    if( over ) {
093                            char[] chs2 = new char[ chs.length + 1 ];
094                            System.arraycopy( chs,0,chs2,1,chs.length );
095                            if( chs[0] == '-' ) {
096                                    chs2[0] = '-';
097                                    chs2[1] = '1';
098                            }
099                            else {
100                                    chs2[0] = '1';
101                            }
102                            chs = chs2;
103                    }
104                    return new String( chs );
105            }
106    
107            /**
108             * エãƒ?‚£ターで編é›?�•れたãƒ??タを登録する場合に、データそã?もã?ã‚?
109             * 変換して、実登録ãƒ??タを作æ?しますã?
110             * 例えば,大æ–?­—ã?みのフィールドならã?大æ–?­—化しますã?
111             * 実登録ãƒ??タの作æ?は、DBType オブジェクトを利用しますã?で,
112             * これと Editor とがアンマッチã?場合ã?、うまくデータ変換
113             * されなã�?�¯能性がありますã?で、注意願いますã?
114             *
115             * @og.rev 3.3.3.0 (2003/07/09) 前後ã?スペã?スを取り除ã�?�¦おくã€?
116             * @og.rev 3.3.3.1 (2003/07/18) 後ろスペã?スを取り除くã?(StringUtil#rTrim)
117             *
118             * @param       value   (ä¸?ˆ¬に編é›?ƒ‡ータとして登録されたデータ)
119             *
120             * @return      修正後ã?æ–?­—å?(ä¸?ˆ¬にãƒ??タベã?スに登録するãƒ??タ)
121             */
122            @Override
123            public String valueSet( final String value ) {
124                    return StringUtil.rTrim( value ) ;
125            }
126    
127            /**
128             * ãƒ??タが登録可能かどã�?�‹をチェãƒ?‚¯しますã?
129             * ãƒ??タがエラーの場合ã?、そのエラーå†?®¹を返しますã?
130             * 許可するæ–?­—ã?ã€?-9 の数字ã?マイナス(-) 、小数点(.)ですã?
131             * 小数点の位置チェãƒ?‚¯は行いませんã€?
132             *
133             * @og.rev 2.3.1.4 (2003/02/18) 属æ?チェãƒ?‚¯を強化したã?
134             * @og.rev 3.6.0.0 (2004/09/22) チェãƒ?‚¯é ?›®は、数字を許可するæ–?­—å?とするã€?
135             * @og.rev 3.6.0.0 (2004/09/22) dbType パラメータを引数に追åŠ?
136             * @og.rev 5.2.2.0 (2010/11/01) 厳å¯?�«チェãƒ?‚¯(isStrict=true)するフラグを追åŠ?
137             *
138             * @param   key         キー
139             * @param   value       値
140             * @param   sizeX       整数部åˆ??æ–?­—å?の長ã�?
141             * @param   sizeY       少数部åˆ??æ–?­—å?の長ã�?
142             * @param   typeParam   dbType パラメータ
143             * @param   isStrict    厳å¯?�«チェãƒ?‚¯するかどã�?�‹[true:する/false:標準的]
144             *
145             * @return  エラーå†?®¹
146             */
147    //      public ErrorMessage valueCheck( final String key ,final String value ,
148    //                                                                      final int sizeX ,final int sizeY ,final String param ) {
149            @Override
150            public ErrorMessage valueCheck( final String key ,final String value ,
151                                                                            final int sizeX ,final int sizeY ,final String typeParam ,final boolean isStrict) {
152    
153                    ErrorMessage msg = new ErrorMessage();
154                    if( value == null || value.length() == 0 ) { return msg; }
155    
156                    // チェãƒ?‚¯用のvalue を用意しますã?カンãƒ?,)を取り除ã�?�¦おく為ですã?
157                    String tmpValue = StringUtil.deleteChar(value,',' );
158                    String check;
159    
160                    // 3.6.0.0 (2004/09/22) チェãƒ?‚¯å†?®¹変更
161                    check = DBTypeCheckUtil.decimalFormatCheck( tmpValue );
162                    if( check != null ) {
163                            // æŒ?®šã?æ–?­—以外ã?æ–?­—が使われてã�?�¾すã?
164                            msg.addMessage( 0,ErrorMessage.NG,"ERR0009", key,check );
165                    }
166    
167                    check = DBTypeCheckUtil.decimalCodeCheck( tmpValue );
168                    if( check != null ) {
169                            // 符号の位置が不正ですã?
170                            msg.addMessage( 0, ErrorMessage.NG, "ERR0023", key, check );
171                    }
172    
173                    // 3.6.0.0 (2004/09/22) 追åŠ?
174                    check = DBTypeCheckUtil.decimalPointCheck( tmpValue );
175                    if( check != null ) {
176                            // 小数点の位置が不正ですã?
177                            msg.addMessage( 0, ErrorMessage.NG, "ERR0024", key, check );
178                    }
179    
180                    // 3.6.0.0 (2004/09/22) dbType パラメータを使用したマッチチェãƒ?‚¯
181                    check = DBTypeCheckUtil.matcheCheck( tmpValue,typeParam );
182                    if( check != null ) {
183                            // æŒ?®šã?æ–?­—以外ã?æ–?­—が使われてã�?�¾すã?
184                            msg.addMessage( 0,ErrorMessage.NG,"ERR0009", key,check );
185                    }
186    
187                    return msg;
188            }
189    }