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 * Aチェックメソッド(chk***())が全ての行で実行された後、エラーメッセージに"エラー"が含まれている場合
032 * B実行時エラーが発生した場合
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//                      throw new RuntimeException( "配列型テーブルモデルがセットされていません。" );
094                        String errMsg = "配列型テーブルモデルがセットされていません。" ;
095                        throw new RuntimeException( errMsg );
096                }
097
098                String modType = null;
099
100                row = 0;
101                if( !fstchk() ) { return false; }
102                for( int i = 0; i < table.getRowCount(); i++ ) {
103                        if( !befchk( row ) ) { return false; }
104
105                        modType = table.getModifyType( row );
106                        if( "A".equals( modType ) ) {
107                                if( !inschk( row ) ) { return false; }
108                        }
109                        else if( "C".equals( modType ) ) {
110                                if( !modchk( row ) ) { return false; }
111                        }
112                        else if( "D".equals( modType ) ) {
113                                if( !delchk( row ) ) { return false; }
114                        }
115
116                        if( !allchk( row ) ) { return false; }
117
118                        row++;
119                }
120                if( getKekka() >= ErrorMessage.NG ) { return false; }
121
122                row = 0;
123//              if( !first() ) { return false; }
124                for( int i = 0; i < table.getRowCount(); i++ ) {
125                        // 5.1.8.0 (2010/07/01) firstは行ループの中で呼び出し
126                        if( row == 0 ) {
127                                if( !first() ) { return false; }
128                        }
129
130                        if( !befall( row ) ) { return false; }
131
132                        modType = table.getModifyType( row );
133                        if( "A".equals( modType ) ) {
134                                if( !insert( row ) ) { return false; }
135                        }
136                        else if( "C".equals( modType ) ) {
137                                if( !modify( row ) ) { return false; }
138                        }
139                        else if( "D".equals( modType ) ) {
140                                if( !delete( row ) ) { return false; }
141                        }
142
143                        if( !allrow( row ) ) { return false; }
144
145                        // 5.1.8.0 (2010/07/01) lastは行ループの中で呼び出し
146                        if( row == table.getRowCount() - 1 ) {
147                                if( !last() ) { return false; }
148                        }
149                        row++;
150                }
151//              if( !last() ) { return false; }
152
153                return true;
154        }
155
156        /**
157         * このクラスは、テーブルモデルが外部から指定されている必要があります。
158         *
159         * このメソッド自体は、protected属性であるため、サブクラスから直接参照することができます。
160         * 但し、これは、各業務ロジックで直接参照することを想定したものではなく、BizLogicの
161         * メイン構造を拡張するサブクラスを定義する際に使用することを想定しています。
162         * (この想定がなければ、本来は、package privateにすべきです)
163         * このため、業務ロジックを各実装クラスでは直接参照しないで下さい。
164         *
165         * @see AbstractBizLogic#isRequireTable()
166         *
167         * @return テーブルモデルが外部から指定されている必要があるかどうか(常にtrue)
168         */
169        @Override
170        protected boolean isRequireTable() {
171                return true;
172        }
173
174        /**
175         * メインカーソルの一番初めで呼ばれるチェックロジックを定義します。
176         * ここでは何も実装されていません。
177         *
178         * @return 処理が正常終了したか
179         */
180        protected boolean fstchk() {
181                return true;
182        }
183
184        /**
185         * メインカーソルの各行(変更区分の各処理の前)で呼ばれるチェックロジックを定義します。
186         * ここでは何も実装されていません。
187         *
188         * @param row 行番号(インデックス)
189         *
190         * @return 処理が正常終了したか
191         */
192        protected boolean befchk( final int row ) {
193                return true;
194        }
195
196        /**
197         * メインカーソルの各行(変更区分の各処理の後)で呼ばれるチェックロジックを定義します。
198         * ここでは何も実装されていません。
199         *
200         * @param row 行番号(インデックス)
201         *
202         * @return 処理が正常終了したか
203         */
204        protected boolean allchk( final int row ) {
205                return true;
206        }
207
208        /**
209         * メインカーソルの各行(変更区分="A")で呼ばれるチェックロジックを定義します。
210         * ここでは何も実装されていません。
211         *
212         * @param row 行番号(インデックス)
213         *
214         * @return 処理が正常終了したか
215         */
216        protected boolean inschk( final int row ) {
217                return true;
218        }
219
220        /**
221         * メインカーソルの各行(変更区分="C")で呼ばれるチェックロジックを定義します。
222         * ここでは何も実装されていません。
223         *
224         * @param row 行番号(インデックス)
225         *
226         * @return 処理が正常終了したか
227         */
228        protected boolean modchk( final int row ) {
229                return true;
230        }
231
232        /**
233         * メインカーソルの各行(変更区分="D")で呼ばれるチェックロジックを定義します。
234         * ここでは何も実装されていません。
235         *
236         * @param row 行番号(インデックス)
237         *
238         * @return 処理が正常終了したか
239         */
240        protected boolean delchk( final int row ) {
241                return true;
242        }
243
244        /**
245         * メインカーソルの一番初めで呼ばれるロジックを定義します。
246         * ここでは何も実装されていません。
247         *
248         * @return 処理が正常終了したか
249         */
250        protected boolean first() {
251                return true;
252        }
253
254        /**
255         * メインカーソルの一番最後で呼ばれるロジックを定義します。
256         * ここでは何も実装されていません。
257         *
258         * @return 処理が正常終了したか
259         */
260        protected boolean last() {
261                return true;
262        }
263
264        /**
265         * メインカーソルの各行(変更区分の各処理の前)で呼ばれるロジックを定義します。
266         * ここでは何も実装されていません。
267         *
268         * @param row 行番号(インデックス)
269         *
270         * @return 処理が正常終了したか
271         */
272        protected boolean befall( final int row ) {
273                return true;
274        }
275
276        /**
277         * メインカーソルの各行(変更区分の各処理の後)で呼ばれるロジックを定義します。
278         * ここでは何も実装されていません。
279         *
280         * @param row 行番号(インデックス)
281         *
282         * @return 処理が正常終了したか
283         */
284        protected boolean allrow( final int row ) {
285                return true;
286        }
287
288        /**
289         * メインカーソルの各行(変更区分="A")で呼ばれるロジックを定義します。
290         * ここでは何も実装されていません。
291         *
292         * @param row 行番号(インデックス)
293         *
294         * @return 処理が正常終了したか
295         */
296        protected boolean insert( final int row ) {
297                return true;
298        }
299
300        /**
301         * メインカーソルの各行(変更区分="C")で呼ばれるロジックを定義します。
302         * ここでは何も実装されていません。
303         *
304         * @param row 行番号(インデックス)
305         *
306         * @return 処理が正常終了したか
307         */
308        protected boolean modify( final int row ) {
309                return true;
310        }
311
312        /**
313         * メインカーソルの各行(変更区分="D")で呼ばれるロジックを定義します。
314         * ここでは何も実装されていません。
315         *
316         * @param row 行番号(インデックス)
317         *
318         * @return 処理が正常終了したか
319         */
320        protected boolean delete( final int row ) {
321                return true;
322        }
323}