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     */
016    package org.opengion.hayabusa.taglib;
017    
018    import org.opengion.hayabusa.common.HybsSystemException;
019    import org.opengion.fukurou.util.StringUtil;
020    import org.opengion.fukurou.util.Attributes;
021    
022    import static org.opengion.fukurou.util.StringUtil.nval ;
023    
024    /**
025     * 検索結果のカラ?示に対して様?な属?を付加(マ?キング)するタグで?参?:viewMarker)?
026     *
027     * こ?タグは、カラ?にマ?キングするタグです?親タグとして、viewMarker ?
028     * 使用する?があります?
029     * こ?タグでは、BODY部に?した?を?レン?ーとして使用します?通常の???
030     * そ?ままで、{@XXXX}で?した変数は、リクエスト?を設定します?
031     * [XXXX]で?した?は、検索結果のDBTableModelの値を行毎に割り当てます?
032     * マ?カー??有無(マ?カーするかしな?)は、onMark属?と、markList属?で
033     * ?します?markList属?に??値に、onMark属?に設定した?が存在する場合?
034     * マ?カーされます? こ?markList属?には?1" と "true"が?期設?
035     * されて?ため、onMark属?に"1" また? "true"を指定すれ?、?行?ークされます?
036     * また?どちら?属?も?{@XXXX} ??[XXXX]変数が使用できます?[XXXX]変数では?
037     * 行毎に、onMark属???markList属?を設定できる為?通常はどちらか固?
038     * 行毎? マ?カー??有無を指定できます?
039     * [XXXX]変数でカラ?の先?に$を付加した場??[$XXXX])は、?の値がURLエンコー?
040     * されて返されます?
041     * ※ <b>現段階では、viewMarker がカラ?をキーにcolumnMarkerオブジェクトを
042     * 管?て?為、行毎にマ?クの有無は?できますが、?ークを?り替える
043     * 使?が?来ません?/b>
044     *
045     * @og.formSample
046     * ●形式?lt;og:columnMarker column="???" ??? &gt; ??? &lt;/og:columnMarker &gt;
047     * ●body?あ?EVAL_BODY_BUFFERED:BODYを評価し?{&#064;XXXX} を解析しま?
048     *
049     * ●Tag定義??
050     *   &lt;og:columnMarker
051     *       column             【TAG】?ーク処?行うカラ?を指定しま?
052     *       columns            【TAG】?ーク処?行うカラ?をカンマ区?(CSV形?で??しま?
053     *       onMark             【TAG】?ークを???true or 1)/処?な?false or 0)の設定を?しま?初期値:true)
054     *       markList           【TAG】??る?ークを含????を?"|"区?の??で?しま?初期値:"true|TRUE|1")
055     *       instrVals          【TAG】スペ?スで区?れた?の値につ?、?ークしま?
056     *       useFormatDeco      【TAG】[$XXXX],[#XXXX]機?を有効にしま?初期値:false)
057     *       debug              【TAG】デバッグ??を?力するかど?[true/false]を指定しま?初期値:false)
058     *   &gt;   ... Body ...
059     *   &lt;/og:columnMarker&gt;
060     *
061     * ●使用?
062     *     ?CD??CDSYHN02)は赤字で表示する?
063     *     ?CD??CDSYHN03)は-----と表示する?
064     *     &lt;og:viewMarker command="{&#064;command}"&gt;
065     *         &lt;og:columnMarker column="CDSYHN02" onMark="true" &gt;
066     *             &lt;font color='red'&gt;[VCDSYHN02]&lt;/font&gt;
067     *         &lt;/og:columnMarker&gt;
068     *         &lt;og:columnMarker column="CDSYHN03" onMark="[XXXX]" markList="[YYYY]" &gt;
069     *             &lt;CENTER&gt;&lt;-----&lt;/CENTER&gt;
070     *         &lt;/og:columnMarker&gt;
071     *     &lt;/og:viewMarker&gt;
072     *
073     * @og.group 画面表示
074     *
075     * @version  4.0
076     * @author       Kazuhiko Hasegawa
077     * @since    JDK5.0,
078     */
079    public class ColumnMarkerTag extends CommonTagSupport {
080            //* こ?プログラ??VERSION??を設定します?       {@value} */
081            private static final String VERSION = "5.6.3.0 (2013/04/01)" ;
082    
083            private static final long serialVersionUID = 563020130401L ;
084    
085            private String          column          = null;
086            private String[]        columns         = null;
087            private String          onMark          = "true";                       // true また? 1
088            // 3.5.2.0 (2003/10/20)
089            private String          markList        = "true|TRUE|1";        // true また? 1
090            private String          instrVals       = null;                         // 3.8.8.1 (2007/01/06)
091    
092            private String          useFormatDeco = "false";                // 5.6.3.0 (2013/04/01) [$XXXX],[#XXXX]機?を有効にするかど?
093    
094            /**
095             * Taglibの開始タグが見つかったときに処??doStartTag() ?オーバ?ライドします?
096             *
097             * @return      後続????( EVAL_BODY_BUFFERED )
098             */
099            @Override
100            public int doStartTag() {
101                    return( EVAL_BODY_BUFFERED );   // Body を評価する? extends BodyTagSupport ?
102            }
103    
104            /**
105             * Taglibのタグ本体を処??doAfterBody() ?オーバ?ライドします?
106             *
107             * @og.rev 3.1.1.0 (2003/03/28) ボディの?を取得する??、CommonTagSupport で行う?
108             * @og.rev 3.5.2.0 (2003/10/20) markList属?を追?
109             * @og.rev 3.8.8.1 (2007/01/06) instrVals属?を追?
110             * @og.rev 4.0.0.0 (2005/08/31) 同?ラ???登録を許可します?
111             * @og.rev 5.6.3.0 (2013/04/01) useFormatDeco属?を追??$XXXX],[#XXXX]機?を有効にするかど???
112             *
113             * @return      後続????(SKIP_BODY)
114             */
115            @Override
116            public int doAfterBody() {
117                    ViewMarkerTag viewMarker = (ViewMarkerTag)findAncestorWithClass( this,ViewMarkerTag.class );
118                    if( viewMarker != null ) {
119                            String marker = getBodyString();
120    
121                            set( "body"             ,marker );
122                            set( "onMark"   ,onMark );
123                            set( "markList" ,markList );
124                            set( "instrVals",instrVals );                   // 3.8.8.1 (2007/01/06)
125                            set( "useFormatDeco",useFormatDeco );   // 5.6.3.0 (2013/04/01) [$XXXX],[#XXXX]機?を有効にするかど?
126                            boolean flag = false;
127                            if( column != null && column.length() > 0 ) {
128                                    // 4.0.0 (2005/08/31) 同?ラ???登録を許可します?
129                                    set( "column",column );
130                                    viewMarker.addAttribute( getAttributes() );
131                                    flag = true;
132                            }
133    
134                            if( columns != null && columns.length > 0 ) {
135                                    flag = true;
136                                    for( int i=0; i<columns.length; i++ ) {
137                                            String newMarker = StringUtil.replace( marker,"[$1]","[" + columns[i] + "]" );
138                                            set( "body"  ,newMarker );
139                                            // 4.0.0 (2005/08/31) 同?ラ???登録を許可します?
140                                            set( "column",columns[i] );
141                                            viewMarker.addAttribute( new Attributes( getAttributes() ) );
142                                    }
143                            }
144    
145                            if( ! flag ) {
146                                    String errMsg = "colum か?columns は、どちらか??です?";
147                                    throw new HybsSystemException( errMsg );
148                            }
149                    }
150                    return(SKIP_BODY);
151            }
152    
153            /**
154             * タグリブオブジェクトをリリースします?
155             *
156             * キャ?ュされて再利用される?で、フィールド?初期設定を行います?
157             *
158             * @og.rev 2.0.0.4 (2002/09/27) カスタ?グの release() メソ?を?追?
159             * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応?release2() ?doEndTag()で呼ぶ?
160             * @og.rev 3.5.2.0 (2003/10/20) markList属?を追?
161             * @og.rev 3.8.8.1 (2007/01/06) instrVals属?を追?
162             * @og.rev 5.6.3.0 (2013/04/01) useFormatDeco属?を追?
163             *
164             */
165            @Override
166            protected void release2() {
167                    super.release2();
168                    column          = null;
169                    columns         = null;
170                    onMark          = "true";                       // true また? 1
171                    markList        = "true|TRUE|1";
172                    instrVals       = null;                         // 3.8.8.1 (2007/01/06)
173                    useFormatDeco = "false";                // 5.6.3.0 (2013/04/01) [$XXXX],[#XXXX]機?を有効にするかど?
174            }
175    
176            /**
177             * 【TAG】?ーク処?行うカラ?を指定します?
178             *
179             * @og.tag
180             * こ?カラ?のTableModelに対して、?ークを??ます?
181             *
182             * @param       clm カラ?
183             */
184            public void setColumn( final String clm ) {
185                    column = getRequestParameter( clm );
186            }
187    
188            /**
189             * 【TAG】?ーク処?行うカラ?をカンマ区?(CSV形?で??します?
190             *
191             * @og.tag
192             * こ??のカラ?のTableModelに対して?マ?クを??ます?
193             * カラ?は、カンマ区?で??することができます?そ?場合??
194             * ??カラ?対して、すべて同??処?行います?
195             * <del>先に配?に?してからリクエスト変数の値を取得するよ?します?
196             * こうする事で、リクエストにカンマ区?の値を設定できるようになります?</del>
197             * ?方法???常のパラメータ取得後に、CSV?します?
198             *
199             * @og.rev 3.5.6.2 (2004/07/05) 先に配?に?してからリクエスト変数の値を取?
200             * @og.rev 3.8.8.5 (2007/03/09) 通常のパラメータ取得後に、CSV?に戻します?
201             *
202             * @param       clms マ?ク処?行うカラ?(CSV形?
203             */
204            public void setColumns( final String clms ) {
205                    columns = StringUtil.csv2Array( getRequestParameter( clms ) );
206                    if( columns.length == 0 ) { columns = null; }
207            }
208    
209            /**
210             * 【TAG】?ークを???true or 1)/処?な?false or 0)の設定を?しま?初期値:true)?
211             *
212             * @og.tag
213             * マ?クを??る?合??true"(また? "1")
214             * 処?な??合?, "true以?(また? "0")をセ?します?
215             * 初期値は?"true"(マ?クを???です?
216             * さらに、[カラ?] で、動?カラ??値で、?ークをする?しな?
217             * 選ぶ事が可能になります?値は?true"(また? "1") で、?ークします?
218             * 追?3.5.2.0 (2003/10/20)?markList属?に、??象??郡を指定できます?
219             * これにより、?ークを??るかど?の判断が?true,1 以外にも使用できるようになりました?
220             *
221             * @og.rev 3.5.0.0 (2003/09/17) onMark に、[カラ?] の値をセ?できるように修正?
222             *
223             * @param       flag マ?クの処?[true,1:処??それ以?処?ない]
224             */
225            public void setOnMark( final String flag ) {
226                    onMark = nval( getRequestParameter( flag ),onMark );
227            }
228    
229            /**
230             * 【TAG】??る?ークを含????を?"|"区?の??で?しま?初期値:"true|TRUE|1")?
231             *
232             * @og.tag
233             * markListで与えられた文字?に、onMark??(大??小文字?区別あり)?
234             * 含まれて?ば、??ます?
235             * 例えば?A","B","C" と???が?onMark で?された
236             * 場合に処?るよ?した??合??A|B|C" をセ?します?
237             * markList には、[カラ?]?が可能です?
238             * 初期値は?"true|TRUE|1"です?
239             *
240             * @og.rev 3.5.2.0 (2003/10/20) 新規追?
241             *
242             * @param       list 処?る?ーク(indexOf による含?含まな??
243             */
244            public void setMarkList( final String list ) {
245                    markList = nval( getRequestParameter( list ),markList );
246            }
247    
248            /**
249             * 【TAG】スペ?スで区?れた?の値につ?、?ークします?
250             *
251             * @og.tag
252             * ?的に作?された表示結果に対して、引数の??を含??に?
253             * <span class="instr0">引数??</span> ??と置き換えます?
254             * 0 の部??、引数??の現れた?を指定します?
255             * これにより??索された?のみにマ?クすることが可能です?
256             * 部?字?は、スペ?スで区?、それぞれ独立した形でマ?ク
257             * されます?で、検索エンジン等で検索したキャ?ュ表示のような
258             * 効果を持たすことが可能になります?
259             *
260             * @param       val スペ?スで区?れた?の値
261             * @see         SqlAndTag#setInstrVals( String )
262             */
263            public void setInstrVals( final String val ) {
264                    instrVals = nval( getRequestParameter( val ),instrVals );
265            }
266    
267            /**
268             * 【TAG】[$XXXX],[#XXXX]機?を有効にするかど??しま?初期値:"false")?
269             *
270             * @og.tag
271             * カラ??フォーマット??、[$XXXX],[#XXXX]などの就職記号を付けると?
272             * ??タでな??を?力できます?
273             * [$XXXX] は、レン?ー処?れた??を?[#XXXX]は、ラベルリソースを?力します?
274             * こ?、columnMarker の?ォルトでは、[$XXXX]は、URLエンコード??れた結果?
275             * 返されます?他?処?viewタグのボディ部?とは異なる??すが、互換性のため?
276             * [$XXXX]のレン?ー処??、行われません?
277             * こ?、属?で?true" を設定すれ?、他?フォーマット??同じ処?実行されます?
278             * 初期値は、互換性を?慮し?"false" になって?す?
279             *
280             * @og.rev 5.6.3.0 (2013/04/01) 新規追?
281             *
282             * @param       val [$XXXX],[#XXXX]機?を有効にするかど?(true:有効/false:無効)
283             */
284            public void setUseFormatDeco( final String val ) {
285                    useFormatDeco = nval( getRequestParameter( val ),useFormatDeco );
286            }
287    
288            /**
289             * こ?オブジェクト???表現を返します?
290             * 基本???目?使用します?
291             *
292             * @return こ?クラスの??表現
293             */
294            @Override
295            public String toString() {
296                    return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
297                                    .println( "VERSION"             ,VERSION        )
298                                    .println( "column"              ,column         )
299                                    .println( "columns"             ,columns        )
300                                    .println( "onMark"              ,onMark         )
301                                    .println( "markList"    ,markList       )
302                                    .println( "Other..."    ,getAttributes().getAttribute() )
303                                    .fixForm().toString() ;
304            }
305    }