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.fukurou.util.KanaFilter;
021    import org.opengion.hayabusa.db.AbstractDBType;
022    import org.opengion.hayabusa.db.DBTypeCheckUtil;
023    
024    /**
025     * 半è§?全角混在のクラスですが、半角カタカナã?みをé?さなã�?–‡字å?を扱ã�?‚ºの、カラãƒ?±žæ?を定義しますã?
026     *
027     * 半角カタカナã?定義は、\uFF61 から \uFF9F までですã?
028     * 半角カタカナを入力すると、å?角カタカナに変換して、登録してã�?�¾すã?
029     * こã?変換処ç�?�«、KanaFilter#han2zen を使用してã�?�¾すã?これはã€?
030     * 『CJKV日中韓越情報処ç�??のフィルターアルゴリズãƒ?�§濁点ã‚?�Š濁点の正しい処ç�?‚‚含まれてã�?�¾すã?
031     *
032     * タイプチェãƒ?‚¯として、以下ã?条件を判定しますã?
033     * ・æ–?­—å?長は、Byte換算でのæ–?­—数との比è¼?
034     * ・半角文字+å?角カタカナチェãƒ?‚¯「c < 0x20 || ( c >= 0xff61 && c <= 0xff9f )以外ã?エラー
035     * ・æ–?­—パラメータの 正規表現チェãƒ?‚¯
036     * ・クロスサイトスクリプティングチェãƒ?‚¯
037     *
038     * @og.rev 3.4.0.0 (2003/09/01) 新規作æ?
039     * @og.group ãƒ??タ属æ?
040     *
041     * @version  4.0
042     * @author   Kazuhiko Hasegawa
043     * @since    JDK5.0,
044     */
045    public class DBType_XKZ extends AbstractDBType {
046            //* こã?プログラãƒ??VERSIONæ–?­—å?を設定しますã?       {@value} */
047            private static final String VERSION = "5.2.2.0 (2010/11/01)" ;
048    
049            /**
050             * エãƒ?‚£ターで編é›?�•れたãƒ??タを登録する場合に、データそã?もã?ã‚?
051             * 変換して、実登録ãƒ??タを作æ?しますã?
052             * 例えば,大æ–?­—ã?みのフィールドならã?大æ–?­—化しますã?
053             * 実登録ãƒ??タの作æ?は、DBType オブジェクトを利用しますã?で,
054             * これと Editor とがアンマッチã?場合ã?、うまくデータ変換
055             * されなã�?�¯能性がありますã?で、注意願いますã?
056             *
057             * @param       value   (ä¸?ˆ¬に編é›?ƒ‡ータとして登録されたデータ)
058             *
059             * @return  修正後ã?æ–?­—å?(ä¸?ˆ¬にãƒ??タベã?スに登録するãƒ??タ)
060             */
061            @Override
062            public String valueSet( final String value ) {
063                    if( value == null ) { return null; }
064                    return KanaFilter.han2zen( StringUtil.rTrim( value ) );
065            }
066    
067            /**
068             * ãƒ??タが登録可能かどã�?�‹をチェãƒ?‚¯しますã?
069             * ãƒ??タがエラーの場合ã?、そのエラーå†?®¹を返しますã?
070             *
071             * @og.rev 3.6.0.0 (2004/09/22) dbType パラメータを引数に追åŠ?
072             * @og.rev 5.2.2.0 (2010/11/01) 厳å¯?�«チェãƒ?‚¯(isStrict=true)するフラグを追åŠ?
073             *
074             * @param   key         キー
075             * @param   value       値
076             * @param   sizeX       整数部åˆ??æ–?­—å?の長ã�?
077             * @param   sizeY       少数部åˆ??æ–?­—å?の長ã�?
078             * @param   typeParam   dbType パラメータ
079             * @param   isStrict    厳å¯?�«チェãƒ?‚¯するかどã�?�‹[true:する/false:標準的]
080             *
081             * @return  エラーå†?®¹
082             */
083    //      public ErrorMessage valueCheck( final String key ,final String value ,
084    //                                                                      final int sizeX ,final int sizeY ,final String param ) {
085            @Override
086            public ErrorMessage valueCheck( final String key ,final String value ,
087                                                                            final int sizeX ,final int sizeY ,final String typeParam ,final boolean isStrict) {
088    
089                    ErrorMessage msg = new ErrorMessage();
090                    if( value == null || value.length() == 0 ) { return msg; }
091    
092                    int len = (sizeY == 0) ? sizeX : sizeX + sizeY + 1;
093                    String check = DBTypeCheckUtil.byteLengthCheck( value,len );
094                    if( check != null ) {
095                            // æ–?­—å?の長さがæŒ?®šã?長さよりも長ã�?�§すã?
096                            msg.addMessage( 0,ErrorMessage.NG,"ERR0006",key,value,check,String.valueOf( len ) );
097                    }
098    
099                    StringBuilder val = new StringBuilder();
100                    boolean isError = false;
101                    for( int i=0; i<value.length(); i++ ) {
102                            char ch = value.charAt( i );
103                            if( ch < 0x20 || ( ch >= 0xff61 && ch <= 0xff9f ) ) {
104                                    val.append( "<span class=\"NG\">" ).append( ch ).append( "</span>" );
105                                    isError = true;
106                            }
107                            else {
108                                    val.append( ch );
109                            }
110                    }
111                    if( isError ) {
112                            // æŒ?®šã?æ–?­—以外ã?æ–?­—が使われてã�?�¾すã?
113                            msg.addMessage( 0,ErrorMessage.NG,"ERR0009", key,val.toString() );
114                    }
115    
116                    // 3.6.0.0 (2004/09/22) dbType パラメータを使用したマッチチェãƒ?‚¯
117                    check = DBTypeCheckUtil.matcheCheck( value,typeParam );
118                    if( check != null ) {
119                            // æŒ?®šã?æ–?­—以外ã?æ–?­—が使われてã�?�¾すã?
120                            msg.addMessage( 0,ErrorMessage.NG,"ERR0009", key,check );
121                    }
122    
123                    // クロスサイトスクリプティング対策ï¼?<', '>' は登録させなã�??
124                    msg = xssCheck( key ,value, msg );
125    
126                    return msg;
127            }
128    }