    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.hayabusa.taglib;
    017
    018import org.opengion.hayabusa.common.HybsSystemException;
    019import org.opengion.fukurou.util.Attributes;
    020import org.opengion.fukurou.util.StringUtil;
    021
    022import static org.opengion.fukurou.util.StringUtil.nval ;
    023
    024/**
    025 * 検索結果の DBTableModelオブジェクトのカラム値を操作(設定、変換、ADDなど)するタグです。
    026 *
    027 * entry タグの子タグとして使用します。entryタグと、このcolumnSetタグの command
    028 * が同じ場合のみ、実行されます。
    029 * 処理方法は、action で指定します。
    030 *
    031 * @og.formSample
    032 * ●形式：&lt;og:entry command="…"&gt;
    033 *             &lt;og:setColumn
    034 *                 command   ="…"          : entryタグのcommandと一致する場合に実行
    035 *                 columnId  ="…"          : 処理を行うカラムＩＤを指定(必須,複数指定可)
    036 *                 action    ="…"          : 処理方法を指定
    037 *                 value     ="…"          : 設定する値を指定(action="TBLSET"のみ[カラム名]使用可能)
    038 *                 conditionKey  ="…"      : 条件判定するカラムＩＤを指定(初期値は columnId )
    039 *                 conditionList ="…"      : 条件判定する値のリストを、"|"で区切って登録(初期値は、無条件)
    040 *             /&gt;
    041 *         &lt;/og:entry&gt;
    042 * ●body：なし
    043 *
    044 * ●Tag定義：
    045 *   &lt;og:columnSet
    046 *       command            【TAG】コマンド(INSERT/COPY/MODIFY/DELETE/ENTRY/CHANGE/RESET/ALLRESET/ALLACTION/RESETDATA/INSERTONE/REALDELETE/REQENTRY)を設定します
    047 *       columnId         ○【TAG】カラムＩＤをセットします(複数指定時は、カンマ区切り文字で設定する)(必須)。
    048 *       value              【TAG】値をセットします
    049 *       action             【TAG】アクション(DEFAULT/CLEAR/ADD/SET/NULLSET/LOWER/UPPER/COPY/TBLSET//WRTCTRL/DBMENU/REQSET/SEQSET)をセットします
    050 *       conditionKey       【TAG】条件判定するカラムＩＤを指定します(初期値は columnId )
    051 *       conditionList      【TAG】条件判定する値のリストを、"|"で区切って登録します(初期値:無条件)
    052 *       caseKey            【TAG】このタグ自体を利用するかどうかの条件キーを指定します(初期値:null) 5.7.7.2 (2014/06/20)
    053 *       caseVal            【TAG】このタグ自体を利用するかどうかの条件値を指定します(初期値:null) 5.7.7.2 (2014/06/20)
    054 *       caseNN             【TAG】指定の値が、null/ゼロ文字列 でない場合(Not Null=NN)は、このタグは使用されます(初期値:true) 5.7.7.2 (2014/06/20)
    055 *       caseNull           【TAG】指定の値が、null/ゼロ文字列 の場合は、このタグは使用されます(初期値:true) 5.7.7.2 (2014/06/20)
    056 *       debug              【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
    057 *   /&gt;
    058 *
    059 * ●使用例
    060 *    &lt;og:entry command="{&#064;command}"  &gt;
    061 *        &lt;og:columnSet command="{&#064;command}" columnId="ECNO"   action="CLEAR" /&gt;
    062 *        &lt;og:columnSet command="{&#064;command}" columnId="JYOKYO" action="SET" value="1" /&gt;
    063 *    &lt;/og:entry&gt;
    064 *
    065 *    &lt;og:entry command="MODIFY" rows="1" &gt;
    066 *        &lt;og:columnSet command="MODIFY" columnId="key" action="TBLSET" value ="[key][lang]"/&gt;
    067 *    &lt;/og:entry&gt;
    068 *
    069 *    command属性 は、entryタグのcommand属性と同一の場合のみ、処理します。
    070 *    [command属性]
    071 *      INSERT     新規
    072 *      COPY       複写
    073 *      MODIFY     変更
    074 *      DELETE     削除
    075 *      ENTRY      エントリー
    076 *      CHANGE     チェンジ
    077 *      RESET      リセット
    078 *      ALLRESET   全件リセット
    079 *      ALLACTION  オールアクション
    080 *      RESETDATA  リセットデータ
    081 *      INSERTONE  新規(1行のみ)
    082 *      REALDELETE 物理削除
    083 *      REQENTRY   リクエスト変数設定
    084 *
    085 *    [action属性]
    086 *      DEFAULT カラムリソースで定義した初期値をセットします。
    087 *      CLEAR   値をクリア(ゼロストリング &quot;&quot; )します。
    088 *      ADD     現在の値を ＋１ します。  0 ⇒ 1 , A ⇒ B , 9 ⇒ 10。value属性と併用すれば、指定の値を加算できます。
    089 *      SET     value で設定した値を 新しい値として登録します。
    090 *      NULLSET 元の値が NULL の場合だけ、value で設定した新しい値を登録します。
    091 *      LOWER   小文字に変換します。
    092 *      UPPER   大文字に変換します。
    093 *      COPY    value にコピー元のカラムIDをセットすれば、その値を代入します。
    094 *      TBLSET  DBTableModel の内容を取り込んで指定の columnId カラムに設定します。
    095 *              [カラム名] で指定できます。
    096 *              また、これは文字列を解析して、 value を作成しますので,文字列連結等に使用できます。
    097 *      WRTCTRL writableControl を使用したカラムデータの先頭アンダーバーを削除します。
    098 *      DBMENU  DBMENUでパラメータ設定(コロン連結文字)を使用したカラムデータの先頭データのみにします。
    099 *      REQSET  valueで指定したカラムの値をキーに、リクエスト変数から値を取出し、セットします。
    100 *      SEQSET  valueの初期値を利用して、１レコードごとに、＋１した値をセットします。
    101 *      PREFIX  valueの値を後ろから検索し、指定のカラム値の前半部分を取得します(記号は含みません)。
    102 *      SUFIX   valueの値を後ろから検索し、指定のカラム値の後半部分を取得します(記号は含みません)。
    103 *      その他  カラムのDBType の valueAction メソッドを呼び出します。自由に設定可能です。
    104 *
    105 * @og.group 画面登録
    106 *
    107 * @version  4.0
    108 * @author       Kazuhiko Hasegawa
    109 * @since    JDK5.0,
    110 */
    111public class ColumnSetTag extends CommonTagSupport {
    112        //* このプログラムのVERSION文字列を設定します。   {@value} */
    113        private static final String VERSION = "5.7.7.2 (2014/06/20)" ;
    114
    115        private static final long serialVersionUID = 577220140620L ;
    116
    117        private String columnId         = null;
    118        private String conditionKey = null;
    119
    120        /**
    121         * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。
    122         *
    123         * @og.rev 3.6.0.6 (2004/10/22) columnNo に伴なう削除
    124         * @og.rev 5.7.7.2 (2014/06/20) caseKey,caseVal,caseNN,caseNull 属性を追加
    125         *
    126         * @return      後続処理の指示(SKIP_BODY)
    127         */
    128        @Override
    129        public int doStartTag() {
    130                // 5.7.7.2 (2014/06/20) caseKey,caseVal,caseNN,caseNull 属性を追加
    131                if( useTag() ) {
    132                        EntryTag entry = (EntryTag)findAncestorWithClass( this,EntryTag.class );
    133                        if( entry == null ) {
    134                                String errMsg = "<b>" + getTagName() + "タグは、EntryTag のBODY部に記述される必要があります。</b>";
    135                                throw new HybsSystemException( errMsg );
    136                        }
    137
    138                        Attributes standardAttri = getAttributes();
    139                        String[] clms = StringUtil.csv2Array( columnId );
    140                        for( int i=0; i<clms.length; i++ ) {
    141                                Attributes attri = new Attributes( standardAttri );
    142                                attri.set( "columnId", clms[i] );
    143                                // conditionKey が null の場合は、columnId が設定される。
    144                                attri.set( "conditionKey", nval( conditionKey,clms[i] ) );
    145                                entry.setAttributes( attri );
    146                        }
    147                }
    148
    149                return SKIP_BODY ;
    150        }
    151
    152        /**
    153         * タグリブオブジェクトをリリースします。
    154         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
    155         *
    156         * @og.rev 2.0.0.4 (2002/09/27) カスタムタグの release() メソッドを、追加
    157         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。
    158         * @og.rev 3.6.0.6 (2004/10/22) columnNo に伴なう変更
    159         *
    160         */
    161        @Override
    162        protected void release2() {
    163                super.release2();
    164                columnId         = null;
    165                conditionKey = null;
    166        }
    167
    168        /**
    169         * 【TAG】コマンド(INSERT,COPY,MODIFY,DELETE,ENTRY,CHANGE,RESET,ALLACTION)を設定します。
    170         *
    171         * @og.tag
    172         * 上位の EntryTag のコマンドと一致した場合のみ、処理されます。
    173         * ここでは、コマンド文字列の整合性チェックは行っていません。
    174         *
    175         * @param       command コマンド
    176         * @see         <a href="../../../../constant-values.html#org.opengion.hayabusa.taglib.EntryTag.CMD_INSERT">コマンド定数</a>
    177         */
    178        public void setCommand( final String command ) {
    179                set( "command",getRequestParameter( command ) );
    180        }
    181
    182        /**
    183         * 【TAG】値をセットします。
    184         *
    185         * @og.tag
    186         * 設定する値をセットします。
    187         *
    188         * @param       value 値
    189         */
    190        public void setValue( final String value ) {
    191                set( "value",getRequestParameter( value ) );
    192        }
    193
    194        /**
    195         * 【TAG】アクション(DEFAULT/CREAR/ADD/SET/NULLSET/LOWER/UPPER/COPY/TBLSET/WRTCTRL/DBMENU/REQSET/SEQSET/PREFIX/SUFIX)をセットします。
    196         *
    197         * @og.tag
    198         * ここでは、アクション文字列の整合性チェックを行っておりません。
    199         *
    200         * DEFAULT カラムリソースで定義した初期値をセットします。
    201         * CREAR   値をクリア(ゼロストリング &quot;&quot; )します。
    202         * ADD     現在の値を ＋１ します。  0 ⇒ 1 , A ⇒ B , 9 ⇒ 10。value属性と併用すれば、指定の値を加算できます。
    203         * SET     value で設定した値を 新しい値として登録します。
    204         * NULLSET 元の値が NULL の場合だけ、value で設定した新しい値を登録します。
    205         * LOWER   小文字に変換します。
    206         * UPPER   大文字に変換します。
    207         * COPY    value にコピー元のカラムIDをセットすれば、その値を代入します。
    208         * TBLSET  DBTableModel の内容を取り込んで指定の columnId カラムに設定します。[カラム名] で指定できます。
    209         * WRTCTRL writableControl を使用したカラムデータの先頭アンダーバーを削除します。
    210         * DBMENU  DBMENUでパラメータ設定(コロン連結文字)を使用したカラムデータの先頭データのみにします。
    211         * REQSET  valueで指定したカラムの値をキーに、リクエスト変数から値を取出し、セットします。
    212         * SEQSET  valueの初期値を利用して、１レコードごとに、＋１した値をセットします。
    213         * PREFIX  valueの値を後ろから検索し、指定のカラム値の前半部分を取得します(記号は含みません)。
    214         * SUFIX   valueの値を後ろから検索し、指定のカラム値の後半部分を取得します(記号は含みません)。
    215         * その他  カラムのDBType の valueAction メソッドを呼び出します。自由に設定可能です。
    216         *
    217         * @param       action アクション文字列
    218         * @see         <a href="../../../../constant-values.html#org.opengion.hayabusa.taglib.EntryTag.ACT_DEFAULT">アクション定数</a>
    219         */
    220        public void setAction( final String action ) {
    221                set( "action",getRequestParameter( action ) );
    222        }
    223
    224        /**
    225         * 【TAG】カラムＩＤをセットします(複数指定時は、カンマ区切り文字で設定する)。
    226         *
    227         * @og.tag
    228         * 処理を適用するカラムＩＤを指定します。
    229         * 全く同じ内容を設定する場合には、カラム名をＣＳＶ形式(カンマ区切り)で
    230         * 複数指定することが可能です。
    231         *
    232         * @og.rev 3.6.0.6 (2004/10/22) columnNo に伴なう変更
    233         *
    234         * @param       clmid カラムＩＤ
    235         */
    236        public void setColumnId( final String clmid ) {
    237                columnId = getRequestParameter( clmid );
    238        }
    239
    240        /**
    241         * 【TAG】条件判定するカラムＩＤを指定します(初期値は columnId )。
    242         *
    243         * @og.tag
    244         * 指定のカラムＩＤの値と、conditionList の値を比較して、
    245         * 存在する場合は、action処理を実行します。
    246         * 例えば、初期値設定(action="DEFAULT")で、値が "0" の場合だけ適用するような
    247         * ケースに使用できます。
    248         * 指定しない場合は、columnId と同じキーになります。
    249         * 注意：columnId は、ＣＳＶ形式で複数同時に指定できます。その場合は、
    250         * conditionKey には、複数設定する機能はありませんので、全カラムに
    251         * 同一カラムを使用する場合は、conditionKey に値を設定できます。
    252         * 値を設定しない場合は、自動的に、columnId と同一になります。
    253         *
    254         * @og.rev 3.6.0.6 (2004/10/22) 新規追加
    255         *
    256         * @param       key カラムＩＤ
    257         * @see         #setConditionList( String )
    258         */
    259        public void setConditionKey( final String key ) {
    260                conditionKey = nval( getRequestParameter( key ),null ) ;
    261        }
    262
    263        /**
    264         * 【TAG】条件判定する値のリストを、"|"で区切って登録します(初期値:無条件)。
    265         *
    266         * @og.tag
    267         * conditionKey とペアで指定します。ここには、カラムの設定値のリストを
    268         * 指定することで、複数条件(ＯＲ結合)での比較を行い、リストにカラム値が
    269         * 存在する場合のみ、action処理を実行します。
    270         * 設定しない場合は、無条件に実行します。
    271         *
    272         * @og.rev 3.6.0.6 (2004/10/22) 新規追加
    273         *
    274         * @param       list 条件判定する値("|"区切)
    275         * @see         #setConditionKey( String )
    276         */
    277        public void setConditionList( final String list ) {
    278                set( "conditionList","|" + getRequestParameter( list ) + "|" );
    279        }
    280
    281        /**
    282         * 【TAG】カラムＩＤが存在しないときに無視するかどうかを指定します(初期値:true)。
    283         *
    284         * @og.tag
    285         * カラムセットする場合は、DBTableModel に存在するカラムに対してのみ、
    286         * 処理を適用するべきで、通常存在しないカラムを使用した場合は、Exception が
    287         * throw されます。(strictCheck="true" 初期値の動作です。)
    288         * ところが、動的テーブル検索などでカラムが不特定な場合、DBTableModel に
    289         * 存在しない場合に、無視したい場合があります。その場合は、strictCheck="false"
    290         * に設定すると、カラムが存在しない場合は、エラーにせず、無視します。
    291         * 初期値は、true:厳格に処理する です。
    292         *
    293         * @og.rev 4.0.0.0 (2006/09/31) 新規追加
    294         *
    295         * @param       strict 無視するかどうか[true/false]
    296         */
    297        public void setStrictCheck( final String strict ) {
    298                set( "strictCheck",getRequestParameter( strict ) );
    299        }
    300
    301        /**
    302         * このオブジェクトの文字列表現を返します。
    303         * 基本的にデバッグ目的に使用します。
    304         *
    305         * @return このクラスの文字列表現
    306         */
    307        @Override
    308        public String toString() {
    309                return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
    310                                .println( "VERSION"             ,VERSION                )
    311                                .println( "columnId"    ,columnId               )
    312                                .println( "conditionKey",conditionKey   )
    313                                .println( "Other..."    ,getAttributes().getAttribute() )
    314                                .fixForm().toString() ;
    315        }
    316}