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        この画面にかかった累計DB処理時間(ms)
033 * ・maxDbTime     この画面にかかった最大DB処理時間(ms)
034 * ・maxQuery      最大DB処理時間を記録したときの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;    // この画面にかかった累計DB処理時間(ms)
051        private long   maxDbTime        = 0;    // この画面にかかった最大DB処理時間(ms)
052        private String maxQuery         = null; // 最大DB処理時間を記録したときの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 DB処理時間(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 DB処理時間(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         * この画面へのアクセス回数を、+1します。
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         * エラー発生時の件数を+1します。
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         * この画面にかかった累計DB処理時間(ms)を返します。
197         *
198         * @return  dbTime この画面にかかったDB処理時間(ms)
199         */
200        public long getQueryTime() {
201                return dbTime ;
202        }
203
204        /**
205         * この画面にかかった最大DB処理時間(ms)を返します。
206         *
207         * @return  maxDbTime 最大DB処理時間(ms)
208         */
209        public long getMaxQueryTime() {
210                return maxDbTime ;
211        }
212
213        /**
214         * 最大DB処理時間を記録したときのSQL文を返します。
215         *
216         * @return  maxQuery 最大DB処理時間を記録したときの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                final String rtn ;
223                if( maxQuery == null ) { rtn = ""; }
224                else if( maxQuery.length() < 1300 ) { rtn = maxQuery; }
225                else {
226                        String tmp ;
227                        try {
228                                byte[] byteValue = StringUtil.makeByte( maxQuery,"UTF-8" );
229                                tmp = new String( byteValue,"UTF-8" );
230                                if( tmp.length() > 1300 ) {
231                                        tmp = tmp.substring( 0,1300 );
232                                }
233                        }
234                        catch( UnsupportedEncodingException ex ) {      // サポート必須のはず
235                                tmp = maxQuery.substring( 0,1300 );
236                        }
237                        rtn = tmp;
238                }
239
240                return rtn ;
241        }
242}