    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//                      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}