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}