File Source: GlobalCommentManagement.java
1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. The ASF licenses this file to You
4 * under the Apache License, Version 2.0 (the "License"); you may not
5 * use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License. For additional information regarding
15 * copyright in this work, please see the NOTICE file in the top level
16 * directory of this distribution.
17 */
18
19 package org.apache.roller.weblogger.ui.struts2.admin;
20
21 import java.util.ArrayList;
22 import java.util.Arrays;
23 import java.util.Collections;
24 import java.util.HashMap;
25 import java.util.Iterator;
26 import java.util.List;
27 import java.util.Map;
28 import org.apache.commons.lang.StringUtils;
29 import org.apache.commons.logging.Log;
30 import org.apache.commons.logging.LogFactory;
31 import org.apache.roller.weblogger.WebloggerException;
32 import org.apache.roller.weblogger.business.WebloggerFactory;
33 import org.apache.roller.weblogger.business.WeblogManager;
34 import org.apache.roller.weblogger.pojos.Weblog;
35 import org.apache.roller.weblogger.pojos.WeblogEntryComment;
36 import org.apache.roller.weblogger.ui.struts2.pagers.CommentsPager;
37 import org.apache.roller.weblogger.ui.struts2.util.KeyValueObject;
38 import org.apache.roller.weblogger.util.cache.CacheManager;
39 import org.apache.roller.weblogger.ui.struts2.util.UIAction;
40 import org.apache.roller.weblogger.util.Utilities;
41
42
43 /**
44 * Action for managing global set of comments.
45 */
46 public class GlobalCommentManagement extends UIAction {
47
/*
P/P * Method: org.apache.roller.weblogger.ui.struts2.admin.GlobalCommentManagement__static_init
*
* Postconditions:
* init'ed(log)
*/
48 private static Log log = LogFactory.getLog(GlobalCommentManagement.class);
49
50 // number of comments to show per page
51 private static final int COUNT = 30;
52
53 // bean for managing submitted data
54 private GlobalCommentManagementBean bean = new GlobalCommentManagementBean();
55
56 // pager for the comments we are viewing
57 private CommentsPager pager = null;
58
59 // first comment in the list
60 private WeblogEntryComment firstComment = null;
61
62 // last comment in the list
63 private WeblogEntryComment lastComment = null;
64
65 // indicates number of comments that would be deleted by bulk removal
66 // a non-zero value here indicates bulk removal is a valid option
67 private int bulkDeleteCount = 0;
68
69
/*
P/P * Method: void org.apache.roller.weblogger.ui.struts2.admin.GlobalCommentManagement()
*
* Postconditions:
* this.actionName == &"globalCommentManagement"
* this.bean == &new GlobalCommentManagementBean(GlobalCommentManagement#1)
* this.bulkDeleteCount == 0
* this.bean.page == 0
* new String[](GlobalCommentManagementBean#1).length == 0
* new String[](GlobalCommentManagementBean#2).length == 0
* this.desiredMenu == &"admin"
* this.firstComment == null
* this.lastComment == null
* this.pager == null
* ...
*/
70 public GlobalCommentManagement() {
71 this.actionName = "globalCommentManagement";
72 this.desiredMenu = "admin";
73 this.pageTitle = "commentManagement.title";
74 }
75
76
77 // admin role required
78 public String requiredUserRole() {
/*
P/P * Method: String requiredUserRole()
*
* Postconditions:
* return_value == &"admin"
*/
79 return "admin";
80 }
81
82 // no weblog required
83 public boolean isWeblogRequired() {
/*
P/P * Method: bool isWeblogRequired()
*
* Postconditions:
* return_value == 0
*/
84 return false;
85 }
86
87
88 public void loadComments() {
89
/*
P/P * Method: void loadComments()
*
* Preconditions:
* this.bean != null
* init'ed(this.bean.endDateString)
* init'ed(this.bean.searchString)
* init'ed(this.bean.startDateString)
* (soft) log != null
* (soft) this.bean.approvedString != null
* (soft) this.bean.page in -71_582_788..143_165_576
* (soft) this.bean.spamString != null
*
* Presumptions:
* init'ed(java.util.Collections.EMPTY_LIST)
* java.util.List:size(...)@109 >= -231+1
* java.util.List:size(...)@114 >= -231+1
* org.apache.roller.weblogger.business.Weblogger:getWeblogManager(...)@93 != null
* org.apache.roller.weblogger.business.WebloggerFactory:getWeblogger(...)@93 != null
*
* Postconditions:
* possibly_updated(this.firstComment)
* possibly_updated(this.lastComment)
* this.pager == &new CommentsPager(loadComments#2)
* new CommentsPager(loadComments#2) num objects == 1
*
* Test Vectors:
* java.util.List:size(...)@107: {-231..0}, {1..232-1}
* java.util.List:size(...)@108: {-231..30}, {31..232-1}
*/
90 List comments = Collections.EMPTY_LIST;
91 boolean hasMore = false;
92 try {
93 WeblogManager wmgr = WebloggerFactory.getWeblogger().getWeblogManager();
94 List rawComments = wmgr.getComments(
95 null,
96 null,
97 getBean().getSearchString(),
98 getBean().getStartDate(),
99 getBean().getEndDate(),
100 getBean().getStatus(),
101 true, // reverse chrono order
102 getBean().getPage() * COUNT,
103 COUNT + 1);
104 comments = new ArrayList();
105 comments.addAll(rawComments);
106
+ 107 if(comments != null && comments.size() > 0) {
108 if(comments.size() > COUNT) {
109 comments.remove(comments.size()-1);
110 hasMore = true;
111 }
112
113 setFirstComment((WeblogEntryComment)comments.get(0));
114 setLastComment((WeblogEntryComment)comments.get(comments.size()-1));
115 }
116 } catch (WebloggerException ex) {
117 log.error("Error looking up comments", ex);
118 // TODO: i18n
119 addError("Error looking up comments");
120 }
121
122 // build comments pager
123 String baseUrl = buildBaseUrl();
124 setPager(new CommentsPager(baseUrl, getBean().getPage(), comments, hasMore));
125 }
126
127
128 // use the action data to build a url representing this action, including query data
129 private String buildBaseUrl() {
130
/*
P/P * Method: String buildBaseUrl()
*
* Preconditions:
* this.bean != null
* init'ed(this.bean.approvedString)
* init'ed(this.bean.endDateString)
* init'ed(this.bean.searchString)
* init'ed(this.bean.spamString)
* init'ed(this.bean.startDateString)
*
* Presumptions:
* org.apache.roller.weblogger.business.Weblogger:getUrlStrategy(...)@149 != null
* org.apache.roller.weblogger.business.WebloggerFactory:getWeblogger(...)@149 != null
*
* Postconditions:
* init'ed(return_value)
*
* Test Vectors:
* org.apache.commons.lang.StringUtils:isEmpty(...)@133: {1}, {0}
* org.apache.commons.lang.StringUtils:isEmpty(...)@136: {1}, {0}
* org.apache.commons.lang.StringUtils:isEmpty(...)@139: {1}, {0}
* org.apache.commons.lang.StringUtils:isEmpty(...)@142: {1}, {0}
* org.apache.commons.lang.StringUtils:isEmpty(...)@145: {1}, {0}
*/
131 Map<String, String> params = new HashMap();
132
133 if(!StringUtils.isEmpty(getBean().getSearchString())) {
134 params.put("bean.searchString", getBean().getSearchString());
135 }
136 if(!StringUtils.isEmpty(getBean().getStartDateString())) {
137 params.put("bean.startDateString", getBean().getStartDateString());
138 }
139 if(!StringUtils.isEmpty(getBean().getEndDateString())) {
140 params.put("bean.endDateString", getBean().getEndDateString());
141 }
142 if(!StringUtils.isEmpty(getBean().getApprovedString())) {
143 params.put("bean.approvedString", getBean().getApprovedString());
144 }
145 if(!StringUtils.isEmpty(getBean().getSpamString())) {
146 params.put("bean.spamString", getBean().getSpamString());
147 }
148
149 return WebloggerFactory.getWeblogger().getUrlStrategy().getActionURL("globalCommentManagement", "/roller-ui/admin",
150 null, params, false);
151 }
152
153
154 // show comment management page
155 public String execute() {
156
157 // load list of comments from query
/*
P/P * Method: String execute()
*
* Preconditions:
* this.bean != null
* init'ed(this.bean.endDateString)
* init'ed(this.bean.searchString)
* init'ed(this.bean.startDateString)
* (soft) log != null
* (soft) this.bean.approvedString != null
* (soft) this.bean.page in -71_582_788..143_165_576
* (soft) this.bean.spamString != null
*
* Presumptions:
* org.apache.roller.weblogger.ui.struts2.pagers.CommentsPager:getItems(...)@161 != null
*
* Postconditions:
* return_value == &"list"
* init'ed(this.bean.ids)
* init'ed(this.bean.spamComments)
* possibly_updated(this.firstComment)
* possibly_updated(this.lastComment)
* this.pager == &new CommentsPager(loadComments#2)
* new CommentsPager(loadComments#2) num objects == 1
*/
158 loadComments();
159
160 // load bean data using comments list
161 getBean().loadCheckboxes(getPager().getItems());
162
163 return LIST;
164 }
165
166
167 /**
168 * Query for a specific subset of comments based on various criteria.
169 */
170 public String query() {
171
172 // load list of comments from query
/*
P/P * Method: String query()
*
* Preconditions:
* this.bean != null
* (soft) log != null
* (soft) this.bean.approvedString != null
* (soft) init'ed(this.bean.endDateString)
* (soft) this.bean.page in -71_582_788..143_165_576
* (soft) init'ed(this.bean.searchString)
* (soft) this.bean.spamString != null
* (soft) init'ed(this.bean.startDateString)
*
* Presumptions:
* org.apache.roller.weblogger.business.WeblogManager:getComments(...)@180 != null
* org.apache.roller.weblogger.business.Weblogger:getWeblogManager(...)@179 != null
* org.apache.roller.weblogger.business.WebloggerFactory:getWeblogger(...)@179 != null
* org.apache.roller.weblogger.ui.struts2.pagers.CommentsPager:getItems(...)@176 != null
*
* Postconditions:
* return_value == &"list"
* init'ed(this.bean.ids)
* init'ed(this.bean.spamComments)
* possibly_updated(this.bulkDeleteCount)
* possibly_updated(this.firstComment)
* possibly_updated(this.lastComment)
* this.pager == &new CommentsPager(loadComments#2)
* new CommentsPager(loadComments#2) num objects == 1
*
* Test Vectors:
* java.util.List:size(...)@191: {-231..30}, {31..232-1}
*/
173 loadComments();
174
175 // load bean data using comments list
176 getBean().loadCheckboxes(getPager().getItems());
177
178 try {
179 WeblogManager wmgr = WebloggerFactory.getWeblogger().getWeblogManager();
180 List allMatchingComments = wmgr.getComments(
181 null,
182 null,
183 getBean().getSearchString(),
184 getBean().getStartDate(),
185 getBean().getEndDate(),
186 getBean().getStatus(),
187 true, // reverse chrono order
188 0,
189 -1);
190
191 if(allMatchingComments.size() > COUNT) {
192 setBulkDeleteCount(allMatchingComments.size());
193 }
194
195 } catch (WebloggerException ex) {
196 log.error("Error looking up comments", ex);
197 // TODO: i18n
198 addError("Error looking up comments");
199 }
200
201 return LIST;
202 }
203
204
205 /**
206 * Bulk delete all comments matching query criteria.
207 */
208 public String delete() {
209
210 try {
/*
P/P * Method: String delete()
*
* Preconditions:
* (soft) log != null
* (soft) this.bean != null
* (soft) this.bean.approvedString != null
* (soft) init'ed(this.bean.endDateString)
* (soft) init'ed(this.bean.searchString)
* (soft) this.bean.spamString != null
* (soft) init'ed(this.bean.startDateString)
*
* Presumptions:
* org.apache.roller.weblogger.business.Weblogger:getWeblogManager(...)@211 != null
* org.apache.roller.weblogger.business.WebloggerFactory:getWeblogger(...)@211 != null
*
* Postconditions:
* return_value == &"list"
* this.bean == One-of{&new GlobalCommentManagementBean(delete#2), old this.bean}
* (soft) this.bean != null
* init'ed(this.bean.ids)
* init'ed(this.bean.spamComments)
* possibly_updated(this.firstComment)
* possibly_updated(this.lastComment)
* this.pager == One-of{&new CommentsPager(loadComments#2), old this.pager}
* new CommentsPager(loadComments#2) num objects <= 1
* new GlobalCommentManagementBean(delete#2) num objects <= 1
* ...
*/
211 WeblogManager wmgr = WebloggerFactory.getWeblogger().getWeblogManager();
212 int deleted = wmgr.removeMatchingComments(
213 null,
214 null,
215 getBean().getSearchString(),
216 getBean().getStartDate(),
217 getBean().getEndDate(),
218 getBean().getStatus());
219
220 // TODO: i18n
221 addMessage("Successfully deleted "+deleted+" comments");
222
223 // reset form and load fresh comments list
224 setBean(new GlobalCommentManagementBean());
225
226 return execute();
227
228 } catch (WebloggerException ex) {
229 log.error("Error doing bulk delete", ex);
230 // TODO: i18n
231 addError("Bulk delete failed due to unexpected error");
232 }
233
234 return LIST;
235 }
236
237
238 /**
239 * Update a list of comments.
240 */
241 public String update() {
242
243 try {
/*
P/P * Method: String update()
*
* Preconditions:
* log != null
* (soft) this.bean != null
* (soft) init'ed(this.bean.ids)
* (soft) init'ed(this.bean.spamComments)
* (soft) init'ed(this.bean.deleteComments)
*
* Presumptions:
* ids.length@265 <= 232-1
* java.util.Arrays:asList(...)@262 != null
* org.apache.roller.weblogger.business.WeblogManager:getComment(...)@255 != null
* org.apache.roller.weblogger.business.WeblogManager:getComment(...)@275 != null
* org.apache.roller.weblogger.business.Weblogger:getWeblogManager(...)@244 != null
* ...
*
* Postconditions:
* return_value == &"list"
* this.bean == One-of{&new GlobalCommentManagementBean(update#8), old this.bean}
* (soft) this.bean != null
* init'ed(this.bean.ids)
* init'ed(this.bean.spamComments)
* possibly_updated(this.firstComment)
* possibly_updated(this.lastComment)
* this.pager == One-of{&new CommentsPager(loadComments#2), old this.pager}
* new CommentsPager(loadComments#2) num objects <= 1
* new GlobalCommentManagementBean(update#8) num objects <= 1
* ...
*
* Test Vectors:
* java.lang.String:equals(...)@278: {1}, {0}
* java.lang.String:equals(...)@285: {0}, {1}
* java.util.Arrays:asList(...)@249: Addr_Set{null}, Inverse{null}
* java.util.Iterator:hasNext(...)@254: {0}, {1}
* java.util.Iterator:hasNext(...)@297: {0}, {1}
* java.util.List:contains(...)@270: {0}, {1}
* java.util.List:contains(...)@278: {0}, {1}
* java.util.List:size(...)@250: {-231..0}, {1..232-1}
*/
244 WeblogManager wmgr = WebloggerFactory.getWeblogger().getWeblogManager();
245
246 List<Weblog> flushList = new ArrayList<Weblog>();
247
248 // delete all comments with delete box checked
249 List<String> deletes = Arrays.asList(getBean().getDeleteComments());
250 if(deletes != null && deletes.size() > 0) {
251 log.debug("Processing deletes - "+deletes.size());
252
253 WeblogEntryComment deleteComment = null;
254 for(String deleteId : deletes) {
255 deleteComment = wmgr.getComment(deleteId);
256 flushList.add(deleteComment.getWeblogEntry().getWebsite());
257 wmgr.removeComment(deleteComment);
258 }
259 }
260
261 // loop through IDs of all comments displayed on page
262 List spamIds = Arrays.asList(getBean().getSpamComments());
263 log.debug(spamIds.size()+" comments marked as spam");
264
265 String[] ids = Utilities.stringToStringArray(getBean().getIds(),",");
266 for (int i=0; i < ids.length; i++) {
267 log.debug("processing id - "+ ids[i]);
268
269 // if we already deleted it then skip forward
270 if(deletes.contains(ids[i])) {
271 log.debug("Already deleted, skipping - "+ids[i]);
272 continue;
273 }
274
275 WeblogEntryComment comment = wmgr.getComment(ids[i]);
276
277 // mark/unmark spam
278 if (spamIds.contains(ids[i]) &&
279 !WeblogEntryComment.SPAM.equals(comment.getStatus())) {
280 log.debug("Marking as spam - "+comment.getId());
281 comment.setStatus(WeblogEntryComment.SPAM);
282 wmgr.saveComment(comment);
283
284 flushList.add(comment.getWeblogEntry().getWebsite());
285 } else if(WeblogEntryComment.SPAM.equals(comment.getStatus())) {
286 log.debug("Marking as approved - "+comment.getId());
287 comment.setStatus(WeblogEntryComment.APPROVED);
288 wmgr.saveComment(comment);
289
290 flushList.add(comment.getWeblogEntry().getWebsite());
291 }
292 }
293
294 WebloggerFactory.getWeblogger().flush();
295
296 // notify caches of changes, flush weblogs affected by changes
297 for (Iterator sites = flushList.iterator(); sites.hasNext();) {
298 CacheManager.invalidate((Weblog)sites.next());
299 }
300
301 addMessage("commentManagement.updateSuccess");
302
303 // reset form and load fresh comments list
304 setBean(new GlobalCommentManagementBean());
305
306 return execute();
307
308 } catch (Exception ex) {
309 log.error("ERROR updating comments", ex);
310 addError("commentManagement.updateError", ex.toString());
311 }
312
313 return LIST;
314 }
315
316
317 public List getCommentStatusOptions() {
318
/*
P/P * Method: List getCommentStatusOptions()
*
* Postconditions:
* return_value == &new ArrayList(getCommentStatusOptions#1)
* new ArrayList(getCommentStatusOptions#1) num objects == 1
*/
319 List opts = new ArrayList();
320
321 opts.add(new KeyValueObject("ALL", getText("commentManagement.all")));
322 opts.add(new KeyValueObject("ONLY_PENDING", getText("commentManagement.onlyPending")));
323 opts.add(new KeyValueObject("ONLY_APPROVED", getText("commentManagement.onlyApproved")));
324 opts.add(new KeyValueObject("ONLY_DISAPPROVED", getText("commentManagement.onlyDisapproved")));
325
326 return opts;
327 }
328
329 public List getSpamStatusOptions() {
330
/*
P/P * Method: List getSpamStatusOptions()
*
* Postconditions:
* return_value == &new ArrayList(getSpamStatusOptions#1)
* new ArrayList(getSpamStatusOptions#1) num objects == 1
*/
331 List opts = new ArrayList();
332
333 opts.add(new KeyValueObject("ALL", getText("commentManagement.all")));
334 opts.add(new KeyValueObject("NO_SPAM", getText("commentManagement.noSpam")));
335 opts.add(new KeyValueObject("ONLY_SPAM", getText("commentManagement.onlySpam")));
336
337 return opts;
338 }
339
340
341 public GlobalCommentManagementBean getBean() {
/*
P/P * Method: GlobalCommentManagementBean getBean()
*
* Preconditions:
* init'ed(this.bean)
*
* Postconditions:
* return_value == this.bean
* init'ed(return_value)
*/
342 return bean;
343 }
344
345 public void setBean(GlobalCommentManagementBean bean) {
/*
P/P * Method: void setBean(GlobalCommentManagementBean)
*
* Postconditions:
* this.bean == bean
* init'ed(this.bean)
*/
346 this.bean = bean;
347 }
348
349 public int getBulkDeleteCount() {
/*
P/P * Method: int getBulkDeleteCount()
*
* Preconditions:
* init'ed(this.bulkDeleteCount)
*
* Postconditions:
* return_value == this.bulkDeleteCount
* init'ed(return_value)
*/
350 return bulkDeleteCount;
351 }
352
353 public void setBulkDeleteCount(int bulkDeleteCount) {
/*
P/P * Method: void setBulkDeleteCount(int)
*
* Postconditions:
* this.bulkDeleteCount == bulkDeleteCount
* init'ed(this.bulkDeleteCount)
*/
354 this.bulkDeleteCount = bulkDeleteCount;
355 }
356
357 public WeblogEntryComment getFirstComment() {
/*
P/P * Method: WeblogEntryComment getFirstComment()
*
* Preconditions:
* init'ed(this.firstComment)
*
* Postconditions:
* return_value == this.firstComment
* init'ed(return_value)
*/
358 return firstComment;
359 }
360
361 public void setFirstComment(WeblogEntryComment firstComment) {
/*
P/P * Method: void setFirstComment(WeblogEntryComment)
*
* Postconditions:
* this.firstComment == firstComment
* init'ed(this.firstComment)
*/
362 this.firstComment = firstComment;
363 }
364
365 public WeblogEntryComment getLastComment() {
/*
P/P * Method: WeblogEntryComment getLastComment()
*
* Preconditions:
* init'ed(this.lastComment)
*
* Postconditions:
* return_value == this.lastComment
* init'ed(return_value)
*/
366 return lastComment;
367 }
368
369 public void setLastComment(WeblogEntryComment lastComment) {
/*
P/P * Method: void setLastComment(WeblogEntryComment)
*
* Postconditions:
* this.lastComment == lastComment
* init'ed(this.lastComment)
*/
370 this.lastComment = lastComment;
371 }
372
373 public CommentsPager getPager() {
/*
P/P * Method: CommentsPager getPager()
*
* Preconditions:
* init'ed(this.pager)
*
* Postconditions:
* return_value == this.pager
* init'ed(return_value)
*/
374 return pager;
375 }
376
377 public void setPager(CommentsPager pager) {
/*
P/P * Method: void setPager(CommentsPager)
*
* Postconditions:
* this.pager == pager
* init'ed(this.pager)
*/
378 this.pager = pager;
379 }
380
381 }
SofCheck Inspector Build Version : 2.18479
| GlobalCommentManagement.java |
2009-Jan-02 14:24:46 |
| GlobalCommentManagement.class |
2009-Sep-04 03:12:45 |