<%@ page import="java.util.*, java.sql.*, com.oroinc.text.perl.Perl5Util, com.oroinc.text.perl.MalformedPerl5PatternException, com.oroinc.text.regex.PatternMatcherInput" errorPage="error.jsp" %> <%! String channel = "etcon"; String db_driver = "org.postgresql.Driver"; String db_url = "jdbc:postgresql://localhost/irclog"; String db_user = "dav"; String db_pass = ""; int defaultLimit = 40; Connection db = null; //static constructor { try{ Class.forName(db_driver); db = DriverManager.getConnection(db_url, db_user, db_pass); } catch(ClassNotFoundException e){ //out.println("No such class:" + db_driver+"

"); } catch(SQLException e){ //out.println((e.getMessage())+"

"); } } %> <% // set defaults int limit = defaultLimit; int startRow = Integer.MAX_VALUE; // sometime need to ensure this is > rowid max value int endRow = Integer.MAX_VALUE; // sometime need to ensure this is > rowid max value boolean prevOrder = true; boolean urlsOnly = false; String lines = request.getParameter("lines"); String start = request.getParameter("start"); String order = request.getParameter("order"); String urlsonly = request.getParameter("urlsonly"); if (order!=null) { if (order.equalsIgnoreCase("next")) { prevOrder = false; } } if (lines!=null) { try { limit = Integer.valueOf(lines).intValue(); if (limit > 500 || limit <1) { limit = defaultLimit; } } catch (NumberFormatException nfe) { } } if (start!=null) { try { startRow = Integer.valueOf(start).intValue(); if (startRow<=0) { startRow = Integer.MAX_VALUE; } } catch (NumberFormatException nfe) { } } if (urlsonly!=null && urlsonly.equalsIgnoreCase("true")) { urlsOnly = true; } %> Log for #<%=channel%>

<% int stop = startRow-limit; if (stop<0 || lines==null) { stop = 0; } String sql = null; if (prevOrder) { sql = "SELECT rowid, stamp, name, msg, type " +"FROM Log"+channel+" " +"WHERE (type"+(urlsOnly?" = ":" <> ")+"7 AND rowid <= "+startRow+" ) " +"ORDER BY rowid DESC LIMIT "+limit; } else { sql = "SELECT rowid, stamp, name, msg, type " +"FROM Log"+channel+" " +"WHERE (type"+(urlsOnly?" = ":" <> ")+"7 AND rowid >= "+startRow+" ) " +"ORDER BY rowid ASC LIMIT "+limit; } Vector lineVector = new Vector(limit); try { //System.out.println(sql); java.sql.Statement st = db.createStatement(); ResultSet rs = st.executeQuery(sql); while(rs.next()) { long id = rs.getLong(1); Timestamp stamp = rs.getTimestamp(2); String nick = rs.getString(3); String msg = rs.getString(4); long type = rs.getLong(5); lineVector.add( new Line( rs.getLong(1), rs.getTimestamp(2), rs.getString(3), rs.getString(4), rs.getLong(5) ) ); } } catch(SQLException e){ System.out.println("ShowLog.jsp: "+e.getMessage()); out.println("ShowLog.jsp: "+e.getMessage()); } Object[] lineArray = lineVector.toArray(); if (lineArray!=null && lineArray.length>0) { long firstRow; long lastRow; if (prevOrder) { firstRow = ((Line)lineArray[lineArray.length-1]).getId(); lastRow = ((Line)lineArray[0]).getId(); } else { firstRow = ((Line)lineArray[0]).getId(); lastRow = ((Line)lineArray[lineArray.length-1]).getId(); } urlsonly=urlsOnly?"true":"false"; out.println("[Prev] "); out.println("[Next] "); out.println("[Latest Text] "); out.println("[Latest URLs] "); out.println("


"); if (prevOrder) { for (int i=lineArray.length-1; i>=0; i-- ) { out.println( lineArray[i].toString()+"
" ); } } else { for (int i=0; i" ); } } out.println("
"); out.println("[Prev] "); out.println("[Next] "); out.println("[Latest Text] "); out.println("[Latest URLs] "); } else { out.println( "Unable to find messages in the specified range" ); } %> <%! private class Line { private long id; private String stamp; private String nick; private String msg; private long type; public Line( long id, Timestamp stamp, String nick, String msg, long type ) { this.id = id; this.nick = nick; this.msg = msg; this.type = type; java.text.DateFormat f = new java.text.SimpleDateFormat("HH:mm:ss"); this.stamp = f.format(stamp); } public long getId() { return this.id; } public String toString() { String buf = ""; switch ((int)type) { case 1: buf = sysFont("*** ")+nickFont(nick)+textFont(" "+msg+" (@") +dateFont(stamp)+textFont(")"); break; case 2: buf = sysFont("*** ")+nickFont(nick)+textFont(" has left "+msg+" (@") +dateFont(stamp)+textFont(")"); break; case 3: buf = sysFont("*** ")+nickFont(nick)+textFont(" has quit irc: "+msg+" (@") +dateFont(stamp)+textFont(")"); break; case 4: buf = dateFont(stamp)+sysFont(" * ")+nickFont(nick)+textFont(" "+msg); break; case 5: buf = dateFont(stamp)+sysFont(" * ") +nickFont(nick)+textFont(" is now known as ")+nickFont(msg); break; case 6: buf = dateFont(stamp)+" "+nickFont(nick)+textFont(": "+fixURL(msg)); break; case 7: buf = dateFont(stamp)+" "+nickFont(nick)+textFont(" posted: "+fixURL(msg)); break; } //buf = id+" "+buf; return buf; } private String sysFont( String s ) { return ""+s+""; } private String dateFont( String s ) { return ""+s+""; } private String nickFont( String s ) { return ""+s+""; } private String textFont( String s ) { return ""+s+""; } private String fixURL( String msg ) { Perl5Util p5u = new Perl5Util(); PatternMatcherInput matchInput= new PatternMatcherInput(msg); String buf = new String(msg); String type1 = "http://\\S+"; String type2 = "ftp://\\S+"; String matches = "("+type1+"|"+type2+")"; try { while (p5u.match("m#"+matches+"#",matchInput)) { com.oroinc.text.regex.MatchResult matchResult = p5u.getMatch(); String clause = matchResult.group(1); String newclause = ""+clause+""; buf = replaceClause( buf, clause, newclause ); } } catch (MalformedPerl5PatternException mp5ue) { mp5ue.printStackTrace(); } return buf; } private String replaceClause( String msg, String trigger, String replacement ) { int x=msg.indexOf(trigger); if (x!=-1) { StringBuffer sb = new StringBuffer(msg); return (sb.replace(x,x+trigger.length(),replacement)).toString(); } return msg; } } %>