OSDN Git Service

Ver8.5.2.0
[opengion/opengionV8.git] / uap / webapps / gf / src / org / opengion / fukurou / business / BizLogic_TABLE.java
1 /*
2  * Copyright (c) 2009 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.business;
17
18 import org.opengion.fukurou.util.ErrorMessage;
19 import org.opengion.fukurou.model.DataModel;                            // 6.7.9.1 (2017/05/19)
20 import org.opengion.fukurou.system.OgRuntimeException ;         // 6.4.2.0 (2016/01/29)
21
22 /**
23  * 配列型テーブルモデルをメインカーソルとした業務ロジックの構造を定義します。
24  *
25  * 配列型テーブルモデルについては、setTable( ArrayTableModel )によりセットします。
26  * 配列型テーブルモデルが定義されていない場合、エラーとなります。
27  *
28  * このクラスでは、以下に示すメソッドが呼び出されるタイミングのみを定義しています。
29  * メソッドの中身については、サブクラスでオーバーライドし実装して下さい。
30  *
31  * 処理が途中で中断される条件は、以下の3つです。
32  * ①各メソッドの戻り値がfalseの場合
33  * ②チェックメソッド(chk***())が全ての行で実行された後、エラーメッセージに"エラー"が含まれている場合
34  * ③実行時エラーが発生した場合
35  *
36  *  fstchk()              変更区分に関わらず   処理を始める前に呼び出し
37  *    8.0.2.0 (2021/11/30) 行単位ロジックチェックは廃止
38  * <del>useLoop == true
39  *        befchk( int row ) 変更区分に関わらず   各行について呼び出し(insert,modify,deleteの前に呼び出し)
40  *        inschk( int row ) 変更区分が"A"の場合 各行について呼び出し
41  *        modchk( int row ) 変更区分が"C"の場合 各行について呼び出し
42  *        delchk( int row ) 変更区分が"D"の場合 各行について呼び出し
43  *        allchk( int row ) 変更区分に関わらず   各行について呼び出し(insert,modify,deleteの後に呼び出し)
44  * </del>
45  *  first()                       変更区分に関わらず   最初の行でのみ呼び出し
46  *    useLoop == true
47  *      befall( int row ) 変更区分に関わらず   各行について呼び出し(insert,modify,deleteの前に呼び出し)
48  *      insert( int row ) 変更区分が"A"の場合 各行について呼び出し
49  *      modify( int row ) 変更区分が"C"の場合 各行について呼び出し
50  *      delete( int row ) 変更区分が"D"の場合 各行について呼び出し
51  *      allrow( int row ) 変更区分に関わらず   各行について呼び出し(insert,modify,deleteの後に呼び出し)
52  *  last()            変更区分に関わらず   最後の行でのみ呼び出し
53  *
54  * ※ インデックス(row)とは、このArrayTableModel に持つ vals 配列の行のインデックスです。
55  * よって、オリジナルのDBTableModelの行番号ではありません。
56  *
57  * 8.0.2.0 (2021/11/30) 行単位ロジックチェックは廃止。
58  *  befchk,inschk,modchk,delchk,allchk
59  *  必要であれば、fstchk() で、DataModel を取得して処理してください。
60  *
61  * @og.rev 5.1.1.0 (2009/12/01) 新規作成
62  * @og.group 業務ロジック
63  *
64  * @version 5.0
65  * @author Hiroki Nakamura
66  * @since JDK1.6,
67  */
68 public class BizLogic_TABLE extends AbstractBizLogic {
69         private boolean useLoop = true;                         // 6.8.5.0 (2018/01/09) ループを回すかどうかを引数で指定します。
70
71         /**
72          * デフォルトコンストラクター
73          *
74          * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor.
75          */
76         public BizLogic_TABLE() { super(); }            // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
77
78         /**
79          * 処理のメインロジックの前処理を記述します。
80          * (ここでは何もしません)
81          *
82          * このメソッド自体は、protected属性であるため、サブクラスから直接参照することができます。
83          * 但し、これは、各業務ロジックで直接参照することを想定したものではなく、BizLogicの
84          * メイン構造を拡張するサブクラスを定義する際に使用することを想定しています。
85          * (この想定がなければ、本来は、package privateにすべきです)
86          * このため、業務ロジックを各実装クラスでは直接参照しないで下さい。
87          */
88         @Override       // AbstractBizLogic
89         protected void init() {
90                 // Document empty method チェック対策
91         }
92
93         /**
94          * 処理のメインロジックを記述します。
95          *
96          * このメソッド自体は、protected属性であるため、サブクラスから直接参照することができます。
97          * 但し、これは、各業務ロジックで直接参照することを想定したものではなく、BizLogicの
98          * メイン構造を拡張するサブクラスを定義する際に使用することを想定しています。
99          * (この想定がなければ、本来は、package privateにすべきです)
100          * このため、業務ロジックを各実装クラスでは直接参照しないで下さい。
101          *
102          * @og.rev 5.1.8.0 (2010/07/01) first,lastは行ループの中で呼び出し
103          * @og.rev 5.6.7.0 (2013/07/27) Exception を throw するとき、一旦、errMsg 変数にセットします。
104          * @og.rev 6.7.9.1 (2017/05/19) protected ArrayTableModel を、private DataModel に変更します。
105          * @og.rev 6.8.5.0 (2018/01/09) first(),last() をループから出して、ループを回すかどうかを引数で指定します。
106          * @og.rev 8.0.2.0 (2021/11/30) 行単位ロジックチェックは廃止。
107          *
108          * @return 処理が正常終了したか
109          */
110         @Override       // AbstractBizLogic
111         protected boolean main() {
112                 final DataModel<String> table = getTable();             // 6.7.9.1 (2017/05/19)
113
114                 if( table == null ) {
115                         // 5.6.7.0 (2013/07/27) Exception を throw するとき、一旦、errMsg 変数にセットします。
116                         final String errMsg = "配列型テーブルモデルがセットされていません。" ;
117                         throw new OgRuntimeException( errMsg );
118                 }
119
120                 row = 0;
121                 if( !fstchk() ) { return false; }
122
123 //              final int rowLen = table.getRowCount();                 // 6.8.5.0 (2018/01/09)
124
125         //      8.0.2.0 (2021/11/30) 行単位ロジックチェックは廃止。
126         //      if( useLoop ) {                 // 6.8.5.0 (2018/01/09)
127 //      //              for( int i=0; i<table.getRowCount(); i++ ) {
128                 //      for( int i=0; i<rowLen; i++ ) {
129                 //              if( !befchk( row ) ) { return false; }
130
131                 //              final String modType = table.getModifyType( row );
132
133                 //              // 6.9.7.0 (2018/05/14) PMD These nested if statements could be combined
134                 //              if(    "A".equals( modType ) && !inschk( row )
135                 //                      || "C".equals( modType ) && !modchk( row )
136                 //                      || "D".equals( modType ) && !delchk( row )
137                 //                      || !allchk( row ) ) {
138                 //                      return false;
139                 //              }
140
141 //                              if( "A".equals( modType ) ) {
142 //                                      if( !inschk( row ) ) { return false; }
143 //                              }
144 //                              else if( "C".equals( modType ) ) {
145 //                                      if( !modchk( row ) ) { return false; }
146 //                              }
147 //                              else if( "D".equals( modType ) ) {
148 //                                      if( !delchk( row ) ) { return false; }
149 //                              }
150 //
151 //                              if( !allchk( row ) ) { return false; }
152
153                 //              row++;
154                 //      }
155         //      }
156                 if( getKekka() >= ErrorMessage.NG ) { return false; }
157
158         //      row = 0;
159                 final int rowLen = table.getRowCount();                         // 6.8.5.0 (2018/01/09)
160                 if( rowLen > 0 && !first() ) { return false; }          // 6.8.5.0 (2018/01/09) ループの外に出します。
161
162                 if( useLoop ) {                 // 6.8.5.0 (2018/01/09)
163 //      //              for( int i=0; i<table.getRowCount(); i++ ) {
164                         for( int i=0; i<rowLen; i++ ) {
165 //      //                      // 5.1.8.0 (2010/07/01) firstは行ループの中で呼び出し
166 //      //                      if( row == 0 ) {
167 //      //                              if( !first() ) { return false; }
168 //      //                      }
169
170                                 if( !befall( row ) ) { return false; }
171
172                                 final String modType = table.getModifyType( row );
173
174                                 // 6.9.7.0 (2018/05/14) PMD These nested if statements could be combined
175                                 if(        "A".equals( modType ) && !insert( row )
176                                         || "C".equals( modType ) && !modify( row )
177                                         || "D".equals( modType ) && !delete( row )
178                                         || !allrow( row ) ) {
179                                         return false;
180                                 }
181
182 //                              if( !befall( row ) ) { return false; }
183 //
184 //                              final String modType = table.getModifyType( row );
185 //                              if( "A".equals( modType ) ) {
186 //                                      if( !insert( row ) ) { return false; }
187 //                              }
188 //                              else if( "C".equals( modType ) ) {
189 //                                      if( !modify( row ) ) { return false; }
190 //                              }
191 //                              else if( "D".equals( modType ) ) {
192 //                                      if( !delete( row ) ) { return false; }
193 //                              }
194 //
195 //                              if( !allrow( row ) ) { return false; }
196 //
197 //      //                      // 5.1.8.0 (2010/07/01) lastは行ループの中で呼び出し
198 //      //                      if( row == table.getRowCount() - 1 ) {
199 //      //                              if( !last() ) { return false; }
200 //      //                      }
201                                 row++;
202                         }
203                 }
204
205                 if( rowLen > 0 ) {              // 6.8.5.0 (2018/01/09) ループの外に出します。
206                         row = rowLen-1;
207                         if( !last() ) { return false; }
208                 }
209
210                 return true;
211         }
212
213         /**
214          * このクラスは、テーブルモデルが外部から指定されている必要があります。
215          *
216          * このメソッド自体は、protected属性であるため、サブクラスから直接参照することができます。
217          * 但し、これは、各業務ロジックで直接参照することを想定したものではなく、BizLogicの
218          * メイン構造を拡張するサブクラスを定義する際に使用することを想定しています。
219          * (この想定がなければ、本来は、package privateにすべきです)
220          * このため、業務ロジックを各実装クラスでは直接参照しないで下さい。
221          *
222          * @og.rev 8.0.2.0 (2021/11/30) protected → default 変更(サブクラスからのアクセスはない)
223          *
224          * @return テーブルモデルが外部から指定されている必要があるかどうか(常にtrue)
225          * @see AbstractBizLogic#isRequireTable()
226          */
227         @Override
228 //      protected boolean isRequireTable() {
229         /* default */ boolean isRequireTable() {
230                 return true;
231         }
232
233         /**
234          * メインカーソルの一番初めで呼ばれるチェックロジックを定義します。
235          * ここでは何も実装されていません。
236          *
237          * @return 処理が正常終了したか
238          */
239         protected boolean fstchk() {
240                 return true;
241         }
242
243 //      /**
244 //       * メインカーソルの各行(変更区分の各処理の前)で呼ばれるチェックロジックを定義します。
245 //       * ここでは何も実装されていません。
246 //       *
247 //       * @og.rev 8.0.2.0 (2021/11/30) 行単位ロジックチェックは廃止。
248 //       *
249 //       * @param row 行番号(インデックス)
250 //       *
251 //       * @return 処理が正常終了したか
252 //       */
253 //      protected boolean befchk( final int row ) {
254 //              return true;
255 //      }
256
257 //      /**
258 //       * メインカーソルの各行(変更区分の各処理の後)で呼ばれるチェックロジックを定義します。
259 //       * ここでは何も実装されていません。
260 //       *
261 //       * @og.rev 8.0.2.0 (2021/11/30) 行単位ロジックチェックは廃止。
262 //       *
263 //       * @param row 行番号(インデックス)
264 //       *
265 //       * @return 処理が正常終了したか
266 //       */
267 //      protected boolean allchk( final int row ) {
268 //              return true;
269 //      }
270
271 //      /**
272 //       * メインカーソルの各行(変更区分="A")で呼ばれるチェックロジックを定義します。
273 //       * ここでは何も実装されていません。
274 //       *
275 //       * @og.rev 8.0.2.0 (2021/11/30) 行単位ロジックチェックは廃止。
276 //       *
277 //       * @param row 行番号(インデックス)
278 //       *
279 //       * @return 処理が正常終了したか
280 //       */
281 //      protected boolean inschk( final int row ) {
282 //              return true;
283 //      }
284
285 //      /**
286 //       * メインカーソルの各行(変更区分="C")で呼ばれるチェックロジックを定義します。
287 //       * ここでは何も実装されていません。
288 //       *
289 //       * @og.rev 8.0.2.0 (2021/11/30) 行単位ロジックチェックは廃止。
290 //       *
291 //       * @param row 行番号(インデックス)
292 //       *
293 //       * @return 処理が正常終了したか
294 //       */
295 //      protected boolean modchk( final int row ) {
296 //              return true;
297 //      }
298
299 //      /**
300 //       * メインカーソルの各行(変更区分="D")で呼ばれるチェックロジックを定義します。
301 //       * ここでは何も実装されていません。
302 //       *
303 //       * @og.rev 8.0.2.0 (2021/11/30) 行単位ロジックチェックは廃止。
304 //       *
305 //       * @param row 行番号(インデックス)
306 //       *
307 //       * @return 処理が正常終了したか
308 //       */
309 //      protected boolean delchk( final int row ) {
310 //              return true;
311 //      }
312
313         /**
314          * メインカーソルの一番初めで呼ばれるロジックを定義します。
315          * ここでは何も実装されていません。
316          *
317          * @return 処理が正常終了したか
318          */
319         protected boolean first() {
320                 return true;
321         }
322
323         /**
324          * メインカーソルの一番最後で呼ばれるロジックを定義します。
325          * ここでは何も実装されていません。
326          *
327          * @return 処理が正常終了したか
328          */
329         protected boolean last() {
330                 return true;
331         }
332
333         /**
334          * メインカーソルの各行(変更区分の各処理の前)で呼ばれるロジックを定義します。
335          * ここでは何も実装されていません。
336          *
337          * @param row 行番号(インデックス)
338          *
339          * @return 処理が正常終了したか
340          */
341         protected boolean befall( final int row ) {
342                 return true;
343         }
344
345         /**
346          * メインカーソルの各行(変更区分の各処理の後)で呼ばれるロジックを定義します。
347          * ここでは何も実装されていません。
348          *
349          * @param row 行番号(インデックス)
350          *
351          * @return 処理が正常終了したか
352          */
353         protected boolean allrow( final int row ) {
354                 return true;
355         }
356
357         /**
358          * メインカーソルの各行(変更区分="A")で呼ばれるロジックを定義します。
359          * ここでは何も実装されていません。
360          *
361          * @param row 行番号(インデックス)
362          *
363          * @return 処理が正常終了したか
364          */
365         protected boolean insert( final int row ) {
366                 return true;
367         }
368
369         /**
370          * メインカーソルの各行(変更区分="C")で呼ばれるロジックを定義します。
371          * ここでは何も実装されていません。
372          *
373          * @param row 行番号(インデックス)
374          *
375          * @return 処理が正常終了したか
376          */
377         protected boolean modify( final int row ) {
378                 return true;
379         }
380
381         /**
382          * メインカーソルの各行(変更区分="D")で呼ばれるロジックを定義します。
383          * ここでは何も実装されていません。
384          *
385          * @param row 行番号(インデックス)
386          *
387          * @return 処理が正常終了したか
388          */
389         protected boolean delete( final int row ) {
390                 return true;
391         }
392
393         /**
394          * ループを回すかどうかを指定します。
395          *
396          * ループ処理を使用しない場合の処理速度向上のためのフラグです。
397          *
398          * ループ処理とは、引数に row番号を指定する関数です。
399          * 初期値は、true(ループを回す) です。
400          * false を指定すると、それらのメソッドは使用されず、fstchk()、first()、last() のみ呼び出されます。
401          *
402          * init() と main() は、AbstractBizLogic#exec() から呼ばれるため、通常通り呼び出されます。
403          *
404          * @og.rev 6.8.5.0 (2018/01/09) ループを回すかどうかを引数で指定します。
405          *
406          * @param useLoop ループを回すかどうか
407          */
408         protected final void setUseLoop( final boolean useLoop ) {
409                 this.useLoop = useLoop;
410         }
411 }