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 org.opengion.fukurou.util.ErrorMessage;
019import org.opengion.fukurou.util.StringUtil;
020import org.opengion.hayabusa.db.AbstractDBType;
021import org.opengion.hayabusa.db.DBTypeCheckUtil;
022
023import java.util.Locale ;
024
025/**
026 * 半角大文字の英数字の文字列を扱う為の、カラム属性を定義します。
027 *
028 * 入力文字列は、trim された後、大文字化(toUpperCase)された後、タイプチェックされます。
029 * 半角カタカナは半角大文字に分類されない為、対象外(使用できない)です。
030 *
031 * タイプチェックとして、以下の条件を判定します。
032 * ・文字列長は、Byte換算での文字数との比較
033 * ・半角大文字チェック「c < 0x20 || c > 0x7e || ( 'a' <= c && c <= 'z' )以外」エラー
034 * ・文字パラメータの 正規表現チェック
035 * ・クロスサイトスクリプティングチェック
036 *
037 * @og.group データ属性
038 *
039 * @version  4.0
040 * @author   Kazuhiko Hasegawa
041 * @since    JDK5.0,
042 */
043public class DBType_XU extends AbstractDBType {
044        /** このプログラムのVERSION文字列を設定します。   {@value} */
045        private static final String VERSION = "6.4.2.0 (2016/01/29)" ;
046
047        /**
048         * デフォルトコンストラクター
049         *
050         * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor.
051         */
052        public DBType_XU() { super(); }         // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
053
054        /**
055         * 半角0文字の固定長でFILL埋めされた文字列を返します。
056         * なお、エラーチェックは行われません。
057         * 実行前に、必ず valueCheck( String value ,int len ) が行われる必要があります。
058         *
059         * @og.rev 3.5.4.5 (2004/01/23) エンコード指定に変更します。
060         *
061         * @param   value    FILL埋めする文字列
062         * @param   sizeX    整数部分の文字列の長さ
063         * @param   sizeY    小数部分の文字列の長さ
064         * @param   encode   固定長で変換する文字エンコード
065         *
066         * @return  FILL埋めした新しい文字列
067         */
068        @Override
069        public String valueFill( final String value ,final int sizeX ,final int sizeY,final String encode ) {
070                final int len = (sizeY == 0) ? sizeX : sizeX + sizeY + 1;
071
072                return StringUtil.stringXFill( value,len );
073        }
074
075        /**
076         * エディターで編集されたデータを登録する場合に、データそのものを
077         * 変換して、実登録データを作成します。
078         * 例えば,大文字のみのフィールドなら、大文字化します。
079         * 実登録データの作成は、DBType オブジェクトを利用しますので,
080         * これと Editor とがアンマッチの場合は、うまくデータ変換
081         * されない可能性がありますので、注意願います。
082         *
083         * @og.rev 3.3.3.0 (2003/07/09) 前後のスペースを取り除いておく。
084         * @og.rev 3.3.3.1 (2003/07/18) 後ろスペースを取り除く。(StringUtil#rTrim)
085         *
086         * @param       value   (一般に編集データとして登録されたデータ)
087         *
088         * @return  修正後の文字列(一般にデータベースに登録するデータ)
089         */
090        @Override
091        public String valueSet( final String value ) {
092                // 6.4.1.1 (2016/01/16) PMD refactoring. Avoid if (x != y) ..; else ..;
093                return value == null ? null : StringUtil.rTrim( value ).toUpperCase(Locale.JAPAN) ;
094        }
095
096        /**
097         * データが登録可能かどうかをチェックします。
098         * データがエラーの場合は、そのエラー内容を返します。
099         *
100         * @og.rev 3.6.0.0 (2004/09/22) dbType パラメータ(文字パラメータ)を引数に追加
101         * @og.rev 5.2.2.0 (2010/11/01) 厳密にチェック(isStrict=true)するフラグを追加
102         *
103         * @param   key         キー
104         * @param   value       値
105         * @param   sizeX       整数部分の文字列の長さ
106         * @param   sizeY       小数部分の文字列の長さ
107         * @param   typeParam   dbType パラメータ(文字パラメータ)
108         * @param   isStrict    厳密にチェックするかどうか[true:する/false:標準的]
109         *
110         * @return  エラー内容
111         * @og.rtnNotNull
112         */
113        @Override
114        public ErrorMessage valueCheck( final String key ,final String value ,
115                                                                        final int sizeX ,final int sizeY ,final String typeParam ,final boolean isStrict) {
116
117                // 6.3.9.1 (2015/11/27) Found 'DD'-anomaly for variable(PMD)
118                final ErrorMessage msg = new ErrorMessage();
119                if( value == null || value.isEmpty() ) { return msg; }
120
121                final int len = (sizeY == 0) ? sizeX : sizeX + sizeY + 1;
122                if( value.length() > len ) {
123                        // 文字列の長さが指定の長さよりも長いです。
124                        msg.addMessage( 0,ErrorMessage.NG,"ERR0006", key,value, String.valueOf( value.length() ), String.valueOf( len ) );
125                }
126
127                final StringBuilder buf = new StringBuilder( BUFFER_MIDDLE );
128                boolean isError = false;
129                for( int i=0; i<value.length(); i++ ) {
130                        final char ch = value.charAt( i );
131                        if( ch < 0x20 || ch > 0x7e || 'a' <= ch && ch <= 'z' ) {                                                // 6.9.7.0 (2018/05/14) PMD Useless parentheses.
132                                buf.append( "<span class=\"NG\">" ).append( ch ).append( "</span>" );
133                                isError = true;
134                        }
135                        else {
136                                buf.append( ch );
137                        }
138                }
139                if( isError ) {
140                        // 指定の文字以外の文字が使われています。
141                        msg.addMessage( 0,ErrorMessage.NG,"ERR0009", key,buf.toString() );
142                }
143
144                // 3.6.0.0 (2004/09/22) dbType パラメータ(文字パラメータ)を使用したマッチチェック
145                final String check = DBTypeCheckUtil.matcheCheck( value,typeParam );
146                if( check != null ) {
147                        // 指定の文字以外の文字が使われています。
148                        msg.addMessage( 0,ErrorMessage.NG,"ERR0009", key,check );
149                }
150
151                // クロスサイトスクリプティング対策:'<', '>' は登録させない。
152                // 6.3.9.1 (2015/11/27) Found 'DD'-anomaly for variable(PMD)
153                return xssCheck( key ,value, msg );
154        }
155}