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.fukurou.business; 017 018import org.opengion.fukurou.util.ErrorMessage; 019import org.opengion.fukurou.model.DataModel; // 6.7.9.1 (2017/05/19) 020import org.opengion.fukurou.system.OgRuntimeException ; // 6.4.2.0 (2016/01/29) 021 022/** 023 * 配列型テーブルモデルをメインカーソルとした業務ロジックの構造を定義します。 024 * 025 * 配列型テーブルモデルについては、setTable( ArrayTableModel )によりセットします。 026 * 配列型テーブルモデルが定義されていない場合、エラーとなります。 027 * 028 * このクラスでは、以下に示すメソッドが呼び出されるタイミングのみを定義しています。 029 * メソッドの中身については、サブクラスでオーバーライドし実装して下さい。 030 * 031 * 処理が途中で中断される条件は、以下の3つです。 032 * ①各メソッドの戻り値がfalseの場合 033 * ②チェックメソッド(chk***())が全ての行で実行された後、エラーメッセージに"エラー"が含まれている場合 034 * ③実行時エラーが発生した場合 035 * 036 * fstchk() 変更区分に関わらず 処理を始める前に呼び出し 037 * befchk( int row ) 変更区分に関わらず 各行について呼び出し(insert,modify,deleteの前に呼び出し) 038 * inschk( int row ) 変更区分が"A"の場合 各行について呼び出し 039 * modchk( int row ) 変更区分が"C"の場合 各行について呼び出し 040 * delchk( int row ) 変更区分が"D"の場合 各行について呼び出し 041 * allchk( int row ) 変更区分に関わらず 各行について呼び出し(insert,modify,deleteの後に呼び出し) 042 * first() 変更区分に関わらず 最初の行でのみ呼び出し 043 * befall( int row ) 変更区分に関わらず 各行について呼び出し(insert,modify,deleteの前に呼び出し) 044 * insert( int row ) 変更区分が"A"の場合 各行について呼び出し 045 * modify( int row ) 変更区分が"C"の場合 各行について呼び出し 046 * delete( int row ) 変更区分が"D"の場合 各行について呼び出し 047 * allrow( int row ) 変更区分に関わらず 各行について呼び出し(insert,modify,deleteの後に呼び出し) 048 * last() 変更区分に関わらず 最後の行でのみ呼び出し 049 * 050 * ※ インデックス(row)とは、このArrayTableModel に持つ vals 配列の行のインデックスです。 051 * よって、オリジナルのDBTableModelの行番号ではありません。 052 * 053 * @og.rev 5.1.1.0 (2009/12/01) 新規作成 054 * @og.group 業務ロジック 055 * 056 * @version 5.0 057 * @author Hiroki Nakamura 058 * @since JDK1.6, 059 */ 060public class BizLogic_TABLE extends AbstractBizLogic { 061 private boolean useLoop = true; // 6.8.5.0 (2018/01/09) ループを回すかどうかを引数で指定します。 062 063 /** 064 * デフォルトコンストラクター 065 * 066 * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor. 067 */ 068 public BizLogic_TABLE() { super(); } // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。 069 070 /** 071 * 処理のメインロジックの前処理を記述します。 072 * (ここでは何もしません) 073 * 074 * このメソッド自体は、protected属性であるため、サブクラスから直接参照することができます。 075 * 但し、これは、各業務ロジックで直接参照することを想定したものではなく、BizLogicの 076 * メイン構造を拡張するサブクラスを定義する際に使用することを想定しています。 077 * (この想定がなければ、本来は、package privateにすべきです) 078 * このため、業務ロジックを各実装クラスでは直接参照しないで下さい。 079 */ 080 @Override 081 protected void init() { 082 // Document empty method チェック対策 083 } 084 085 /** 086 * 処理のメインロジックを記述します。 087 * 088 * このメソッド自体は、protected属性であるため、サブクラスから直接参照することができます。 089 * 但し、これは、各業務ロジックで直接参照することを想定したものではなく、BizLogicの 090 * メイン構造を拡張するサブクラスを定義する際に使用することを想定しています。 091 * (この想定がなければ、本来は、package privateにすべきです) 092 * このため、業務ロジックを各実装クラスでは直接参照しないで下さい。 093 * 094 * @og.rev 5.1.8.0 (2010/07/01) first,lastは行ループの中で呼び出し 095 * @og.rev 5.6.7.0 (2013/07/27) Exception を throw するとき、一旦、errMsg 変数にセットします。 096 * @og.rev 6.7.9.1 (2017/05/19) protected ArrayTableModel を、private DataModel に変更します。 097 * @og.rev 6.8.5.0 (2018/01/09) first(),last() をループから出して、ループを回すかどうかを引数で指定します。 098 * 099 * @return 処理が正常終了したか 100 */ 101 @Override 102 protected boolean main() { 103 final DataModel<String> table = getTable(); // 6.7.9.1 (2017/05/19) 104 105 if( table == null ) { 106 // 5.6.7.0 (2013/07/27) Exception を throw するとき、一旦、errMsg 変数にセットします。 107 final String errMsg = "配列型テーブルモデルがセットされていません。" ; 108 throw new OgRuntimeException( errMsg ); 109 } 110 111 final int rowLen = table.getRowCount(); // 6.8.5.0 (2018/01/09) 112 row = 0; 113 if( !fstchk() ) { return false; } 114 115 if( useLoop ) { // 6.8.5.0 (2018/01/09) 116// for( int i=0; i<table.getRowCount(); i++ ) { 117 for( int i=0; i<rowLen; i++ ) { 118 if( !befchk( row ) ) { return false; } 119 120 final String modType = table.getModifyType( row ); 121 if( "A".equals( modType ) ) { 122 if( !inschk( row ) ) { return false; } 123 } 124 else if( "C".equals( modType ) ) { 125 if( !modchk( row ) ) { return false; } 126 } 127 else if( "D".equals( modType ) ) { 128 if( !delchk( row ) ) { return false; } 129 } 130 131 if( !allchk( row ) ) { return false; } 132 133 row++; 134 } 135 } 136 if( getKekka() >= ErrorMessage.NG ) { return false; } 137 138 row = 0; 139 if( rowLen > 0 && !first() ) { return false; } // 6.8.5.0 (2018/01/09) ループの外に出します。 140 141 if( useLoop ) { // 6.8.5.0 (2018/01/09) 142// for( int i=0; i<table.getRowCount(); i++ ) { 143 for( int i=0; i<rowLen; i++ ) { 144// // 5.1.8.0 (2010/07/01) firstは行ループの中で呼び出し 145// if( row == 0 ) { 146// if( !first() ) { return false; } 147// } 148 149 if( !befall( row ) ) { return false; } 150 151 final String modType = table.getModifyType( row ); 152 if( "A".equals( modType ) ) { 153 if( !insert( row ) ) { return false; } 154 } 155 else if( "C".equals( modType ) ) { 156 if( !modify( row ) ) { return false; } 157 } 158 else if( "D".equals( modType ) ) { 159 if( !delete( row ) ) { return false; } 160 } 161 162 if( !allrow( row ) ) { return false; } 163 164// // 5.1.8.0 (2010/07/01) lastは行ループの中で呼び出し 165// if( row == table.getRowCount() - 1 ) { 166// if( !last() ) { return false; } 167// } 168 row++; 169 } 170 } 171 172 if( rowLen > 0 ) { // 6.8.5.0 (2018/01/09) ループの外に出します。 173 row = rowLen-1; 174 if( !last() ) { return false; } 175 } 176 177 return true; 178 } 179 180 /** 181 * このクラスは、テーブルモデルが外部から指定されている必要があります。 182 * 183 * このメソッド自体は、protected属性であるため、サブクラスから直接参照することができます。 184 * 但し、これは、各業務ロジックで直接参照することを想定したものではなく、BizLogicの 185 * メイン構造を拡張するサブクラスを定義する際に使用することを想定しています。 186 * (この想定がなければ、本来は、package privateにすべきです) 187 * このため、業務ロジックを各実装クラスでは直接参照しないで下さい。 188 * 189 * @see AbstractBizLogic#isRequireTable() 190 * 191 * @return テーブルモデルが外部から指定されている必要があるかどうか(常にtrue) 192 */ 193 @Override 194 protected boolean isRequireTable() { 195 return true; 196 } 197 198 /** 199 * メインカーソルの一番初めで呼ばれるチェックロジックを定義します。 200 * ここでは何も実装されていません。 201 * 202 * @return 処理が正常終了したか 203 */ 204 protected boolean fstchk() { 205 return true; 206 } 207 208 /** 209 * メインカーソルの各行(変更区分の各処理の前)で呼ばれるチェックロジックを定義します。 210 * ここでは何も実装されていません。 211 * 212 * @param row 行番号(インデックス) 213 * 214 * @return 処理が正常終了したか 215 */ 216 protected boolean befchk( final int row ) { 217 return true; 218 } 219 220 /** 221 * メインカーソルの各行(変更区分の各処理の後)で呼ばれるチェックロジックを定義します。 222 * ここでは何も実装されていません。 223 * 224 * @param row 行番号(インデックス) 225 * 226 * @return 処理が正常終了したか 227 */ 228 protected boolean allchk( final int row ) { 229 return true; 230 } 231 232 /** 233 * メインカーソルの各行(変更区分="A")で呼ばれるチェックロジックを定義します。 234 * ここでは何も実装されていません。 235 * 236 * @param row 行番号(インデックス) 237 * 238 * @return 処理が正常終了したか 239 */ 240 protected boolean inschk( final int row ) { 241 return true; 242 } 243 244 /** 245 * メインカーソルの各行(変更区分="C")で呼ばれるチェックロジックを定義します。 246 * ここでは何も実装されていません。 247 * 248 * @param row 行番号(インデックス) 249 * 250 * @return 処理が正常終了したか 251 */ 252 protected boolean modchk( final int row ) { 253 return true; 254 } 255 256 /** 257 * メインカーソルの各行(変更区分="D")で呼ばれるチェックロジックを定義します。 258 * ここでは何も実装されていません。 259 * 260 * @param row 行番号(インデックス) 261 * 262 * @return 処理が正常終了したか 263 */ 264 protected boolean delchk( final int row ) { 265 return true; 266 } 267 268 /** 269 * メインカーソルの一番初めで呼ばれるロジックを定義します。 270 * ここでは何も実装されていません。 271 * 272 * @return 処理が正常終了したか 273 */ 274 protected boolean first() { 275 return true; 276 } 277 278 /** 279 * メインカーソルの一番最後で呼ばれるロジックを定義します。 280 * ここでは何も実装されていません。 281 * 282 * @return 処理が正常終了したか 283 */ 284 protected boolean last() { 285 return true; 286 } 287 288 /** 289 * メインカーソルの各行(変更区分の各処理の前)で呼ばれるロジックを定義します。 290 * ここでは何も実装されていません。 291 * 292 * @param row 行番号(インデックス) 293 * 294 * @return 処理が正常終了したか 295 */ 296 protected boolean befall( final int row ) { 297 return true; 298 } 299 300 /** 301 * メインカーソルの各行(変更区分の各処理の後)で呼ばれるロジックを定義します。 302 * ここでは何も実装されていません。 303 * 304 * @param row 行番号(インデックス) 305 * 306 * @return 処理が正常終了したか 307 */ 308 protected boolean allrow( final int row ) { 309 return true; 310 } 311 312 /** 313 * メインカーソルの各行(変更区分="A")で呼ばれるロジックを定義します。 314 * ここでは何も実装されていません。 315 * 316 * @param row 行番号(インデックス) 317 * 318 * @return 処理が正常終了したか 319 */ 320 protected boolean insert( final int row ) { 321 return true; 322 } 323 324 /** 325 * メインカーソルの各行(変更区分="C")で呼ばれるロジックを定義します。 326 * ここでは何も実装されていません。 327 * 328 * @param row 行番号(インデックス) 329 * 330 * @return 処理が正常終了したか 331 */ 332 protected boolean modify( final int row ) { 333 return true; 334 } 335 336 /** 337 * メインカーソルの各行(変更区分="D")で呼ばれるロジックを定義します。 338 * ここでは何も実装されていません。 339 * 340 * @param row 行番号(インデックス) 341 * 342 * @return 処理が正常終了したか 343 */ 344 protected boolean delete( final int row ) { 345 return true; 346 } 347 348 /** 349 * ループを回すかどうかを指定します。 350 * 351 * ループ処理を使用しない場合の処理速度向上のためのフラグです。 352 * 353 * ループ処理とは、引数に row番号を指定する関数です。 354 * 初期値は、true(ループを回す) です。 355 * false を指定すると、それらのメソッドは使用されず、fstchk()、first()、last() のみ呼び出されます。 356 * 357 * init() と main() は、AbstractBizLogic#exec() から呼ばれるため、通常通り呼び出されます。 358 * 359 * @og.rev 6.8.5.0 (2018/01/09) ループを回すかどうかを引数で指定します。 360 * 361 * @param useLoop ループを回すかどうか 362 */ 363 protected final void setUseLoop( final boolean useLoop ) { 364 this.useLoop = useLoop; 365 } 366}