    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 のエスケープ記号(&amp;#xZZZZ;)に変換する、カラム属性を定義します。
    023 *
    024 * SJIS(JA16SJIS) で作成されたデータベースに、(NVARCHAR2)を使用して中国語等を登録するのは
    025 * 非常に複雑でかつ、リスクが大きい処理になります。
    026 * ORACLE殿でも、自信を持っては勧められない機能とのコメントを頂いています。
    027 * そこで、HTMLでのエスケープ文字を使用して、Unicodeを文字列化して登録する為の
    028 * DBType として、新規に作成します。
    029 * ここでは、入力文字を、キャラクタ(char)型に分解し、(&amp;#xZZZZ;)に変換していきます。
    030 * よって、通常に１文字(Shift-JISで２Byte,UTF-8で３Byte)が、８Byteになります。
    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のエスケープ記号(&amp;#xZZZZ;)に変換後に実施されます。
    041 * データベースへの登録には、半角英数字になります。
    042 * ・文字列長は、Byte換算での文字数との比較
    043 * ・半角文字列チェック「 c &lt; 0x20 || c &gt; 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 = "4.0.0.0 (2005/08/31)" ;
    057
    058        /**
    059         * 半角０文字の固定長でFILL埋めされた文字列を返します。
    060         * なお、エラーチェックは行われません。
    061         * 実行前に、必ず valueCheck( String value ,int len ) が行われる必要があります。
    062         *
    063         * @param       value    ＦＩＬＬ埋めする文字列
    064         * @param       sizeX    整数部分の文字列の長さ
    065         * @param       sizeY    少数部分の文字列の長さ
    066         * @param       encode   エンコード指定
    067         *
    068         * @return      ＦＩＬＬ埋めした新しい文字列
    069         */
    070        @Override
    071        public String valueFill( final String value ,final int sizeX ,final int sizeY,final String encode ) {
    072                return valueSet( super.valueFill( value,sizeX,sizeY,encode ) );
    073        }
    074
    075        /**
    076         * String引数の文字列を＋１した文字列を返します。
    077         * これは、英字の場合(A,B,C など)は、B,C,D のように,最終桁の文字コードを
    078         * ＋１ します。
    079         * 文字列が数字タイプの場合は, 数字に変換して、+1 します。(桁上がりもあり)
    080         * 混在タイプの場合は,最後の桁だけを確認して ＋１します。
    081         * 引数が null の場合と、ゼロ文字列("")の場合は,物理的初期設定値(String getDefault())
    082         * の値を返します。
    083         *
    084         * @param       value   String引数の文字列
    085         *
    086         * @return      String引数の文字列を＋１した文字列
    087         */
    088        @Override
    089        public String valueAdd( final String value ) {
    090                return valueSet( super.valueAdd( value ) );
    091        }
    092
    093        /**
    094         * エディターで編集されたデータを登録する場合に、データそのものを
    095         * 変換して、実登録データを作成します。
    096         * 例えば,大文字のみのフィールドなら、大文字化します。
    097         * 実登録データの作成は、DBType オブジェクトを利用しますので,
    098         * これと Editor とがアンマッチの場合は、うまくデータ変換
    099         * されない可能性がありますので、注意願います。
    100         *
    101         * @param       value   (一般に編集データとして登録されたデータ)
    102         *
    103         * @return      修正後の文字列(一般にデータベースに登録するデータ)
    104         */
    105        @Override
    106        public String valueSet( final String value ) {
    107                return StringUtil.getUnicodeEscape( value );
    108        }
    109}