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.StringUtil; 019import org.opengion.hayabusa.db.AbstractDBType; 020 021/** 022 * Unicode文字列の値を HTML のエスケープ記号(&#xZZZZ;)に変換する、カラム属性を定義します。 023 * 024 * SJIS(JA16SJIS) で作成されたデータベースに、(NVARCHAR2)を使用して中国語等を登録するのは 025 * 非常に複雑でかつ、リスクが大きい処理になります。 026 * ORACLE殿でも、自信を持っては勧められない機能とのコメントを頂いています。 027 * そこで、HTMLでのエスケープ文字を使用して、Unicodeを文字列化して登録する為の 028 * DBType として、新規に作成します。 029 * ここでは、入力文字を、キャラクタ(char)型に分解し、(&#xZZZZ;)に変換していきます。 030 * よって、通常に1文字(Shift-JISで2Byte,UTF-8で3Byte)が、8Byteになります。 031 * この変換された文字列を、HTML上でそのまま取り出すと、元のUnicode文字に戻る為、 032 * 通常のShift-JISでは、扱えない文字(中国語など)でも表示可能になります。 033 * 034 * (NVARCHAR2)を使用して中国語等を登録する場合の文字コード変換 035 * 036 * APレイヤ ネットレイヤ DBレイヤ 037 * 文字入力 → 全てDBのCHARセットに変換 → NCHARの分だけUTFに変換 038 * (UTF) (S-jis) (UTF) 039 * 040 * タイプチェックは、HTMLのエスケープ記号(&#xZZZZ;)に変換後に実施されます。 041 * データベースへの登録には、半角英数字になります。 042 * ・文字列長は、Byte換算での文字数との比較 043 * ・半角文字列チェック「 c < 0x20 || c > 0x7e 以外」エラー 044 * ・文字パラメータの 正規表現チェック 045 * ・クロスサイトスクリプティングチェック 046 * 047 * @og.rev 3.8.0.0 (2005/06/07) 新規作成 048 * @og.group データ属性 049 * 050 * @version 4.0 051 * @author Kazuhiko Hasegawa 052 * @since JDK5.0, 053 */ 054public class DBType_NVAR extends AbstractDBType { 055 /** このプログラムのVERSION文字列を設定します。 {@value} */ 056 private static final String VERSION = "6.4.2.0 (2016/01/29)" ; 057 058 /** 059 * デフォルトコンストラクター 060 * 061 * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor. 062 */ 063 public DBType_NVAR() { super(); } // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。 064 065 /** 066 * 半角0文字の固定長でFILL埋めされた文字列を返します。 067 * なお、エラーチェックは行われません。 068 * 実行前に、必ず valueCheck( String value ,int len ) が行われる必要があります。 069 * 070 * @param value FILL埋めする文字列 071 * @param sizeX 整数部分の文字列の長さ 072 * @param sizeY 小数部分の文字列の長さ 073 * @param encode エンコード指定 074 * 075 * @return FILL埋めした新しい文字列 076 */ 077 @Override 078 public String valueFill( final String value ,final int sizeX ,final int sizeY,final String encode ) { 079 return valueSet( super.valueFill( value,sizeX,sizeY,encode ) ); 080 } 081 082 /** 083 * String引数の文字列を+1した文字列を返します。 084 * これは、英字の場合(A,B,C など)は、B,C,D のように,最終桁の文字コードを 085 * +1 します。 086 * 文字列が数字タイプの場合は, 数字に変換して、+1 します。(桁上がりもあり) 087 * 混在タイプの場合は,最後の桁だけを確認して +1します。 088 * 引数が null の場合と、ゼロ文字列("")の場合は,物理的初期設定値(String getDefault()) 089 * の値を返します。 090 * 091 * @param value String引数の文字列 092 * 093 * @return String引数の文字列を+1した文字列 094 */ 095 @Override 096 public String valueAdd( final String value ) { 097 return valueSet( super.valueAdd( value ) ); 098 } 099 100 /** 101 * エディターで編集されたデータを登録する場合に、データそのものを 102 * 変換して、実登録データを作成します。 103 * 例えば,大文字のみのフィールドなら、大文字化します。 104 * 実登録データの作成は、DBType オブジェクトを利用しますので, 105 * これと Editor とがアンマッチの場合は、うまくデータ変換 106 * されない可能性がありますので、注意願います。 107 * 108 * @param value (一般に編集データとして登録されたデータ) 109 * 110 * @return 修正後の文字列(一般にデータベースに登録するデータ) 111 */ 112 @Override 113 public String valueSet( final String value ) { 114 return StringUtil.getUnicodeEscape( value ); 115 } 116}