1 140 package com.ivata.groupware.business.mail.struts; 141 142 import java.util.Arrays ; 143 import java.util.HashSet ; 144 import java.util.Iterator ; 145 import java.util.List ; 146 import java.util.Vector ; 147 148 import javax.servlet.http.HttpServletRequest ; 149 import javax.servlet.http.HttpServletResponse ; 150 import javax.servlet.http.HttpSession ; 151 152 import org.apache.log4j.Logger; 153 import org.apache.struts.action.ActionErrors; 154 import org.apache.struts.action.ActionForm; 155 import org.apache.struts.action.ActionMapping; 156 import org.picocontainer.PicoContainer; 157 158 import com.ivata.groupware.admin.security.server.SecurityServerException; 159 import com.ivata.groupware.admin.security.user.UserDO; 160 import com.ivata.groupware.admin.setting.Settings; 161 import com.ivata.groupware.business.mail.Mail; 162 import com.ivata.groupware.business.mail.MailConstants; 163 import com.ivata.groupware.business.mail.message.MessageDO; 164 import com.ivata.groupware.business.mail.server.NoMailServerException; 165 import com.ivata.groupware.business.mail.session.MailSession; 166 import com.ivata.groupware.container.PicoContainerFactory; 167 import com.ivata.mask.MaskFactory; 168 import com.ivata.mask.util.StringHandling; 169 import com.ivata.mask.util.SystemException; 170 import com.ivata.mask.util.ThrowableHandling; 171 import com.ivata.mask.web.struts.MaskAction; 172 import com.ivata.mask.web.struts.MaskAuthenticator; 173 174 175 184 public class IndexAction extends MaskAction { 185 188 private static final Logger logger = Logger.getLogger(IndexAction.class); 189 192 private Mail mail; 193 196 private Settings settings; 197 205 public IndexAction( 206 final Mail mailParam, 207 final Settings settingsParam, 208 final MaskFactory maskFactory, 209 final MaskAuthenticator authenticator) { 210 super(maskFactory, authenticator); 211 this.mail = mailParam; 212 this.settings = settingsParam; 213 } 214 215 231 public String execute(final ActionMapping mapping, 232 final ActionErrors errors, 233 final ActionForm form, 234 final HttpServletRequest request, 235 final HttpServletResponse response, 236 final HttpSession session) throws SystemException { 237 if (logger.isDebugEnabled()) { 238 logger.debug("execute(ActionMapping mapping = " + mapping 239 + ", ActionForm form = " + form 240 + ", HttpServletRequest request = " + request 241 + ", HttpServletResponse response = " + response 242 + ", HttpSession session = " + session 243 + ") - start"); 244 } 245 246 IndexForm indexForm = (IndexForm) form; 247 248 MailSession mailSession; 249 try { 250 mailSession = (MailSession) session.getAttribute("securitySession"); 251 } catch (ClassCastException e) { 252 logger.error("Class cast exception getting the mail security " 253 + "session. This means we don't have a mail session.", 254 e); 255 256 session.setAttribute("mailServerException", 257 new NoMailServerException(e)); 258 259 if (logger.isDebugEnabled()) { 260 logger.debug("execute - end - return value = mailServerError"); 261 } 262 return "mailServerError"; 263 } 264 final String folderName = getFolderName(mailSession, indexForm); 265 266 HashSet selectedMessageIds = (HashSet ) session.getAttribute( 268 "selectedMessageIds"); 269 270 if (selectedMessageIds == null) { 272 selectedMessageIds = new HashSet (); 273 session.setAttribute("selectedMessageIds", 274 selectedMessageIds); 275 276 } else if (!indexForm.getRetainPrevious()) { 279 selectedMessageIds.clear(); 280 } 281 282 HashSet removeIds = new HashSet (); 286 removeIds.addAll(Arrays.asList(indexForm.getMessageIds())); 287 288 List selectedList = Arrays.asList(indexForm.getSelectedMessageIds()); 289 removeIds.removeAll(selectedList); 290 291 try { 293 getIndexMessages(request, mailSession, folderName, indexForm); 295 } catch (SystemException e) { 296 String returnValue = handleMailIndexException(e, request, 297 folderName); 298 if (logger.isDebugEnabled()) { 299 logger.debug("execute() - end - returning " 300 + returnValue); 301 } 302 return returnValue; 303 } 304 305 selectedMessageIds.removeAll(removeIds); 307 308 indexForm.setSelectedMessageIds((String []) selectedMessageIds.toArray( 310 indexForm.getSelectedMessageIds())); 311 312 String forwardName = null; 313 if (!selectedMessageIds.isEmpty()) { 314 forwardName = processSelectedMessages(request, mailSession, 315 folderName, indexForm, selectedMessageIds); 316 } 317 318 if (forwardName == null) { 320 forwardName = "mailIndex"; 321 } 322 if (logger.isDebugEnabled()) { 323 logger.debug("execute - end - return value = " 324 + forwardName); 325 } 326 return forwardName; 327 } 328 338 private String getFolderName( 339 final MailSession mailSession, 340 final IndexForm indexForm) 341 throws SystemException { 342 if (logger.isDebugEnabled()) { 343 logger.debug("getFolderName(MailSession mailSession = " 344 + mailSession + ", IndexForm indexForm = " + indexForm 345 + ") - start"); 346 } 347 348 String folderName = null; 350 351 if (indexForm.getFolderName() != null) { 352 folderName = indexForm.getFolderName().toLowerCase(); 353 } 354 355 UserDO user = mailSession.getUser(); 356 if (StringHandling.isNullOrEmpty(folderName)) { 357 folderName = settings.getStringSetting( 358 mailSession, 359 "emailFolderInbox", 360 user); 361 indexForm.setFolderName(folderName); 362 363 } else if (folderName.equals("sent")) { 367 folderName = settings.getStringSetting( 368 mailSession, 369 "emailFolderSent", 370 user); 371 indexForm.setFolderName(folderName); 372 } else if (folderName.equals("drafts")) { 373 folderName = settings.getStringSetting( 374 mailSession, 375 "emailFolderDrafts", 376 user); 377 indexForm.setFolderName(folderName); 378 } else if (folderName.equals("trash")) { 379 folderName = settings.getStringSetting( 380 mailSession, 381 "emailFolderTrash", 382 user); 383 indexForm.setFolderName(folderName); 384 } else { 385 folderName = settings.getStringSetting( 386 mailSession, 387 "emailFolderInbox", 388 user); 389 indexForm.setFolderName(folderName); 390 } 391 392 if (logger.isDebugEnabled()) { 393 logger.debug("getFolderName() - end - return value = " 394 + folderName); 395 } 396 return folderName; 397 } 398 410 private void getIndexMessages( 411 final HttpServletRequest request, 412 final MailSession mailSession, 413 final String folderName, 414 final IndexForm indexForm) 415 throws SystemException { 416 if (logger.isDebugEnabled()) { 417 logger.debug("getIndexMessages(HttpServletRequest request = " 418 + request + ", MailSession mailSession = " + mailSession 419 + ", String folderName = " + folderName 420 + ", IndexForm indexForm = " + indexForm + ") - start"); 421 } 422 423 HttpSession session = request.getSession(); 424 List sessionMessages = null; 425 426 String sessionFolderName = (String ) session.getAttribute( 429 "mailIndexFolderName"); 430 Integer sessionSortBy = (Integer ) session.getAttribute( 431 "mailIndexFolderSortBy"); 432 Boolean sessionSortAscending = (Boolean ) session.getAttribute( 433 "mailIndexFolderSortAscending"); 434 sessionMessages = (List ) session.getAttribute("mailIndexMessages"); 435 436 Integer sortBy = indexForm.getSortBy(); 437 Boolean sortAscending = new Boolean (indexForm.getSortAscending()); 438 439 boolean modified = true; 440 441 if (folderName.equals(sessionFolderName) 445 || (sessionFolderName == null)) { 446 modified = mail.hasNewMessages( 447 mailSession, 448 mailSession.getUser().getName(), 449 folderName); 450 } 451 if (modified 454 || (sessionMessages == null) 455 || !folderName.equals(sessionFolderName) 456 || !sortBy.equals(sessionSortBy)) { 457 if (!(folderName.equals(sessionFolderName) 459 || mail.doesFolderExist(mailSession, folderName))) { 460 mail.createFolder(mailSession, folderName); 461 } 462 463 session.setAttribute("mailIndexFolderName", folderName); 466 session.setAttribute("mailIndexFolderSortBy", sortBy); 467 sessionMessages = mail.findMessagesInFolder(mailSession, 468 folderName, sortBy, sortAscending.booleanValue()); 469 470 } else if (!sortAscending.equals(sessionSortAscending)) { 473 int end = sessionMessages.size(); 474 int halfSize = end / 2; 475 Object tmp; 476 477 for (int start = 0; start < halfSize; ++start) { 478 tmp = sessionMessages.get(--end); 479 sessionMessages.set(end, sessionMessages.get(start)); 480 sessionMessages.set(start, tmp); 481 } 482 } 483 484 session.setAttribute("mailIndexFolderSortAscending", sortAscending); 486 487 session.setAttribute("mailIndexMessages", sessionMessages); 489 490 if (logger.isDebugEnabled()) { 491 logger.debug("getIndexMessages() - end"); 492 } 493 } 494 506 private String handleMailIndexException( 507 final SystemException systemExceptionParam, 508 final HttpServletRequest request, 509 final String folderName) 510 throws SystemException { 511 logger.warn("handleMailIndexException - Caught " 512 + systemExceptionParam.getClass().getName() 513 + " in IndexAction. Analysing cause.", systemExceptionParam); 514 Throwable eCause = ThrowableHandling.getCause(systemExceptionParam); 515 assert (eCause != null); 516 logger.warn("Exception cause: " 517 + eCause.getClass().getName() 518 + ".", eCause); 519 520 if (eCause instanceof NoMailServerException) { 521 NoMailServerException noMailServerException = 522 (NoMailServerException) eCause; 523 524 logger.error("handleMailIndexException (" 527 + noMailServerException.getClass().getName() 528 + ") retrieving index for folder '" 529 + folderName 530 + "': " 531 + noMailServerException.getCause().getMessage()); 532 noMailServerException.printStackTrace(); 533 request.setAttribute("mailServerException", 534 noMailServerException); 535 536 if (logger.isDebugEnabled()) { 537 logger.debug("handleMailIndexException - end - return value = " 538 + "mailServerError"); 539 } 540 return "mailServerError"; 541 } else if (eCause instanceof SecurityServerException) { 542 SecurityServerException serverException = 543 (SecurityServerException) eCause; 544 545 logger.error("handleMailIndexException (" 548 + serverException.getClass().getName() 549 + ") retrieving index for folder '" 550 + folderName 551 + "': " 552 + serverException.getMessage()); 553 serverException.printStackTrace(); 554 request.setAttribute("mailServerException", 555 serverException.getCause()); 556 557 if (logger.isDebugEnabled()) { 558 logger.debug("handleMailIndexException - end - return value = " 559 + "mailServerError"); 560 } 561 return "mailServerError"; 562 } 563 564 if (logger.isDebugEnabled()) { 566 logger.debug("handleMailIndexException - throwing system exception " 567 + "again.", systemExceptionParam); 568 } 569 throw systemExceptionParam; 570 } 571 587 private String processSelectedMessages( 588 final HttpServletRequest request, 589 final MailSession mailSession, 590 final String folderName, 591 final IndexForm indexForm, 592 final HashSet selectedMessageIds) 593 throws SystemException { 594 if (logger.isDebugEnabled()) { 595 logger.debug("processSelectedMessages(" 596 + "HttpServletRequest request = " 597 + request 598 + ", MailSession mailSession = " 599 + mailSession 600 + ", String folderName = " 601 + folderName 602 + ", IndexForm indexForm = " 603 + indexForm 604 + ", List selectedMessageIds = " 605 + selectedMessageIds 606 + ") - start"); 607 } 608 609 HttpSession session = request.getSession(); 610 Integer sortBy = indexForm.getSortBy(); 611 List sessionMessages; 612 613 if (indexForm.getDeleteTrash()) { 615 mail.deleteMessagesFromTrash(mailSession, 616 new Vector (selectedMessageIds)); 617 selectedMessageIds.clear(); 618 sessionMessages = mail.findMessagesInFolder( 619 mailSession, folderName, sortBy, 620 indexForm.getSortAscending()); 621 session.setAttribute("mailIndexMessages", 622 sessionMessages); 623 624 } else if (!StringHandling.isNullOrEmpty(indexForm.getMoveTo())) { 627 mail.moveMessages(mailSession, indexForm.getFolderName(), 628 new Vector (selectedMessageIds), indexForm.getMoveTo()); 629 selectedMessageIds.clear(); 630 sessionMessages = mail.findMessagesInFolder( 631 mailSession, folderName, sortBy, 632 indexForm.getSortAscending()); 633 session.setAttribute("mailIndexMessages", 634 sessionMessages); 635 636 indexForm.setMoveTo(""); 639 } else if (indexForm.getForwardMessages()) { 640 PicoContainer picoContainer = PicoContainerFactory 642 .getInstance().getGlobalContainer(); 643 ComposeForm composeForm = (ComposeForm) 644 picoContainer.getComponentInstance(ComposeForm.class); 645 646 MessageDO newMessage = 647 mail.createThreadMessage( 648 mailSession, 649 indexForm.getFolderName(), 650 new Vector (selectedMessageIds), 651 MailConstants.THREAD_FORWARD); 652 composeForm.setMessage(newMessage); 653 654 request.setAttribute("mailComposeForm", composeForm); 655 656 indexForm.setForwardMessages(false); 657 658 if (logger.isDebugEnabled()) { 659 logger.debug("execute - end - return value = mailCompose"); 660 } 661 return "mailCompose"; 662 } else { 663 sessionMessages = (List ) session.getAttribute("mailIndexMessages"); 664 } 665 666 if (logger.isDebugEnabled()) { 667 logger.debug("processSelectedMessages() - end - return value = " 668 + null); 669 } 670 if (indexForm.getSelectAll()) { 672 for (Iterator i = sessionMessages.iterator(); i.hasNext();) { 673 selectedMessageIds.add(((MessageDO) i.next()).getId()); 674 } 675 676 } else { 678 List selectedList = 679 Arrays.asList(indexForm.getSelectedMessageIds()); 680 selectedMessageIds.addAll(selectedList); 681 } 682 683 return null; 684 } 685 } 686 | Popular Tags |