package com.ngMAT.appl.bbs.servlets; import java.util.Vector; import com.ngMAT.HTML.HTMLString; import com.ngMAT.HTML.HTMLTemplate; import com.ngMAT.appl.genericservlet.GenericServletContext; import com.ngMAT.appl.genericservlet.PartitionedListServlet; import com.ngMAT.appl.genericservlet.PartitionedListServletConfig; import com.ngMAT.appl.bbs.data.table.TBbsMessage; public class MessageThreadListServlet extends PartitionedListServlet { public boolean isReadyToGo(GenericServletContext context) { return true; } private class ThreadMessageHolder { int level = 0; TBbsMessage message = null; ThreadMessageHolder parent = null; Vector children = new Vector(); ThreadMessageHolder (int level, TBbsMessage message) { this.level = level; this.message = message; } ThreadMessageHolder (TBbsMessage message, ThreadMessageHolder parent) { this.level = parent.level + 1; this.message = message; this.parent = parent; } } public void processRowFilling(GenericServletContext context, PartitionedData data, int index, HTMLTemplate row) { // This method is derived from class com.ngMAT.appl.genericservlet.PartitionedListServlet // to do: code goes here MessageThreadListServletConfig config = (MessageThreadListServletConfig)context.getConfig(); ThreadMessageHolder d = (ThreadMessageHolder)data.data.elementAt (index); if (d.level > 0) { row.setTagValue ("indentation", new HTMLString (config.indentation, d.level)); row.setTagValue ("fronting_mark", config.fronting_mark); } row.setTagValue ("bbs_message_id", d.message.bbs_message_id); row.setTagValue ("subject", d.message.subject); row.setTagValue ("contributer_name", d.message.contributer_name); row.setTagValue ("contributer_email", d.message.contributer_email); row.setTagValue ("reg_timestamp", config.df.format (d.message.reg_timestamp)); row.setTagValue ("description", d.message.description); } public void processSurrounding(GenericServletContext context, PartitionedData data, HTMLTemplate template) { String keyword = (String)data.optional_data.get ("keyword"); if (keyword != null) template.setTagValue ("message", "キーワード:" + keyword); } public void refreshData(GenericServletContext context, PartitionedData data) { // This method is derived from class com.ngMAT.appl.genericservlet.PartitionedListServlet // to do: code goes here MessageThreadListServletConfig config = (MessageThreadListServletConfig)context.getConfig(); String command = context.getParameter ("command"); if (command != null) { if (command.equalsIgnoreCase ("query")) processSearchKey (context, data); } long bbs_id = context.getLongParameter ("bbs_id"); String condition = (String)data.optional_data.get ("condition"); if (condition == null) condition = ""; data.data = createThreadData (TBbsMessage.selectAny (context, "where bbs_id = " + bbs_id + condition + " " + config.ORDER_BY)); } private void processSearchKey (GenericServletContext context, PartitionedData data) { String condition = ""; String keyword = context.getParameter ("keyword"); if (keyword != null) { keyword = keyword.trim(); if (keyword.length()> 0) condition = " and description like '%" + escapeSearchKey (context, keyword) + "%'"; else keyword = null; } data.optional_data.put ("condition", condition); if (keyword != null) data.optional_data.put ("keyword", keyword); else data.optional_data.remove ("keyword"); } private String escapeSearchKey (GenericServletContext context, String s) { PartitionedListServletConfig config = (PartitionedListServletConfig)context.getConfig(); if (s.length() > config.search_key_max_length) s = s.substring (0, config.search_key_max_length); StringBuffer buffer = new StringBuffer(); for (int i = 0; i < s.length(); i++) { char c = s.charAt (i); if (c == '\'') buffer.append ("''"); else buffer.append (c); } return new String (buffer); } /** * PartitionedListServlet#processCommand(...)をオーバライド。 */ public void processCommand (GenericServletContext context, HTMLTemplate template, PartitionedData sd) { String command = context.getParameter ("command"); if (command != null) { if (command.equalsIgnoreCase ("change_order")) sd.refresh_required = true; else if (command.equalsIgnoreCase ("query")) sd.refresh_required = true; } } private Vector createThreadData (Vector messages) { Vector threads = new Vector(); while (messages.size() > 0) { TBbsMessage m = (TBbsMessage)messages.firstElement(); ThreadMessageHolder mh = new ThreadMessageHolder (0, m); messages.removeElementAt (0); threads.add (mh); extractChild (mh, messages, threads); } return threads; } private void extractChild (ThreadMessageHolder mh, Vector messages, Vector threads) { while (true) { ThreadMessageHolder child = findChild (mh, messages); if (child == null) break; mh.children.add (child); threads.add (child); extractChild (child, messages, threads); } } private ThreadMessageHolder findChild (ThreadMessageHolder parent_mh, Vector messages) { for (int i = 0; i < messages.size(); i++) { TBbsMessage c = (TBbsMessage)messages.elementAt (i); if (c.ref_message_id == parent_mh.message.bbs_message_id) { messages.removeElementAt (i); ThreadMessageHolder cmh = new ThreadMessageHolder (c, parent_mh); return cmh; } } return null; } }