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}