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