KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > netbeans > server > uihandler > DbInsertion


1 /*
2  * The contents of this file are subject to the terms of the Common Development
3  * and Distribution License (the License). You may not use this file except in
4  * compliance with the License.
5  *
6  * You can obtain a copy of the License at http://www.netbeans.org/cddl.html
7  * or http://www.netbeans.org/cddl.txt.
8  *
9  * When distributing Covered Code, include this CDDL Header Notice in each file
10  * and include the License file at http://www.netbeans.org/cddl.txt.
11  * If applicable, add the following below the CDDL Header, with the fields
12  * enclosed by brackets [] replaced by your own identifying information:
13  * "Portions Copyrighted [year] [name of copyright owner]"
14  *
15  * The Original Software is NetBeans. The Initial Developer of the Original
16  * Software is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun
17  * Microsystems, Inc. All Rights Reserved.
18  */

19 package org.netbeans.server.uihandler;
20
21 import java.sql.PreparedStatement JavaDoc;
22 import java.sql.ResultSet JavaDoc;
23 import java.sql.SQLException JavaDoc;
24 import java.sql.Statement JavaDoc;
25 import java.text.MessageFormat JavaDoc;
26 import java.util.logging.Level JavaDoc;
27 import java.util.logging.LogRecord JavaDoc;
28 import java.util.logging.Logger JavaDoc;
29 import org.netbeans.server.componentsmatch.Component;
30 import org.netbeans.server.componentsmatch.Matcher;
31 import static org.netbeans.server.uihandler.Utils.*;
32 /**
33  *
34  * @author jindra
35  */

36 final class DbInsertion implements Runnable JavaDoc {
37     private static final String JavaDoc GUEST_USER = "GUEST";
38     private static final String JavaDoc 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 JavaDoc logger = Logger.getLogger(DbInsertion.class.getName());
51     private final LogRecord JavaDoc userMetaData;
52     private final Throwable JavaDoc thrown;
53     private final String JavaDoc loggerFileName;
54     
55     // parameter indexes
56
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 JavaDoc _data, Throwable JavaDoc _thrown, String JavaDoc _fileName) {
64         thrown = _thrown;
65         userMetaData = _data;
66         loggerFileName = _fileName;
67     }
68     
69     
70     public void run(){
71         logger.info("INSERTING INTO DB"); // NOI18N
72
if ((userMetaData == null) ||(thrown == null)){
73             logger.warning("NO DATA TO INSERT"); // NOI18N
74
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"); // NOI18N
82
} catch (SQLException JavaDoc ex) {
83             logger.log(Level.WARNING, "TRANSACTION FAILED "+ex.getMessage(), ex); // NOI18N
84
}
85     }
86     
87     private void addDuplicate(int issueId)throws SQLException JavaDoc{
88         // adding comment
89
PreparedStatement JavaDoc pStmt;
90         String JavaDoc[] params = getParams();
91         Integer JavaDoc userId = getExistUserId(params[user_name_idx]);
92         if (userId == 0){//Adding NbUser to my DB
93
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 JavaDoc[] getParams(){
112         final int[] sizes = {MAXOperatingSystem, MAXVM, MAXProductVersion, MAXUsrName, MAXSummary, MAXComment};
113         Object JavaDoc[] oParams = null;
114         oParams = userMetaData.getParameters();
115         String JavaDoc [] params = new String JavaDoc[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 JavaDoc{
126         String JavaDoc[] params = getParams();
127         PreparedStatement JavaDoc pStmt;
128         Integer JavaDoc issueId = getIssueNext();
129         Integer JavaDoc userId = getExistUserId(params[user_name_idx]);
130         if (userId == 0){//Adding NbUser to my DB
131
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         // adding issue
139
Component comp = Matcher.getDefault().match(thrown.getStackTrace());
140         String JavaDoc 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, "");//assign to
153
pStmt.setString(8, params[os_idx]);
154         pStmt.setInt(9, 0);
155         pStmt.execute();
156         pStmt.close();
157         // adding stacktrace
158
pStmt = getConnection().prepareStatement(INSERT_STACKTRACE);
159         pStmt.setInt(1, issueId);
160         String JavaDoc 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);//annotation
167
pStmt.execute();
168         pStmt.close();
169         // adding comment
170
pStmt = getConnection().prepareStatement(INSERT_COMMENT);
171         pStmt.setInt(1, Integer.valueOf(1));// adding new issue so it is the first comment);
172
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         // adding issueNbUser
179
pStmt = getConnection().prepareStatement(INSERT_ISSUENBUSER);
180         pStmt.setInt(1, issueId);
181         pStmt.setInt(2, userId);
182         java.util.Calendar JavaDoc now = new java.util.GregorianCalendar JavaDoc();
183         now.setTime(new java.util.Date JavaDoc());
184         pStmt.setTimestamp(3, new java.sql.Timestamp JavaDoc(now.getTimeInMillis()));
185         pStmt.execute();
186         pStmt.close();
187         //add hashCode
188
pStmt = getConnection().prepareStatement(INSERT_HASH);
189         pStmt.setInt(1, countHash(thrown.getStackTrace()));
190         pStmt.setInt(2, issueId);
191         pStmt.execute();
192         pStmt.close();
193         //add stack trace
194
pStmt = getConnection().prepareStatement(INSERT_METHOD);
195         PreparedStatement JavaDoc pStmtLines = getConnection().prepareStatement(INSERT_LINE);
196         pStmtLines.setInt(1, issueId);
197         Integer JavaDoc methodId, lineNumber;
198         for (int i = 0; i < thrown.getStackTrace().length; i++) {
199             StackTraceElement JavaDoc element = thrown.getStackTrace()[i];
200             String JavaDoc 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){//adding method into table
204
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 JavaDoc methodName) throws SQLException JavaDoc{
222         return getExistId("Method", methodName); // NOI18N
223
}
224     
225     private int getExistUserId(String JavaDoc userName) throws SQLException JavaDoc{
226         return getExistId("NbUser", userName); // NOI18N
227
}
228     
229     private int getExistId(String JavaDoc tableName, String JavaDoc subjectName) throws SQLException JavaDoc{
230         Statement JavaDoc stmt = getConnection().createStatement(ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY);
231         ResultSet JavaDoc 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 JavaDoc getCommentNext(Integer JavaDoc issueId) throws SQLException JavaDoc{
240         Statement JavaDoc stmt = getConnection().createStatement(ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY);
241         ResultSet JavaDoc 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 JavaDoc getUserNext() throws SQLException JavaDoc{
250         if (UserMax == 0) UserMax = getMax("NbUser"); // NOI18N
251
return ++UserMax;
252     }
253     
254     private synchronized Integer JavaDoc getMethodNext() throws SQLException JavaDoc{
255         if (MethodMax == 0) MethodMax = getMax("Method"); // NOI18N
256
return ++MethodMax;
257     }
258     
259     private synchronized Integer JavaDoc getIssueNext() throws SQLException JavaDoc{
260         if (IssueMax == 0) IssueMax = getMax("ISSUE"); // NOI18N
261
return ++IssueMax;
262     }
263     
264     private int getMax(String JavaDoc tableName) throws SQLException JavaDoc{
265         Statement JavaDoc stmt = getConnection().createStatement(ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY);
266         ResultSet JavaDoc 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