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 * ●形式:<og:entry command="…">
033 *             <og:setColumn
034 *                 command   ="…"          : entryタグのcommandと一致する場合に実行
035 *                 columnId  ="…"          : 処理を行うカラムIDを指定(必須,複数指定可)
036 *                 action    ="…"          : 処理方法を指定
037 *                 value     ="…"          : 設定する値を指定(action="TBLSET"のみ[カラム名]使用可能)
038 *                 conditionKey  ="…"      : 条件判定するカラムIDを指定(初期値は columnId )
039 *                 conditionList ="…"      : 条件判定する値のリストを、"|"で区切って登録(初期値は、無条件)
040 *             />
041 *         </og:entry>
042 * ●body:なし
043 *
044 * ●Tag定義:
045 *   <og:columnSet
046 *       command            【TAG】コマンド(INSERT/COPY/MODIFY/DELETE/ENTRY/CHANGE/RESET/ALLRESET/ALLACTION/RESETDATA/INSERTONE/REALDELETE/REQENTRY)を設定します
047 *       columnId         ○【TAG】カラムIDをセットします(複数指定時は、カンマ区切り文字で設定する)(必須)。
048 *       value              【TAG】値をセットします
049 *       action             【TAG】アクション(DEFAULT/CLEAR/ADD/SET/NULLSET/LOWER/UPPER/COPY/TBLSET//WRTCTRL/DBMENU/REQSET/SEQSET)をセットします
050 *       conditionKey       【TAG】条件判定するカラムIDを指定します(初期値は 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 *   />
058 *
059 * ●使用例
060 *    <og:entry command="{@command}"  >
061 *        <og:columnSet command="{@command}" columnId="ECNO"   action="CLEAR" />
062 *        <og:columnSet command="{@command}" columnId="JYOKYO" action="SET" value="1" />
063 *    </og:entry>
064 *
065 *    <og:entry command="MODIFY" rows="1" >
066 *        <og:columnSet command="MODIFY" columnId="key" action="TBLSET" value ="[key][lang]"/>
067 *    </og:entry>
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   値をクリア(ゼロストリング "" )します。
088 *      ADD     現在の値を +1 します。  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の初期値を利用して、1レコードごとに、+1した値をセットします。
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     現在の値を +1 します。  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の初期値を利用して、1レコードごとに、+1した値をセットします。
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】カラムIDをセットします(複数指定時は、カンマ区切り文字で設定する)。
226         *
227         * @og.tag
228         * 処理を適用するカラムIDを指定します。
229         * 全く同じ内容を設定する場合には、カラム名をCSV形式(カンマ区切り)で
230         * 複数指定することが可能です。
231         *
232         * @og.rev 3.6.0.6 (2004/10/22) columnNo に伴なう変更
233         *
234         * @param       clmid カラムID
235         */
236        public void setColumnId( final String clmid ) {
237                columnId = getRequestParameter( clmid );
238        }
239
240        /**
241         * 【TAG】条件判定するカラムIDを指定します(初期値は columnId )。
242         *
243         * @og.tag
244         * 指定のカラムIDの値と、conditionList の値を比較して、
245         * 存在する場合は、action処理を実行します。
246         * 例えば、初期値設定(action="DEFAULT")で、値が "0" の場合だけ適用するような
247         * ケースに使用できます。
248         * 指定しない場合は、columnId と同じキーになります。
249         * 注意:columnId は、CSV形式で複数同時に指定できます。その場合は、
250         * conditionKey には、複数設定する機能はありませんので、全カラムに
251         * 同一カラムを使用する場合は、conditionKey に値を設定できます。
252         * 値を設定しない場合は、自動的に、columnId と同一になります。
253         *
254         * @og.rev 3.6.0.6 (2004/10/22) 新規追加
255         *
256         * @param       key カラムID
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         * 指定することで、複数条件(OR結合)での比較を行い、リストにカラム値が
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】カラムIDが存在しないときに無視するかどうかを指定します(初期値: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}