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// 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}