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 = "4.0.0.0 (2005/08/31)" ;
057
058        /**
059         * 半角0文字の固定長でFILL埋めされた文字列を返します。
060         * なお、エラーチェックは行われません。
061         * 実行前に、必ず valueCheck( String value ,int len ) が行われる必要があります。
062         *
063         * @param       value    FILL埋めする文字列
064         * @param       sizeX    整数部分の文字列の長さ
065         * @param       sizeY    少数部分の文字列の長さ
066         * @param       encode   エンコード指定
067         *
068         * @return      FILL埋めした新しい文字列
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引数の文字列を+1した文字列を返します。
077         * これは、英字の場合(A,B,C など)は、B,C,D のように,最終桁の文字コードを
078         * +1 します。
079         * 文字列が数字タイプの場合は, 数字に変換して、+1 します。(桁上がりもあり)
080         * 混在タイプの場合は,最後の桁だけを確認して +1します。
081         * 引数が null の場合と、ゼロ文字列("")の場合は,物理的初期設定値(String getDefault())
082         * の値を返します。
083         *
084         * @param       value   String引数の文字列
085         *
086         * @return      String引数の文字列を+1した文字列
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}