OSDN Git Service

Ver8.5.2.0
[opengion/opengionV8.git] / uap / webapps / gf / src / org / opengion / fukurou / fileexec / AppliExec.java
1 /*
2  * Copyright (c) 2017 The openGion Project.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
13  * either express or implied. See the License for the specific language
14  * governing permissions and limitations under the License.
15  */
16 package org.opengion.fukurou.fileexec;
17
18 import java.util.concurrent.ConcurrentMap;
19 import java.util.concurrent.ConcurrentHashMap;
20 import java.util.StringJoiner;
21 import java.util.Arrays;
22 import java.util.List;
23 import java.nio.file.Path;
24
25 import org.opengion.fukurou.util.StringUtil;
26
27 /**
28  * AppliExec は、アプリケーションの実行を行う共通の処理クラスです。
29  *
30  *<pre>
31  *
32  * ここでは、GE72の処理IDに応じた方法で実行します。
33  *
34  *</pre>
35  *
36  * @og.rev 7.0.0.0 (2017/07/07) 新規作成
37  *
38  * @version  7.0
39  * @author   Kazuhiko Hasegawa
40  * @since    JDK1.8,
41  */
42 public final class AppliExec {
43         private static final XLogger LOGGER= XLogger.getLogger( AppliExec.class.getSimpleName() );              // ログ出力
44
45         /** GE72 テーブルのカラム定義の enum */
46         public enum GE72 {
47 //      public static enum GE72 {
48                 /** GE72 テーブルから検索するカラム名 */
49 //              RUNTYPE,RUNPG,CLMS,PARAMS,DBID,TABLE_NAME,SHT_NOS,FILE_ENC,SKIP_CNT ;
50                 /** GE72 カラム */ EXECID,
51                 /** GE72 カラム */ RUNTYPE,
52                 /** GE72 カラム */ RUNPG,
53                 /** GE72 カラム */ CLMS,
54                 /** GE72 カラム */ PARAMS,
55                 /** GE72 カラム */ DBID,
56                 /** GE72 カラム */ TABLE_NAME,
57                 /** GE72 カラム */ SHT_NOS,
58                 /** GE72 カラム */ FILE_ENC,
59                 /** GE72 カラム */ SKIP_CNT ;                        // 7.2.1.0 (2020/03/13) EXECID 追加
60
61                 /** order by で、開始日時(ST_TIME)順に処理されるようにしておきます。 */
62                 private static final String FROM_WHERE = " from GE72 where SYSTEM_ID=? and EXECID=? and FGJ='1'" ;              // 1件のみのはず
63
64                 /** 列挙子のCSV形式文字列 のキャッシュ */
65                 public static final String SELECT ;
66                 static {
67                         final StringJoiner sj = new StringJoiner( "," , "select " , FROM_WHERE );
68                         Arrays.stream( values() ).forEachOrdered( v -> sj.add( v.name() ) );
69                         SELECT = sj.toString();
70                 }
71
72                 /** 列挙子の序数(カラムの並び順) */
73                 public final int NO ;
74
75                 /** private コンストラクター */
76                 GE72() { NO = ordinal(); }
77 //              private GE72() { NO = ordinal(); }
78         };
79
80         // GE72()のユニークキーは、systemId + execId だが、GE70()のユニークキーは、systemId + rsrv_no
81         private static final ConcurrentMap<String,AppliExec> APP_EXEC_MAP = new ConcurrentHashMap<>();
82
83         private final String[] ge72Data ;
84
85         private final RunExec runexec ;                 // これもキャッシュできますが、とりあえず動くまでは毎回作成します。
86
87         /**
88          * private コンストラクタ
89          *
90          * @og.rev 6.8.1.5 (2017/09/08) LOGGER.debug 情報の追加
91          *
92          * @param       systemId        システムID
93          * @param       execId          処理ID
94          */
95         private AppliExec( final String systemId , final String execId ) {
96                 LOGGER.debug( () -> "⑥ systemId=" + systemId + " , execId=" + execId );
97
98                 final List<String[]> cmdRow = DBUtil.dbQuery( GE72.SELECT , systemId , execId );
99
100                 if( cmdRow.isEmpty() ) {
101                         // MSG3001 = コマンドリストに、予約番号,取込ID,処理IDは必須です。[{0}]
102                         throw MsgUtil.throwException( "MSG3001" , "SYSTEM_ID=" + systemId + " , EXECID=" + execId );
103                 }
104
105                 ge72Data = cmdRow.get(0);               // 1件のみのはず
106                 final String type = ge72Data[GE72.RUNTYPE.NO];
107
108                 final String key ;
109                 switch( type ) {
110                         case "0" : key = "NONE";        break;                  // なにもしない
111                         case "1" : key = "DBIN";        break;                  // DB入力
112         //              case "2" : key = "PLSQL";       break;                  // PL/SQLコール
113                         case "3" : key = "BAT";         break;                  // BATファイルコール
114         //              case "4" : key = "JSP";         break;                  // JSPファイルコール(URLコネクション)
115                         default  : key = null;          break;                  // なにもしない(runTypeなしエラー)
116                 }
117
118                 if( key == null ) {
119                         // MSG3002 = RUNTYPEに対応するRunExec実装クラスがありません。[{0}]
120                         throw MsgUtil.throwException( "MSG3002" , "RUNTYPE=" + type + " , systemId=" + systemId + " , execId=" + execId );
121                 }
122
123                 runexec = (RunExec)StringUtil.newInstance( "org.opengion.fukurou.fileexec.RunExec_" + key );
124         }
125
126         /**
127          * システムIDと処理IDから、対応するAppliExecオブジェクトを返します。
128          *
129          * AppliExecオブジェクトを、動的に作成し、システムID + 予約番号 をキーにキャッシュします。
130          *
131          * 何らかの Exception が、throw された場合は、null を返します。
132          *
133          * @og.rev 7.2.1.0 (2020/03/13) APP_EXEC_MAPのキーを、systemId + rsrv_no に変更します。
134          *
135          * @param       systemId        システムID
136          * @param       rsrvNo          予約番号(文字列のまま扱います)
137          * @param       execId          処理ID
138          * @return      AppliDataオブジェクト(作成できなければ、null)
139          */
140 //      public static AppliExec newInstance( final String systemId , final String execId ) {
141         public static AppliExec newInstance( final String systemId , final String rsrvNo , final String execId ) {
142 //              final String mapKey = systemId + "_" + execId ;
143                 final String mapKey = systemId + "_" + rsrvNo ;
144
145                 return APP_EXEC_MAP.computeIfAbsent( mapKey , key -> new AppliExec( systemId,execId ) );
146         }
147
148         /**
149          * システムID + 予約番号 をキーにキャッシュからAppliExecオブジェクトを削除します。
150          *
151          * 新しい AppliExecオブジェクトを作成する際に、GE72 を再読み込みします。
152          * 何か定義変更を行った後、読み取りスレッドを停止すると同時に、キャッシュを削除すれば、
153          * 次回起動時には、DBの設定を再読み込みします。
154          *
155          * @og.rev 7.2.1.0 (2020/03/13) APP_EXEC_MAPのキーを、systemId + rsrv_no に変更します。
156          *
157          * @param       systemId        システムID
158          * @param       rsrvNo          予約番号(文字列のまま扱います)
159          */
160         public static void removeInstance( final String systemId , final String rsrvNo ) {
161                 final String mapKey = systemId + "_" + rsrvNo ;
162
163                 APP_EXEC_MAP.remove( mapKey );
164         }
165
166         /**
167          * GE72.RUNTYPE に基づいて、各種処理を実行します。
168          *
169          * @og.rev 6.8.1.5 (2017/09/08) LOGGER.debug 情報の追加
170          *
171          * @param       path 処理するファイルパス
172          * @return      処理件数(正は成功、マイナスは異常時の行番号)
173          */
174         public int exec( final Path path ) {
175                 return runexec.exec( path,ge72Data ) ;
176         }
177
178         /**
179          * GE72.RUNTYPE に基づいて、各種処理を実行します。
180          *
181          * @og.rev 7.2.1.0 (2020/03/13) 新規追加
182          *
183          * @param       path 処理するファイルパス
184          * @param       fgtkan 取込完了フラグ(0:取込なし , 1:処理中 , 2:済 , 7:デーモンエラー , 8:アプリエラー)
185          * @param       errMsg エラーメッセージ
186          */
187         public void endExec( final Path path , final String fgtkan , final String errMsg ) {
188                 runexec.endExec( path,ge72Data,fgtkan,errMsg ) ;
189         }
190 }