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.HybsSystem;
019import org.opengion.hayabusa.html.ViewCrossTableParam;
020
021import static org.opengion.fukurou.util.StringUtil.nval ;
022
023/**
024 * viewタグの viewFormType が HTMLCrossTable の場合にパラメータを設定します。
025 *
026 * クロス集計を行う、ViewForm_HTMLCrossTable クラスに対して、各種パラメータを
027 * 設定します。
028 * パラメータが設定されていない場合は、ViewCrossTableParam の初期値が使用されます。
029 * (パラメータを使用するには、viewタグのuseParam 属性をtrueに設定する必要があります。)
030 *
031 * SELECT文は、CROSS集計機能を利用して求めます。そのときのフォーマットは、
032 * ヘッダー1..N,縦,横,計1..N になります。
033 * ヘッダー部は、複数指定できますが、デフォルトではヘッダーNがキーブレイクすると
034 * 合計用のヘッダーが挿入されます。また、ヘッダーは、前段と同じ値の場合は、表示しません。
035 * 合計は、複数並べることができますが、sumNumber で指定しておく必要があります。
036 *
037 * 各属性は、{@XXXX} 変数が使用できます。
038 * これは、ServletRequest から、XXXX をキーに値を取り出し,この変数に割り当てます。
039 * つまり、このXXXXをキーにリクエストすれば、この変数に値をセットすることができます。
040 *
041 * http://localhost/query.jsp?KEY1=VLA1&KEY2=VAL2
042 *
043 * のようなリクエストで、{@KEY1} とすれば、 VAL1 がセットされます。
044 *
045 * @og.formSample
046 * ●形式:<og:crossParam breakColumn="ZZZ" noGroupColumns="AAA,BBB" sumNumber="2" />
047 * ●body:なし
048 *
049 * ●Tag定義:
050 *   <og:crossParam
051 *       cubeXColumn        【TAG】CUBE計算の1つ目(X)カラムを指定します
052 *       cubeYColumn        【TAG】CUBE計算の2つ目(Y)カラムを指定します
053 *       sumNumber          【TAG】合計値のカラム数を設定します
054 *       breakColumn        【TAG】ブレークによりヘッダー部を出力させるカラム名をセットします(初期値:ヘッダーN)
055 *       noGroupColumns     【TAG】カラム値を前段と比較して同じ場合でも表示させるカラム名をセットします
056 *       shokeiLabel        【TAG】列小計のカラムに表示するラベルIDを指定します(初期値:空文字列)
057 *       gokeiLabel         【TAG】列合計のカラムに表示するラベルIDを指定します(初期値:空文字列)
058 *       cubeSortType       【TAG】CUBE Y の列ヘッダーのソート方式を指定します(初期値:LOAD)
059 *       gokeiSortDir       【TAG】合計行のソート有無とその方向[true:正方向/false:逆方向/null:ソートしない]を指定します(初期値:null)
060 *       useHeaderColumn    【TAG】ヘッダーカラムにレンデラー、エディターを適用するかを指定します(初期値:false)
061 *       useClassAdd        【TAG】各列情報のclass属性に、カラム名などを付与するかどうかを指定します(初期値:false)
062 *       firstClmGokei      【TAG】合計列をCUBEの先頭部分に出すかどうか[true/false]を指定します(初期値:false)
063 *       saveTableId        【TAG】クロス集計結果の DBTableModel をセーブするセッションキーワードを指定します
064 *       saveScope          【TAG】クロス集計結果の DBTableModel をセーブする scope を指定します
065 *       useHeaderResource  【TAG】ヘッダー表示にラベルリソースを適用するかどうかを指定します(初期値:false)
066 *       headerCodeColumn   【廃止】ヘッダー表示に利用するコードを持つカラムを指定します(初期値:空文字列) 7.0.1.5 (2018/12/10) 廃止
067 *       debug              【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
068 *   />
069 *
070 * ●使用例
071 *     ViewFormTag の viewFormType が、HTMLCrossTable の場合に使用します。
072 *     useParam 属性を設定しておかないと、使用されません。
073 *     <og:view
074 *         viewFormType = "HTMLCrossTable"
075 *         command      = "{@command}"
076 *         startNo      = "0"
077 *         pageSize     = "20"
078 *         <b>useParam     = &quot;true&quot;</b>
079 *     &gt;
080 *         &lt;og:crossParam
081 *             breakColumn    = "ZZZ"       : ブレークによりヘッダー部を出力させるカラム名
082 *             noGroupColumns = "AAA,BBB"   : カラム値を前段と比較して同じ場合でも表示させるカラム名
083 *             cubeXColumn    = "CUBE_X"    : CUBE計算の1つ目(X)カラムを指定
084 *             cubeYColumn    = "CUBE_Y"    : CUBE計算の2つ目(Y)カラムを指定
085 *             shokeiLabel    = "SHOKEI"    : 列小計のカラムに表示するラベルID(初期値:SHOKEI)
086 *             gokeiLabel     = "GOKEI"     : 列合計のカラムに表示するラベルID(初期値:GOKEI)
087 *             sumNumber      = "2"         : 合計値のカラム数(初期値1)
088 *             cubeSortType   = "NUMBER"    : CUBE Y の列ヘッダーのソート方式を指定[STRING/NUMBER/LOAD]
089 *             gokeiSortDir   = "false"     : 合計行のソート有無とその方向(正方向/逆方向)を指定[true/false/null]
090 *             firstClmGokei  = "true"      : 合計列をCUBEの先頭部分に出すかどうかを指定[false/true/null]
091 *             useHeaderColumn= "true"      : ヘッダーカラムにレンデラー、エディターを適用するかどうかを指定[false/true/null]
092 *             saveTableId    = "DEFAULT"   : クロス集計結果の DBTableModel をセーブするセッションキーワードを指定
093 *             useClassAdd    = "true"      : String 各列情報のclass属性に、カラム名などを付与するかどうかを指定[false/true/null]
094 *        /&gt;
095 *     &lt;/og:view &gt;
096 *
097 * @og.group 画面表示
098 *
099 * @version  4.0
100 * @author       Kazuhiko Hasegawa
101 * @since    JDK5.0,
102 */
103public class ViewCrossParamTag extends ViewParamImpl {
104        /** このプログラムのVERSION文字列を設定します。   {@value} */
105        private static final String VERSION = "6.4.2.0 (2016/01/29)" ;
106        private static final long serialVersionUID = 642020160129L ;
107
108        /**
109         * デフォルトコンストラクター
110         *
111         * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor.
112         */
113        public ViewCrossParamTag() { super(); }         // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
114
115        /**
116         * 【TAG】ブレークによりヘッダー部を出力させるカラム名をセットします(初期値:ヘッダーN)。
117         *
118         * @og.tag
119         * CROSS集計で求めたフォーマットは、『ヘッダー1..N,縦,横,計1..N 』です。
120         * ヘッダー部は、複数指定できますが、デフォルトではヘッダーNがキーブレイクすると
121         * 合計用のヘッダーが挿入されます。
122         * このヘッダーNそのものが、集計フィールドでなく、単なる属性の場合は、
123         * キーブレイクして欲しくない為、breakColumn="ヘッダーN-1" を指定します。
124         * 初期値は、"ヘッダーN" です。
125         *
126         * @param       clm ブレークカラム
127         */
128        public void setBreakColumn( final String clm ) {
129                putParam( ViewCrossTableParam.BREAK_COLUMN_KEY,
130                                  nval( getRequestParameter( clm ),null ) );
131        }
132
133        /**
134         * 【TAG】カラム値を前段と比較して同じ場合でも表示させるカラム名をセットします。
135         *
136         * @og.tag
137         * CROSS集計で求めたフォーマットは、『ヘッダー1..N,縦,横,計1..N 』です。
138         * ヘッダー部は、キーブレイクする都度、ヘッダーを出力します。それまでは、
139         * 各ヘッダーの値が、前段(同一カラムの先の値)と同じ場合は、空白にします。
140         * こうする事で、値のグループ化が一目で判ります。(初期設定)
141         * このヘッダーが、集計フィールドでなく、単なる属性の場合は、
142         * 空白ではなく、値として表示したい為、グループ化しない事を指定します。
143         *
144         * @param       clms 非グループ化カラム (CSV形式)
145         */
146        public void setNoGroupColumns( final String clms ) {
147                putParam( ViewCrossTableParam.NO_GROUP_COLUMNS_KEY,
148                                  nval( getRequestParameter( clms ),null ) );
149        }
150
151        /**
152         * 【TAG】合計値のカラム数を設定します(初期値:1)。
153         *
154         * @og.tag
155         * CROSS集計で求めたフォーマットは、『ヘッダー1..N,縦,横,計1..N 』です。
156         *  合計は、複数並べることができますが、sumNumber で指定しておく必要があります。
157         * 初期値は、1 です。
158         *
159         * @param       no 合計値カラム数 (初期値1)
160         */
161        public void setSumNumber( final String no ) {
162                putParam( ViewCrossTableParam.SUM_NUMBER_KEY,
163                                  nval( getRequestParameter( no ),"1" ) );
164        }
165
166        /**
167         * 【TAG】列小計のカラムに表示するラベルIDを指定します(初期値:空文字列)。
168         *
169         * @og.tag
170         * 各列の小計のラベルIDを登録します。登録する文字列は、ラベルリソースに
171         * 定義しておいて下さい。
172         * 初期値は、空文字列("")です。
173         *
174         * @og.rev 3.7.1.1 (2005/05/31) 初期値を "SHOKEI" に設定します。
175         *
176         * @param       id 小計ラベルID
177         */
178        public void setShokeiLabel( final String id ) {
179                final String label = nval( getRequestParameter( id ),"SHOKEI" );
180                putParam( ViewCrossTableParam.SHOKEI_LABEL_KEY, getLabel( label ) );
181        }
182
183        /**
184         * 【TAG】列合計のカラムに表示するラベルIDを指定します(初期値:空文字列)。
185         *
186         * @og.tag
187         * 各列の合計のラベルIDを登録します。登録する文字列は、ラベルリソースに
188         * 定義しておいて下さい。
189         * 初期値は、空文字列("")です。
190         *
191         * @og.rev 3.7.1.1 (2005/05/31) 初期値を "GOKEI" に設定します。
192         *
193         * @param       id 合計ラベルID
194         */
195        public void setGokeiLabel( final String id ) {
196                final String label = nval( getRequestParameter( id ),"GOKEI" );
197                putParam( ViewCrossTableParam.GOKEI_LABEL_KEY, getLabel( label ) );
198        }
199
200        /**
201         * 【TAG】CUBE計算の1つ目(X)カラムを指定します。
202         *
203         * @og.tag
204         * 列方向のキーとなるカラム名を指定します。
205         * 初期値は、互換性の関係より、sumNumber より逆計算します。
206         *
207         * @og.rev 3.5.5.9 (2004/06/07) 新規追加
208         *
209         * @param       cubeX 列(X)ラベルID
210         */
211        public void setCubeXColumn( final String cubeX ) {
212                putParam( ViewCrossTableParam.CUBE_X_COLUMN_KEY,
213                                  nval( getRequestParameter( cubeX ),null ) );
214        }
215
216        /**
217         * 【TAG】CUBE計算の2つ目(Y)カラムを指定します。
218         *
219         * @og.tag
220         * 行方向のキーとなるカラム名を指定します。
221         * 初期値は、互換性の関係より、sumNumber より逆計算します。
222         *
223         * @og.rev 3.5.5.9 (2004/06/07) 新規追加
224         *
225         * @param       cubeY 行(Y)ラベルID
226         */
227        public void setCubeYColumn( final String cubeY ) {
228                putParam( ViewCrossTableParam.CUBE_Y_COLUMN_KEY,
229                                  nval( getRequestParameter( cubeY ),null ) );
230        }
231
232        /**
233         * 【TAG】CUBE Y の列ヘッダーのソート方式を指定します(初期値:LOAD)。
234         *
235         * @og.tag
236         * CUBEのヘッダーに対応するカラム列をソート表示する場合の方式を指定します。
237         * 種類として、[STRING/NUMBER/LOAD] があります。
238         * 初期値(指定無し)は、LOAD(取り込み順にセット)です。
239         *
240         * @og.rev 3.5.6.3 (2004/07/12) 新規追加
241         *
242         * @param       cubeSortType 列ヘッダーソート方式 [STRING/NUMBER/LOAD]
243         */
244        public void setCubeSortType( final String cubeSortType ) {
245                putParam( ViewCrossTableParam.CUBE_SORT_TYPE_KEY,
246                                  nval( getRequestParameter( cubeSortType ),null ) );
247        }
248
249        /**
250         * 【TAG】合計行のソート有無とその方向[true:正方向/false:逆方向/null:ソートしない]を指定します(初期値:null)。
251         *
252         * @og.tag
253         * 最も最後の合計カラムにソートを行うかどうか、その時の方向を指定します。
254         * true/false 以外の文字列では、ソートを行いません。trueは、正方向(昇順)で、
255         * falseが逆方向(降順)になります。
256         * 初期値(指定無し)は、ソートしない(null)です。
257         *
258         * @og.rev 3.5.6.3 (2004/07/12) 新規追加
259         *
260         * @param       gokeiSortDir 合計行ソート処理 [true:正方向/false:逆方向/null:ソートしない]
261         */
262        public void setGokeiSortDir( final String gokeiSortDir ) {
263                putParam( ViewCrossTableParam.GOKEI_SORT_DIR_KEY,
264                                  nval( getRequestParameter( gokeiSortDir ),null ) );
265        }
266
267        /**
268         * 【TAG】合計列をCUBEの先頭部分に出すかどうか[true/false]を指定します(初期値:false)。
269         *
270         * @og.tag
271         * 合計列を最終列に出力するか、CUBEの先頭列に出力するかを指定します。
272         * trueが指定された場合はCUBEの先頭列に出力します。
273         * 初期値(false)は合計列を最終列に出力します。
274         *
275         * @og.rev 5.0.0.3 (2009/09/22) 新規追加
276         *
277         * @param       firstClmGokei   合計列の出力場所 [true:先頭列に出力/false:最終列に出力]
278         */
279        public void setFirstClmGokei( final String firstClmGokei ) {
280                putParam( ViewCrossTableParam.FIRST_CLM_GOKEI_KEY,
281                                  nval( getRequestParameter( firstClmGokei ),"false" ) );
282        }
283
284        /**
285         * 【TAG】ヘッダーカラムにレンデラー、エディターを適用するかを指定します(初期値:false)。
286         *
287         * @og.tag
288         * ヘッダーカラムにレンデラー、エディターを適用するかを指定します。
289         * trueが指定された場合は、ヘッダー部分の値そのものをカラム名として扱います。
290         * リソースが存在しない場合は、ラベルのみを各カラムの値で置き換えます。
291         * 初期値(指定無し)は、レンデラー、エディターを適用しない(false)です。
292         *
293         * @og.rev 4.0.0.0 (2007/11/27) 新規追加
294         * @og.rev 5.2.2.0 (2010/11/01) キーに、ViewCrossTableParam.USE_HEADER_COLUMN を使用するように修正
295         *
296         * @param       useHeaderColumn 適用可否 [true:適用する/false:適用しない]
297         */
298        public void setUseHeaderColumn( final String useHeaderColumn ) {
299                putParam( ViewCrossTableParam.USE_HEADER_COLUMN,
300                                  nval( getRequestParameter( useHeaderColumn ),"false" ) );
301        }
302
303        /**
304         * 【TAG】各列情報のclass属性に、カラム名などを付与するかどうかを指定します(初期値:false)。
305         *
306         * @og.tag
307         * 列情報の集計列に対して、class 属性を付与するかどうかを指定します。
308         * class属性は、その列のオリジナルの属性名と、ラベル名の文字列を設定します。
309         * 例えば、集計行の計カラムが複数ある場合は、それぞれに色を指定して、ゼブラ模様を
310         * 設定できます。また、ラベル(表示ヘッダー)も設定されるので、特別な列のみ指定することも
311         * 可能になります。
312         * ※ 特殊対応:cssなどで指定できるIDやCLASS属性は、先頭文字が数字の場合は、
313         * 無効になります。(つまり、効きません。)
314         * 表示ヘッダーは、年月や、社員番号(数字)などのケースもあります。そこで、先頭が数字の
315         * 場合は、"x"(小文字のx)を自動的に頭に追加します。この処理は、ViewForm_HTMLCrossTable
316         * で行います。
317         *
318         * @og.rev 5.2.2.0 (2010/11/01) 新規追加
319         *
320         * @param       useClassAdd     付与するかどうか [true:する/false:しない]
321         */
322        public void setUseClassAdd( final String useClassAdd ) {
323                putParam( ViewCrossTableParam.USE_CLASS_ADD,
324                                  nval( getRequestParameter( useClassAdd ),"false" ) );
325        }
326
327        /**
328         * 【TAG】クロス集計結果の DBTableModel をセーブするセッションキーワードを指定します。
329         *
330         * @og.tag
331         * 検索のみの場合は、何も設定しません。EXCEL等外部にクロス集計の形で
332         * 取り出したい場合に、設定します。
333         * "DEFAULT" という文字列を指定すると、内部では、HybsSystem.TBL_MDL_KEY が
334         * 設定されます。(DEFAULT という文字列に設定されるわけではありません。)
335         * なお、DEFAULT を使用する場合は、検索結果の DBTbleModel をつぶすことになります
336         * ので、NEXT 等は使えません。DBTableModel のデータを利用した forward 等も
337         * 使用できませんので、十分ご注意ください。
338         * DEFAULT 以外の文字列の場合は、指定した文字列そのものがキーになります。
339         * 他のセッションキーと同じにすると動作が不安定になりますので、使用する場合は、
340         * "CROSS_TABLE_SAVE_KEY" を推奨致します。
341         * 指定しない場合は、セッションにセーブされません。(検索されたまま)
342         * 通常、EXCEL出力等を行う場合は、DBTableModel をセーブする必要がありますが、
343         * scope="session" にセーブすると、PREV,NEXT が使えなくなります。これは、
344         * クロス集計時に元のカラムが表形式の別のカラムに置き換えられるためです。
345         * scope="request" では、エラーは発生しなくなりますが、外部に取り出せなくなります。
346         *
347         * @og.rev 5.2.2.0 (2010/11/01) キーに、ViewCrossTableParam.SAVE_TABLEID_KEY を使用するように修正
348         *
349         * @param       id セッション登録ID
350         */
351        public void setSaveTableId( final String id ) {
352                String tableId = nval( getRequestParameter( id ),null );
353                if( "DEFAULT".equals( tableId ) ) {
354                        tableId = HybsSystem.TBL_MDL_KEY;
355                }
356                putParam( ViewCrossTableParam.SAVE_TABLEID_KEY , tableId );
357        }
358
359        /**
360         * 【TAG】クロス集計結果の DBTableModel をセーブする scope を指定します。
361         *
362         * @og.tag
363         * スコープは (request,page,session,application) がありますが、request か session が
364         * 通常選択されます。
365         * また、この設定が有効になるには、saveTableId を指定する必要があります。
366         * saveTableId を指定しないと、そもそも書き出されないため、scope は無視されます。
367         *
368         * scope="session" にセーブすると、PREV,NEXT が使えなくなります。これは、
369         * クロス集計時に元のカラムが表形式の別のカラムに置き換えられるためです。
370         * scope="request" では、エラーは発生しなくなりますが、外部に取り出せなくなります。
371         * 何も指定しない場合は、viewタグに指定されたオリジナルのスコープに書き出されます。
372         * そうで無い場合は、指定のスコープに書き出されます。
373         *
374         * @og.rev 5.2.2.0 (2010/11/01) 新規追加
375         *
376         * @param       scope scope指定 [request/page/session/application]
377         * @see         #setSaveTableId( String )
378         */
379        public void setSaveScope( final String scope ) {
380                putParam( ViewCrossTableParam.SAVE_SCOPE_KEY,
381                                  nval( getRequestParameter( scope ), null ) );
382        }
383
384        /**
385         * 【TAG】ヘッダーカラムにラベルリソースを利用するかを指定します(初期値:false)。
386         *
387         * @og.tag
388         * HTMLCrossTableViewで、ヘッダーカラムの表示にラベルリソースを利用するかどうかを指定します。
389         * trueが指定された場合は、ヘッダー部の値のラベルで表示します。
390         * 初期値(指定無し)は、利用しない(false)です。
391         *
392         * @og.rev 5.5.5.0 (2012/07/28) 新規追加
393         *
394         * @param       useHeaderResource       リソース使用可否 [true:する/false:しない]
395         */
396        public void setUseHeaderResource( final String useHeaderResource ) {
397                putParam( ViewCrossTableParam.USE_HEADER_RSC,
398                                  nval( getRequestParameter( useHeaderResource ),"false" ) );
399        }
400
401//      /**
402//       * 【TAG】ヘッダーのラベルに利用するコードリソースを指定します。
403//       *
404//       * @og.tag
405//       * この値を指定すると上部ヘッダーの表示を対象カラムのコードに対応するラベルで表示します。
406//       * カラムリソースがMENUや、DBMENUのようにSelectionを返す形である必要があります。
407//       * 初期値はnullです。
408//       *
409//       * @og.rev 5.5.5.0 (2012/07/28) 新規追加
410//       * @og.rev 7.0.1.5 (2018/12/10) 廃止
411//       *
412//       * @param       headerCode コードリソースのキー
413//       */
414//      public void setHeaderCodeColumn( final String headerCode ) {
415//              putParam( ViewCrossTableParam.HEADER_CODE_KEY,
416//                                nval( getRequestParameter( headerCode ),null ) );
417//      }
418
419        /**
420         * タグの名称を、返します。
421         * 自分自身のクラス名より、自動的に取り出せないため、このメソッドをオーバーライドします。
422         *
423         * @og.rev 4.0.0.0 (2005/01/31) 新規追加
424         *
425         * @return  タグの名称
426         * @og.rtnNotNull
427         */
428        @Override
429        protected String getTagName() {
430                return "crossParam" ;
431        }
432}