diff options
Diffstat (limited to 'src/main')
-rw-r--r-- | src/main/java/com/juick/rss/Main.java | 211 | ||||
-rw-r--r-- | src/main/java/com/juick/rss/Utils.java | 38 |
2 files changed, 85 insertions, 164 deletions
diff --git a/src/main/java/com/juick/rss/Main.java b/src/main/java/com/juick/rss/Main.java index 936c891d..32e7ebae 100644 --- a/src/main/java/com/juick/rss/Main.java +++ b/src/main/java/com/juick/rss/Main.java @@ -20,47 +20,42 @@ package com.juick.rss; import com.juick.Message; import com.juick.server.MessagesQueries; import com.juick.server.UserQueries; -import java.io.FileInputStream; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.datasource.DriverManagerDataSource; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; import java.text.SimpleDateFormat; -import java.util.ArrayList; import java.util.Date; -import java.util.Iterator; +import java.util.List; import java.util.Properties; import java.util.regex.Matcher; import java.util.regex.Pattern; -import javax.servlet.ServletException; -import javax.servlet.annotation.WebServlet; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; /** - * * @author ugnich */ @WebServlet(name = "Main", urlPatterns = {"/"}) public class Main extends HttpServlet { - 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; + JdbcTemplate 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", "")); + conf.load(getServletContext().getResourceAsStream("/WEB-INF/juick.conf")); + DriverManagerDataSource dataSource = new DriverManagerDataSource(); + dataSource.setDriverClassName(conf.getProperty("datasource_driver", "com.mysql.jdbc.Driver")); + dataSource.setUrl(conf.getProperty("datasource_url")); + sql = new JdbcTemplate(dataSource); } catch (Exception e) { log(null, e); @@ -68,19 +63,6 @@ public class Main extends HttpServlet { } @Override - public void destroy() { - super.destroy(); - if (sql != null) { - try { - sql.close(); - sql = null; - } catch (SQLException e) { - log(null, e); - } - } - } - - @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { if (request.getCharacterEncoding() == null) { request.setCharacterEncoding("UTF-8"); @@ -90,8 +72,8 @@ public class Main extends HttpServlet { if (uri.equals("/")) { int hours = Utils.parseInt(request.getParameter("hours"), 0); if (hours > 0 && hours < 13) { - ArrayList<Integer> mids = getLastMessages(hours); - ArrayList<Message> msgs = MessagesQueries.getMessages(sql, mids); + List<Integer> mids = getLastMessages(hours); + List<Message> msgs = MessagesQueries.getMessages(sql, mids); responseMessages(response, 0, null, msgs); } else { response.sendError(404); @@ -107,9 +89,9 @@ public class Main extends HttpServlet { String uname = uri.substring(1, uri.length() - 5); int uid = UserQueries.getUIDbyName(sql, uname); if (uid > 0) { - ArrayList<Integer> mids = MessagesQueries.getUserBlog(sql, uid, 0, 0); + List<Integer> mids = MessagesQueries.getUserBlog(sql, uid, 0, 0); if (!mids.isEmpty()) { - ArrayList<Message> msgs = MessagesQueries.getMessages(sql, mids); + List<Message> msgs = MessagesQueries.getMessages(sql, mids); responseMessages(response, uid, uname, msgs); } else { response.sendError(404); @@ -122,11 +104,10 @@ public class Main extends HttpServlet { } } - private void responseMessages(HttpServletResponse response, int uid, String uname, ArrayList<Message> msgs) throws IOException { + private void responseMessages(HttpServletResponse response, int uid, String uname, List<Message> msgs) throws IOException { response.setContentType("application/rss+xml; charset=UTF-8"); - PrintWriter out = response.getWriter(); - try { + try (PrintWriter out = response.getWriter()) { out.println("<?xml version='1.0' encoding='utf-8'?>"); out.println("<rss version='2.0' xmlns:atom='http://www.w3.org/2005/Atom' xmlns:slash='http://purl.org/rss/1.0/modules/slash/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:media='http://search.yahoo.com/mrss/' xmlns:juick='http://juick.com/'>"); out.println("<channel>"); @@ -142,33 +123,23 @@ public class Main extends HttpServlet { out.println("<description>The latest messages at Juick</description>"); } - Iterator<Message> i = msgs.iterator(); - while (i.hasNext()) { - Message msg = i.next(); - + for (Message msg : msgs) { 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.println("<link>http://juick.com/" + msg.getUser().getUName() + "/" + msg.getMID() + "</link>"); + out.println("<guid>http://juick.com/" + msg.getUser().getUName() + "/" + msg.getMID() + "</guid>"); - out.print("<title><![CDATA[@" + msg.User.UName + ":"); + out.print("<title><![CDATA[@" + msg.getUser().getUName() + ":"); if (!msg.Tags.isEmpty()) { for (int n = 0; n < msg.Tags.size(); n++) { out.print(" *" + msg.Tags.get(n)); } } out.println("]]></title>"); - out.println("<description><![CDATA[" + formatMessage(msg.Text) + "]]></description>"); - - 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("<description><![CDATA[" + formatMessage(msg.getText()) + "]]></description>"); + + out.println("<pubDate>" + sdfRSS.format(msg.getDate()) + "</pubDate>"); - out.println("<comments>http://juick.com/" + msg.User.UName + "/" + msg.MID + "</comments>"); + out.println("<comments>http://juick.com/" + msg.getUser().getUName() + "/" + msg.getMID() + "</comments>"); if (!msg.Tags.isEmpty()) { for (int n = 0; n < msg.Tags.size(); n++) { out.println("<category>" + escapeHtml(msg.Tags.get(n)) + "</category>"); @@ -176,28 +147,35 @@ public class Main extends HttpServlet { } if (msg.AttachmentType != null) { if (msg.AttachmentType.equals("jpg")) { - out.println("<media:content url='http://i.juick.com/photos-1024/" + msg.MID + ".jpg' type='image/jpeg'/>"); - out.println("<media:thumbnail url='http://i.juick.com/ps/" + msg.MID + ".jpg'/>"); + out.println("<media:content url='http://i.juick.com/photos-1024/" + msg.getMID() + ".jpg' type='image/jpeg'/>"); + out.println("<media:thumbnail url='http://i.juick.com/ps/" + msg.getMID() + ".jpg'/>"); } else if (msg.AttachmentType.equals("png")) { - out.println("<media:content url='http://i.juick.com/photos-1024/" + msg.MID + ".png' type='image/png'/>"); - out.println("<media:thumbnail url='http://i.juick.com/ps/" + msg.MID + ".png'/>"); + out.println("<media:content url='http://i.juick.com/photos-1024/" + msg.getMID() + ".png' type='image/png'/>"); + out.println("<media:thumbnail url='http://i.juick.com/ps/" + msg.getMID() + ".png'/>"); } } - out.println("<juick:user uid='" + msg.User.UID + "'/>"); + out.println("<juick:user uid='" + msg.getUser().getUID() + "'/>"); out.println("</item>"); } out.println("</channel></rss>"); - } finally { - out.close(); } } + private class ResponseReply { + String muname; + int mid; + int rid; + String uname; + String description; + Date pubDate; + String attachmentType; + } + private void responseReplies(HttpServletResponse response, int hours) throws IOException { response.setContentType("application/rss+xml; charset=UTF-8"); - PrintWriter out = response.getWriter(); - try { + try (PrintWriter out = response.getWriter()) { 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/\">"); @@ -206,75 +184,56 @@ public class Main extends HttpServlet { out.println("<link>http://juick.com/</link>"); out.println("<description>The latest comments at Juick</description>"); - PreparedStatement stmt = null; - ResultSet rs = null; - try { - stmt = sql.prepareStatement("SELECT users2.nick,replies.message_id,replies.reply_id,users.nick,replies.txt,DATE_FORMAT(replies.ts,'%a, %d %b %Y %T UT'),replies.attach,replies.ts+0 FROM ((replies INNER JOIN users ON replies.user_id=users.id) INNER JOIN messages ON replies.message_id=messages.message_id) INNER JOIN users AS users2 ON messages.user_id=users2.id WHERE replies.ts>TIMESTAMPADD(HOUR,?,NOW()) AND messages.privacy>0"); - stmt.setInt(1, -hours); - rs = stmt.executeQuery(); - rs.beforeFirst(); - while (rs.next()) { - String muname = rs.getString(1); - 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>"); - out.println("<guid>http://juick.com/" + muname + "/" + mid + "#" + rid + "</guid>"); - out.println("<author>http://juick.com/" + uname + "/</author>"); - out.println("<title>@" + uname + ":</title>"); - out.println("<description><![CDATA[" + formatMessage(rs.getString(5)) + "]]></description>"); - out.println("<pubDate>" + rs.getString(6) + "</pubDate>"); - String attachment = rs.getString(7); - if (attachment != null && !attachment.isEmpty()) { - if (attachment.equals("jpg")) { - out.println("<media:content url='http://i.juick.com/photos-1024/" + mid + "-" + rid + ".jpg' type='image/jpeg'/>"); - out.println("<media:thumbnail url='http://i.juick.com/ps/" + mid + "-" + rid + ".jpg'/>"); - } else if (attachment.equals("png")) { - out.println("<media:content url='http://i.juick.com/photos-1024/" + mid + "-" + rid + ".png' type='image/png'/>"); - out.println("<media:thumbnail url='http://i.juick.com/ps/" + mid + "-" + rid + ".png'/>"); - } + sql.query("SELECT users2.nick,replies.message_id,replies.reply_id," + + "users.nick,replies.txt," + + "replies.ts,replies.attach,replies.ts+0 " + + "FROM ((replies INNER JOIN users ON replies.user_id=users.id) " + + "INNER JOIN messages ON replies.message_id=messages.message_id) " + + "INNER JOIN users AS users2 ON messages.user_id=users2.id " + + "WHERE replies.ts>TIMESTAMPADD(HOUR,?,NOW()) AND messages.privacy>0", (rs, rowNum) -> { + ResponseReply reply = new ResponseReply(); + reply.muname = rs.getString(1); + reply.mid = rs.getInt(2); + reply.rid = rs.getInt(3); + reply.uname = rs.getString(4); + reply.description = rs.getString(5); + reply.pubDate = rs.getTimestamp(6); + reply.attachmentType = rs.getString(7); + return reply; + }, -hours).stream().forEach(r -> { + out.println("<item>"); + out.println("<ya:post>http://juick.com/" + r.muname + "/" + r.mid + "</ya:post>"); + out.println("<link>http://juick.com/" + r.muname + "/" + r.mid + "#" + r.rid + "</link>"); + out.println("<guid>http://juick.com/" + r.muname + "/" + r.mid + "#" + r.rid + "</guid>"); + out.println("<author>http://juick.com/" + r.uname + "/</author>"); + out.println("<title>@" + r.uname + ":</title>"); + out.println("<description><![CDATA[" + formatMessage(r.description) + "]]></description>"); + out.println("<pubDate>" + sdfRSS.format(r.pubDate) + "</pubDate>"); + String attachment = r.attachmentType; + if (attachment != null && !attachment.isEmpty()) { + if (attachment.equals("jpg")) { + out.println("<media:content url='http://i.juick.com/photos-1024/" + r.mid + "-" + r.rid + ".jpg' type='image/jpeg'/>"); + out.println("<media:thumbnail url='http://i.juick.com/ps/" + r.mid + "-" + r.rid + ".jpg'/>"); + } else if (attachment.equals("png")) { + out.println("<media:content url='http://i.juick.com/photos-1024/" + r.mid + "-" + r.rid + ".png' type='image/png'/>"); + out.println("<media:thumbnail url='http://i.juick.com/ps/" + r.mid + "-" + r.rid + ".png'/>"); } - out.println("</item>"); } - } catch (SQLException e) { - System.err.println(e); - } finally { - Utils.finishSQL(rs, stmt); - } - + out.println("</item>"); + }); 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 { - stmt = sql.prepareStatement("SELECT message_id FROM messages WHERE messages.ts>TIMESTAMPADD(HOUR,?,NOW())"); - stmt.setInt(1, -hours); - rs = stmt.executeQuery(); - rs.beforeFirst(); - while (rs.next()) { - mids.add(rs.getInt(1)); - } - } catch (SQLException e) { - System.err.println(e); - } finally { - Utils.finishSQL(rs, stmt); - } - return mids; + private List<Integer> getLastMessages(int hours) { + return sql.queryForList("SELECT message_id FROM messages WHERE messages.ts>TIMESTAMPADD(HOUR,?,NOW())", + Integer.class, -hours); } + private static Pattern regexLinks2 = Pattern.compile("((?<=\\s)|(?<=\\A))([\\[\\{]|<)((?:ht|f)tps?://(?:www\\.)?([^\\/\\s\\\"\\)\\!]+)/?(?:[^\\]\\}](?<!>))*)([\\]\\}]|>)"); public static String escapeHtml(String input) { - return input.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">"); + return input.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">"); } public static String formatMessage(String msg) { diff --git a/src/main/java/com/juick/rss/Utils.java b/src/main/java/com/juick/rss/Utils.java index a6842fe1..036a5a6b 100644 --- a/src/main/java/com/juick/rss/Utils.java +++ b/src/main/java/com/juick/rss/Utils.java @@ -17,50 +17,12 @@ */ package com.juick.rss; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.ArrayList; - /** * * @author ugnich */ public class Utils { - public static void finishSQL(ResultSet rs, Statement stmt) { - if (rs != null) { - try { - rs.close(); - } catch (SQLException e) { - } - } - if (stmt != null) { - try { - stmt.close(); - } catch (SQLException e) { - } - } - } - - public static String convertArray2String(ArrayList<Integer> mids) { - String q = ""; - for (int i = 0; i < mids.size(); i++) { - if (i > 0) { - q += ","; - } - q += mids.get(i); - } - return q; - } - - public static String encodeHTML(String str) { - String ret = str; - ret = ret.replaceAll("<", "<"); - ret = ret.replaceAll(">", ">"); - return str; - } - public static int parseInt(String str, int def) { int ret = def; if (str != null) { |