2 * Copyright (c) 2009 The openGion Project.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
16 package org.opengion.fukurou.business;
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)
23 * 配列型テーブルモデルをメインカーソルとした業務ロジックの構造を定義します。
25 * 配列型テーブルモデルについては、setTable( ArrayTableModel )によりセットします。
26 * 配列型テーブルモデルが定義されていない場合、エラーとなります。
28 * このクラスでは、以下に示すメソッドが呼び出されるタイミングのみを定義しています。
29 * メソッドの中身については、サブクラスでオーバーライドし実装して下さい。
31 * 処理が途中で中断される条件は、以下の3つです。
32 * ①各メソッドの戻り値がfalseの場合
33 * ②チェックメソッド(chk***())が全ての行で実行された後、エラーメッセージに"エラー"が含まれている場合
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の後に呼び出し)
45 * first() 変更区分に関わらず 最初の行でのみ呼び出し
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() 変更区分に関わらず 最後の行でのみ呼び出し
54 * ※ インデックス(row)とは、このArrayTableModel に持つ vals 配列の行のインデックスです。
55 * よって、オリジナルのDBTableModelの行番号ではありません。
57 * 8.0.2.0 (2021/11/30) 行単位ロジックチェックは廃止。
58 * befchk,inschk,modchk,delchk,allchk
59 * 必要であれば、fstchk() で、DataModel を取得して処理してください。
61 * @og.rev 5.1.1.0 (2009/12/01) 新規作成
65 * @author Hiroki Nakamura
68 public class BizLogic_TABLE extends AbstractBizLogic {
69 private boolean useLoop = true; // 6.8.5.0 (2018/01/09) ループを回すかどうかを引数で指定します。
74 * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor.
76 public BizLogic_TABLE() { super(); } // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
79 * 処理のメインロジックの前処理を記述します。
82 * このメソッド自体は、protected属性であるため、サブクラスから直接参照することができます。
83 * 但し、これは、各業務ロジックで直接参照することを想定したものではなく、BizLogicの
84 * メイン構造を拡張するサブクラスを定義する際に使用することを想定しています。
85 * (この想定がなければ、本来は、package privateにすべきです)
86 * このため、業務ロジックを各実装クラスでは直接参照しないで下さい。
88 @Override // AbstractBizLogic
89 protected void init() {
90 // Document empty method チェック対策
96 * このメソッド自体は、protected属性であるため、サブクラスから直接参照することができます。
97 * 但し、これは、各業務ロジックで直接参照することを想定したものではなく、BizLogicの
98 * メイン構造を拡張するサブクラスを定義する際に使用することを想定しています。
99 * (この想定がなければ、本来は、package privateにすべきです)
100 * このため、業務ロジックを各実装クラスでは直接参照しないで下さい。
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) 行単位ロジックチェックは廃止。
110 @Override // AbstractBizLogic
111 protected boolean main() {
112 final DataModel<String> table = getTable(); // 6.7.9.1 (2017/05/19)
114 if( table == null ) {
115 // 5.6.7.0 (2013/07/27) Exception を throw するとき、一旦、errMsg 変数にセットします。
116 final String errMsg = "配列型テーブルモデルがセットされていません。" ;
117 throw new OgRuntimeException( errMsg );
121 if( !fstchk() ) { return false; }
123 // final int rowLen = table.getRowCount(); // 6.8.5.0 (2018/01/09)
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; }
131 // final String modType = table.getModifyType( row );
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 ) ) {
141 // if( "A".equals( modType ) ) {
142 // if( !inschk( row ) ) { return false; }
144 // else if( "C".equals( modType ) ) {
145 // if( !modchk( row ) ) { return false; }
147 // else if( "D".equals( modType ) ) {
148 // if( !delchk( row ) ) { return false; }
151 // if( !allchk( row ) ) { return false; }
156 if( getKekka() >= ErrorMessage.NG ) { return false; }
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) ループの外に出します。
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; }
170 if( !befall( row ) ) { return false; }
172 final String modType = table.getModifyType( row );
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 ) ) {
182 // if( !befall( row ) ) { return false; }
184 // final String modType = table.getModifyType( row );
185 // if( "A".equals( modType ) ) {
186 // if( !insert( row ) ) { return false; }
188 // else if( "C".equals( modType ) ) {
189 // if( !modify( row ) ) { return false; }
191 // else if( "D".equals( modType ) ) {
192 // if( !delete( row ) ) { return false; }
195 // if( !allrow( row ) ) { return false; }
197 // // // 5.1.8.0 (2010/07/01) lastは行ループの中で呼び出し
198 // // if( row == table.getRowCount() - 1 ) {
199 // // if( !last() ) { return false; }
205 if( rowLen > 0 ) { // 6.8.5.0 (2018/01/09) ループの外に出します。
207 if( !last() ) { return false; }
214 * このクラスは、テーブルモデルが外部から指定されている必要があります。
216 * このメソッド自体は、protected属性であるため、サブクラスから直接参照することができます。
217 * 但し、これは、各業務ロジックで直接参照することを想定したものではなく、BizLogicの
218 * メイン構造を拡張するサブクラスを定義する際に使用することを想定しています。
219 * (この想定がなければ、本来は、package privateにすべきです)
220 * このため、業務ロジックを各実装クラスでは直接参照しないで下さい。
222 * @og.rev 8.0.2.0 (2021/11/30) protected → default 変更(サブクラスからのアクセスはない)
224 * @return テーブルモデルが外部から指定されている必要があるかどうか(常にtrue)
225 * @see AbstractBizLogic#isRequireTable()
228 // protected boolean isRequireTable() {
229 /* default */ boolean isRequireTable() {
234 * メインカーソルの一番初めで呼ばれるチェックロジックを定義します。
239 protected boolean fstchk() {
244 // * メインカーソルの各行(変更区分の各処理の前)で呼ばれるチェックロジックを定義します。
245 // * ここでは何も実装されていません。
247 // * @og.rev 8.0.2.0 (2021/11/30) 行単位ロジックチェックは廃止。
249 // * @param row 行番号(インデックス)
251 // * @return 処理が正常終了したか
253 // protected boolean befchk( final int row ) {
258 // * メインカーソルの各行(変更区分の各処理の後)で呼ばれるチェックロジックを定義します。
259 // * ここでは何も実装されていません。
261 // * @og.rev 8.0.2.0 (2021/11/30) 行単位ロジックチェックは廃止。
263 // * @param row 行番号(インデックス)
265 // * @return 処理が正常終了したか
267 // protected boolean allchk( final int row ) {
272 // * メインカーソルの各行(変更区分="A")で呼ばれるチェックロジックを定義します。
273 // * ここでは何も実装されていません。
275 // * @og.rev 8.0.2.0 (2021/11/30) 行単位ロジックチェックは廃止。
277 // * @param row 行番号(インデックス)
279 // * @return 処理が正常終了したか
281 // protected boolean inschk( final int row ) {
286 // * メインカーソルの各行(変更区分="C")で呼ばれるチェックロジックを定義します。
287 // * ここでは何も実装されていません。
289 // * @og.rev 8.0.2.0 (2021/11/30) 行単位ロジックチェックは廃止。
291 // * @param row 行番号(インデックス)
293 // * @return 処理が正常終了したか
295 // protected boolean modchk( final int row ) {
300 // * メインカーソルの各行(変更区分="D")で呼ばれるチェックロジックを定義します。
301 // * ここでは何も実装されていません。
303 // * @og.rev 8.0.2.0 (2021/11/30) 行単位ロジックチェックは廃止。
305 // * @param row 行番号(インデックス)
307 // * @return 処理が正常終了したか
309 // protected boolean delchk( final int row ) {
314 * メインカーソルの一番初めで呼ばれるロジックを定義します。
319 protected boolean first() {
324 * メインカーソルの一番最後で呼ばれるロジックを定義します。
329 protected boolean last() {
334 * メインカーソルの各行(変更区分の各処理の前)で呼ばれるロジックを定義します。
337 * @param row 行番号(インデックス)
341 protected boolean befall( final int row ) {
346 * メインカーソルの各行(変更区分の各処理の後)で呼ばれるロジックを定義します。
349 * @param row 行番号(インデックス)
353 protected boolean allrow( final int row ) {
358 * メインカーソルの各行(変更区分="A")で呼ばれるロジックを定義します。
361 * @param row 行番号(インデックス)
365 protected boolean insert( final int row ) {
370 * メインカーソルの各行(変更区分="C")で呼ばれるロジックを定義します。
373 * @param row 行番号(インデックス)
377 protected boolean modify( final int row ) {
382 * メインカーソルの各行(変更区分="D")で呼ばれるロジックを定義します。
385 * @param row 行番号(インデックス)
389 protected boolean delete( final int row ) {
396 * ループ処理を使用しない場合の処理速度向上のためのフラグです。
398 * ループ処理とは、引数に row番号を指定する関数です。
399 * 初期値は、true(ループを回す) です。
400 * false を指定すると、それらのメソッドは使用されず、fstchk()、first()、last() のみ呼び出されます。
402 * init() と main() は、AbstractBizLogic#exec() から呼ばれるため、通常通り呼び出されます。
404 * @og.rev 6.8.5.0 (2018/01/09) ループを回すかどうかを引数で指定します。
406 * @param useLoop ループを回すかどうか
408 protected final void setUseLoop( final boolean useLoop ) {
409 this.useLoop = useLoop;