    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}