/*
* Copyright (C) 2004-2008 Jive Software. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jivesoftware.xmpp.workgroup;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TimeZone;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.jivesoftware.database.DbConnectionManager;
import org.jivesoftware.util.FastDateFormat;
import org.jivesoftware.xmpp.workgroup.utils.ModelUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xmpp.packet.IQ;
import org.xmpp.packet.PacketError;
public class WorkgroupStats {
private static final Logger Log = LoggerFactory.getLogger(WorkgroupStats.class);
private static final String GET_SESSIONS_WITH_TRANSCRIPTS =
"SELECT sessionID, startTime, endTime FROM fpSession WHERE workgroupID=? AND " +
"userID=? AND transcript IS NOT NULL";
private static final String GET_TRANSCRIPT =
"SELECT transcript FROM fpSession WHERE sessionID=?";
private static final String GET_SESSION_AGENTS =
"SELECT sessionID, agentJID, joinTime, leftTime FROM fpAgentSession WHERE sessionID=?";
private static final FastDateFormat UTC_FORMAT = FastDateFormat
.getInstance("yyyyMMdd'T'HH:mm:ss", TimeZone.getTimeZone("GMT+0"));
private List<Object[]> chatList = new ArrayList<Object[]>();
private List<Object[]> transferList = new ArrayList<Object[]>();
private Workgroup workgroup;
// Defined Variables used in Stats
public final static String ACTION = "ACTION";
public final static String END_OF_CHAT = "END_OF_CHAT";
public final static String START_OF_CHAT = "START_OF_CHAT";
public final static String START_TIME = "START_TIME";
public final static String END_TIME = "END_TIME";
public final static String AGENT_JID = "AGENT_JID";
public final static String AGENT_TRANSFER = "AGENT_TRANSFER";
public final static String OTHER_AGENT_JID = "OTHER_AGENT_JID";
public final static String CHAT_ROOM = "CHAT_ROOM";
public final static String WORKGROUP_NAME = "WORKGROUP_NAME";
public WorkgroupStats(Workgroup workgroup) {
this.workgroup = workgroup;
}
public void processStatistics(Map<String, String> map) {
final String action = map.get(ACTION);
if (END_OF_CHAT.equals(action)) {
String agent = map.get(AGENT_JID);
Long startTime = new Long(map.get(START_TIME));
Long endTime = new Long(map.get(END_TIME));
// String chatRoom = (String)map.get(CHAT_ROOM);
// String workgroupName = (String)map.get(WORKGROUP_NAME);
chatList.add(new Object[]{agent, startTime, endTime});
}
else if (AGENT_TRANSFER.equals(action)) {
final String agent = map.get(AGENT_JID);
final Long startTime = new Long(map.get(START_TIME));
final Long transferTime = new Long(map.get(END_TIME));
final String agentTransferedTo = map.get(OTHER_AGENT_JID);
transferList.add(new Object[]{agent, startTime, transferTime, agentTransferedTo});
}
}
public Iterator<Object[]> getCompletedChats() {
return chatList.iterator();
}
public Iterator<Object[]> getChatsTransfered() {
return transferList.iterator();
}
public void getChatTranscripts(IQ iq, String uniqueUserID) {
try {
IQ replyPacket = IQ.createResultIQ(iq);
Element transcripts = replyPacket.setChildElement("transcripts",
"http://jivesoftware.com/protocol/workgroup");
transcripts.addAttribute("userID", uniqueUserID);
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
con = DbConnectionManager.getConnection();
pstmt = con.prepareStatement(GET_SESSIONS_WITH_TRANSCRIPTS);
pstmt.setLong(1, workgroup.getID());
pstmt.setString(2, uniqueUserID);
rs = pstmt.executeQuery();
while (rs.next()) {
String sessionID = rs.getString(1);
String joinTime = rs.getString(2);
String leftTime = rs.getString(3);
Element transcript = transcripts.addElement("transcript");
// Add the sessionID attribute
transcript.addAttribute("sessionID", sessionID);
// Add the list of agents involved in this session
Element agentElement = transcript.addElement("agents");
addAgentsToElement(agentElement, sessionID);
// Add the date when the attribute
if (joinTime != null && joinTime.length() > 0) {
transcript.addElement("joinTime").setText(UTC_FORMAT.format(new Date(Long.parseLong(joinTime))));
}
if (leftTime != null && leftTime.length() > 0) {
transcript.addElement("leftTime").setText(UTC_FORMAT.format(new Date(Long.parseLong(leftTime))));
}
}
}
catch (Exception ex) {
Log.error(
"Error retrieving chat transcript(s)", ex);
}
finally {
DbConnectionManager.closeConnection(rs, pstmt, con);
workgroup.send(replyPacket);
}
}
catch (Exception ex) {
Log.error(ex.getMessage(), ex);
}
}
public void getChatTranscript(IQ iq, String sessionID) {
final IQ reply = IQ.createResultIQ(iq);
String transcriptXML = null;
try {
Element transcript = reply.setChildElement("transcript",
"http://jivesoftware.com/protocol/workgroup");
transcript.addAttribute("sessionID", sessionID);
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
con = DbConnectionManager.getConnection();
pstmt = con.prepareStatement(GET_TRANSCRIPT);
pstmt.setString(1, sessionID);
rs = pstmt.executeQuery();
if (rs.next()) {
transcriptXML = DbConnectionManager.getLargeTextField(rs, 1);
}
}
catch (SQLException sqle) {
Log.error(sqle.getMessage(), sqle);
}
finally {
DbConnectionManager.closeConnection(rs, pstmt, con);
}
if (transcriptXML != null) {
Document element = DocumentHelper.parseText(transcriptXML);
// Add the Messages and Presences contained in the retrieved transcript element
for (Iterator<Element> it = element.getRootElement().elementIterator(); it.hasNext();) {
Element packet = it.next();
transcript.add(packet.createCopy());
}
}
workgroup.send(reply);
}
catch (Exception ex) {
Log.error(
"There was an error retrieving the following transcript. SessionID = " +
sessionID + " Transcript=" + transcriptXML, ex);
reply.setChildElement(iq.getChildElement().createCopy());
reply.setError(new PacketError(PacketError.Condition.item_not_found));
workgroup.send(reply);
}
}
private void addAgentsToElement(Element elem, String sessionID) {
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
con = DbConnectionManager.getConnection();
pstmt = con.prepareStatement(GET_SESSION_AGENTS);
pstmt.setString(1, sessionID);
rs = pstmt.executeQuery();
while (rs.next()) {
String agentJID = rs.getString(2);
String joinTime = rs.getString(3);
String leftTime = rs.getString(4);
final Element agentElement = elem.addElement("agent");
agentElement.addElement("agentJID").setText(agentJID);
if (ModelUtil.hasLength(joinTime)) {
agentElement.addElement("joinTime").setText(UTC_FORMAT.format(new Date(Long.parseLong(joinTime))));
}
if (ModelUtil.hasLength(leftTime)) {
agentElement.addElement("leftTime").setText(UTC_FORMAT.format(new Date(Long.parseLong(leftTime))));
}
}
}
catch (Exception ex) {
Log.error(ex.getMessage(), ex);
}
finally {
DbConnectionManager.closeConnection(rs, pstmt, con);
}
}
}