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     */
016    package org.opengion.hayabusa.resource;
017    
018    import org.opengion.fukurou.util.StringUtil;
019    import 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        こ?画面にかかった累計D?処??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     */
043    final 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;    // こ?画面にかかった累計D?処??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             * こ?画面へのアクセス回数を??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             * こ?画面にかかった累計D?処??ms)を返します?
197             *
198             * @return  dbTime こ?画面にかかったD?処??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 互換性の為?000 Byte 以?整形します?
219             * @og.rev 4.1.0.1 (2008/01/29) 戻り??000 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    }