    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.hayabusa.resource;
    017
    018import org.opengion.fukurou.util.StringUtil;
    019import java.io.UnsupportedEncodingException;
    020
    021/**
    022 * 画面へのアクセス状況の情報を管理するクラスです。
    023 * 集計そのものは、UserInfo によりデータベース(GE15)に書き込まれます。
    024 * システムリソースのUSE_ACCESS_TOKEI_TABLE=true の場合のみ、DBに書き込まれますが、
    025 * データ集計そのものは、常に行っています。
    026 * このオブジェクトは、GUIInfo から、処理を委譲されて使用されます。
    027 *
    028 * ・accessCount   この画面へのアクセス数
    029 * ・errorCount    この画面でのエラー数
    030 * ・readCount     この画面で検索した件数
    031 * ・writeCount    この画面で登録した件数
    032 * ・dbTime        この画面にかかった累計ＤＢ処理時間(ms)
    033 * ・maxDbTime     この画面にかかった最大ＤＢ処理時間(ms)
    034 * ・maxQuery      最大ＤＢ処理時間を記録したときのSQL文
    035 *
    036 * @og.rev 4.0.0.0 (2004/12/31) 新規作成
    037 * @og.group リソース管理
    038 *
    039 * @version  4.0
    040 * @author   Kazuhiko Hasegawa
    041 * @since    JDK5.0,
    042 */
    043final class GUIAccessCount {
    044        private final String   guiKey ;
    045
    046        private int    accessCount      = 0;    // この画面へのアクセス数
    047        private int    errorCount       = 0;    // この画面でのエラー数
    048        private long   readCount        = 0;    // この画面で検索した件数
    049        private long   writeCount       = 0;    // この画面で登録した件数
    050        private long   dbTime           = 0;    // この画面にかかった累計ＤＢ処理時間(ms)
    051        private long   maxDbTime        = 0;    // この画面にかかった最大ＤＢ処理時間(ms)
    052        private String maxQuery         = null; // 最大ＤＢ処理時間を記録したときのSQL文
    053
    054        /**
    055         * コンストラクター
    056         *
    057         * @param       guiKey          画面キー
    058         */
    059        public GUIAccessCount( final String     guiKey ) {
    060                this.guiKey   = guiKey;
    061        }
    062
    063        /**
    064         * 画面情報 画面ID を取得します。
    065         *
    066         * @return   key   画面ID
    067         */
    068        public String getKey() {
    069                return guiKey;
    070        }
    071
    072        /**
    073         * データベース検索した数と、掛かった時間(ms)を、セットします。
    074         * これは、セキュリティ上の監視フラグで、不必要に、大量の
    075         * データが検索された場合や、不正なデータアクセスがあるかどうかを
    076         * 監視するための統計情報を取得します。
    077         * 画面オブジェクトは、各ユーザー毎に作成されているため、個々の
    078         * ユーザー毎/画面毎のアクセス状況を見ることが可能になります。
    079         *
    080         * @param  cnt データベース検索した数
    081         * @param  time ＤＢ処理時間(ms)
    082         * @param  query そのときのSQL文
    083         */
    084        public void addReadCount( final int cnt,final long time,final String query ) {
    085                readCount += cnt ;
    086                dbTime += time ;
    087                if( maxDbTime < time ) {
    088                        maxDbTime = time;
    089                        maxQuery  = query;
    090                }
    091        }
    092
    093        /**
    094         * データベース検索した数と、掛かった時間(ms)を、取得します。
    095         * これは、セキュリティ上の監視フラグで、不必要に、大量の
    096         * データが検索された場合や、不正なデータアクセスがあるかどうかを
    097         * 監視するための統計情報を取得します。
    098         * 画面オブジェクトは、各ユーザー毎に作成されているため、個々の
    099         * ユーザー毎/画面毎のアクセス状況を見ることが可能になります。
    100         *
    101         * @return  cnt データベース検索した数
    102         */
    103        public long getReadCount() {
    104                return readCount ;
    105        }
    106
    107        /**
    108         * データベース登録した数を、セットします。
    109         * これは、セキュリティ上の監視フラグで、不必要に、大量の
    110         * データが登録された場合や、不正なデータアクセスがあるかどうかを
    111         * 監視するための統計情報を取得します。
    112         * 画面オブジェクトは、各ユーザー毎に作成されているため、個々の
    113         * ユーザー毎/画面毎のアクセス状況を見ることが可能になります。
    114         *
    115         * @param  cnt データベース登録した数
    116         * @param  time ＤＢ処理時間(ms)
    117         * @param  query そのときのSQL文
    118         */
    119        public void addWriteCount( final int cnt,final long time,final String query ) {
    120                writeCount += cnt ;
    121                dbTime += time ;
    122                if( maxDbTime < time ) {
    123                        maxDbTime = time;
    124                        maxQuery  = query;
    125                }
    126        }
    127
    128        /**
    129         * データベース登録した数を、取得します。
    130         * これは、セキュリティ上の監視フラグで、不必要に、大量の
    131         * データが登録された場合や、不正なデータアクセスがあるかどうかを
    132         * 監視するための統計情報を取得します。
    133         * 画面オブジェクトは、各ユーザー毎に作成されているため、個々の
    134         * ユーザー毎/画面毎のアクセス状況を見ることが可能になります。
    135         *
    136         * @return  cnt データベース登録した数
    137         */
    138        public long getWriteCount() {
    139                return writeCount ;
    140        }
    141
    142        /**
    143         * この画面へのアクセス回数を、＋１します。
    144         * アクセス回数は、このメソッドの呼び出し回数のことです。
    145         * 現状では、result.jsp 画面でセットすることで、アクセス数を
    146         * 数えることにします。
    147         *
    148         */
    149        public void addAccessCount() {
    150                accessCount++ ;
    151        }
    152
    153        /**
    154         * この画面へのアクセス回数を、取得します。
    155         * アクセス回数は、isWrite() メソッドの呼び出し回数のことです。
    156         * このメソッドは、画面アクセス時に、チェックするたびに呼ばれます。
    157         * 回数は、各JSP画面にこのチェックが入るはずなので、基本的な
    158         * 画面の数(画面IDではなく、JSPファイル数)になります。
    159         * ただし、forward や、 index では、このチェックは、行っていませんので
    160         * カウントされません。
    161         *
    162         * @return  cnt 画面へのアクセス回数
    163         */
    164        public int getAccessCount() {
    165                return accessCount ;
    166        }
    167
    168        /**
    169         * エラー発生時の件数を＋１します。
    170         * これは、エラー発生時に呼び出すことで、エラー件数をチェックすることが
    171         * 可能になります。
    172         * 一般にエラーには、予期するエラー(必須入力登録漏れ等)と、予期しないエラー
    173         * がありますが、ここでは、Java の Exceptionが発生する予期しないエラーの
    174         * 件数をカウントします。
    175         *
    176         */
    177        public void addErrorCount() {
    178                errorCount++ ;
    179        }
    180
    181        /**
    182         * エラー発生時の件数を取得します。
    183         * これは、エラー発生時に呼び出すことで、エラー件数をチェックすることが
    184         * 可能になります。
    185         * 一般にエラーには、予期するエラー(必須入力登録漏れ等)と、予期しないエラー
    186         * がありますが、ここでは、Java の Exceptionが発生する予期しないエラーの
    187         * 件数をカウントします。
    188         *
    189         * @return  エラー発生件数
    190         */
    191        public int getErrorCount() {
    192                return errorCount ;
    193        }
    194
    195        /**
    196         * この画面にかかった累計ＤＢ処理時間(ms)を返します。
    197         *
    198         * @return  dbTime この画面にかかったＤＢ処理時間(ms)
    199         */
    200        public long getQueryTime() {
    201                return dbTime ;
    202        }
    203
    204        /**
    205         * この画面にかかった最大ＤＢ処理時間(ms)を返します。
    206         *
    207         * @return  maxDbTime 最大ＤＢ処理時間(ms)
    208         */
    209        public long getMaxQueryTime() {
    210                return maxDbTime ;
    211        }
    212
    213        /**
    214         * 最大ＤＢ処理時間を記録したときのSQL文を返します。
    215         *
    216         * @return  maxQuery 最大ＤＢ処理時間を記録したときのSQL文
    217         *
    218         * @og.rev 4.0.0.0 (2007/10/05) SQLServer 互換性の為、4000 Byte 以内に整形します。
    219         * @og.rev 4.1.0.1 (2008/01/29) 戻り値を4000 Byte 以内にします。
    220         */
    221        public String getMaxQuery() {
    222//              return ( maxQuery != null ) ? maxQuery : "" ;
    223
    224                final String rtn ;
    225                if( maxQuery == null ) { rtn = ""; }
    226                else if( maxQuery.length() < 1300 ) { rtn = maxQuery; }
    227                else {
    228                        String tmp ;
    229                        try {
    230                                byte[] byteValue = StringUtil.makeByte( maxQuery,"UTF-8" );
    231                                tmp = new String( byteValue,"UTF-8" );
    232                                if( tmp.length() > 1300 ) {
    233                                        tmp = tmp.substring( 0,1300 );
    234                                }
    235                        }
    236                        catch( UnsupportedEncodingException ex ) {      // サポート必須のはず
    237                                tmp = maxQuery.substring( 0,1300 );
    238                        }
    239                        rtn = tmp;
    240                }
    241
    242                return rtn ;
    243        }
    244}