    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_BUFFERED ; }            // 5.1.9.0 (2010/08/01) 変更
    100                else                                 { return SKIP_BODY ; }
    101        }
    102
    103        /**
    104         * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。
    105         *
    106         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。
    107         * @og.rev 3.8.6.1 (2006/10/20) isRenderer 属性でマーカーの種類を指定
    108         *
    109         * @return      後続処理の指示
    110         */
    111        @Override
    112        public int doEndTag() {
    113                debugPrint();           // 4.0.0 (2005/02/28)
    114                if( check( command, COMMAND_LIST ) ) {
    115                        final String mid ;
    116                        if( isRenderer ) {
    117                                mid = nval( viewMarkerId,HybsSystem.VIEW_MARK_KEY );
    118                        }
    119                        else {
    120                                mid = nval( viewMarkerId,HybsSystem.EDIT_MARK_KEY );
    121                        }
    122                        setRequestAttribute( mid,viewMarker );
    123                }
    124
    125                return EVAL_PAGE ;
    126        }
    127
    128        /**
    129         * タグリブオブジェクトをリリースします。
    130         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
    131         *
    132         * @og.rev 2.0.0.4 (2002/09/27) カスタムタグの release() メソッドを、追加
    133         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。
    134         * @og.rev 3.8.6.1 (2006/10/20) isRenderer属性追加、viewMarkerId属性初期値変更
    135         *
    136         */
    137        @Override
    138        protected void release2() {
    139                super.release2();
    140                viewMarker              = new ViewMarker_MARKER();
    141                viewMarkerId    = null;
    142                command                 = null;
    143                isRenderer              = true;                                         // 3.8.6.1 (2006/10/20)
    144        }
    145
    146        /**
    147         * 内部タグの ColumnMarkerTag より、個々のカラムの値を書き換える 為の
    148         * マーカー文字列を受け取る。
    149         *
    150         * 複数の値を受け取って、後ほど、すべてのカラムに対して処理を行います。
    151         *
    152         * @og.rev 3.1.2.0 (2003/04/07) taglib パッケージ内部で使用している箇所を protected 化する。
    153         * @og.rev 4.0.0.0 (2005/08/31) 同一カラムの複数登録を許可します。
    154         *
    155         * @param       attri  Attribute マーク処理属性
    156         */
    157        protected void addAttribute( final Attributes attri ) {
    158                viewMarker.addAttribute( attri );
    159        }
    160
    161        /**
    162         * 【TAG】コマンド(NEW,RENEW,RESET,REVIEW)をセットします。
    163         *
    164         * @og.tag
    165         * コマンドは,HTMLから(get/post)指定されますので,CMD_xxx で設定される
    166         * フィールド定数値のいづれかを、指定できます。
    167         *
    168         * @param       cmd コマンド(public static final 宣言されている文字列)
    169         * @see         <a href="../../../../constant-values.html#org.opengion.hayabusa.taglib.ViewMarkerTag.CMD_NEW">コマンド定数</a>
    170         */
    171        public void setCommand( final String cmd ) {
    172                String cmd2 = getRequestParameter( cmd );
    173                if( cmd2 != null && cmd2.length() > 0 ) { command = cmd2.toUpperCase(Locale.JAPAN); }
    174        }
    175
    176        /**
    177         * 【TAG】(通常使いません)requestから取得する ViewMarker に対応する Attributes オブジェクトの ID。
    178         *
    179         * @og.tag
    180         * ViewForm オブジェクトに、ViewMarker オブジェクトをこのキーより取得することにより、
    181         * カラムに対して、マーカー情報を付加して表示させる。
    182         * 初期値は、HybsSystem.VIEW_MARK_KEY です。
    183         *
    184         * @og.rev 3.1.4.0 (2003/04/18) 新規追加
    185         * @og.rev 3.5.6.3 (2004/07/12) {&#064;XXXX} 変数を使用できるように変更。
    186         * @og.rev 3.5.6.4 (2004/07/16) MARK_ID を付加して、他のid と混同しないようにします。
    187         * @og.rev 3.8.6.1 (2006/10/20) 初期値:null (editMarker を考慮)
    188         *
    189         * @param       id ViewMarker オブジェクトID
    190         */
    191        public void setViewMarkerId( final String id ) {
    192                viewMarkerId = nval( getRequestParameter( id ),null ) ;
    193        }
    194
    195        /**
    196         * 【TAG】マーカーのタイプが renderer かどうか[true/false]を指定します(初期値:true)。
    197         *
    198         * @og.tag
    199         * このMarker オブジェクトが、ViewMarker か、EditMarker かを指定します。
    200         * 内部的には、ViewMarker オブジェクトを構築しており、viewForm で、どちらにセット
    201         * するかを決めているだけです。
    202         * true にセットすると、従来からある、viewMarker(renderer) を指定します。
    203         * false は、editMarker として作用し、オブジェクトが書き込み可能な場合に表示されます。
    204         * 初期値は、true:renderer です。
    205         *
    206         * @og.rev 3.8.6.1 (2006/10/20) 新規追加
    207         *
    208         * @param       flag    マーカータイプ [true:renderer/false:editor]
    209         */
    210        public void setIsRenderer( final String flag ) {
    211                isRenderer = nval( getRequestParameter( flag ),isRenderer ) ;
    212        }
    213
    214        /**
    215         * シリアライズ用のカスタムシリアライズ書き込みメソッド
    216         *
    217         * @og.rev 4.0.0.0 (2006/09/31) 新規追加
    218         * @serialData 一部のオブジェクトは、シリアライズされません。
    219         *
    220         * @param       strm    ObjectOutputStreamオブジェクト
    221         * @throws IOException  入出力エラーが発生した場合
    222         */
    223        private void writeObject( final ObjectOutputStream strm ) throws IOException {
    224                strm.defaultWriteObject();
    225        }
    226
    227        /**
    228         * シリアライズ用のカスタムシリアライズ読み込みメソッド
    229         *
    230         * ここでは、transient 宣言された内部変数の内、初期化が必要なフィールドのみ設定します。
    231         *
    232         * @og.rev 4.0.0.0 (2006/09/31) 新規追加
    233         * @serialData 一部のオブジェクトは、シリアライズされません。
    234         *
    235         * @param       strm    ObjectInputStreamオブジェクト
    236         * @see #release2()
    237         * @throws IOException  シリアライズに関する入出力エラーが発生した場合
    238         * @throws ClassNotFoundException       クラスを見つけることができなかった場合
    239         */
    240        private void readObject( final ObjectInputStream strm ) throws IOException , ClassNotFoundException {
    241                strm.defaultReadObject();
    242                viewMarker = new ViewMarker_MARKER();
    243        }
    244
    245        /**
    246         * このオブジェクトの文字列表現を返します。
    247         * 基本的にデバッグ目的に使用します。
    248         *
    249         * @return このクラスの文字列表現
    250         */
    251        @Override
    252        public String toString() {
    253                return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
    254                                .println( "VERSION"                     ,VERSION                )
    255                                .println( "viewMarkerId"        ,viewMarkerId   )
    256                                .println( "command"                     ,command                )
    257                                .println( "Other..."    ,getAttributes().getAttribute() )
    258                                .fixForm().toString() ;
    259        }
    260}