1 10 11 package org.mmbase.applications.community.modules; 12 13 import java.util.*; 14 15 import org.mmbase.util.*; 16 import org.mmbase.module.*; 17 import org.mmbase.module.core.*; 18 import org.mmbase.module.corebuilders.*; 19 import org.mmbase.applications.community.builders.*; 20 import org.mmbase.util.logging.*; 21 22 47 48 public class CommunityPrc extends ProcessorModule { 49 50 private static final Logger log = Logging.getLoggerInstance(CommunityPrc.class); 51 52 private Message messageBuilder; 53 private Channel channelBuilder; 54 private Community communityBuilder; 55 56 private VirtualBuilder treeBuilder; 57 58 private MMBase mmb; 59 60 private boolean active = false; 61 62 65 public CommunityPrc() { 66 } 67 68 72 public void init() { 73 mmb = MMBase.getMMBase(); 75 activate(); 76 } 77 78 82 protected boolean activate() { 83 if (!active) { 84 85 messageBuilder = (Message) mmb.getBuilder("message"); 86 if (messageBuilder == null) { 87 log.info("Community module could not be activated because message builder missing"); 88 return false; 89 } 90 if (!messageBuilder.activate()) { 91 log.info("Community module could not (yet) be activated because message builder could not be activated" + (messageBuilder == null ? "." : " (" + messageBuilder + ").")); 92 return false; 93 } 94 communityBuilder = (Community)mmb.getBuilder("community"); 95 if (communityBuilder == null) { 96 log.info("Community builder missing. Communityprc can work without it though."); 97 } else { 98 if(!communityBuilder.activate()) { 99 log.info("Community builder could not be activated. Communityprc can work without that though."); 100 } 101 } 102 channelBuilder = (Channel) mmb.getBuilder("channel"); 103 if (channelBuilder == null) { 104 log.info("Channel builder missing. Communityprc can work without it though."); 105 } else { 106 if (! channelBuilder.activate()) { 107 log.info("Channel builder could not be activated. Communityprc can work without that though."); 108 } 109 } 110 initializeTreeBuilder(); 111 active = true; 112 log.service("Community module was activated sucessfully"); 113 } 114 return active; 115 } 116 117 124 private void initializeTreeBuilder() { 125 treeBuilder = new VirtualReferrerBuilder(messageBuilder); 126 treeBuilder.addField(new FieldDefs("list head","string", -1,-1,"listhead",FieldDefs.TYPE_STRING)); 127 treeBuilder.addField(new FieldDefs("list tail","string", -1,-1,"listtail",FieldDefs.TYPE_STRING)); 128 treeBuilder.addField(new FieldDefs("depth","integer", -1,-1,"depth",FieldDefs.TYPE_INTEGER)); 129 treeBuilder.addField(new FieldDefs("nr of replies","integer", -1,-1,"replycount",FieldDefs.TYPE_INTEGER)); 130 }; 131 132 140 public String replace(PageInfo sp, String cmds) { 141 if (activate()) { 142 StringTokenizer tok = new StringTokenizer(cmds,"-\n\r"); 143 if (tok.hasMoreTokens()) { 144 String cmd = tok.nextToken(); 145 if (cmd.equals("MESSAGE")) { 146 return messageBuilder.replace(sp, tok); 147 } 148 if (cmd.equals("CHANNEL")) { 149 return channelBuilder.replace(sp, tok); 150 } 151 if (cmd.equals("COMMUNITY")) { 152 return communityBuilder.replace(sp, tok); 153 } 154 } 155 } 156 return ""; 157 } 158 159 174 public boolean process(PageInfo sp, Hashtable cmds, Hashtable vars) { 175 boolean result = false; 176 if (activate()) { 177 String token; 178 for (Enumeration h = cmds.keys(); h.hasMoreElements();) { 179 String key = (String )h.nextElement(); 180 StringTokenizer tok = new StringTokenizer(key , "-\n\r"); 181 182 token = tok.nextToken(); 183 if (token.equals("MESSAGE")) { 184 if (tok.hasMoreElements()) { 185 token = tok.nextToken(); 186 187 if (token.equals("POST")) { 188 doPostProcess(sp, cmds, vars); 189 } else if (token.equals("UPDATE")) { 190 doUpdateProcess(sp, cmds,vars); 191 } 192 } 193 } 194 result = true; 195 } 196 } 197 return result; 198 } 199 200 207 private void setReturnValue(PageInfo sp, Hashtable vars, String name, String value) { 208 if (vars!=null) { 209 if (value==null) { 211 vars.remove(name); 212 } else { 213 vars.put(name,value); 214 } 215 } 216 } 217 218 225 private boolean doPostProcess(PageInfo sp, Hashtable cmds, Hashtable vars) { 226 String tmp = (String )cmds.get("MESSAGE-POST"); 228 setReturnValue(sp,vars,"MESSAGE-ERROR",null); 229 try { 230 int messagethreadnr = Integer.parseInt(tmp); 231 String subject = (String )vars.get("MESSAGE-SUBJECT"); 232 String body = (String )vars.get("MESSAGE-BODY"); 233 tmp = (String )vars.get("MESSAGE-CHANNEL"); 234 int channel = Integer.parseInt(tmp); 235 236 tmp = (String )vars.get("MESSAGE-CHATTER"); 238 int user; 239 if (tmp != null) user = Integer.parseInt(tmp); else user = -1; 240 String chatterName = (String )vars.get("MESSAGE-CHATTERNAME"); 241 242 int result=Message.POST_ERROR_UNKNOWN; 244 if (subject != null) { 245 result=messageBuilder.post(subject, body, channel, messagethreadnr, user, chatterName); 246 setReturnValue(sp,vars,"MESSAGE-NUMBER",""+result); 247 } else { 248 result=messageBuilder.post(body, messagethreadnr, user, chatterName); 249 setReturnValue(sp,vars,"MESSAGE-NUMBER","-1"); 250 } 251 if (result<Message.POST_OK) { 252 String err=messageBuilder.getMessageError(result); 253 log.error(result+":"+err); 254 setReturnValue(sp,vars,"MESSAGE-ERROR",err); 255 } 256 return result>=Message.POST_OK; 257 } catch (NumberFormatException e) { setReturnValue(sp,vars,"MESSAGE-ERROR", 259 "Invalid parameter value ( '"+tmp+"' is not a number)"); 260 return false; 261 } 262 } 263 264 271 private boolean doUpdateProcess(PageInfo sp, Hashtable cmds, Hashtable vars) { 272 String tmp = (String )cmds.get("MESSAGE-UPDATE"); 273 try { 274 int number = Integer.parseInt(tmp); 276 String subject = (String )vars.get("MESSAGE-SUBJECT"); 277 String body = (String )vars.get("MESSAGE-BODY"); 278 tmp = (String )vars.get("MESSAGE-CHATTER"); 280 int user; 281 if (tmp != null) user = Integer.parseInt(tmp); else user = -1; 282 String chatterName = (String )vars.get("MESSAGE-CHATTERNAME"); 283 log.info("MESSAGE-CHATTERNAME="+chatterName); 284 int result=messageBuilder.update(chatterName, user, subject, body, number); 285 if (result<Message.POST_OK) { 286 String err=messageBuilder.getMessageError(result); 287 log.error(result+":"+err); 288 setReturnValue(sp,vars,"MESSAGE-ERROR",err); 289 } else { 290 setReturnValue(sp,vars,"MESSAGE-NUMBER",""+number); 291 } 292 return result==Message.POST_OK; 293 } catch (NumberFormatException e) { setReturnValue(sp,vars,"MESSAGE-ERROR", 295 "Invalid parameter value ( '"+tmp+"' is not a number)"); 296 return false; 297 } 298 } 299 300 309 public MMObjectBuilder getListBuilder(String command, Map params) { 310 activate(); 311 if (command.equals("TREE")) return treeBuilder; 312 if (command.equals("WHO") || command.equals("TEMPORARYRELATIONS")) { 313 String type = (String )params.get("TYPE"); 314 if (type != null) { 315 return mmb.getBuilder(type); 316 } 317 } 318 return new VirtualBuilder(mmb); 319 } 320 321 329 public Vector getNodeList(Object context, String command, Map params) { 330 activate(); 331 if (command.equals("WHO")) return channelBuilder.getNodeListUsers(params); 332 if (command.equals("TEMPORARYRELATIONS")) return getNodeListTemporaryRelations(params); 333 return super.getNodeList(context,command, params); 334 } 335 336 345 public Vector getList(PageInfo sp, StringTagger params, String command) { 346 if (activate()) { 347 if (command.equals("TREE")) return messageBuilder.getListMessages(params); 348 if (command.equals("WHO")) return channelBuilder.getListUsers(params); 349 if (command.equals("TEMPORARYRELATIONS")) return getListTemporaryRelations(params); 350 throw new UnsupportedOperationException ("Unknown command '" + command + "'"); 351 } else { 352 throw new RuntimeException ("CommunityPrc module could not be activated"); 353 } 355 } 356 357 370 public Vector getListTemporaryRelations(StringTagger params) { 371 Enumeration relatedNodes = getNodeListTemporaryRelations(params).elements(); 372 MMObjectNode relatedNode; 373 Object value; 374 Vector result=new Vector(); 375 Vector fields = params.Values("FIELDS"); 376 while (relatedNodes.hasMoreElements()) { 377 relatedNode = (MMObjectNode)relatedNodes.nextElement(); 378 for (int i = 0; i < fields.size(); i++) { 379 value = relatedNode.getValue((String )fields.elementAt(i)); 380 if (value != null) result.add("" + value); else result.add(""); 381 } 382 } 383 return result; 384 } 385 386 399 public Vector getNodeListTemporaryRelations(Map params) { 400 activate(); 401 String number = (String )params.get("NODE"); 402 MMObjectNode node; 403 if (number == null) { 404 log.warn("getListTemporaryRelations(): Can't find node: " + number); 405 return new Vector(); 406 } 407 int offset=0; 408 String tmp = (String )params.get("FROMCOUNT"); 409 if (tmp!=null) offset=Integer.parseInt(tmp); 410 int max=Integer.MAX_VALUE; 411 tmp = (String )params.get("MAXCOUNT"); 412 if (tmp!=null) max=Integer.parseInt(tmp); 413 414 if (number.indexOf("_") < 0) 416 node = messageBuilder.getNode(number); 417 else 418 node = (MMObjectNode)MMObjectBuilder.temporaryNodes.get(number); 419 Vector relatedNodes = messageBuilder.getTemporaryRelated(node, (String )params.get("TYPE"),offset,max); 420 return relatedNodes; 421 } 422 } 423 | Popular Tags |