/*
* Juick
* Copyright (C) 2008-2011, Ugnich Anton
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see .
*/
package com.juick.http.www;
import com.juick.server.MessagesQueries;
import com.juick.server.UserQueries;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Locale;
import java.util.ResourceBundle;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
*
* @author Ugnich Anton
*/
public class UserThread {
protected void doGetThread(Connection sql, HttpServletRequest request, HttpServletResponse response, com.juick.User user, int MID) throws ServletException, IOException {
com.juick.User visitor = Utils.getVisitorUser(sql, request);
Locale locale = request.getLocale();
if (!MessagesQueries.canViewThread(sql, MID, visitor != null ? visitor.UID : 0)) {
response.sendError(403);
return;
}
boolean listview = false;
String paramView = request.getParameter("view");
if (paramView != null) {
if (paramView.equals("list")) {
listview = true;
if (visitor != null) {
UserQueries.setUserOptionInt(sql, visitor.UID, "repliesview", 1);
}
} else if (paramView.equals("tree") && visitor != null) {
UserQueries.setUserOptionInt(sql, visitor.UID, "repliesview", 0);
}
} else if (visitor != null && UserQueries.getUserOptionInt(sql, visitor.UID, "repliesview", 0) == 1) {
listview = true;
}
String title = "@" + user.UName + " - #" + MID;
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
try {
PageTemplates.pageHead(out, title, null);
PageTemplates.pageNavigation(out, locale, visitor);
PageTemplates.pageUserTitle(out, sql, locale, user, visitor);
out.println("
");
out.println("
");
out.println("
");
printMessage(out, sql, MID, visitor, locale);
printReplies(out, sql, MID, visitor, locale, listview);
out.println("
");
out.println("
");
out.println("
"); // topwrapper
PageTemplates.pageFooter(request, out, locale, visitor);
} finally {
out.close();
}
}
public static void printMessage(PrintWriter out, Connection sql, int mid, com.juick.User visitor, Locale locale) {
ResourceBundle rb = ResourceBundle.getBundle("Global", locale);
ResourceBundle rbthread = ResourceBundle.getBundle("UserThread", locale);
PreparedStatement stmt = null;
ResultSet rs = null;
try {
stmt = sql.prepareStatement("SELECT STRAIGHT_JOIN messages.message_id,messages.user_id,users.nick,messages_txt.tags,messages.readonly,messages.privacy,messages_txt.txt,TIMESTAMPDIFF(MINUTE,messages.ts,NOW()),messages.ts,messages.replies,messages.attach,messages.place_id,places.name,messages.lat,messages.lon FROM ((messages INNER JOIN messages_txt ON messages.message_id=messages_txt.message_id) INNER JOIN users ON messages.user_id=users.id) LEFT JOIN places ON messages.place_id=places.place_id WHERE messages.message_id=?");
stmt.setInt(1, mid);
rs = stmt.executeQuery();
if (rs.first()) {
int uid = rs.getInt(2);
String uname = rs.getString(3);
String tags = rs.getString(4);
String txt = rs.getString(7);
// timediff
// timestamp
// replies
// attach
// pid
// pname
// lat
// lon
boolean cancomment = visitor != null;
tags = (tags != null) ? PageTemplates.formatTags(tags) : "";
if (rs.getInt(5) == 1) {
tags += " *readonly";
cancomment = false;
}
switch (rs.getInt(6)) {
case 2:
tags += " *public";
break;
case -1:
tags += " *friends";
break;
case -2:
tags += " *private";
break;
}
txt = PageTemplates.formatMessage(txt);
out.println("");
out.println(" - ");
out.println(" ");
out.println(" ");
out.println(" ");
if (rs.getString(13) != null) {
out.println("
" + rs.getString(14) + "
");
}
out.println(" " + txt + "
");
if (rs.getString(11) != null) {
if (rs.getString(11).equals("jpg")) {
out.println(" ");
} else {
out.println(" ");
}
}
if (cancomment) {
out.println(" ");
}
ArrayList recomm = MessagesQueries.getMessageRecommendations(sql, mid);
if (!recomm.isEmpty()) {
out.print(" " + rb.getString("Recommended by") + " (" + recomm.size() + "): ");
for (int i = 0; i < recomm.size(); i++) {
if (i > 0) {
out.print(", ");
}
out.print("
@" + recomm.get(i) + "");
}
}
out.println(" ");
out.println("
");
out.println("");
}
} catch (SQLException e) {
System.err.println(e);
} finally {
Utils.finishSQL(rs, stmt);
}
}
public static void printReplies(PrintWriter out, Connection sql, int mid, com.juick.User visitor, Locale locale, boolean listview) {
ResourceBundle rbuser = ResourceBundle.getBundle("User", locale);
ArrayList
replies = new ArrayList();
PreparedStatement stmt = null;
ResultSet rs = null;
try {
stmt = sql.prepareStatement("SELECT replies.reply_id,replies.replyto,replies.user_id,users.nick,replies.txt,TIMESTAMPDIFF(MINUTE,replies.ts,NOW()),replies.ts,replies.attach FROM replies INNER JOIN users ON replies.user_id=users.id WHERE replies.message_id=? ORDER BY replies.reply_id ASC");
stmt.setInt(1, mid);
rs = stmt.executeQuery();
rs.beforeFirst();
while (rs.next()) {
com.juick.Message msg = new com.juick.Message();
msg.MID = mid;
msg.RID = rs.getInt(1);
msg.ReplyTo = rs.getInt(2);
msg.User = new com.juick.User();
msg.User.UID = rs.getInt(3);
msg.User.UName = rs.getString(4);
msg.Text = PageTemplates.formatMessage(rs.getString(5));
msg.MinutesAgo = rs.getInt(6);
msg.TimestampString = rs.getString(7);
msg.AttachmentType = rs.getString(8);
replies.add(msg);
if (msg.ReplyTo > 0) {
boolean added = false;
for (int i = 0; i < replies.size(); i++) {
if (replies.get(i).RID == msg.ReplyTo) {
replies.get(i).childs.add(msg);
added = true;
break;
}
}
if (!added) {
msg.ReplyTo = 0;
}
}
}
} catch (SQLException e) {
System.err.println(e);
} finally {
Utils.finishSQL(rs, stmt);
}
if (!replies.isEmpty()) {
out.println("");
out.print("
");
out.println("
" + rbuser.getString("Replies") + " (" + replies.size() + ")
");
out.println("
");
out.println("");
if (listview) {
printList(out, replies, locale);
} else {
printTree(out, replies, 0, 0, locale);
}
out.println("
");
}
for (int i = 0; i < replies.size(); i++) {
replies.get(i).cleanupChilds();
}
replies.clear();
}
public static void printTree(PrintWriter out, ArrayList replies, int ReplyTo, int margin, Locale locale) {
ResourceBundle rb = ResourceBundle.getBundle("Global", locale);
if (margin > 420) {
margin = 420;
}
for (int i = 0; i < replies.size(); i++) {
com.juick.Message msg = replies.get(i);
if (msg.ReplyTo == ReplyTo) {
out.print(" - 0) {
out.print("margin-left: " + margin + "px;display:none;");
}
out.println("\">");
if (msg.AttachmentType != null) {
if (msg.AttachmentType.equals("jpg")) {
out.println(" ");
} else {
out.println(" ");
}
}
out.println(" ");
out.println(" ");
out.println(" ");
out.println("
" + msg.Text + "
");
out.println(" ");
out.println(" ");
if (ReplyTo == 0) {
int childs = msg.getChildsCount() - 1;
if (childs > 0) {
out.println(" ");
}
}
out.println(" ");
printTree(out, replies, msg.RID, margin + 20, locale);
}
}
}
public static void printList(PrintWriter out, ArrayList replies, Locale locale) {
ResourceBundle rb = ResourceBundle.getBundle("Global", locale);
for (int i = 0; i < replies.size(); i++) {
com.juick.Message msg = replies.get(i);
out.print(" - ");
if (msg.AttachmentType != null) {
if (msg.AttachmentType.equals("jpg")) {
out.println(" ");
} else {
out.println(" ");
}
}
out.println(" ");
out.println(" ");
out.println(" ");
out.println("
" + msg.Text + "
");
out.print(" ");
out.println(" ");
out.println(" ");
}
}
}