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