package org.kisst.gft.admin;
import org.kisst.jms.ControlMessage;
import org.kisst.jms.JmsListener;
import org.kisst.jms.JmsUtil;
import org.kisst.jms.MultiListener;
import org.kisst.props4j.Props;
import org.kisst.servlet4j.AbstractServlet;
import org.kisst.util.XmlNode;
import javax.jms.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Enumeration;
import java.util.HashMap;
public class ListenerServlet extends AbstractServlet {
private static int maxErroTextLength=200;
private final HashMap<String, MultiListener> listeners;
public ListenerServlet(HashMap<String, MultiListener> listeners, Props props) {
super(props);
this.listeners=listeners;
}
public void handle(HttpServletRequest request, HttpServletResponse response)
throws IOException {
boolean showListeners=true;
if (getUser(request, response)==null)
return;
response.setContentType("text/html;charset=utf-8");
//response.setStatus(HttpServletResponse.SC_OK);
PrintWriter out = response.getWriter();
String url=request.getRequestURI();
String name=url.substring("/listener/".length());
//String queuenames="input,error,retry";
String queuenames="input,error";
int pos=name.indexOf("/");
if (pos>0) {
queuenames=name.substring(pos+1);
name=name.substring(0,pos);
showListeners=false;
}
MultiListener lstnr = listeners.get(name);
if (showListeners) {
out.println("<h1>Listener "+name+"</h1>");
out.println("<h2>Status of Listener threads</h2>");
out.println("<ul>");
for (JmsListener l :lstnr.listeners)
out.println("<li>"+l.getStatus()+"</l>");
out.println("</ul>");
}
for (String qname:queuenames.split("[,]"))
writeQueueMessages(out, lstnr, qname);
}
public static void writeQueueMessages(PrintWriter out, MultiListener listener, String qname) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Session session=null;
try {
session = listener.getQueueSystem().getConnection().createSession(true, Session.AUTO_ACKNOWLEDGE);
String q=listener.getQueue(qname);
int index=1;
out.println("<h2>"+q+"</h2>");
out.println("<table>");
out.println("<tr><th>index</th>");
out.println("<th style=\"width:200px\">time</th>");
out.println("<th align=\"left\">channel</th>");
out.println("<th align=\"left\">msgid</th>");
out.println("<th align=\"left\">info</th>");
out.println("<th align=\"left\">action</th>");
out.println("<th align=\"left\">safe retry</th>");
out.println("<th align=\"left\">error</th></tr>");
Queue destination = session.createQueue(q);
QueueBrowser browser = session.createBrowser(destination);
Enumeration<?> e = browser.getEnumeration();
int count=0;
while (e.hasMoreElements()) {
count++;
Message msg = (Message) e.nextElement();
String channel=msg.getStringProperty("state_CHANNEL");
String id=msg.getStringProperty("state_ID");
try {
if (id!=null && id.startsWith("msgid:ID:")) {
// fix: old messages were saved with their (original) messageid
int pos=id.indexOf(',');
if (pos>0 && pos+1<id.length())
id=id.substring(pos+1);
else
id="";
}
if (ControlMessage.isStartMessage(msg))
channel="Start message";
else if (ControlMessage.isStopMessage(msg))
channel="Stop message";
else {
if (channel==null) {
// TODO: handle all type of messages
XmlNode xml=new XmlNode(((TextMessage)msg).getText()).getChild("Body").getChildren().get(0);
channel="???"+xml.getChildText("kanaal")+"???";
id=xml.getChildText("bestand");
}
}
}
catch (RuntimeException ex) {
channel="Unknown format";
}
String action = msg.getStringProperty("state_ACTION");
if (action==null)
action = msg.getStringProperty("state_LAST_ACTION");
String retrySafely = msg.getStringProperty("state_RETRY_SAFELY");
if (retrySafely==null)
retrySafely="unknown";
String errorText = msg.getStringProperty("state_ERROR");
if (errorText==null)
errorText = msg.getStringProperty("state_LAST_ERROR");
if (errorText!=null) {
errorText = errorText.replace("++++++++++++++++++++++++++ IE filler+++++++++++++++++++++++++++++++++++++++", "");
errorText = errorText.replace("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++", "");
errorText = errorText.replace("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++", "");
if (errorText.length()>maxErroTextLength)
errorText=errorText.substring(0,maxErroTextLength);
errorText=quoteXml(errorText);
}
String msgid=msg.getJMSMessageID();
long timestamp = msg.getJMSTimestamp();
out.println("<tr>");
out.println("<td>"+(index++)+"</td>");
out.println("<td style=\"width: 120px\"><a href=\"/logging/minutes=2&endTime="+(timestamp+60000)+"\">"+format.format(new Date(timestamp))+"</td>");
out.println("<td><a href=\"/channel/"+channel+"\">"+channel+"</a></td>");
out.println("<td><a href=\"/message/"+listener.getName()+"/"+qname+"/"+msgid+"\">"+msgid+"</a></td>");
out.println("<td><a href=\"/logging/hours=1&eventtype="+id+"\">"+id+"</a></td>");
out.println("<td>"+action+"</td>");
out.println("<td>"+retrySafely+"</td>");
out.println("<td>"+errorText+"</td>");
out.println("</tr>");
}
out.println("</table>");
out.println("Found "+count+" messages");
}
catch (JMSException e) { throw JmsUtil.wrapJMSException(e); }
finally {
try {
if (session!=null)
session.close();
}
catch (JMSException e) { throw JmsUtil.wrapJMSException(e); }
}
}
}