001package org.opengion.hayabusa.queue;
002
003// import org.apache.commons.lang3.StringUtils;                                 // 7.0.6.0 (2019/10/07)
004import org.opengion.fukurou.db.ConnectionFactory;
005import org.opengion.fukurou.db.DBFunctionName;
006import org.opengion.fukurou.db.DBUtil;
007import org.opengion.fukurou.db.Transaction;
008import org.opengion.fukurou.db.TransactionReal;
009// import org.opengion.fukurou.util.ApplicationInfo;
010import org.opengion.fukurou.db.ApplicationInfo;                                 // 7.0.6.0 (2019/10/07) util → db に移動のため
011import org.opengion.hayabusa.common.HybsSystem;
012import org.opengion.fukurou.system.DateSet;                                             // 7.0.6.0 (2019/10/07) HybsSystem.getDate( String )
013
014/**
015 * キュー処理用のDBアクセスクラス
016 * キューの受信と送信処理で、
017 * データベースにアクセスして処理を行います。
018 *
019 * 実際のMQ,SQSとの通信そのものはfukurouで行います。
020 *
021 * @og.group メッセージ連携
022 *
023 * @og.rev 5.10.15.2 (2019/09/20) 新規作成
024 *
025 * @version 5
026 * @author oota
027 * @since JDK7
028 *
029 */
030public class DBAccessQueue {
031        private static final String DYSET_YMD  = "yyyyMMddHHmmss";
032//      private static ApplicationInfo appInfo ;
033        private static final String DBID = HybsSystem.sys( "RESOURCE_DBID" );
034        private final String SYSTEM_ID;
035        private final String USRSET;
036        private final String PGUPD;
037        private final String DMN_NAME;
038        private final ApplicationInfo appInfo ;                 // 7.2.9.4 (2020/11/20) PMD:Possible unsafe assignment to a non-final static field in a constructor.
039
040        /** 処理中 {@value} */
041        public static final String  FGKAN_PROCESS = "2";
042        /** 完了 {@value} */
043        public static final String  FGKAN_END = "3";
044        /** エラー{@value} */
045        public static final String  FGKAN_ERROR = "4";
046
047        /** コネクションにアプリケーション情報を追記するかどうか指定 */
048        // パラメータ編集必要
049        private static final boolean USE_DB_APPLICATION_INFO  = HybsSystem.sysBool( "USE_DB_APPLICATION_INFO" ) ;
050
051        /**
052         * コンストラクター
053         * 初期処理を行います。
054         *
055         * @param systemid システムID
056         * @param usrset ユーザID
057         * @param prpupd プログラムID
058         * @param dmnName デーモン名
059         */
060        public DBAccessQueue(final String systemid, final String usrset, final String prpupd, final String dmnName) {
061                SYSTEM_ID = systemid;
062//              USRSET = StringUtils.defaultString(usrset, "UNNONE") ;                  // 7.0.6.0 (2019/10/07)
063//              PGUPD  = StringUtils.defaultString( prpupd, "UNNONE" ) ;                // 7.0.6.0 (2019/10/07)
064//              DMN_NAME = StringUtils.defaultString( dmnName, "UNNONE" ) ;             // 7.0.6.0 (2019/10/07)
065                USRSET          = usrset  == null ? "UNNONE" : usrset ;                         // "" の時、"" を返す必要がある。StringUtil.nval は、"" と null を同値に扱う
066                PGUPD           = prpupd  == null ? "UNNONE" : prpupd ;
067                DMN_NAME        = dmnName == null ? "UNNONE" : dmnName ;
068
069                if (USE_DB_APPLICATION_INFO) {
070                        appInfo = new ApplicationInfo();
071
072                        // ユーザーID,IPアドレス,ホスト名
073                        appInfo.setClientInfo(USRSET, HybsSystem.HOST_ADRS, HybsSystem.HOST_NAME);
074                        // 画面ID,操作,プログラムID
075                        appInfo.setModuleInfo("DBAccessQueue", null, DMN_NAME);
076                }
077                else {
078                        appInfo = null;
079                }
080        }
081
082        /**
083         * GE65検索
084         * GE65の処理対象リストを取得します。
085         *
086         * @return 処理対象リスト
087         */
088        public String[][] selectGE65() {
089                final String sql = "SELECT A.YKNO, A.QUEUEID, A.MESSAGE, A.SFDUPID, B.QUESYU, B.JMSURL FROM GE66 A"
090                                + " INNER JOIN GE65 B ON A.SYSTEM_ID = B.SYSTEM_ID AND A.QUEUEID = B.QUEUEID AND B.FGJ = '1'"
091                                + " WHERE A.SYSTEM_ID = ? AND A.FGKAN = '1' AND A.FGJ = '1'";
092
093                // 7.2.9.4 (2020/11/20) PMD:Consider simply returning the value vs storing it in local variable 'vals'
094                return DBUtil.dbExecute(sql, new String[] {SYSTEM_ID}, appInfo, DBID);
095//              final String[][] vals = DBUtil.dbExecute(sql, new String[] {SYSTEM_ID}, appInfo, DBID);
096//              return vals;
097        }
098
099        /**
100         * エラー状態に更新
101         * 完了フラグをエラー状態に更新して、
102         * エラー情報を格納します。
103         *
104         * @param ykno 要求番号
105         * @param errMsg エラーメッセージ
106         */
107        public void updateGE66Error(final String ykno, final String errMsg) {
108                final String updSql = "UPDATE GE66 SET FGKAN = ?, ERRMSG = ?"
109                                + "WHERE SYSTEM_ID = ? AND FGJ = '1' AND YKNO = ?";
110                DBUtil.dbExecute(updSql, new String[] {
111                                FGKAN_ERROR, errMsg, SYSTEM_ID, ykno
112                }, appInfo, DBID);
113        }
114
115        /**
116         * 完了フラグの更新
117         * 完了フラグを指定された値に更新します。
118         *
119         * @param ykno 要求番号
120         * @param fgkan 完了フラグ
121         */
122        public void updateGE66(final String ykno, final String fgkan) {
123//              final String dyset = HybsSystem.getDate(DYSET_YMD);
124                final String dyset = DateSet.getDate(DYSET_YMD);                        // 7.0.6.0 (2019/10/07)
125                final String updSql = "UPDATE GE66 SET FGKAN = ?, DYUPD = ?, USRUPD = ?, PGUPD = ?"
126                                + "WHERE SYSTEM_ID = ? AND FGJ = '1' AND YKNO = ?";
127                DBUtil.dbExecute(updSql, new String[] {
128                                fgkan, dyset, USRSET, PGUPD, SYSTEM_ID, ykno}, appInfo, DBID);
129        }
130        /**
131         * 受信管理データ取得
132         * 受信管理テーブルから、キューIDとbizlogic名を取得します。
133         *
134         * @return 受信管理リスト
135         */
136        public String[][] setlectGE67() {
137                // 対象 キュー名(グループ名)とbizlogic名の取得処理
138                final String sql = "SELECT QUEUEID, BIZLOGICID FROM GE67"
139                                + " WHERE SYSTEM_ID = ? AND FGJ = '1'";
140
141                // 7.2.9.4 (2020/11/20) PMD:Consider simply returning the value vs storing it in local variable 'vals'
142                return DBUtil.dbExecute(sql, new String[] {SYSTEM_ID}, appInfo, DBID);
143//              final String[][] vals = DBUtil.dbExecute(sql, new String[] {SYSTEM_ID}, appInfo, DBID);
144//              return vals;
145        }
146
147        /**
148         * 処理番号生成
149         * GE68_SEQUENCEからシーケンス番号を生成します。
150         *
151         * @og.rev 7.0.6.4 (2019/11/29) TransactionRealのclose漏れ対応
152         *
153         * @return 処理番号
154         */
155        public String generateSyoriNo() {
156                String syoriNo = "";
157
158//              final Transaction tran = new TransactionReal( appInfo );
159
160                // 処理番号生成
161                try( Transaction tran = new TransactionReal( appInfo ) ) {                              // 7.0.6.4 (2019/11/29) try-with-resources文
162//              try {
163                        final DBFunctionName dbName = DBFunctionName.getDBName( ConnectionFactory.getDBName( DBID ) );
164                        syoriNo = Integer.toString(dbName.getSequence("GE68S01", tran, DBID));
165//              }finally {
166//                      tran.close();
167                }
168
169                return syoriNo;
170        }
171
172        /**
173         * GE68(キュー受信結果テーブル)更新
174         * キュー受信結果テーブルを指定された完了状態に更新します。
175         *
176         * @param syno 処理番号
177         * @param fgkan 完了フラグ
178         */
179        public void updateGE68(final String syno,  final String fgkan) {
180//              final String dyset = HybsSystem.getDate(DYSET_YMD);
181                final String dyset = DateSet.getDate(DYSET_YMD);                        // 7.0.6.0 (2019/10/07)
182
183                final String sql = "UPDATE GE68 SET FGKAN = ?, DYUPD = ?, USRUPD = ?, PGUPD = ?"
184                                + "WHERE FGJ = '1'"
185                                + " AND SYSTEM_ID = ?"
186                                + " AND SYNO = ?";
187
188                final String[] data = new String[] {fgkan, dyset, USRSET, PGUPD, SYSTEM_ID, syno};
189
190                // sql実行
191                DBUtil.dbExecute(sql, data, appInfo, DBID);
192        }
193
194        /**
195         *  GE68(キュー受信結果テーブル)登録
196         * キュー受信結果テーブルに受信データを登録します。
197         *
198         * @param queueNm キュー名
199         * @param syno 処理NO
200         * @param bizlogicId ビズロジックID
201         * @param messageText メッセージ
202         */
203        public void insertGE68(final String queueNm, final String syno, final String bizlogicId
204                        ,final String messageText) {
205//              final String dyset = HybsSystem.getDate(DYSET_YMD);
206                final String dyset = DateSet.getDate(DYSET_YMD);                        // 7.0.6.0 (2019/10/07)
207
208                final String sql = "INSERT INTO GE68(SYSTEM_ID, QUEUEID, SYNO, BIZLOGICID, MESSAGE, FGKAN, FGJ,"
209                                + "DYSET, DYUPD, USRSET, USRUPD, PGSET,  PGUPD)"
210                                + " VALUES(?,?,?,?,?,?,'1'"
211                                + ",?,?,?,?,?,?)";
212
213                final String[] data = new String[] {
214                                SYSTEM_ID, queueNm, syno, bizlogicId, messageText, DBAccessQueue.FGKAN_PROCESS
215                                ,dyset, dyset, USRSET,  USRSET, PGUPD, PGUPD
216                };
217
218                // sql実行
219                DBUtil.dbExecute(sql,  data, appInfo, DBID);
220        }
221
222        /**
223         * GE68(キュー受信結果テーブル)エラー更新
224         * キュー受信結果テーブルをエラー状態に更新します。
225         *
226         * @param syoriNo 処理NO
227         * @param errMsg エラーメッセージ
228         */
229        public void updateGE68Error(final String syoriNo, final String errMsg) {
230                // エラーテーブルに登録
231//              final String dyset = HybsSystem.getDate(DYSET_YMD);
232                final String dyset = DateSet.getDate(DYSET_YMD);                        // 7.0.6.0 (2019/10/07)
233
234                final String sql = "UPDATE GE68"
235                                + " SET ERRMSG = ?, FGKAN = ?"
236                                + " ,DYUPD = ?, USRUPD = ?, PGUPD = ?"
237                                + " WHERE SYSTEM_ID = ? AND FGJ = '1' AND SYNO = ? ";
238
239                final String[] data = new String[] {
240                                  errMsg                                                        // エラーメッセージ
241                                , DBAccessQueue.FGKAN_ERROR
242                                , dyset
243                                , USRSET
244                                , PGUPD
245                                , SYSTEM_ID
246                                , syoriNo
247                };
248
249                // sql実行
250                DBUtil.dbExecute(sql, data, appInfo, DBID);
251        }
252}