1 19 package org.netbeans.server.uihandler; 20 21 import java.sql.PreparedStatement ; 22 import java.sql.ResultSet ; 23 import java.sql.SQLException ; 24 import java.sql.Statement ; 25 import java.text.MessageFormat ; 26 import java.util.logging.Level ; 27 import java.util.logging.LogRecord ; 28 import java.util.logging.Logger ; 29 import org.netbeans.server.componentsmatch.Component; 30 import org.netbeans.server.componentsmatch.Matcher; 31 import static org.netbeans.server.uihandler.Utils.*; 32 36 final class DbInsertion implements Runnable { 37 private static final String GUEST_USER = "GUEST"; 38 private static final String UNKNOWN = "unknown"; 39 private static final int MAXUsrName = 30; 40 private static final int MAXMethodName = 100; 41 private static final int MAXMessage = 100; 42 private static final int MAXSummary = 200; 43 private static final int MAXVM = 50; 44 private static final int MAXProductVersion = 50; 45 private static final int MAXOperatingSystem = 50; 46 private static final int MAXComment = 250; 47 private static int UserMax = 0; 48 private static int MethodMax = 0; 49 private static int IssueMax = 0; 50 private static final Logger logger = Logger.getLogger(DbInsertion.class.getName()); 51 private final LogRecord userMetaData; 52 private final Throwable thrown; 53 private final String loggerFileName; 54 55 private static final int os_idx = 0; 57 private static final int vm_idx = 1; 58 private static final int version_idx = 2; 59 private static final int user_name_idx = 3; 60 private static final int summary_idx = 4; 61 private static final int comment_idx = 5; 62 63 public DbInsertion(LogRecord _data, Throwable _thrown, String _fileName) { 64 thrown = _thrown; 65 userMetaData = _data; 66 loggerFileName = _fileName; 67 } 68 69 70 public void run(){ 71 logger.info("INSERTING INTO DB"); if ((userMetaData == null) ||(thrown == null)){ 73 logger.warning("NO DATA TO INSERT"); return; 75 } 76 int duplicate = Utils.checkIssue(thrown); 77 try{ 78 if (duplicate == -1) insertIssue(); 79 else addDuplicate(duplicate); 80 getConnection().commit(); 81 logger.info("TRANSACTION COMMITED"); } catch (SQLException ex) { 83 logger.log(Level.WARNING, "TRANSACTION FAILED "+ex.getMessage(), ex); } 85 } 86 87 private void addDuplicate(int issueId)throws SQLException { 88 PreparedStatement pStmt; 90 String [] params = getParams(); 91 Integer userId = getExistUserId(params[user_name_idx]); 92 if (userId == 0){ pStmt = getConnection().prepareStatement(INSERT_NBUSER); 94 userId = getUserNext(); 95 pStmt.setInt(1, userId); 96 pStmt.setString(2, params[user_name_idx]); 97 pStmt.execute(); 98 pStmt.close(); 99 } 100 pStmt = getConnection().prepareStatement(INSERT_COMMENT); 101 int nextComment = getCommentNext(issueId); 102 pStmt.setInt(1, nextComment); 103 pStmt.setInt(2, issueId); 104 pStmt.setInt(3, userId); 105 pStmt.setString(4, params[comment_idx]); 106 pStmt.setString(5, loggerFileName); 107 pStmt.execute(); 108 pStmt.close(); 109 } 110 111 private String [] getParams(){ 112 final int[] sizes = {MAXOperatingSystem, MAXVM, MAXProductVersion, MAXUsrName, MAXSummary, MAXComment}; 113 Object [] oParams = null; 114 oParams = userMetaData.getParameters(); 115 String [] params = new String [oParams.length]; 116 for (int i = 0; i < oParams.length; i++) { 117 params[i] = oParams[i].toString(); 118 } 119 if (params[user_name_idx].length() == 0) params[user_name_idx] = GUEST_USER; 120 for (int i = 0;i<sizes.length;i++) 121 if (params[i].length() > sizes[i]) params[i] = params[i].substring(0, sizes[i]); 122 return params; 123 } 124 125 private void insertIssue()throws SQLException { 126 String [] params = getParams(); 127 PreparedStatement pStmt; 128 Integer issueId = getIssueNext(); 129 Integer userId = getExistUserId(params[user_name_idx]); 130 if (userId == 0){ pStmt = getConnection().prepareStatement(INSERT_NBUSER); 132 userId = getUserNext(); 133 pStmt.setInt(1, userId); 134 pStmt.setString(2, params[user_name_idx]); 135 pStmt.execute(); 136 pStmt.close(); 137 } 138 Component comp = Matcher.getDefault().match(thrown.getStackTrace()); 140 String component=UNKNOWN, subComponent=UNKNOWN; 141 if (comp != null){ 142 component = comp.getComponent(); 143 subComponent = comp.getSubComponent(); 144 } 145 pStmt = getConnection().prepareStatement(INSERT_ISSUE); 146 pStmt.setInt(1, issueId); 147 pStmt.setString(2, params[summary_idx]); 148 pStmt.setString(3, params[vm_idx]); 149 pStmt.setString(4, params[version_idx]); 150 pStmt.setString(5, component); 151 pStmt.setString(6, subComponent); 152 pStmt.setString(7, ""); pStmt.setString(8, params[os_idx]); 154 pStmt.setInt(9, 0); 155 pStmt.execute(); 156 pStmt.close(); 157 pStmt = getConnection().prepareStatement(INSERT_STACKTRACE); 159 pStmt.setInt(1, issueId); 160 String message = thrown.getMessage(); 161 if (message!= null){ 162 if (message.length() > MAXMessage) message = message.substring(0, MAXMessage); 163 pStmt.setString(2, message); 164 }else pStmt.setNull(2, java.sql.Types.VARCHAR); 165 pStmt.setString(3, thrown.getClass().getName()); 166 pStmt.setNull(4, java.sql.Types.INTEGER); pStmt.execute(); 168 pStmt.close(); 169 pStmt = getConnection().prepareStatement(INSERT_COMMENT); 171 pStmt.setInt(1, Integer.valueOf(1)); pStmt.setInt(2, issueId); 173 pStmt.setInt(3, userId); 174 pStmt.setString(4, params[comment_idx]); 175 pStmt.setString(5, loggerFileName); 176 pStmt.execute(); 177 pStmt.close(); 178 pStmt = getConnection().prepareStatement(INSERT_ISSUENBUSER); 180 pStmt.setInt(1, issueId); 181 pStmt.setInt(2, userId); 182 java.util.Calendar now = new java.util.GregorianCalendar (); 183 now.setTime(new java.util.Date ()); 184 pStmt.setTimestamp(3, new java.sql.Timestamp (now.getTimeInMillis())); 185 pStmt.execute(); 186 pStmt.close(); 187 pStmt = getConnection().prepareStatement(INSERT_HASH); 189 pStmt.setInt(1, countHash(thrown.getStackTrace())); 190 pStmt.setInt(2, issueId); 191 pStmt.execute(); 192 pStmt.close(); 193 pStmt = getConnection().prepareStatement(INSERT_METHOD); 195 PreparedStatement pStmtLines = getConnection().prepareStatement(INSERT_LINE); 196 pStmtLines.setInt(1, issueId); 197 Integer methodId, lineNumber; 198 for (int i = 0; i < thrown.getStackTrace().length; i++) { 199 StackTraceElement element = thrown.getStackTrace()[i]; 200 String methodName = element.getClassName().concat(".").concat(element.getMethodName()); 201 if (methodName.length()> MAXMethodName) methodName = methodName.substring(methodName.length()-MAXMethodName); 202 methodId = getExistingMethodId(methodName); 203 if (methodId==0){ methodId=getMethodNext(); 205 pStmt.setInt(1, methodId); 206 pStmt.setString(2, methodName); 207 pStmt.execute(); 208 } 209 if (element.getLineNumber()>=0) lineNumber = element.getLineNumber(); 210 else lineNumber = 0; 211 pStmtLines.setInt(2, methodId); 212 pStmtLines.setInt(3, lineNumber); 213 pStmtLines.setInt(4, i); 214 pStmtLines.execute(); 215 } 216 pStmt.close(); 217 pStmtLines.close(); 218 } 219 220 221 private int getExistingMethodId(String methodName) throws SQLException { 222 return getExistId("Method", methodName); } 224 225 private int getExistUserId(String userName) throws SQLException { 226 return getExistId("NbUser", userName); } 228 229 private int getExistId(String tableName, String subjectName) throws SQLException { 230 Statement stmt = getConnection().createStatement(ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY); 231 ResultSet result = executeQuery(stmt, MessageFormat.format(SELECT_EXIST_ID, tableName, subjectName)); 232 int value = 0; 233 if (result.next()) value = result.getInt(1); 234 result.close(); 235 stmt.close(); 236 return value; 237 } 238 239 private synchronized Integer getCommentNext(Integer issueId) throws SQLException { 240 Statement stmt = getConnection().createStatement(ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY); 241 ResultSet result = executeQuery(stmt, MessageFormat.format(SELECT_MAX_COMMENT, issueId.toString())); 242 result.next(); 243 int value = result.getInt(1); 244 result.close(); 245 stmt.close(); 246 return ++value; 247 } 248 249 private synchronized Integer getUserNext() throws SQLException { 250 if (UserMax == 0) UserMax = getMax("NbUser"); return ++UserMax; 252 } 253 254 private synchronized Integer getMethodNext() throws SQLException { 255 if (MethodMax == 0) MethodMax = getMax("Method"); return ++MethodMax; 257 } 258 259 private synchronized Integer getIssueNext() throws SQLException { 260 if (IssueMax == 0) IssueMax = getMax("ISSUE"); return ++IssueMax; 262 } 263 264 private int getMax(String tableName) throws SQLException { 265 Statement stmt = getConnection().createStatement(ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY); 266 ResultSet result = executeQuery(stmt, MessageFormat.format(SELECT_MAX_ID, tableName)); 267 result.next(); 268 int value = result.getInt(1); 269 result.close(); 270 stmt.close(); 271 return value; 272 } 273 274 } 275 | Popular Tags |