    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.process.HybsProcess;
    020import org.opengion.fukurou.process.Process_DBParam;
    021import org.opengion.fukurou.util.StringUtil;
    022import org.opengion.fukurou.util.ToString;                                              // 6.1.1.0 (2015/01/17)
    023
    024import static org.opengion.fukurou.util.StringUtil.nval ;
    025
    026/**
    027 * MainProcess で実行される Processクラスを構築します。
    028 *
    029 * 親クラス(Process)は、org.opengion.fukurou.process パッケージの HybsProcess
    030 * インターフェースを実装したクラスの、Process_****.java の **** 部分を指定します。
    031 * 共通的な パラメータは、このTagクラスに実装しますが、それぞれ、個別に必要な
    032 * パラメータは、ParamTag を使用して指定します。
    033 * このタグは、MainProcess タグの内部にのみ、記述可能です。
    034 *
    035 * @og.formSample
    036 * ●形式：&lt;og:process processID="ZZZ" &gt;
    037 *             &lt;og:param key="AAA" value="111" /&gt;
    038 *         &lt;/og:process &gt;
    039 * ●body：あり(EVAL_BODY_BUFFERED:BODYを評価し、{&#064;XXXX} を解析します)
    040 *
    041 * ●Tag定義：
    042 *   &lt;og:process
    043 *       processID        ○【TAG】リクエスト情報 に登録するキーをセットします(必須)。
    044 *       caseKey            【TAG】このタグ自体を利用するかどうかの条件キーを指定します(初期値:null)
    045 *       caseVal            【TAG】このタグ自体を利用するかどうかの条件値を指定します(初期値:null)
    046 *       caseNN             【TAG】指定の値が、null/ゼロ文字列 でない場合(Not Null=NN)は、このタグは使用されます(初期値:判定しない)
    047 *       caseNull           【TAG】指定の値が、null/ゼロ文字列 の場合は、このタグは使用されます(初期値:判定しない)
    048 *       caseIf             【TAG】指定の値が、true/TRUE文字列の場合は、このタグは使用されます(初期値:判定しない)
    049 *       debug              【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
    050 *   &gt;   ... Body ...
    051 *   &lt;/og:process&gt;
    052 *
    053 * ●使用例
    054 *     一般的な変数の渡し方
    055 *   &lt;og:mainProcess &gt;
    056 *     &lt;og:process processID="DBReader" &gt;
    057 *        &lt;og:param key="dbid" value="FROM" /&gt;
    058 *        &lt;og:param key="sql"  value="select * from GE02" /&gt;
    059 *     &lt;/og:process &gt;
    060 *     &lt;og:process processID="DBWriter" &gt;
    061 *        &lt;og:param key="dbid"  value="TO" /&gt;
    062 *        &lt;og:param key="table" value="GE02" /&gt;
    063 *     &lt;/og:process &gt;
    064 *   &lt;/og:mainProcess &gt;
    065 *
    066 *     BODY 部に記述した変数の渡し方
    067 *     &lt;og:process processID="DBReader" &gt;
    068 *        &lt;og:param key="SQL" &gt;
    069 *              SELECT COUNT(*) FROM GEA03
    070 *              WHERE SYSTEM_ID=[SYSTEM_ID]
    071 *              AND   CLM=[CLM]
    072 *              AND   FGJ = '1'
    073 *        &lt;/og:param&gt;
    074 *     &lt;/og:process &gt;
    075 *
    076 * @og.group リアルバッチ系
    077 *
    078 * @version  4.0
    079 * @author       Kazuhiko Hasegawa
    080 * @since    JDK5.0,
    081 */
    082public class ProcessTag extends CommonTagSupport {
    083        /** このプログラムのVERSION文字列を設定します。   {@value} */
    084        private static final String VERSION = "6.4.2.0 (2016/01/29)" ;
    085        private static final long serialVersionUID = 642020160129L ;
    086
    087        private static final String PRCS = "org.opengion.fukurou.process.Process_" ;
    088
    089        private transient HybsProcess   process ;
    090        private String          processID       ;
    091
    092        /**
    093         * デフォルトコンストラクター
    094         *
    095         * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor.
    096         */
    097        public ProcessTag() { super(); }                // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
    098
    099        /**
    100         * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。
    101         *
    102         * @og.rev 4.3.1.1 (2008/09/04) DBParam 使用時は、専用の初期化メソッドを呼ぶ
    103         * @og.rev 6.3.4.0 (2015/08/01) caseKey,caseVal,caseNN,caseNull,caseIf 属性対応
    104         *
    105         * @return      後続処理の指示( EVAL_BODY_BUFFERED )
    106         */
    107        @Override
    108        public int doStartTag() {
    109                if( !useTag() ) { return SKIP_BODY ; }  // 6.3.4.0 (2015/08/01)
    110
    111                final MainProcessTag mainProcess = (MainProcessTag)findAncestorWithClass( this,MainProcessTag.class );
    112                if( mainProcess == null ) {
    113                        final String errMsg = "<b>" + getTagName() + "タグは、MainProcessTagの内側(要素)に記述してください。</b>"
    114                                                                + "processID=" + processID ;
    115                        throw new HybsSystemException( errMsg );
    116                }
    117
    118                // 4.3.1.1 (2008/09/04) DBParam 使用時は、専用の初期化メソッドを呼ぶ
    119                if( "DBParam".equals( processID ) ) {
    120                        process = new Process_DBParam();
    121                        ((Process_DBParam)process).setAppInfo( getApplicationInfo() );
    122                }
    123                else {
    124                        process = (HybsProcess)StringUtil.newInstance( PRCS + processID );
    125                }
    126
    127                mainProcess.addProcess( process );
    128
    129                return EVAL_BODY_BUFFERED ;             // Body を評価する
    130        }
    131
    132        /**
    133         * タグリブオブジェクトをリリースします。
    134         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
    135         *
    136         */
    137        @Override
    138        protected void release2() {
    139                super.release2();
    140                processID       = null;
    141                process         = null;
    142        }
    143
    144        /**
    145         * 【TAG】リクエスト情報 に登録するキーをセットします。
    146         *
    147         * @og.tag
    148         * processID は、org.opengion.fukurou.process.HybsProcess インターフェースを実装した
    149         * Process_**** クラスの **** を与えます。
    150         * これらは、HybsProcess インターフェースを継承したサブクラスである必要があります。
    151         * 標準で、org.opengion.fukurou.process 以下の Process_**** クラスが、Process_**** 宣言 と
    152         * して、定義されています。
    153         * 属性クラス定義の {@link org.opengion.fukurou.process.HybsProcess HybsProcess} を参照願います。
    154         * {@og.doc03Link process Process_**** クラス}
    155         *
    156         * @param       pid リクエスト情報に登録するキー
    157         * @see         org.opengion.fukurou.process.HybsProcess  HybsProcessのサブクラス
    158         */
    159        public void setProcessID( final String pid ) {
    160                processID = nval( getRequestParameter( pid ),processID ) ;
    161        }
    162
    163        /**
    164         * 親クラスに登録するキーをセットします。
    165         *
    166         * @param       key             登録するキー
    167         * @param       value   登録する値
    168         */
    169        protected void addParam( final String key,final String value ) {
    170                process.putArgument( key,value );
    171        }
    172
    173        /**
    174         * このオブジェクトの文字列表現を返します。
    175         * 基本的にデバッグ目的に使用します。
    176         *
    177         * @return このクラスの文字列表現
    178         * @og.rtnNotNull
    179         */
    180        @Override
    181        public String toString() {
    182                return ToString.title( this.getClass().getName() )
    183                                .println( "VERSION"                             ,VERSION                        )
    184                                .println( "processID"                   ,processID                      )
    185                                .fixForm().toString() ;
    186        }
    187}