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.plugin.daemon;
017
018import java.io.IOException;
019import java.util.Date;
020import java.util.Map;                                                                                   // 6.9.0.0 (2018/01/31) 新規追加
021
022import org.opengion.fukurou.system.OgRuntimeException;                  // 6.4.2.0 (2016/01/29)
023import org.opengion.fukurou.system.LogWriter;
024import org.opengion.fukurou.util.StringUtil;
025import org.opengion.fukurou.util.HybsTimerTask;
026// import org.opengion.fukurou.util.URLConnect;                                 // 6.9.0.0 (2018/01/31) URLConnect 廃止
027import org.opengion.fukurou.util.HttpConnect;                                   // 6.9.0.0 (2018/01/31) 新規追加
028// import org.opengion.fukurou.util.XHTMLTag;
029import static org.opengion.fukurou.system.HybsConst.CR;                 // 6.1.0.0 (2014/12/26)
030
031/**
032 * 【URLアクセス】
033 * 指定したパラメータでURLに接続します。
034 * このクラスは、HybsTimerTask を継承したタイマータスククラスです。
035 * startDaemon() がタイマータスクによって、呼び出されます。
036 *
037 * 接続のためのパラメータは以下です
038 * url           : 接続先URL(必須)
039 * proxyHost     : プロキシのホスト名
040 * proxyPort     : プロキシのポート番号
041 * useSystemUser : デフォルトのユーザ/パスワードを利用するか(初期値:true)
042 *                 trueの場合はSYSTEM:*********を利用します。
043 * authUserPass  : ユーザとパスワードをUSER:PASSWORDの形で記述
044 * keys          : リクエストパラメータのキー(CSV形式)
045 * vals                  : リクエストパラメータの値(CSV形式)
046 * debug         : 接続したページを受信して、ログに書き出します(初期値:false)
047 *
048 * 【廃止】method : POSTかGETを指定(初期値:GET) (6.9.0.0 (2018/01/31) 廃止)
049 *
050 * 接続エラー時のログはファイル(SYS_LOG_URL)に出力されます。
051 *
052 * @og.rev 4.3.4.4 (2009/01/01) 新規作成
053 * @og.group デーモン
054 *
055 * @version  4.0
056 * @author   Takahashi Masakazu
057 * @since    JDK5.0,
058 */
059public class Daemon_URLConnect extends HybsTimerTask {
060        /** このプログラムのVERSION文字列を設定します。 {@value} */
061        private static final String VERSION = "8.5.3.0 (2023/09/08)" ;
062
063//      private static final String DEFAULT_USER = "SYSTEM:MANAGER" ;
064        private static final String DEFAULT_USER = "admin:admin" ;                      // 6.9.0.1 (2018/02/05) この際、変更しておきます。
065        private static final int LOOP_COUNTER = 24;     // カウンタを24回に設定
066
067        private int loopCnt ;
068
069        private boolean debug   ;
070        private String  urlStr                  ;
071
072//      private URLConnect conn                 ;
073        private HttpConnect conn                ;                       // 6.9.0.0 (2018/01/31) URLConnect 廃止、HttpConnect に置き換えます。
074
075        /**
076         * デフォルトコンストラクター
077         *
078         * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor.
079         */
080        public Daemon_URLConnect() { super(); }         // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
081
082        /**
083         * このタイマータスクによって初期化されるアクションです。
084         * パラメータを使用した初期化を行います。
085         *
086         * @og.rev 6.2.5.1 (2015/06/12) StringUtil.nvalを、すべてのパラメータ取得時に適用します。
087         * @og.rev 6.9.0.0 (2018/01/31) URLConnect 廃止、HttpConnect に置き換えます。
088         * @og.rev 6.9.8.0 (2018/05/28) FindBugs:ローカル変数への無効な代入(methodのGET/POST廃止)
089         */
090        @Override
091        public void initDaemon() {
092                debug                                           = StringUtil.nval( getValue( "DEBUG"         ) , debug ) ;
093                urlStr                                          = StringUtil.nval( getValue( "url"           ) , null  );
094                final boolean useSystemUser     = StringUtil.nval( getValue( "useSystemUser" ) , true  );
095//              final String method                     = StringUtil.nval( getValue( "method"        ) , "GET" );               // 6.9.8.0 (2018/05/28) FindBugs
096                final String proxyHost          = StringUtil.nval( getValue( "proxyHost"     ) , null );
097                final int    proxyPort          = StringUtil.nval( getValue( "proxyPort"     ) , -1   );
098//              final String keys                       = StringUtil.nval( getValue( "keys"          ) , null );
099//              final String vals                       = StringUtil.nval( getValue( "vals"          ) , null );
100                final String authUserPass       = useSystemUser ? DEFAULT_USER
101                                                                                                        : StringUtil.nval( getValue( "authUserPass"  ) , null );
102
103//              final String urlEnc = XHTMLTag.urlEncode( keys,vals );
104
105                conn = new HttpConnect( urlStr,authUserPass );          // HttpConnect は、GET でも後付で引数を渡せます。
106
107                // POST の場合は、すべてのパラメータを、GETの場合は、既存のパラメータにプラスされます。
108                for( final Map.Entry<String,String> params : getParameter().entrySet() ) {
109                        conn.addRequestProperty( params.getKey() , params.getValue() );
110                }
111
112//              if( ! "POST".equals( method ) ) {
113//                      urlStr = XHTMLTag.addUrlEncode( urlStr,urlEnc );
114//              }
115//              conn = new URLConnect( urlStr,authUserPass );
116
117                if( proxyHost != null ) {
118                        conn.setProxy( proxyHost,proxyPort );
119                }
120
121//              if( "POST".equals(method) && keys != null && vals != null ) {
122//                      conn.setPostData( urlEnc );
123//              }
124        }
125
126        /**
127         * タイマータスクのデーモン処理の開始ポイントです。
128         *
129         * @og.rev 6.3.9.0 (2015/11/06) コンストラクタで初期化されていないフィールドを null チェックなしで利用している(findbugs)
130         * @og.rev 6.9.0.0 (2018/01/31) URLConnect 廃止、HttpConnect に置き換えます。
131         * @og.rev 8.5.3.0 (2023/09/08) URLデーモン実行されないバグを修正。(DEBUG=true 時しか、動作しなかった)
132         */
133        @Override
134        protected void startDaemon() {
135                if( loopCnt % LOOP_COUNTER == 0 ) {
136                        loopCnt = 1;
137                        System.out.println( toString() + " " + new Date()  + " " );
138                }
139                else {
140                        loopCnt++ ;
141                }
142
143                // 6.3.9.0 (2015/11/06) コンストラクタで初期化されていないフィールドを null チェックなしで利用している(findbugs)
144                if( conn == null ) {
145                        final String errMsg = "#initDaemon()を先に実行しておいてください。" ;
146                        throw new OgRuntimeException( errMsg );
147                }
148
149                // URLへのconnect及びデータ取得実行
150                try {
151//                      conn.connect();
152
153                        final String connData = conn.readData();                                // 8.5.3.0 (2023/09/08) Add
154                        if( debug ){
155                                // System.out.println( conn.readData() );
156                                final String debugMsg = "Daemon_URLConnect:url=[" + urlStr + "]" + CR
157//                                                              + conn.readData();                                      // 8.5.3.0 (2023/09/08) Modify
158                                                                + connData;
159                                LogWriter.log( debugMsg );
160                        }
161                }
162                catch( final IOException ex ) {
163                        System.out.println(ex);
164                        final String errMsg = "Daemon_URLConnect:データ取得中にエラーが発生しました。" + CR
165                                                + " url=[" + urlStr + "]" + CR
166                                                + ex;
167                        LogWriter.log( errMsg );
168                }
169//              finally {
170//                      // 6.3.9.1 (2015/11/27) null でないことがわかっている値の冗長な null チェック(findbugs)
171//                      conn.disconnect();
172//              }
173        }
174}