
org.sakaiproject.event.impl.EventQueryServiceImpl Maven / Gradle / Ivy
package org.sakaiproject.event.impl;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.sakaiproject.event.api.EventQueryService;
import org.sakaiproject.util.Xml;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.sakaiproject.db.api.SqlService;
/**
* Implementation of EventQueryService
* It returns xml event lists for a given user eid.
*/
public class EventQueryServiceImpl implements EventQueryService {
private static Log log = LogFactory.getLog(EventQueryServiceImpl.class);
private DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
/**
* Returns a list of events of a user between 2 dates.
* @param eid is the user that we want to query
* @param startDate limit the query ti these dates
* @param endDate limit the query ti these dates
* @return String as the result of the Query in xml
*/
public String getUserActivity(String eid, Date startDate, Date endDate) {
String query = "select se.EVENT_ID, se.EVENT_DATE, se.EVENT, se.REF, se.CONTEXT, se.EVENT_CODE, um.USER_ID, um.EID from " +
"SAKAI_EVENT se, SAKAI_SESSION ss, SAKAI_USER_ID_MAP um " +
"where se.SESSION_ID = ss.SESSION_ID and um.EID = ? and ";
if (sqlService.getVendor().equals("oracle"))
{
query += "EVENT_DATE BETWEEN to_date(?, 'YYYY-MM-DD HH24:MI') AND to_date(?, 'YYYY-MM-DD HH24:MI') ";
}
else
{
query += "EVENT_DATE BETWEEN ? AND ?";
}
query += " and um.USER_ID = ss.SESSION_USER order by se.EVENT_DATE desc";
return queryEventTableWithEid(query, new Object[]{eid, startDate, endDate});
}
/**
* Returns a list of events of a user between 2 dates.
* @param eid is the user that we want to query
* @param startDateString limit the query ti these dates. In this case as String if we call it as a rest
* @param endDateString limit the query ti these dates. In this case as String if we call it as a rest
* @return String as the result of the Query in xml
*/
public String getUserActivityRestVersion(String eid, String startDateString, String endDateString) {
Date startDate;
Date endDate;
try
{
startDate = getDateFromString(startDateString);
endDate = getDateFromString(endDateString);
}
catch (ParseException e)
{
return "Activity Webservices exception : " + e.getMessage();
}
String query = "select se.EVENT_ID, se.EVENT_DATE, se.EVENT, se.REF, se.CONTEXT, se.EVENT_CODE, um.USER_ID, um.EID from " +
"SAKAI_EVENT se, SAKAI_SESSION ss, SAKAI_USER_ID_MAP um " +
"where se.SESSION_ID = ss.SESSION_ID and um.EID = ? and ";
if (sqlService.getVendor().equals("oracle"))
{
query += "EVENT_DATE BETWEEN to_date(?, 'YYYY-MM-DD HH24:MI') AND to_date(?, 'YYYY-MM-DD HH24:MI') ";
}
else
{
query += "EVENT_DATE BETWEEN ? AND ?";
}
query += " and um.USER_ID = ss.SESSION_USER order by se.EVENT_DATE desc";
return queryEventTableWithEid(query, new Object[]{eid, startDate, endDate});
}
/**
* Returns the User's logon activity.
* @param eid is the user that we want to query
* @return String as the result of the Query in xml
*/
public String getUserLogonActivity(String eid) {
String query = ("select se.EVENT_ID, se.EVENT_DATE, se.EVENT, se.REF, se.CONTEXT, se.EVENT_CODE, um.USER_ID, um.EID from " +
"SAKAI_EVENT se, SAKAI_SESSION ss, SAKAI_USER_ID_MAP um " +
"where se.SESSION_ID = ss.SESSION_ID and um.EID = ? and " +
"um.USER_ID = ss.SESSION_USER and se.EVENT = 'user.login' order by se.EVENT_DATE desc");
return queryEventTableWithEid(query, new Object[]{eid});
}
/**
* Returns the User's activity filtered by one event type.
* @param eid is the user that we want to query
* @param eventType the event type to filter
* @return String as the result of the Query in xml
*/
public String getUserActivityByType(String eid, String eventType) {
String query = ("select se.EVENT_ID, se.EVENT_DATE, se.EVENT, se.REF, se.CONTEXT, se.EVENT_CODE, um.USER_ID, um.EID from " +
"SAKAI_EVENT se, SAKAI_SESSION ss, SAKAI_USER_ID_MAP um " +
"where se.SESSION_ID = ss.SESSION_ID and um.EID = ? and " +
"um.USER_ID = ss.SESSION_USER and se.EVENT = ? order by se.EVENT_DATE desc");
return queryEventTableWithEid(query, new Object[]{eid, eventType});
}
/**
* Parses the string to create a date object
*/
private Date getDateFromString(String dateString) throws ParseException {
try {
Date date = df.parse(dateString);
return date;
} catch (ParseException e) {
log.warn("Date format should be yyyy-MM-dd HH:mm:ss");
throw new ParseException("Date format should be yyyy-MM-dd HH:mm:ss",e.getErrorOffset());
}
}
/**
* Executes the query
*/
private String queryEventTableWithEid(String query, Object[] args) {
Document doc = Xml.createDocument();
Node results = doc.createElement("events");
doc.appendChild(results);
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
boolean returnErrorMessage = false;
String errorMessage = "";
try {
conn = sqlService.borrowConnection();
ps = conn.prepareStatement(query);
for (int i = 0; i < args.length; i++) {
if (args[i] instanceof String) {
ps.setString(i + 1, (String) args[i]);
}
else if (args[i] instanceof Date) {
ps.setString(i + 1, df.format(args[i]));
long date = ((Date) args[i]).getTime();
}
}
rs = ps.executeQuery();
buildXmlFromResultSet(results, rs);
} catch (Exception e) {
log.error(e.getMessage(), e);
returnErrorMessage = true;
errorMessage= "Activity Webservices exception :" + e.getMessage();
} finally {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
}
}
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
}
}
if (returnErrorMessage) return errorMessage;
}
return Xml.writeDocumentToString(doc);
}
/**
* Creates the xml result based in the SQL query
*/
private Document buildXmlFromResultSet(Node results, ResultSet rs) throws SQLException {
Document doc = results.getOwnerDocument();
while (rs.next()) {
Node eventNode = doc.createElement("event");
results.appendChild(eventNode);
Node id = doc.createElement("event_id");
id.appendChild(doc.createTextNode(rs.getString("EVENT_ID")));
eventNode.appendChild(id);
Node event_date = doc.createElement("event_date");
event_date.appendChild(doc.createTextNode(df.format(rs.getTimestamp("EVENT_DATE"))));
eventNode.appendChild(event_date);
Node event = doc.createElement("event_type");
event.appendChild(doc.createTextNode(rs.getString("EVENT")));
eventNode.appendChild(event);
Node ref = doc.createElement("ref");
ref.appendChild(doc.createTextNode(rs.getString("REF")));
eventNode.appendChild(ref);
Node context = doc.createElement("context");
context.appendChild(doc.createTextNode(rs.getString("CONTEXT")));
eventNode.appendChild(context);
Node event_code = doc.createElement("event_code");
event_code.appendChild(doc.createTextNode(rs.getString("EVENT_CODE")));
eventNode.appendChild(event_code);
Node user_id = doc.createElement("user_id");
user_id.appendChild(doc.createTextNode(rs.getString("USER_ID")));
eventNode.appendChild(user_id);
Node eidNode = doc.createElement("eid");
eidNode.appendChild(doc.createTextNode(rs.getString("EID")));
eventNode.appendChild(eidNode);
}
return doc;
}
/*************************************************************************************************************************************************
* Dependencies
************************************************************************************************************************************************/
/** Dependency: SqlService. */
protected SqlService sqlService;
public void setSqlService(SqlService sqlService) {
this.sqlService = sqlService;
}
/**********************************************************************************************************************************************************************************************************************************************************
* Init and Destroy
*********************************************************************************************************************************************************************************************************************************************************/
/**
* Init method.
*/
public void init() {
log.info(this + ".init()");
}
/**
* Final cleanup.
*/
public void destroy() {
log.info(this + ".destroy()");
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy