    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.fukurou.process;
    017
    018import org.opengion.fukurou.db.ConnectionFactory;
    019import org.opengion.fukurou.util.Argument;
    020import org.opengion.fukurou.db.ApplicationInfo;
    021import org.opengion.fukurou.system.LogWriter;
    022
    023import java.util.Set ;
    024import java.util.Map ;
    025import java.util.LinkedHashMap ;
    026import java.net.InetAddress;
    027import java.net.UnknownHostException;
    028
    029import java.sql.Connection;
    030
    031/**
    032 * Process_DBParam は、他のプロセスへ共通のデータベース接続を割り当てる為の、
    033 * ParamProcess インターフェースの実装クラスです。
    034 *
    035 * DB接続 が必要な Process (DBCountFilter、DBMerge、DBReader、DBWriterなど)を
    036 * 使用して処理する場合に、接続を指定することができます。
    037 * DBID(接続先) は、Process_DBParam の -configFile で指定する DBConfig.xml ファイルを使用します。
    038 *
    039 * @og.formSample
    040 *  Process_DBParam -infoUSER=C00000 -infoPGID=GE1234 -configFile=DBConfig.xml
    041 *
    042 *   [ -infoUSER=実行ユーザー       ] ： DB接続履歴取得用の実行ユーザー(例:C00000)
    043 *   [ -infoPGID=実行プログラムID   ] ： DB接続履歴取得用の実行プログラムID(例:GE1234)
    044 *   [ -configFile=実行プログラムID ] ： DB接続情報設定 XMLファイル(例:DBConfig.xml)
    045 *   [ -display=[false/true]        ] ： trueは、接続状況を詳細表示します(初期値:false)
    046 *
    047 * @og.rev 4.0.0.0 (2007/11/22) DBConfig.xml による DBID(接続先)指定に変更。
    048 * @og.rev 6.3.1.0 (2015/06/28) 履歴取得用パラメータの必須解除
    049 *
    050 * @version  4.0
    051 * @author   Kazuhiko Hasegawa
    052 * @since    JDK5.0,
    053 */
    054public class Process_DBParam extends AbstractProcess implements ParamProcess {
    055        /** 実行しているサーバーの名称 */
    056        private static final String HOST_NAME ;
    057        /** 実行しているサーバーのIPアドレス */
    058        private static final String HOST_ADRS ;
    059
    060        private ApplicationInfo appInfo ;
    061        private boolean                 display ;                       // 表示しない
    062
    063        // 5.3.4.0 (2011/04/01) bulkData 関係のメソッドを追加
    064        private Set<String> bulkData ;
    065
    066        /** staticイニシャライザ後、読み取り専用にするので、ConcurrentHashMap を使用しません。 */
    067        private static final Map<String,String> MUST_PROPARTY   ;       // ［プロパティ］必須チェック用 Map
    068        /** staticイニシャライザ後、読み取り専用にするので、ConcurrentHashMap を使用しません。 */
    069        private static final Map<String,String> USABLE_PROPARTY ;       // ［プロパティ］整合性チェック Map
    070
    071        static {
    072                String dmnHost ;
    073                String dnmAdrs ;
    074                try {
    075                        final InetAddress address = InetAddress.getLocalHost();
    076                        dmnHost = address.getHostName() ;
    077                        dnmAdrs = address.getHostAddress() ;
    078                }
    079                catch( final UnknownHostException ex ) {
    080                        dmnHost = "Unknown";
    081                        dnmAdrs = "Unknown";
    082                }
    083                HOST_NAME = dmnHost;
    084                HOST_ADRS = dnmAdrs;
    085        }
    086
    087        static {
    088                MUST_PROPARTY = new LinkedHashMap<>();
    089                // 6.3.1.0 (2015/06/28) 必須から外します。
    090
    091                USABLE_PROPARTY = new LinkedHashMap<>();
    092                USABLE_PROPARTY.put( "infoUSER" , "DB接続履歴取得用の実行ユーザー" );
    093                USABLE_PROPARTY.put( "infoPGID" , "DB接続履歴取得用の実行プログラムID" );
    094                USABLE_PROPARTY.put( "configFile", "DB接続情報設定 XMLファイル" );
    095                USABLE_PROPARTY.put( "display"  , "trueは、接続状況を詳細表示します(初期値:false)" );            // 6.3.1.0 (2015/06/28) 追加
    096        }
    097
    098        /**
    099         * デフォルトコンストラクター。
    100         * このクラスは、動的作成されます。デフォルトコンストラクターで、
    101         * super クラスに対して、必要な初期化を行っておきます。
    102         *
    103         */
    104        public Process_DBParam() {
    105                super( "org.opengion.fukurou.process.Process_DBParam",MUST_PROPARTY,USABLE_PROPARTY );
    106        }
    107
    108        /**
    109         * ApplicationInfoオブジェクトを登録します。
    110         * これは、通常の初期処理ではなく、タグリブから起動される場合のみ
    111         * 呼ばれるメソッドです。
    112         * 初期処理メソッド(init)では、appInfo がセット済みの場合は、
    113         * ConnectionFactoryの初期化を行いません。
    114         *
    115         * @og.rev 4.3.1.1 (2008/09/04) 新規追加(taglib呼出専用)
    116         *
    117         * @param   appInfo アプリ情報オブジェクト
    118         */
    119        public void setAppInfo( final ApplicationInfo appInfo ) {
    120                this.appInfo = appInfo;
    121        }
    122
    123        /**
    124         * プロセスの初期化を行います。初めに一度だけ、呼び出されます。
    125         * 初期処理(ファイルオープン、ＤＢオープン等)に使用します。
    126         *
    127         * @og.rev 4.3.1.1 (2008/09/04) taglib呼出時は、ConnectionFactoryの初期化を行わない
    128         * @og.rev 6.3.1.0 (2015/06/28) display属性の追加
    129         *
    130         * @param   paramProcess データベースの接続先情報などを持っているオブジェクト
    131         */
    132        @Override
    133        public void init( final ParamProcess paramProcess ) {
    134                final Argument arg = getArgument();                     // 6.3.1.0 (2015/06/28) display属性の追加のため。
    135
    136                // 4.3.1.1 (2008/09/04) taglib呼出時は、ConnectionFactoryの初期化を行わない
    137                if( appInfo == null ) {
    138
    139                        final String infoUSER   = arg.getProparty( "infoUSER" );                // DB接続履歴取得用の実行ユーザー
    140                        final String infoPGID   = arg.getProparty( "infoPGID" );                // DB接続履歴取得用の実行プログラムID
    141                        final String configFile = arg.getProparty( "configFile" );              // DB接続情報設定 XMLファイル
    142
    143                        appInfo = new ApplicationInfo();
    144                        // JavaVM 起動時のユーザーID,IPアドレス,ホスト名をセットします。
    145                        appInfo.setClientInfo( infoUSER,HOST_ADRS,HOST_NAME );
    146
    147                        // 画面ID,操作,プログラムID
    148                        appInfo.setModuleInfo( infoPGID,null,"fukurou" );
    149
    150                        // DBID接続情報の取得先の設定
    151                        ConnectionFactory.init( null,configFile );
    152                }
    153
    154                display = arg.getProparty( "display",display );         // 6.3.1.0 (2015/06/28)
    155        }
    156
    157        /**
    158         * 指定の 接続先ID に対する コネクションを返します。
    159         *
    160         * @param       key     接続先ID
    161         *
    162         * @return      コネクション
    163         * @throws      RuntimeException DB接続先が未設定の場合
    164         * @og.rtnNotNull
    165         */
    166        @Override
    167        public Connection getConnection( final String key ) {
    168                return ConnectionFactory.connection( key,appInfo );
    169        }
    170
    171        /**
    172         * 検索した結果が設定された Set オブジェクトを設定します。
    173         *
    174         * @og.rev 5.3.4.0 (2011/04/01) 新規追加
    175         *
    176         * @param       bulkData        検索した結果が設定されたSetオブジェクト
    177         */
    178        @Override
    179        public void setBulkData( final Set<String> bulkData ) {
    180                this.bulkData = bulkData;
    181        }
    182
    183        /**
    184         * 検索した結果が設定された Set オブジェクトを返します。
    185         *
    186         * @og.rev 5.3.4.0 (2011/04/01) 新規追加
    187         *
    188         * @return      検索した結果が設定された Setオブジェクト
    189         */
    190        @Override
    191        public Set<String> getBulkData() {
    192                return bulkData ;
    193        }
    194
    195        /**
    196         * プロセスの終了を行います。最後に一度だけ、呼び出されます。
    197         * 終了処理(ファイルクローズ、ＤＢクローズ等)に使用します。
    198         *
    199         * @og.rev 4.0.0.0 (2007/11/27) commit,rollback,remove 処理を追加
    200         *
    201         * @param   isOK トータルで、OKだったかどうか[true:成功/false:失敗]
    202         */
    203        @Override
    204        public void end( final boolean isOK ) {
    205                // 何もありません。(PMD エラー回避)
    206        }
    207
    208        /**
    209         * プロセスの処理結果のレポート表現を返します。
    210         * 処理プログラム名、入力件数、出力件数などの情報です。
    211         * この文字列をそのまま、標準出力に出すことで、結果レポートと出来るような
    212         * 形式で出してください。
    213         *
    214         * @return   処理結果のレポート
    215         */
    216        @Override
    217        public String report() {
    218
    219                final String report = "[" + getClass().getName() + "]" + CR
    220                                                        + ConnectionFactory.information( display ) ;
    221
    222                return report ;
    223        }
    224
    225        /**
    226         * このクラスの使用方法を返します。
    227         *
    228         * @return      このクラスの使用方法
    229         * @og.rtnNotNull
    230         */
    231        @Override
    232        public String usage() {
    233                final StringBuilder buf = new StringBuilder( BUFFER_LARGE )
    234                        .append( "Process_DBParam は、他のプロセスへ共通のデータベース接続を割り当てる為の、"        ).append( CR )
    235                        .append( "ParamProcess インターフェースの実装クラスです。"                                                               ).append( CR )
    236                        .append( CR )
    237                        .append( "DB接続 が必要な Process (DBCountFilter、DBMerge、DBReader、DBWriterなど)を"       ).append( CR )
    238                        .append( "使用して処理する場合に、接続を指定することができます。"                                          ).append( CR )
    239                        .append( "DBID(接続先) は、-configFile で指定する DBConfig.xml ファイルを使用します。"       ).append( CR )
    240                        .append( CR )
    241                        .append( "引数文字列中に空白を含む場合は、ダブルコーテーション(\"\") で括って下さい。"    ).append( CR )
    242                        .append( "引数文字列の 『=』の前後には、空白は挟めません。必ず、-key=value の様に"           ).append( CR )
    243                        .append( "繋げてください。"                                                                                                                             ).append( CR )
    244                        .append( CR )
    245                        .append( "[ -infoUSER=実行ユーザー       ] ： DB接続履歴取得用の実行ユーザー(例:C00000)"              ).append( CR )
    246                        .append( "[ -infoPGID=実行プログラムID   ] ： DB接続履歴取得用の実行プログラムID(例:GE1234)"    ).append( CR )
    247                        .append( "[ -configFile=実行プログラムID ] ： DB接続情報設定 XMLファイル(例:DBConfig.xml)"         ).append( CR )
    248                        .append( "[ -display=[false/true]        ] ： trueは、接続状況を詳細表示します(初期値:false)"     ).append( CR )
    249                        .append( CR ).append( CR )
    250                        .append( getArgument().usage() ).append( CR );
    251
    252                return buf.toString();
    253        }
    254
    255        /**
    256         * このクラスは、main メソッドから実行できません。
    257         *
    258         * @param       args    コマンド引数配列
    259         */
    260        public static void main( final String[] args ) {
    261                LogWriter.log( new Process_DBParam().usage() );
    262        }
    263}