    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.ViewMarker;
    020import org.opengion.hayabusa.html.ViewMarker_MARKER;
    021import org.opengion.fukurou.util.Attributes;
    022import static org.opengion.fukurou.util.StringUtil.nval ;
    023
    024import java.util.Locale ;
    025import java.io.ObjectOutputStream;
    026import java.io.ObjectInputStream;
    027import java.io.IOException;
    028
    029/**
    030 * 複数のcolumnMarker を統合して、検索結果に対して様々な属性を付加するタグです。(参照:columnMarker)
    031 *
    032 * DBTableModelオブジェクトの表示にHTMLタグをマークします。
    033 * 子タグとして、ColumnMarkerTag のBODY要素をパースして、タグを作成します。
    034 *
    035 * @og.formSample
    036 * ●形式：&lt;og:viewMarker &gt; ･･･ &lt;/og:viewMarker &gt;
    037 * ●body：あり(EVAL_BODY_BUFFERED:BODYを評価し、{&#064;XXXX} を解析します)
    038 *
    039 * ●Tag定義：
    040 *   &lt;og:viewMarker
    041 *       command          ○【TAG】コマンド(NEW,RENEW,RESET,REVIEW)をセットします(必須)。
    042 *       viewMarkerId       【TAG】(通常使いません)requestから取得する ViewMarker に対応する Attributes オブジェクトの ID
    043 *       debug              【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
    044 *       isRenderer         【TAG】マーカーのタイプが renderer かどうか[true/false]を指定します(初期値:true)
    045 *   &gt;   ... Body ...
    046 *   &lt;/og:viewMarker&gt;
    047 *
    048 * ●使用例
    049 *     商品CD２(CDSYHN02)は赤字で表示する。
    050 *     商品CD３(CDSYHN03)は-----と表示する。
    051 *         &lt;og:viewMarker command="{&#064;command}"&gt;
    052 *             &lt;og:columnMarker column="CDSYHN02" onMark="true" &gt;
    053 *                 &lt;font color='red'&gt;[VCDSYHN02]&lt;/font&gt;
    054 *             &lt;/og:columnMarker&gt;
    055 *             &lt;og:columnMarker column="CDSYHN03" onMark="true" &gt;
    056 *                 &lt;CENTER&gt;-----&lt;/CENTER&gt;
    057 *             &lt;/og:columnMarker&gt;
    058 *         &lt;/og:viewMarker&gt;
    059 *
    060 * @og.group 画面表示
    061 *
    062 * @version  4.0
    063 * @author       Kazuhiko Hasegawa
    064 * @since    JDK5.0,
    065 */
    066public class ViewMarkerTag extends CommonTagSupport {
    067        //* このプログラムのVERSION文字列を設定します。   {@value} */
    068        private static final String VERSION = "5.1.9.0 (2010/08/01)" ;
    069
    070        private static final long serialVersionUID = 519020100801L ;
    071
    072        /** command 引数に渡す事の出来る コマンド  新規 {@value} */
    073        public static final String CMD_NEW      = "NEW" ;
    074        /** command 引数に渡す事の出来る コマンド  再検索 {@value} */
    075        public static final String CMD_RENEW    = "RENEW" ;
    076        /** command 引数に渡す事の出来る コマンド  リセット {@value}  */
    077        public static final String CMD_RESET  = "RESET" ;               // 3.5.4.0 (2003/11/25)
    078        /** command 引数に渡す事の出来る コマンド  再表示 {@value}  */
    079        public static final String CMD_REVIEW  = "REVIEW" ;             // 3.5.4.0 (2003/11/25)
    080
    081        /** command 引数に渡す事の出来る コマンド リスト  */
    082        private static final String[] COMMAND_LIST = new String[] {
    083                CMD_NEW , CMD_RENEW ,CMD_RESET , CMD_REVIEW };          // 3.5.4.0 (2003/11/25)
    084
    085        private transient ViewMarker    viewMarker              = new ViewMarker_MARKER();
    086        private String  viewMarkerId    = null;
    087        private String  command                 = null;
    088        private boolean isRenderer              = true;                                         // 3.8.6.1 (2006/10/20)
    089
    090        /**
    091         * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。
    092         *
    093         * @og.rev 5.1.9.0 (2010/08/01) 戻り値を、EVAL_BODY_INCLUDE → EVAL_BODY_BUFFERED に変更
    094         *
    095         * @return      後続処理の指示
    096         */
    097        @Override
    098        public int doStartTag() {
    099//              if( check( command, COMMAND_LIST ) ) { return( EVAL_BODY_INCLUDE ); }
    100                if( check( command, COMMAND_LIST ) ) { return( EVAL_BODY_BUFFERED ); }          // 5.1.9.0 (2010/08/01) 変更
    101                else                                 { return( SKIP_BODY ); }
    102        }
    103
    104        /**
    105         * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。
    106         *
    107         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。
    108         * @og.rev 3.8.6.1 (2006/10/20) isRenderer 属性でマーカーの種類を指定
    109         *
    110         * @return      後続処理の指示
    111         */
    112        @Override
    113        public int doEndTag() {
    114                debugPrint();           // 4.0.0 (2005/02/28)
    115                if( check( command, COMMAND_LIST ) ) {
    116                        final String mid ;
    117                        if( isRenderer ) {
    118                                mid = nval( viewMarkerId,HybsSystem.VIEW_MARK_KEY );
    119                        }
    120                        else {
    121                                mid = nval( viewMarkerId,HybsSystem.EDIT_MARK_KEY );
    122                        }
    123                        setRequestAttribute( mid,viewMarker );
    124                }
    125
    126                return(EVAL_PAGE);
    127        }
    128
    129        /**
    130         * タグリブオブジェクトをリリースします。
    131         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
    132         *
    133         * @og.rev 2.0.0.4 (2002/09/27) カスタムタグの release() メソッドを、追加
    134         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。
    135         * @og.rev 3.8.6.1 (2006/10/20) isRenderer属性追加、viewMarkerId属性初期値変更
    136         *
    137         */
    138        @Override
    139        protected void release2() {
    140                super.release2();
    141                viewMarker              = new ViewMarker_MARKER();
    142                viewMarkerId    = null;
    143                command                 = null;
    144                isRenderer              = true;                                         // 3.8.6.1 (2006/10/20)
    145        }
    146
    147        /**
    148         * 内部タグの ColumnMarkerTag より、個々のカラムの値を書き換える 為の
    149         * マーカー文字列を受け取る。
    150         *
    151         * 複数の値を受け取って、後ほど、すべてのカラムに対して処理を行います。
    152         *
    153         * @og.rev 3.1.2.0 (2003/04/07) taglib パッケージ内部で使用している箇所を protected 化する。
    154         * @og.rev 4.0.0.0 (2005/08/31) 同一カラムの複数登録を許可します。
    155         *
    156         * @param       attri  Attribute マーク処理属性
    157         */
    158        protected void addAttribute( final Attributes attri ) {
    159                viewMarker.addAttribute( attri );
    160        }
    161
    162        /**
    163         * 【TAG】コマンド(NEW,RENEW,RESET,REVIEW)をセットします。
    164         *
    165         * @og.tag
    166         * コマンドは,HTMLから(get/post)指定されますので,CMD_xxx で設定される
    167         * フィールド定数値のいづれかを、指定できます。
    168         *
    169         * @param       cmd コマンド(public static final 宣言されている文字列)
    170         * @see         <a href="../../../../constant-values.html#org.opengion.hayabusa.taglib.ViewMarkerTag.CMD_NEW">コマンド定数</a>
    171         */
    172        public void setCommand( final String cmd ) {
    173                String cmd2 = getRequestParameter( cmd );
    174                if( cmd2 != null && cmd2.length() > 0 ) { command = cmd2.toUpperCase(Locale.JAPAN); }
    175        }
    176
    177        /**
    178         * 【TAG】(通常使いません)requestから取得する ViewMarker に対応する Attributes オブジェクトの ID。
    179         *
    180         * @og.tag
    181         * ViewForm オブジェクトに、ViewMarker オブジェクトをこのキーより取得することにより、
    182         * カラムに対して、マーカー情報を付加して表示させる。
    183         * 初期値は、HybsSystem.VIEW_MARK_KEY です。
    184         *
    185         * @og.rev 3.1.4.0 (2003/04/18) 新規追加
    186         * @og.rev 3.5.6.3 (2004/07/12) {&#064;XXXX} 変数を使用できるように変更。
    187         * @og.rev 3.5.6.4 (2004/07/16) MARK_ID を付加して、他のid と混同しないようにします。
    188         * @og.rev 3.8.6.1 (2006/10/20) 初期値:null (editMarker を考慮)
    189         *
    190         * @param       id ViewMarker オブジェクトID
    191         */
    192        public void setViewMarkerId( final String id ) {
    193                viewMarkerId = nval( getRequestParameter( id ),null ) ;
    194        }
    195
    196        /**
    197         * 【TAG】マーカーのタイプが renderer かどうか[true/false]を指定します(初期値:true)。
    198         *
    199         * @og.tag
    200         * このMarker オブジェクトが、ViewMarker か、EditMarker かを指定します。
    201         * 内部的には、ViewMarker オブジェクトを構築しており、viewForm で、どちらにセット
    202         * するかを決めているだけです。
    203         * true にセットすると、従来からある、viewMarker(renderer) を指定します。
    204         * false は、editMarker として作用し、オブジェクトが書き込み可能な場合に表示されます。
    205         * 初期値は、true:renderer です。
    206         *
    207         * @og.rev 3.8.6.1 (2006/10/20) 新規追加
    208         *
    209         * @param       flag    マーカータイプ [true:renderer/false:editor]
    210         */
    211        public void setIsRenderer( final String flag ) {
    212                isRenderer = nval( getRequestParameter( flag ),isRenderer ) ;
    213        }
    214
    215        /**
    216         * シリアライズ用のカスタムシリアライズ書き込みメソッド
    217         *
    218         * @og.rev 4.0.0.0 (2006/09/31) 新規追加
    219         * @serialData 一部のオブジェクトは、シリアライズされません。
    220         *
    221         * @param       strm    ObjectOutputStreamオブジェクト
    222         * @throws IOException  入出力エラーが発生した場合
    223         */
    224        private void writeObject( final ObjectOutputStream strm ) throws IOException {
    225                strm.defaultWriteObject();
    226        }
    227
    228        /**
    229         * シリアライズ用のカスタムシリアライズ読み込みメソッド
    230         *
    231         * ここでは、transient 宣言された内部変数の内、初期化が必要なフィールドのみ設定します。
    232         *
    233         * @og.rev 4.0.0.0 (2006/09/31) 新規追加
    234         * @serialData 一部のオブジェクトは、シリアライズされません。
    235         *
    236         * @param       strm    ObjectInputStreamオブジェクト
    237         * @see #release2()
    238         * @throws IOException  シリアライズに関する入出力エラーが発生した場合
    239         * @throws ClassNotFoundException       クラスを見つけることができなかった場合
    240         */
    241        private void readObject( final ObjectInputStream strm ) throws IOException , ClassNotFoundException {
    242                strm.defaultReadObject();
    243                viewMarker = new ViewMarker_MARKER();
    244        }
    245
    246        /**
    247         * このオブジェクトの文字列表現を返します。
    248         * 基本的にデバッグ目的に使用します。
    249         *
    250         * @return このクラスの文字列表現
    251         */
    252        @Override
    253        public String toString() {
    254                return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
    255                                .println( "VERSION"                     ,VERSION                )
    256                                .println( "viewMarkerId"        ,viewMarkerId   )
    257                                .println( "command"                     ,command                )
    258                                .println( "Other..."    ,getAttributes().getAttribute() )
    259                                .fixForm().toString() ;
    260        }
    261}