/* * Copyright (C) 1999-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.openfire.fastpath.providers; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import org.dom4j.Element; import org.jivesoftware.database.DbConnectionManager; import org.jivesoftware.xmpp.workgroup.AgentNotFoundException; import org.jivesoftware.xmpp.workgroup.Workgroup; import org.jivesoftware.xmpp.workgroup.WorkgroupProvider; 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; /** * AgentHistory is responsible for retrieving the information for one agent. */ public class AgentHistory implements WorkgroupProvider { private static final Logger Log = LoggerFactory.getLogger(AgentHistory.class); private static final String GET_AGENT_SESSIONS = "SELECT sessionID, joinTime, leftTime FROM fpAgentSession WHERE agentJID=?"; private static final String GET_SESSION_METADATA = "SELECT metadataname, metadatavalue FROM fpSessionMetadata WHERE sessionID=?"; public boolean handleGet(IQ packet) { Element iq = packet.getChildElement(); String name = iq.getName(); return "chat-sessions".equals(name); } public boolean handleSet(IQ packet) { return false; } public void executeGet(IQ packet, Workgroup workgroup) { IQ reply = IQ.createResultIQ(packet); try { if (workgroup.getAgentManager().getAgentSession(packet.getFrom()) == null) { reply = IQ.createResultIQ(packet); reply.setChildElement(packet.getChildElement().createCopy()); reply.setError(new PacketError(PacketError.Condition.not_authorized)); workgroup.send(reply); return; } } catch (AgentNotFoundException e) { reply = IQ.createResultIQ(packet); reply.setChildElement(packet.getChildElement().createCopy()); reply.setError(new PacketError(PacketError.Condition.not_authorized)); workgroup.send(reply); return; } // Create session list List<AgentHistoryModel> sessionList = new ArrayList<AgentHistoryModel>(); Element chatSessions = reply.setChildElement("chat-sessions", "http://jivesoftware.com/protocol/workgroup"); Element iq = packet.getChildElement(); String agentJID = iq.attributeValue("agentJID"); String ms = iq.attributeValue("maxSessions"); String date = iq.attributeValue("startDate"); long startTime = 0; if (date != null) { startTime = Long.parseLong(date); } int maxSessions = Integer.parseInt(ms); Connection con = null; PreparedStatement pstmt = null; try { con = DbConnectionManager.getConnection(); pstmt = con.prepareStatement(GET_AGENT_SESSIONS); pstmt.setString(1, agentJID); ResultSet result = pstmt.executeQuery(); while (result.next()) { String sessionID = result.getString(1); String joinTime = result.getString(2); String leftTime = result.getString(3); AgentHistoryModel model = new AgentHistoryModel(); if (ModelUtil.hasLength(joinTime) && ModelUtil.hasLength(leftTime)) { try { long start = Long.valueOf(joinTime); long end = Long.valueOf(leftTime); long totalTime = end - start; model.setSessionID(sessionID); model.setJoinTime(joinTime); model.setDuration(Long.toString(totalTime)); if (start >= startTime) { sessionList.add(model); } } catch (NumberFormatException e) { Log.error(e.getMessage(), e); } } } result.close(); } catch (Exception ex) { Log.error(ex.getMessage(), ex); } finally { DbConnectionManager.closeConnection(pstmt, con); } buildAndSend(sessionList, chatSessions, reply, workgroup, maxSessions); } public void buildAndSend(List<AgentHistoryModel> list, Element chatSessions, IQ reply, Workgroup workgroup, int maxSessions) { for (AgentHistoryModel model : getNewList(list, maxSessions)) { Element session = chatSessions.addElement("chat-session"); session.addElement("sessionID").setText(model.getSessionID()); session.addElement("date").setText(model.getJoinTime()); session.addElement("duration").setText(model.getDuration()); session.addElement("visitorsName").setText(model.getName() == null ? "" : model.getName()); session.addElement("visitorsEmail").setText(model.getEmail() == null ? "" : model.getEmail()); session.addElement("question").setText(model.getQuestion() == null ? "" : model.getQuestion()); } workgroup.send(reply); } private List<AgentHistoryModel> getNewList(List<AgentHistoryModel> sessions, int maxSessions) { List<AgentHistoryModel> newList = new ArrayList<AgentHistoryModel>(); Collections.sort(sessions, new Comparator<AgentHistoryModel>() { public int compare(AgentHistoryModel m1, AgentHistoryModel m2) { String str1 = m1.getJoinTime(); String str2 = m2.getJoinTime(); long i1 = Long.valueOf(str1); long i2 = Long.valueOf(str2); // Check if identical if (i1 == i2) { return 0; } if (i1 > i2) { return -1; } else if (i1 < i2) { return 1; } else { return 0; } } }); int max = maxSessions < sessions.size() ? maxSessions : sessions.size(); for (int i = 0; i < max; i++) { AgentHistoryModel model = sessions.get(i); appendSessionInformation(model); newList.add(model); } return newList; } private void appendSessionInformation(AgentHistoryModel model) { Connection con = null; PreparedStatement pstmt = null; ResultSet rs = null; try { con = DbConnectionManager.getConnection(); pstmt = con.prepareStatement(GET_SESSION_METADATA); pstmt.setString(1, model.getSessionID()); rs = pstmt.executeQuery(); while (rs.next()) { String name = rs.getString(1); String value = rs.getString(2); if (name.equals("username")) { model.setName(value); } else if (name.equals("email")) { model.setEmail(value); } else if (name.equals("question")) { model.setQuestion(value); } } } catch (Exception ex) { Log.error(ex.getMessage(), ex); } finally { DbConnectionManager.closeConnection(rs, pstmt, con); } } public void executeSet(IQ packet, Workgroup workgroup) { } private class AgentHistoryModel { private String sessionID; private String joinTime; private String duration; private String name; private String email; private String question; AgentHistoryModel() { } public String getSessionID() { return sessionID; } public void setSessionID(String sessionID) { this.sessionID = sessionID; } public void setJoinTime(String joinTime) { this.joinTime = joinTime; } public String getJoinTime() { return joinTime; } public void setDuration(String duration) { this.duration = duration; } public String getDuration() { return duration; } public void setName(String name) { this.name = name; } public String getName() { return name; } public void setEmail(String email) { this.email = email; } public String getEmail() { return email; } public void setQuestion(String question) { this.question = question; } public String getQuestion() { return question; } } }