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}