    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 = "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         * 半角０文字の固定長でFILL埋めされた文字列を返します。
    067         * なお、エラーチェックは行われません。
    068         * 実行前に、必ず valueCheck( String value ,int len ) が行われる必要があります。
    069         *
    070         * @param       value    ＦＩＬＬ埋めする文字列
    071         * @param       sizeX    整数部分の文字列の長さ
    072         * @param       sizeY    小数部分の文字列の長さ
    073         * @param       encode   エンコード指定
    074         *
    075         * @return      ＦＩＬＬ埋めした新しい文字列
    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引数の文字列を＋１した文字列を返します。
    084         * これは、英字の場合(A,B,C など)は、B,C,D のように,最終桁の文字コードを
    085         * ＋１ します。
    086         * 文字列が数字タイプの場合は, 数字に変換して、+1 します。(桁上がりもあり)
    087         * 混在タイプの場合は,最後の桁だけを確認して ＋１します。
    088         * 引数が null の場合と、ゼロ文字列("")の場合は,物理的初期設定値(String getDefault())
    089         * の値を返します。
    090         *
    091         * @param       value   String引数の文字列
    092         *
    093         * @return      String引数の文字列を＋１した文字列
    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}