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.Locale; 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; 024 025/** 026 * 今までのカラム属性は昔からのルールに従っているため、 027 * 品番情報の文字列を扱う為のカラム属性を新たに定義します。 028 * 029 * 品番で使用可能な文字化どうか(例えばI等)は考慮しません。 030 * 031 * タイプチェックとして、以下の条件を判定します。 032 * ・文字列長は、Byte換算での文字数との比較 033 * ・文字列チェックはXUと同じ 034 * ・文字パラメータの 正規表現チェック 035 * ・クロスサイトスクリプティングチェック 036 * 037 * ハイフンは、 038 * ・入力文字数が13または14桁 039 * ・4桁目&10桁目が"-" 040 * ・他にハイフンがない 041 * を全て満たした場合に削除を行います。 042 * 043 * @og.group データ属性 044 * 045 * @version 5.0 046 * @author Takahashi Masakazu 047 * @since JDK5.0, 048 */ 049public class DBType_PN2 extends AbstractDBType { 050 //* このプログラムのVERSION文字列を設定します。 {@value} */ 051 private static final String VERSION = "6.4.3.2 (2016/02/19)" ; 052 053 /** 054 * デフォルトコンストラクター 055 * 056 * @og.rev 6.4.3.2 (2016/02/19) PMD refactoring. Each class should declare at least one constructor. 057 */ 058 public DBType_PN2() { super(); } // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。 059 060 /** 061 * エディターで編集されたデータを登録する場合に、データそのものを 062 * 変換して、実登録データを作成します。 063 * データの表示用文字列を返します。 064 * 特定の条件の場合、XXX-XXXXX-XXX 形式で入力された情報を、XXXXXXXXXXX 形式で表示します。 065 * カット&ペースト対策です。 066 * ※入力文字数が12または13桁 067 * かつ、4桁目&10桁目が"-" 068 * かつ、他にハイフンがない 069 * 場合にハイフンの削除を行います。 070 * 071 * @og.rev 6.4.3.1 (2016/02/12) newValの求め方が、おかしい。 072 * @og.rev 5.9.7.1 (2016/04/06) スペースは前後を取るようにする 073 * 074 * @param value (一般に編集データとして登録されたデータ) 075 * 076 * @return 修正後の文字列(一般にデータベースに登録するデータ) 077 */ 078 @Override 079 public String valueSet( final String value ) { 080 081 String newVal = value; 082 if( newVal != null ) { 083 newVal = newVal.trim().toUpperCase(Locale.JAPAN); 084 if( ( newVal.length()==12 || newVal.length()==13 ) 085 && newVal.indexOf( '-' ) == 3 086 && newVal.lastIndexOf( '-' ) == 9 087 && newVal.indexOf( '-' , 4 ) == 9 ) { 088 newVal = StringUtil.replace( newVal,"-","" ); 089 } 090 } 091 092 return newVal; 093 094 } 095 096 /** 097 * データが登録可能かどうかをチェックします。 098 * データがエラーの場合は、そのエラー内容を返します。 099 * 100 * @param key キー 101 * @param value 値 102 * @param sizeX 整数部分の文字列の長さ 103 * @param sizeY 少数部分の文字列の長さ 104 * @param typeParam dbType パラメータ(文字パラメータ) 105 * @param isStrict 厳密にチェックするかどうか[true:する/false:標準的] 106 * 107 * @return エラー内容 108 */ 109 @Override 110 public ErrorMessage valueCheck( final String key ,final String value , 111 final int sizeX ,final int sizeY ,final String typeParam ,final boolean isStrict) { 112 113 ErrorMessage msg = new ErrorMessage(); 114 if( value == null || value.length() == 0 ) { return msg; } 115 116 final int len = (sizeY == 0) ? sizeX : sizeX + sizeY + 1; 117 if( value.length() > len ) { 118 // 文字列の長さが指定の長さよりも長いです。 119 msg.addMessage( 0,ErrorMessage.NG,"ERR0006", key,value, String.valueOf( value.length() ), String.valueOf( len ) ); 120 } 121 122 final StringBuilder buf = new StringBuilder( BUFFER_MIDDLE ); 123 boolean isError = false; 124 for( int i=0; i<value.length(); i++ ) { 125 final char ch = value.charAt( i ); 126 if( ch < 0x20 || ch > 0x7e || ( 'a' <= ch && ch <= 'z' ) ) { 127 buf.append( "<span class=\"NG\">" ).append( ch ).append( "</span>" ); 128 isError = true; 129 } 130 else { 131 buf.append( ch ); 132 } 133 } 134 if( isError ) { 135 // 指定の文字以外の文字が使われています。 136 msg.addMessage( 0,ErrorMessage.NG,"ERR0009", key,buf.toString() ); 137 } 138 139 // 3.6.0.0 (2004/09/22) dbType パラメータ(文字パラメータ)を使用したマッチチェック 140 final String check = DBTypeCheckUtil.matcheCheck( value,typeParam ); 141 if( check != null ) { 142 // 指定の文字以外の文字が使われています。 143 msg.addMessage( 0,ErrorMessage.NG,"ERR0009", key,check ); 144 } 145 146 // クロスサイトスクリプティング対策:'<', '>' は登録させない。 147 msg = xssCheck( key ,value, msg ); 148 return msg; 149 } 150}