package org.ifsoft.openlink.view;
import java.io.IOException;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ArrayList;
import java.util.Date;
import java.util.Calendar;
import java.text.SimpleDateFormat;
import java.text.DateFormat;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.*;
import javax.servlet.annotation.*;
import org.jivesoftware.util.*;
import org.jivesoftware.openfire.XMPPServer;
import org.jivesoftware.openfire.user.UserManager;
import org.jivesoftware.openfire.user.User;
import org.ifsoft.openlink.*;
import org.ifsoft.openlink.component.*;
import org.ifsoft.openlink.calllog.*;
import org.xmpp.packet.JID;
import org.slf4j.*;
import org.slf4j.Logger;
@WebServlet(value="/traderlyncCallHistory", name="traderlyncCallHistory") public class CallHistory extends HttpServlet {
private UserManager userManager;
private static final Logger Log = LoggerFactory.getLogger(CallHistory.class);
public void init(ServletConfig servletConfig) throws ServletException {
super.init(servletConfig);
userManager = XMPPServer.getInstance().getUserManager();
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setHeader("Expires", "Sat, 6 May 1995 12:00:00 GMT");
response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
response.addHeader("Cache-Control", "post-check=0, pre-check=0");
response.setHeader("Pragma", "no-cache");
response.setHeader("Content-Type", "text/html");
response.setHeader("Connection", "close");
ServletOutputStream out = response.getOutputStream();
try {
CallFilter filter = null;
out.println("<html>");
out.println("<head>");
out.println("<title>Call History</title>");
out.println("<meta name=\"pageID\" content=\"TRADERLYNC-CALL-HISTORY\"/>");
out.println("<style type='text/css'>");
out.println(".btn {");
out.println(" font-size: 10px;");
out.println(" font-family: Arial;");
out.println(" font-weight: normal;");
out.println(" -moz-border-radius: 6px;");
out.println(" -webkit-border-radius: 6px;");
out.println(" border-radius: 6px;");
out.println(" border: 0px solid #dcdcdc;");
out.println(" padding: 4px 13px;");
out.println(" text-decoration: none;");
out.println(" background: -moz-linear-gradient(center top, #ededed 5%, #dfdfdf 100%);");
out.println(" background: -ms-linear-gradient(top, #ededed 5%, #dfdfdf 100%);");
out.println(" filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',");
out.println(" endColorstr='#dfdfdf');");
out.println(" background: -webkit-gradient(linear, left top, left bottom, color-stop(5%, #ededed),");
out.println(" color-stop(100%, #dfdfdf));");
out.println(" background-color: #ededed;");
out.println(" color: #777777;");
out.println(" display: inline-block;");
out.println(" text-shadow: 1px 1px 0px #ffffff;");
out.println(" -webkit-box-shadow: inset 1px 1px 0px 0px #ffffff;");
out.println(" -moz-box-shadow: inset 1px 1px 0px 0px #ffffff;");
out.println(" box-shadow: inset 1px 1px 0px 0px #ffffff;");
out.println("}");
out.println(".btn:hover {");
out.println(" background: -moz-linear-gradient(center top, #dfdfdf 5%, #ededed 100%);");
out.println(" background: -ms-linear-gradient(top, #dfdfdf 5%, #ededed 100%);");
out.println(" filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#dfdfdf',");
out.println(" endColorstr='#ededed');");
out.println(" background: -webkit-gradient(linear, left top, left bottom, color-stop(5%, #dfdfdf),");
out.println(" color-stop(100%, #ededed));");
out.println(" background-color: #dfdfdf;");
out.println("}");
out.println(".btn:active {");
out.println(" position: relative;");
out.println(" top: 1px;");
out.println("}");
out.println("</style>");
out.println("<script src='/js/prototype.js' type='text/javascript'></script>");
out.println("<script src='/js/scriptaculous.js' type='text/javascript'></script>");
out.println("<script type='text/javascript' language='javascript' src='/js/tooltips/domLib.js'></script>");
out.println("<script type='text/javascript' language='javascript' src='/js/tooltips/domTT.js'></script>");
out.println("<script type='text/javascript' src='/js/jscalendar/calendar.js'></script>");
out.println("<script type='text/javascript' src='/js/jscalendar/i18n.jsp'></script>");
out.println("<script type='text/javascript' src='/js/jscalendar/calendar-setup.js'></script>");
out.println("<script type='text/javascript' src='/js/behaviour.js'></script>");
out.println("<script type='text/javascript' src='js/callhistory.js'></script>");
out.println("<script type='text/javascript'>");
out.println(" function playMediaFile(location) {");
out.println(" var audio1 = document.getElementById('audio1');");
out.println(" audio1.src = location;");
out.println(" audio1.play();");
out.println(" }");
out.println("</script>");
out.println("<link rel='stylesheet' type='text/css' href='/js/jscalendar/calendar-win2k-cold-1.css' />");
out.println("<link rel='stylesheet' type='text/css' href='style/callhistory.css' />");
out.println("</head>");
out.println("<body>");
String msg = request.getParameter("msg");
if (msg != null)
{
out.println("<div class='jive-success'>");
out.println("<table cellpadding='0' cellspacing='0' border='0'>");
out.println("<tbody>");
out.println("<tr><td class='jive-icon'><img src='images/success-16x16.gif' width='16' height='16' border='0' alt=''></td>");
out.println("<td class='jive-icon-label'>");
out.println(msg);
out.println("</td></tr>");
out.println("</tbody>");
out.println("</table>");
out.println("</div>");
}
String userName = request.getParameter("username") != null ? request.getParameter("username") : "";
String caller = request.getParameter("caller") != null ? request.getParameter("caller") : "";
String called = request.getParameter("called") != null ? request.getParameter("called") : "";
String callType = request.getParameter("callType") != null ? request.getParameter("callType") : "";
String startDate = request.getParameter("startDate") != null ? request.getParameter("startDate") : "";
String endDate = request.getParameter("endDate") != null ? request.getParameter("endDate") : "";
String action = request.getParameter("action");
if (action == null)
{
Calendar calendar = Calendar.getInstance();
int day = calendar.get(Calendar.DATE);
int month = calendar.get(Calendar.MONTH) + 1;
int year = calendar.get(Calendar.YEAR);
//startDate = month + "/" + day + "/" + year;
}
Date fromDate = null;
if (startDate != null && startDate.length() > 0) {
DateFormat formatter = new SimpleDateFormat("MM/dd/yy");
try {
fromDate = formatter.parse(startDate);
}
catch (Exception e) {
Log.error("CallHistory " + e);
e.printStackTrace();
}
}
Date uptoDate = null;
if (endDate != null && endDate.length() > 0) {
DateFormat formatter = new SimpleDateFormat("MM/dd/yy");
try {
Date date = formatter.parse(endDate);
// The user has chosen an end date and expects that any conversation
// that falls on that day will be included in the search results. For
// example, say the user choose 6/17/2006 as an end date. If a conversation
// occurs at 5:33 PM that day, it should be included in the results. In
// order to make this possible, we need to make the end date one millisecond
// before the next day starts.
uptoDate = new Date(date.getTime() + JiveConstants.DAY - 1);
}
catch (Exception e) {
Log.error("CallHistory " + e);
e.printStackTrace();
}
}
out.println("<form name='jid' action='traderlync-call-history' method='get'>");
out.println(" <div>");
out.println(" <table class='stat'>");
out.println(" <tr valign='top'>");
out.println(" <td>");
out.println(" <table cellpadding='3' cellspacing='0' border='0' width='100%'>");
out.println(" <tbody>");
out.println(" <tr>");
out.println(" <td align='left' width='150'>User name: ");
out.println(" </td>");
out.println(" <td align='left'>");
out.println(" <input type='text' size='20' maxlength='100' name='username' value='" + (userName != null ? userName : "") + "'>");
out.println(" </td>");
out.println(" </tr>");
out.println(" <tr>");
out.println(" <td align='left' width='150'>Caller: ");
out.println(" </td>");
out.println(" <td align='left'>");
out.println(" <input type='text' size='20' maxlength='100' name='caller' value='" + (caller != null ? caller : "") + "'>");
out.println(" </td>");
out.println(" </tr>");
out.println(" <tr>");
out.println(" <td align='left' width='150'>Called: ");
out.println(" </td>");
out.println(" <td align='left'>");
out.println(" <input type='text' size='20' maxlength='100' name='called' value='" + (called != null ? called : "") + "'>");
out.println(" </td>");
out.println(" </tr>");
out.println(" <tr>");
out.println(" <td align='left' width='150'>Type: ");
out.println(" </td>");
out.println(" <td align='left'>");
out.println(" <select name='callType' size='1'>");
out.println(" <option value='all' " + (("all".equals(callType) || callType == null) ? "selected" : "") + ">All</option>");
out.println(" <option value='in' " + ("in".equals(callType) ? "selected" : "") + ">Incoming</option>");
out.println(" <option value='out' " + ("out".equals(callType) ? "selected" : "") + ">Outgoing</option>");
out.println(" <option value='missed' " + ("missed".equals(callType) ? "selected" : "") + ">Missed</option>");
out.println(" </select>");
out.println(" </td>");
out.println(" </tr>");
out.println(" </tbody>");
out.println(" </table>");
out.println(" </td>");
out.println(" <td width='0' height='100%' valign='middle'>");
out.println(" <div class='verticalrule'></div>");
out.println(" </td>");
out.println(" <td>");
out.println(" <table>");
out.println(" <tr>");
out.println(" <td colspan='3'>");
out.println(" <b>Date Range:</b>");
out.println(" <a title='Enter specific date ranges to search between. You can specify a start date and/or end date.'><img src='images/icon_help_14x14.gif' vspace='2' align='texttop'/></a>");
out.println(" </td>");
out.println(" </tr>");
out.println(" <tr valign='top'>");
out.println(" <td>Start:</td>");
out.println(" <td>");
out.println(" <input type='text' id='startDate' name='startDate' size='13'");
out.println(" value='" + (startDate != null ? startDate : "") + "' class='textfield'/><br/>");
out.println(" <span class='jive-description'>Use mm/dd/yy</span>");
out.println(" </td>");
out.println(" <td>");
out.println(" <img src='images/icon_calendarpicker.gif' vspace='3' id='startDateTrigger'>");
out.println(" </td>");
out.println(" </tr>");
out.println(" <tr valign='top'>");
out.println(" <td>End:</td>");
out.println(" <td>");
out.println(" <input type='text' id='endDate' name='endDate' size='13'");
out.println(" value='" + (endDate != null ? endDate : "") + "' class='textfield'/><br/>");
out.println(" <span class='jive-description'>Use mm/dd/yy</span>");
out.println(" </td>");
out.println(" <td>");
out.println(" <img src='images/icon_calendarpicker.gif' vspace='3' id='endDateTrigger'>");
out.println(" </td>");
out.println(" </tr>");
out.println(" </table>");
out.println(" </td>");
out.println(" <td>");
out.println(" <table>");
out.println(" <tr>");
out.println(" <td>Media Player:</td>");
out.println(" <td nowrap><audio controls id='audio1' preload='none'><source src='' type='audio/mp3'></audio></td>");
out.println(" </tr>");
out.println(" </table>");
out.println(" </td>");
out.println(" </tr>");
out.println(" </table>");
out.println(" </div>");
out.println(" <div align='left'><input type='submit' name='action' value='Query'></div>");
out.println("</form>");
out.println("");
out.println("<br>");
filter = CallLogDAO.createSQLFilter(userName, caller, called, callType, fromDate, uptoDate, "");
if (filter != null)
{
int linesCount = 100;
int numberOfCalls = CallLogDAO.getLogCount(filter);
int pageCounter = (numberOfCalls/linesCount);
pageCounter = numberOfCalls > (linesCount * pageCounter) ? pageCounter + 1 : pageCounter;
String start = request.getParameter("start");
String count = request.getParameter("count");
int pageStart = start == null ? 0 : Integer.parseInt(start);
int pageCount = count == null ? linesCount : Integer.parseInt(count);
out.println("<table width='100%' cellpadding=\"1\" cellspacing=\"1\" border=\"0\"><tr><td>Total: " + numberOfCalls + " Pages:[");
for (int i=0; i<pageCounter; i++)
{
int iStart = (i * linesCount);
int iCount = ((i * linesCount) + linesCount) > numberOfCalls ? ((i * linesCount) + linesCount) - numberOfCalls : linesCount;
int page = i + 1;
if (pageStart == iStart)
{
out.println("<span nowrap> " + page + " </span>");
} else {
out.println("<span nowrap><a href='traderlync-call-history?action=Query&username=" + userName + "&caller=" + caller + "&called=" + called + "&callType=" + callType + "&startDate=" + startDate + "&endDate=" + endDate + "&start=" + iStart + "&count=" + iCount + "'> " + page + " </a></span>");
}
}
out.println("]</td></tr></table>");
out.println("<div class=\"jive-table\">");
out.println("<table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" width=\"100%\">");
out.println("<thead>");
out.println("<tr>");
out.println("<th nowrap>User Name</th>");
out.println("<th nowrap>Full Name</th>");
out.println("<th nowrap>Direction</th>");
out.println("<th nowrap>Missed</th>");
out.println("<th nowrap>Active</th>");
out.println("<th nowrap>Caller Number</th>");
out.println("<th nowrap>Caller Name</th>");
out.println("<th nowrap>Called Number</th>");
out.println("<th nowrap>Called Name</th>");
out.println("<th nowrap>Time</th>");
out.println("<th nowrap>Duration (secs)</th>");
out.println("<th nowrap>Recording</th>");
out.println("</tr>");
out.println("</thead>");
out.println("<tbody>");
Collection<CallLog> calls = CallLogDAO.getCalls(filter, pageStart, pageCount);
Iterator it = calls.iterator();
int i = 0;
while( it.hasNext() )
{
try
{
CallLog callLog = (CallLog)it.next();
try {
JID jid = new JID(callLog.getParticipantLog().getJid());
String userId = jid.getNode();
if (userManager.isRegisteredUser(userId))
{
User user = userManager.getUser(userId);
String recording = callLog.getTscId();
if(i % 2 == 1)
out.println("<tr class=\"jive-odd\">");
else
out.println("<tr class=\"jive-even\">");
out.println("<td width=\"5%\">");
out.println(user.getUsername());
out.println("</td>");
out.println("<td width=\"10%\">");
out.println(user.getName());
out.println("</td>");
out.println("<td width=\"5%\">");
out.println("Incoming".equals(callLog.getDirection()) ? "<img src=\"images/incoming.jpg\" alt=\"Incoming\" border=\"0\">In" : "<img src=\"images/outgoing.jpg\" alt=\"Outgoing\" border=\"0\">Out");
out.println("</td>");
out.println("<td width=\"5%\">");
out.println("CallMissed".equals(callLog.getState()) ? "<img src=\"images/success-16x16.gif\" alt=\"Missed\" border=\"0\">" : " ");
out.println("</td>");
out.println("<td width=\"5%\">");
out.println("Active".equals(callLog.getParticipantLog().getType()) ? "<img src=\"images/success-16x16.gif\" alt=\"Active\" border=\"0\">" : " ");
out.println("</td>");
out.println("<td width=\"10%\">");
out.println(callLog.getCallerNumber());
out.println("</td>");
out.println("<td width=\"10%\">");
out.println(callLog.getCallerName());
out.println("</td>");
out.println("<td width=\"10%\">");
out.println(callLog.getCalledNumber());
out.println("</td>");
out.println("<td width=\"10%\">");
out.println(callLog.getCalledName());
out.println("</td>");
out.println("<td width=\"10%\">");
out.println(String.valueOf(callLog.getParticipantLog().getStartTimestamp()));
out.println("</td>");
out.println("<td width=\"5%\">");
out.println(String.valueOf(callLog.getParticipantLog().getDuration()));
out.println("</td>");
out.println("<td width=\"10%\">");
if (recording != null && !recording.equals(""))
{
recording = recording.replace(java.io.File.separator, "/");
int pos = recording.indexOf("/spank/");
if (pos > -1)
{
String url = "http://" + XMPPServer.getInstance().getServerInfo().getHostname() + ":" + JiveGlobals.getProperty("httpbind.port.plain", "7070") + recording.substring(pos + 6);
out.println("<button type='button' class='btn' onclick='playMediaFile("" + url + "")'>Play ►</button>");
} else {
out.println(recording);
}
} else {
out.println(" ");
}
out.println("</td>");
out.println("</tr>");
i++;
}
} catch (Exception e) {
Log.error("CallHistory " + e);
e.printStackTrace();
}
}
catch(Exception e)
{
Log.error("CallHistory " + e);
e.printStackTrace();
}
}
out.println("</tbody>");
out.println("</table>");
out.println("</div>");
}
out.println("<script>loaded();</script>");
out.println("</body>");
out.println("</html>");
}
catch (Exception e) {
Log.error("CallHistory " + e);
e.printStackTrace();
}
}
}