Revision 2113
Added by Matt Jones over 20 years ago
test/edu/ucsb/nceas/metacattest/EventLogTest.java | ||
---|---|---|
29 | 29 |
import java.sql.Timestamp; |
30 | 30 |
import java.text.ParseException; |
31 | 31 |
import java.text.SimpleDateFormat; |
32 |
import java.util.Date; |
|
33 | 32 |
|
34 | 33 |
import edu.ucsb.nceas.metacat.DBConnectionPool; |
35 | 34 |
import edu.ucsb.nceas.metacat.EventLog; |
... | ... | |
93 | 92 |
Timestamp startDate = null; |
94 | 93 |
Timestamp endDate = null; |
95 | 94 |
try { |
96 |
startDate = new Timestamp((format.parse("2004-04-07 09:32:00")).getTime());
|
|
97 |
endDate = new Timestamp((format.parse("2004-04-07 09:50:00")).getTime());
|
|
95 |
startDate = new Timestamp((format.parse("2004-04-08 02:32:00")).getTime());
|
|
96 |
endDate = new Timestamp((format.parse("2004-04-08 11:20:00")).getTime());
|
|
98 | 97 |
} catch (ParseException e) { |
99 | 98 |
System.out.println("Failed to created endDate from format."); |
100 | 99 |
} |
src/edu/ucsb/nceas/metacat/EventLog.java | ||
---|---|---|
171 | 171 |
int endIndex = 0; |
172 | 172 |
|
173 | 173 |
if (ipAddress != null) { |
174 |
query.append(formatSqlClause(clauseAdded, "ip_address", ipAddress));
|
|
174 |
query.append(generateSqlClause(clauseAdded, "ip_address", ipAddress));
|
|
175 | 175 |
clauseAdded = true; |
176 | 176 |
} |
177 | 177 |
if (principal != null) { |
178 |
query.append(formatSqlClause(clauseAdded, "principal", principal));
|
|
178 |
query.append(generateSqlClause(clauseAdded, "principal", principal));
|
|
179 | 179 |
clauseAdded = true; |
180 | 180 |
} |
181 | 181 |
if (docid != null) { |
182 |
query.append(formatSqlClause(clauseAdded, "docid", docid));
|
|
182 |
query.append(generateSqlClause(clauseAdded, "docid", docid));
|
|
183 | 183 |
clauseAdded = true; |
184 | 184 |
} |
185 | 185 |
if (event != null) { |
186 |
query.append(formatSqlClause(clauseAdded, "event", event));
|
|
186 |
query.append(generateSqlClause(clauseAdded, "event", event));
|
|
187 | 187 |
clauseAdded = true; |
188 | 188 |
} |
189 | 189 |
if (startDate != null) { |
... | ... | |
209 | 209 |
dbConn = DBConnectionPool.getDBConnection("EventLog.getReport"); |
210 | 210 |
serialNumber = dbConn.getCheckOutSerialNumber(); |
211 | 211 |
|
212 |
// Execute the insert statement |
|
213 |
System.out.println(query.toString()); |
|
212 |
// Execute the query statement |
|
214 | 213 |
PreparedStatement stmt = dbConn.prepareStatement(query.toString()); |
215 | 214 |
if (startIndex > 0) { |
216 | 215 |
stmt.setTimestamp(startIndex, startDate); |
... | ... | |
220 | 219 |
} |
221 | 220 |
stmt.execute(); |
222 | 221 |
ResultSet rs = stmt.getResultSet(); |
223 |
//process the result |
|
222 |
//process the result and return it as an XML document
|
|
224 | 223 |
resultDoc.append("<?xml version=\"1.0\"?>\n"); |
225 | 224 |
resultDoc.append("<log>\n"); |
226 | 225 |
while (rs.next()) { |
227 |
resultDoc.append(formatXmlRecord(rs.getString(1), rs.getString(2),
|
|
226 |
resultDoc.append(generateXmlRecord(rs.getString(1), rs.getString(2),
|
|
228 | 227 |
rs.getString(3), rs.getString(4), |
229 | 228 |
rs.getString(5), rs.getTimestamp(6))); |
230 | 229 |
} |
... | ... | |
250 | 249 |
* @param values the values to match in the SQL query |
251 | 250 |
* @return a String representation of the SQL query clause |
252 | 251 |
*/ |
253 |
private String formatSqlClause(boolean addOperator, String column, String[] values) |
|
252 |
private String generateSqlClause(boolean addOperator, String column, |
|
253 |
String[] values) |
|
254 | 254 |
{ |
255 | 255 |
StringBuffer clause = new StringBuffer(); |
256 | 256 |
if (addOperator) { |
... | ... | |
281 | 281 |
* @param dateLogged the date on which the event occurred |
282 | 282 |
* @return String containing the formatted XML |
283 | 283 |
*/ |
284 |
private String formatXmlRecord(String entryId, String ipAddress, String principal,
|
|
285 |
String docid, String event, Timestamp dateLogged)
|
|
284 |
private String generateXmlRecord(String entryId, String ipAddress,
|
|
285 |
String principal, String docid, String event, Timestamp dateLogged)
|
|
286 | 286 |
{ |
287 | 287 |
StringBuffer rec = new StringBuffer(); |
288 | 288 |
rec.append("<logEntry>"); |
289 |
rec.append(formatXmlElement("entryid", entryId));
|
|
290 |
rec.append(formatXmlElement("ipAddress", ipAddress));
|
|
291 |
rec.append(formatXmlElement("principal", principal));
|
|
292 |
rec.append(formatXmlElement("docid", docid));
|
|
293 |
rec.append(formatXmlElement("event", event));
|
|
294 |
rec.append(formatXmlElement("dateLogged", dateLogged.toString()));
|
|
289 |
rec.append(generateXmlElement("entryid", entryId));
|
|
290 |
rec.append(generateXmlElement("ipAddress", ipAddress));
|
|
291 |
rec.append(generateXmlElement("principal", principal));
|
|
292 |
rec.append(generateXmlElement("docid", docid));
|
|
293 |
rec.append(generateXmlElement("event", event));
|
|
294 |
rec.append(generateXmlElement("dateLogged", dateLogged.toString()));
|
|
295 | 295 |
rec.append("</logEntry>\n"); |
296 | 296 |
|
297 | 297 |
return rec.toString(); |
... | ... | |
304 | 304 |
* @param value the content of the xml element |
305 | 305 |
* @return the formatted XML element as a String |
306 | 306 |
*/ |
307 |
private String formatXmlElement(String name, String value)
|
|
307 |
private String generateXmlElement(String name, String value)
|
|
308 | 308 |
{ |
309 | 309 |
return "<" + name + ">" + value + "</" + name + ">"; |
310 | 310 |
} |
src/edu/ucsb/nceas/metacat/MetaCatServlet.java | ||
---|---|---|
38 | 38 |
import java.sql.PreparedStatement; |
39 | 39 |
import java.sql.ResultSet; |
40 | 40 |
import java.sql.SQLException; |
41 |
import java.sql.Timestamp; |
|
42 |
import java.text.ParseException; |
|
43 |
import java.text.SimpleDateFormat; |
|
41 | 44 |
import java.util.Enumeration; |
42 | 45 |
import java.util.Hashtable; |
43 | 46 |
import java.util.PropertyResourceBundle; |
... | ... | |
95 | 98 |
* action=getdataguide -- retrieve a Data Guide <br> |
96 | 99 |
* action=getprincipals -- retrieve a list of principals in XML <br> |
97 | 100 |
* datadoc -- data document name (id) <br> |
101 |
* action=getlog -- get a report of events that have occurred in the system<br> |
|
102 |
* ipAddress -- filter on one or more IP addresses<br> |
|
103 |
* principal -- filter on one or more principals (LDAP DN syntax)<br> |
|
104 |
* docid -- filter on one or more document identifiers (with revision)<br> |
|
105 |
* event -- filter on event type (e.g., read, insert, update, delete)<br> |
|
106 |
* start -- filter out events before the start date-time<br> |
|
107 |
* end -- filter out events before the end date-time<br> |
|
98 | 108 |
* <p> |
99 | 109 |
* The particular combination of parameters that are valid for each particular |
100 | 110 |
* action value is quite specific. This documentation will be reorganized to |
... | ... | |
205 | 215 |
{ |
206 | 216 |
// Close all db connection |
207 | 217 |
System.out.println("Destroying MetacatServlet"); |
208 |
connPool.release();
|
|
218 |
DBConnectionPool.release();
|
|
209 | 219 |
} |
210 | 220 |
|
211 | 221 |
/** Handle "GET" method requests from HTTP clients */ |
... | ... | |
467 | 477 |
PrintWriter out = response.getWriter(); |
468 | 478 |
out.println(Version.getVersionAsXml()); |
469 | 479 |
out.close(); |
480 |
} else if (action.equals("getlog")) { |
|
481 |
handleGetLogAction(params, request, response); |
|
470 | 482 |
} else if (action.equals("login") || action.equals("logout")) { |
471 | 483 |
} else if (action.equals("protocoltest")) { |
472 | 484 |
String testURL = "metacat://dev.nceas.ucsb.edu/NCEAS.897766.9"; |
... | ... | |
1139 | 1151 |
DocumentImpl doc = new DocumentImpl(docid); |
1140 | 1152 |
|
1141 | 1153 |
//check the permission for read |
1142 |
if (!doc.hasReadPermission(user, groups, docid)) {
|
|
1154 |
if (!DocumentImpl.hasReadPermission(user, groups, docid)) {
|
|
1143 | 1155 |
Exception e = new Exception("User " + user |
1144 | 1156 |
+ " does not have permission" |
1145 | 1157 |
+ " to read the document with the docid " + docid); |
... | ... | |
1312 | 1324 |
DocumentImpl doc = new DocumentImpl(docid); |
1313 | 1325 |
|
1314 | 1326 |
//check the permission for read |
1315 |
if (!doc.hasReadPermission(user, groups, docid)) {
|
|
1327 |
if (!DocumentImpl.hasReadPermission(user, groups, docid)) {
|
|
1316 | 1328 |
Exception e = new Exception("User " + user |
1317 | 1329 |
+ " does not have " |
1318 | 1330 |
+ "permission to read the document with the docid " |
... | ... | |
1980 | 1992 |
out.println(e.getMessage()); |
1981 | 1993 |
out.println("</error>"); |
1982 | 1994 |
} |
1983 |
|
|
1984 | 1995 |
} |
1985 | 1996 |
|
1986 | 1997 |
/** |
1998 |
* Print a report from the event log based on filter parameters passed in |
|
1999 |
* from the web. |
|
2000 |
* |
|
2001 |
* TODO: make sure urlencoding of timestamp params is working |
|
2002 |
* |
|
2003 |
* @param params the parameters from the web request |
|
2004 |
* @param request the http request object for getting request details |
|
2005 |
* @param response the http response object for writing output |
|
2006 |
*/ |
|
2007 |
private void handleGetLogAction(Hashtable params, HttpServletRequest request, |
|
2008 |
HttpServletResponse response) |
|
2009 |
{ |
|
2010 |
// Get all of the parameters in the correct formats |
|
2011 |
String[] ipAddress = (String[])params.get("ipaddress"); |
|
2012 |
String[] principal = (String[])params.get("principal"); |
|
2013 |
String[] docid = (String[])params.get("docid"); |
|
2014 |
String[] event = (String[])params.get("event"); |
|
2015 |
String[] startArray = (String[]) params.get("start"); |
|
2016 |
String[] endArray = (String[]) params.get("end"); |
|
2017 |
String start = null; |
|
2018 |
String end = null; |
|
2019 |
if (startArray != null) { |
|
2020 |
start = startArray[0]; |
|
2021 |
} |
|
2022 |
if (endArray != null) { |
|
2023 |
end = endArray[0]; |
|
2024 |
} |
|
2025 |
Timestamp startDate = null; |
|
2026 |
Timestamp endDate = null; |
|
2027 |
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); |
|
2028 |
try { |
|
2029 |
if (start != null) { |
|
2030 |
startDate = new Timestamp((format.parse(start)).getTime()); |
|
2031 |
} |
|
2032 |
if (end != null) { |
|
2033 |
endDate = new Timestamp((format.parse(end)).getTime()); |
|
2034 |
} |
|
2035 |
} catch (ParseException e) { |
|
2036 |
System.out.println("Failed to created Timestamp from input."); |
|
2037 |
} |
|
2038 |
|
|
2039 |
// Request the report by passing the filter parameters |
|
2040 |
try { |
|
2041 |
response.setContentType("text/xml"); |
|
2042 |
PrintWriter out = response.getWriter(); |
|
2043 |
out.println(EventLog.getInstance().getReport(ipAddress, principal, |
|
2044 |
docid, event, startDate, endDate)); |
|
2045 |
out.close(); |
|
2046 |
} catch (IOException e) { |
|
2047 |
MetaCatUtil.debugMessage( |
|
2048 |
"Could not open http response for writing: " |
|
2049 |
+ e.getMessage(), 5); |
|
2050 |
} |
|
2051 |
} |
|
2052 |
|
|
2053 |
/** |
|
1987 | 2054 |
* Handle documents passed to metacat that are encoded using the |
1988 | 2055 |
* "multipart/form-data" mime type. This is typically used for uploading |
1989 | 2056 |
* data files which may be binary and large. |
Also available in: Unified diff
Added the EventLog functionality to the servlet as action=getlog. Valid parameters are ipAddress, principal, docid, event, start, end. All parameters can be repeated except start and end.