/* * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU 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 General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program. If not, see . */ package com.l2jserver.communityserver.model; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.Collection; import java.util.Map; import java.util.logging.Logger; import javolution.util.FastList; import javolution.util.FastMap; import com.l2jserver.communityserver.L2DatabaseFactory; public class Topic { private static Logger _log = Logger.getLogger(Topic.class.getName()); // type public static final int SERVER = 0; public static final int INBOX = 1; public static final int OUTBOX = 2; public static final int ARCHIVE = 3; public static final int TEMP_ARCHIVE = 4; public static final int MEMO = 5; public static final int ANNOUNCE = 6; public static final int BULLETIN = 7; //perm public static final int NONE = 0; public static final int ALL = 1; public static final int READ = 2; private int _id; // same as type private int _forumId; private final int _sqlDPId; private String _topicName; private int _ownerId; private int _lastPostId; private int _permissions; private Map _posts; /** * @param restaure * @param i * @param j * @param string * @param k * @param string2 * @param l * @param m * @param n */ public Topic(ConstructorType ct, final int sqlDPId, int id, int fid, String name, int oid, int per) { _sqlDPId = sqlDPId; _id = id; _forumId = fid; _topicName = name; _ownerId = oid; _lastPostId = 0; _permissions = per; _posts = new FastMap(); if (ct == ConstructorType.CREATE) { insertindb(); } else { loadPosts(); } } private void loadPosts() { java.sql.Connection con = null; try { con = L2DatabaseFactory.getInstance().getConnection(); PreparedStatement statement = con.prepareStatement("SELECT * FROM posts WHERE serverId=? AND post_forum_id=? AND post_topic_id=?"); statement.setInt(1, _sqlDPId); statement.setInt(2, _forumId); statement.setInt(3, _id); ResultSet result = statement.executeQuery(); while (result.next()) { int postId = Integer.parseInt(result.getString("post_id")); int postOwner = Integer.parseInt(result.getString("post_ownerid")); String recipientList = result.getString("post_recipient_list"); long date = Long.parseLong(result.getString("post_date")); String title = result.getString("post_title"); String text = result.getString("post_txt"); int type = Integer.parseInt(result.getString("post_type")); int parentId = Integer.parseInt(result.getString("post_parent_id")); int readCount = Integer.parseInt(result.getString("post_read_count")); Post p = new Post(ConstructorType.RESTORE, _sqlDPId, postId, postOwner, recipientList, parentId, date, _id, _forumId, title, text, type, readCount); _posts.put(postId, p); if (postId > _lastPostId) _lastPostId = postId; } result.close(); statement.close(); } catch (Exception e) { _log.warning("data error on Forum " + _forumId + " : " + e); e.printStackTrace(); } finally { try { con.close(); } catch (Exception e) { } } } public int getNewPostId() { return ++_lastPostId; } /** * */ public void insertindb() { java.sql.Connection con = null; try { con = L2DatabaseFactory.getInstance().getConnection(); PreparedStatement statement = con.prepareStatement("INSERT INTO topics (serverId,topic_id,topic_forum_id,topic_name,topic_ownerid,topic_permissions) values (?,?,?,?,?,?)"); statement.setInt(1, _sqlDPId); statement.setInt(2, _id); statement.setInt(3, _forumId); statement.setString(4, _topicName); statement.setInt(5, _ownerId); statement.setInt(6, _permissions); statement.execute(); statement.close(); } catch (Exception e) { _log.warning("error while saving new Topic to db " + e); } finally { try { con.close(); } catch (Exception e) { } } } public enum ConstructorType { RESTORE, CREATE } public void clearPosts() { _posts.clear(); } public int getPostsSize() { return _posts.size(); } public Post getPost(int j) { return _posts.get(j); } public void addPost(Post p) { _posts.put(p.getID(), p); } public void rmPostByID(int id) { _posts.get(id).deleteme(); _posts.remove(id); } public Collection getAllPosts() { return _posts.values(); } public Post[] getLastTwoPosts() { // if the Topic type is Announce then only Advertise Posts count Post[] ret = new Post[2]; for (Post p: _posts.values()) { if (_id == ANNOUNCE && p.getType() != Post.ADVERTISE) continue; if (ret[0] == null || ret[0].getDate() < p.getDate()) { ret[1] = ret[0]; ret[0] = p; } } return ret; } public FastList getChildrenPosts(Post parent) { FastList ret = new FastList(); if (parent == null) return ret; // parent post always the first ret.add(parent); for (Post p: _posts.values()) if (p.getParentId() == parent.getID()) ret.add(p); return ret; } /** * @return */ public int getID() { return _id; } public int getForumID() { return _forumId; } /** * @return */ public String getName() { // TODO Auto-generated method stub return _topicName; } /** * */ public void deleteme(Forum f) { f.rmTopicByID(getID()); java.sql.Connection con = null; try { con = L2DatabaseFactory.getInstance().getConnection(); PreparedStatement statement = con.prepareStatement("DELETE FROM topics WHERE topic_id=? AND topic_forum_id=?"); statement.setInt(1, getID()); statement.setInt(2, f.getID()); statement.execute(); statement.close(); } catch (Exception e) { e.printStackTrace(); } finally { try { con.close(); } catch (Exception e) { } } } public int getPermissions() { return _permissions; } public void setPermissions(int val) { _permissions = val; java.sql.Connection con = null; try { con = L2DatabaseFactory.getInstance().getConnection(); PreparedStatement statement = con.prepareStatement("UPDATE topics SET topic_permissions=? WHERE serverId=? AND topic_id=? AND topic_forum_id=?"); statement.setInt(1, _permissions); statement.setInt(2, _sqlDPId); statement.setInt(3, _id); statement.setInt(4, _forumId); statement.execute(); statement.close(); } catch (Exception e) { _log.warning("error while saving new permissions to db " + e); } finally { try { con.close(); } catch (Exception e) { } } } }