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    }