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