diff options
Diffstat (limited to 'src/java/com/juick/rss/Main.java')
-rw-r--r-- | src/java/com/juick/rss/Main.java | 66 |
1 files changed, 34 insertions, 32 deletions
diff --git a/src/java/com/juick/rss/Main.java b/src/java/com/juick/rss/Main.java index 827ecf39..9c0d803c 100644 --- a/src/java/com/juick/rss/Main.java +++ b/src/java/com/juick/rss/Main.java @@ -28,7 +28,6 @@ import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; -import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; @@ -48,26 +47,26 @@ import javax.servlet.http.HttpServletResponse; */ @WebServlet(name = "Main", urlPatterns = {"/"}) public class Main extends HttpServlet { - - private static SimpleDateFormat sdfSQL = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - private static SimpleDateFormat sdfRSS = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z"); + + private static final SimpleDateFormat sdfSQL = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + private static final SimpleDateFormat sdfRSS = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z"); Connection sql; - + @Override public void init() throws ServletException { super.init(); try { Properties conf = new Properties(); conf.load(new FileInputStream("/etc/juick/rss.conf")); - + Class.forName("com.mysql.jdbc.Driver"); sql = DriverManager.getConnection("jdbc:mysql://localhost/juick?autoReconnect=true&user=" + conf.getProperty("mysql_username", "") + "&password=" + conf.getProperty("mysql_password", "")); - + } catch (Exception e) { log(null, e); } } - + @Override public void destroy() { super.destroy(); @@ -80,13 +79,13 @@ public class Main extends HttpServlet { } } } - + @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { if (request.getCharacterEncoding() == null) { request.setCharacterEncoding("UTF-8"); } - + String uri = request.getRequestURI(); if (uri.equals("/")) { int hours = Utils.parseInt(request.getParameter("hours"), 0); @@ -122,10 +121,10 @@ public class Main extends HttpServlet { response.sendError(404); } } - + private void responseMessages(HttpServletResponse response, int uid, String uname, ArrayList<Message> msgs) throws IOException { response.setContentType("application/rss+xml; charset=UTF-8"); - + PrintWriter out = response.getWriter(); try { out.println("<?xml version='1.0' encoding='utf-8'?>"); @@ -142,15 +141,15 @@ public class Main extends HttpServlet { out.println("<link>http://juick.com/</link>"); out.println("<description>The latest messages at Juick</description>"); } - + Iterator<Message> i = msgs.iterator(); while (i.hasNext()) { Message msg = i.next(); - + out.println("<item>"); out.println("<link>http://juick.com/" + msg.User.UName + "/" + msg.MID + "</link>"); out.println("<guid>http://juick.com/" + msg.User.UName + "/" + msg.MID + "</guid>"); - + out.print("<title><![CDATA[@" + msg.User.UName + ":"); if (!msg.Tags.isEmpty()) { for (int n = 0; n < msg.Tags.size(); n++) { @@ -159,13 +158,16 @@ public class Main extends HttpServlet { } out.println("]]></title>"); out.println("<description><![CDATA[" + formatMessage(msg.Text) + "]]></description>"); - - try { - Date date = sdfSQL.parse(msg.TimestampString); - out.println("<pubDate>" + sdfRSS.format(date) + "</pubDate>"); - } catch (ParseException e) { + + synchronized (sdfSQL) { + try { + Date date = sdfSQL.parse(msg.TimestampString); + out.println("<pubDate>" + sdfRSS.format(date) + "</pubDate>"); + } catch (Exception e) { + System.err.println("PARSE EXCEPTION: " + msg.TimestampString); + } } - + out.println("<comments>http://juick.com/" + msg.User.UName + "/" + msg.MID + "</comments>"); if (!msg.Tags.isEmpty()) { for (int n = 0; n < msg.Tags.size(); n++) { @@ -184,26 +186,26 @@ public class Main extends HttpServlet { out.println("<juick:user uid='" + msg.User.UID + "'/>"); out.println("</item>"); } - + out.println("</channel></rss>"); } finally { out.close(); } } - + private void responseReplies(HttpServletResponse response, int hours) throws IOException { response.setContentType("application/rss+xml; charset=UTF-8"); - + PrintWriter out = response.getWriter(); try { - + out.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>"); out.println("<rss version=\"2.0\" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" xmlns:ya=\"http://blogs.yandex.ru/yarss/\" xmlns:media=\"http://search.yahoo.com/mrss/\">"); out.println("<channel>"); out.println("<title>Juick</title>"); out.println("<link>http://juick.com/</link>"); out.println("<description>The latest comments at Juick</description>"); - + PreparedStatement stmt = null; ResultSet rs = null; try { @@ -216,7 +218,7 @@ public class Main extends HttpServlet { int mid = rs.getInt(2); int rid = rs.getInt(3); String uname = rs.getString(4); - + out.println("<item>"); out.println("<ya:post>http://juick.com/" + muname + "/" + mid + "</ya:post>"); out.println("<link>http://juick.com/" + muname + "/" + mid + "#" + rid + "</link>"); @@ -242,16 +244,16 @@ public class Main extends HttpServlet { } finally { Utils.finishSQL(rs, stmt); } - + out.println("</channel></rss>"); } finally { out.close(); } } - + private ArrayList<Integer> getLastMessages(int hours) { ArrayList<Integer> mids = new ArrayList<Integer>(20); - + PreparedStatement stmt = null; ResultSet rs = null; try { @@ -270,7 +272,7 @@ public class Main extends HttpServlet { return mids; } private static Pattern regexLinks2 = Pattern.compile("((?<=\\s)|(?<=\\A))([\\[\\{]|<)((?:ht|f)tps?://(?:www\\.)?([^\\/\\s\\\"\\)\\!]+)/?(?:[^\\]\\}](?<!>))*)([\\]\\}]|>)"); - + public static String formatMessage(String msg) { msg = msg.replaceAll("&", "&"); msg = msg.replaceAll("<", "<"); @@ -330,7 +332,7 @@ public class Main extends HttpServlet { // > citate msg = msg.replaceAll("(?:(?<=\\n)|(?<=\\A))> *(.*)?(\\n|(?=\\Z))", "<blockquote>$1</blockquote>"); msg = msg.replaceAll("</blockquote><blockquote>", "\n"); - + msg = msg.replaceAll("\n", "<br/>\n"); return msg; } |