/** * @param auth * @param msg * @param request * @throws Exception */ private void saveDraft(AuthProfile auth, MimeMessage msg, HttpServletRequest request) throws Exception { ByteArrayOutputStream bos = new ByteArrayOutputStream(); msg.writeTo(bos); byte bMsg[] = bos.toByteArray(); // serialize the message byte array ObjectOutputStream os = new ObjectOutputStream(bos); os.writeObject(bMsg); // create an email db item MsgDbObject item = new MsgDbObject(); item.setEmail(bMsg); String md5Header = new String(MD5.getHashString(bMsg)).toUpperCase(new Locale("en", "US")); ConnectionMetaHandler handler = getConnectionHandler(request); ConnectionProfile profile = getConnectionProfile(request); FolderControllerFactory factory = new FolderControllerFactory(auth, profile, handler); FolderController foldCont = factory.getFolderController(); FolderDbObject fItem = foldCont.getDraftsFolder(); item.setUniqueId(md5Header); item.setFolderId(fItem.getId()); item.setUnread(new Boolean(false)); item.setUsername(auth.getUsername()); item.setMsgSize(new Long(bMsg.length)); // save the email db item. MailControllerFactory mailFact = new MailControllerFactory(auth, profile, handler, fItem.getFolderName()); MailController mailCont = mailFact.getMailController(); mailCont.appendEmail(item); }
/** * The doPost method of the servlet. <br> * This method is called when a form has its tag value method equals to post. * * @param request the request send by the client to the server * @param response the response send by the server to the client * @throws ServletException if an error occurred * @throws IOException if an error occurred */ public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setHeader("Expires", "-1"); response.setHeader("Pragma", "no-cache"); response.setHeader("Cache-control", "no-cache"); response.setHeader("Content-Type", "text/html; charset=utf-8"); PrintWriter out = response.getWriter(); AuthProfile auth = getAuthProfile(request); // get folder and set it into sesssion String sFolder = URLDecoder.decode((String) getVariable(request, "folder"), "UTF-8"); // prepare variables List headers = null; ConnectionMetaHandler handler = getConnectionHandler(request); ConnectionProfile profile = getConnectionProfile(request); FolderControllerFactory foldFact = null; FolderController folderCont = null; String currFolder = org.claros.commons.mail.utility.Constants.FOLDER_INBOX(profile); try { if (auth == null) { throw new org.claros.commons.exception.NoPermissionException(); } // if folder name is empty or it is inbox then do mail filtering. It is done by inbox // controller if (sFolder == null || sFolder.equals("") || sFolder.equals(currFolder)) { try { InboxControllerFactory inFact = new InboxControllerFactory(auth, profile, handler); InboxController inCont = inFact.getInboxController(); handler = inCont.checkEmail(); request.getSession().setAttribute("handler", handler); foldFact = new FolderControllerFactory(auth, profile, handler); folderCont = foldFact.getFolderController(); } catch (Exception e) { log.debug("minor error while checking new mail", e); } // get the id(pop3) or the mail folder name (imap) if (profile.getProtocol().equals(org.claros.commons.mail.utility.Constants.POP3)) { currFolder = folderCont.getInboxFolder().getId().toString(); } else { currFolder = folderCont.getInboxFolder().getFolderName(); } } else { currFolder = sFolder; handler = (ConnectionMetaHandler) request.getSession().getAttribute("handler"); foldFact = new FolderControllerFactory(auth, profile, handler); folderCont = foldFact.getFolderController(); } request.getSession().setAttribute("folder", currFolder); // get info about the current folder FolderDbObject myFolder = folderCont.getFolder(currFolder); // time to fetch the headers if (profile.getProtocol().equals(org.claros.commons.mail.utility.Constants.POP3) && myFolder .getFolderType() .equals(org.claros.intouch.common.utility.Constants.FOLDER_TYPE_INBOX)) { currFolder = org.claros.commons.mail.utility.Constants.FOLDER_INBOX(null); } // get and set sort parameters String mailSort = (String) getVariable(request, "mailSort"); if (null == mailSort) mailSort = "date"; String mailSortDirection = (String) getVariable(request, "mailSortDirection"); if (null == mailSortDirection) mailSortDirection = "desc"; request.getSession().setAttribute("mailSort", mailSort); request.getSession().setAttribute("mailSortDirection", mailSortDirection); // first check to see if the server supports server side sorting or not. // if it supports server side sorting it is a big performance enhancement. ArrayList sortedHeaders = null; boolean supportsServerSorting = false; try { // if the user doesn't want server side sorting for any reason(????) do not to server // side imap sorting. String disableImapSort = PropertyFile.getConfiguration("/config/config.xml") .getString("common-params.disable-imap-sort"); if (disableImapSort != null && (disableImapSort.toLowerCase().equals("yes") || disableImapSort.toLowerCase().equals("true"))) { sortedHeaders = null; supportsServerSorting = false; } else { // the user agrees on the performance enhancement imap sort offers. So go on. // let's give a try if the user supports it or not. ProtocolFactory pFact = new ProtocolFactory(profile, auth, handler); Protocol protocol = pFact.getProtocol(currFolder); sortedHeaders = protocol.getHeadersSortedList(mailSort, mailSortDirection); // profile has the boolean variable of it supports server side sorting or not!!! // so set it to the session for future references. profile = protocol.getProfile(); request.getSession().setAttribute("profile", profile); supportsServerSorting = true; } } catch (ProtocolNotAvailableException p) { sortedHeaders = null; supportsServerSorting = false; } // it is pop3 mode or the imap server doesn't support server side sorting. if (!supportsServerSorting) { headers = folderCont.getHeadersByFolder(currFolder); } // if server side sorting is supported, do not fetch the messages yet. they will be fetched // when paging variables are set below. // get and set pageNo int pageNo = 1; try { pageNo = Integer.parseInt(getVariable(request, "pageNo").toString()); } catch (Exception e) { } request.getSession().setAttribute("pageNo", new Integer(pageNo)); Cookie c1 = new Cookie("mailSort", mailSort); c1.setMaxAge(Integer.MAX_VALUE); Cookie c2 = new Cookie("mailSortDirection", mailSortDirection); c2.setMaxAge(Integer.MAX_VALUE); Cookie c3 = new Cookie("pageNo", String.valueOf(pageNo)); c3.setMaxAge(Integer.MAX_VALUE); response.addCookie(c1); response.addCookie(c2); response.addCookie(c3); boolean isAscending = false; if (mailSortDirection != null && mailSortDirection.equals("asc")) { isAscending = true; } // organize em String fromSort = ""; String dateSort = ""; String sizeSort = ""; String subjectSort = ""; if (mailSort == null || mailSort.equals("date")) { if (isAscending) dateSort = "asc"; else dateSort = "desc"; } else if (mailSort.equals("from")) { if (isAscending) fromSort = "asc"; else fromSort = "desc"; } else if (mailSort.equals("subject")) { if (isAscending) subjectSort = "asc"; else subjectSort = "desc"; } else if (mailSort.equals("to")) { if (isAscending) fromSort = "asc"; else fromSort = "desc"; } else if (mailSort.equals("size")) { if (isAscending) sizeSort = "asc"; else sizeSort = "desc"; } out.print( "<div id=\"ieHolder\" class=\"ieHolder\"><div class=\"ie7Holder\" id=\"ie7Holder\">"); // at least show the title bar also with sort arrows if (profile.getProtocol().equals(Constants.IMAP)) { out.print( "<p class='title' id='mailtitle' displayName='" + myFolder.getFolderName() + "' folderid='" + myFolder.getId() + "' foldername='mailFolder" + myFolder.getFolderName() + "' type='" + myFolder.getFolderType() + "'>" + " <span class='flag' style='background-image:url(images/unchecked.gif);background-repeat:no-repeat;' onclick='clickAll();'><a href='javascript:;'> </a></span>"); } else { out.print( "<p class='title' id='mailtitle' displayName='" + myFolder.getFolderName() + "' folderid='" + myFolder.getId() + "' foldername='mailFolder" + myFolder.getId() + "' type='" + myFolder.getFolderType() + "'>" + " <span class='flag' style='background-image:url(images/unchecked.gif);background-repeat:no-repeat;' onclick='clickAll();'><a href='javascript:;'> </a></span>"); } out.print( "<span class='attributes'><a href='javascript:;'><span style='cursor:hand'><img alt='' src='images/priority-title.gif' align='absmiddle'><img alt='' src='images/sensitivity-title.gif' align='absmiddle'></span></a></span>"); if (myFolder .getFolderType() .equals(org.claros.intouch.common.utility.Constants.FOLDER_TYPE_SENT)) { out.print( " <span class='from " + fromSort + "' onclick=\"sortColumn(this, 'to');\" sort='" + fromSort + "'><a href='javascript:;'><span style='cursor:hand'>" + getText(request, "to") + "</span></a></span>"); if (mailSort != null && mailSort.equals("from")) { mailSort = "to"; } } else { out.print( " <span class='from " + fromSort + "' onclick=\"sortColumn(this, 'from');\" sort='" + fromSort + "'><a href='javascript:;'><span style='cursor:hand'>" + getText(request, "from") + "</span></a></span>"); if (mailSort != null && mailSort.equals("to")) { mailSort = "from"; } } out.print( " <span class='subject " + subjectSort + "' onclick=\"sortColumn(this, 'subject');\" sort='" + subjectSort + "'><a href='javascript:;'><span style='cursor:hand'>" + getText(request, "subject") + "</span></a></span>" + " <span class='date " + dateSort + "' onclick=\"sortColumn(this, 'date');\" sort='" + dateSort + "'><a href='javascript:;'><span style='cursor:hand'>" + getText(request, "date") + "</span></a></span>" + " <span class='size " + sizeSort + "' onclick=\"sortColumn(this, 'size');\" sort='" + sizeSort + "'><a href='javascript:;'><span style='cursor:hand'>" + getText(request, "size") + "</span></a></span>" + " <span class='attach'><a href='javascript:;'> </a></span>" + "</p>"); if (!supportsServerSorting) { // sort the headers if (mailSort == null || mailSort.equals("date")) { Collections.sort(headers, new ComparatorDate(isAscending)); } else if (mailSort.equals("from")) { Collections.sort(headers, new ComparatorFrom(isAscending, loc)); } else if (mailSort.equals("subject")) { Collections.sort(headers, new ComparatorSubject(isAscending, loc)); } else if (mailSort.equals("to")) { Collections.sort(headers, new ComparatorTo(isAscending, loc)); } else if (mailSort.equals("size")) { Collections.sort(headers, new ComparatorSize(isAscending)); } } // organize and generate XML from the headers. if (headers != null || supportsServerSorting) { EmailHeader tmp = null; int pageSize = 25; String strPageSize = PropertyFile.getConfiguration("/config/config.xml") .getString("common-params.mailbox-page-size"); if (strPageSize != null) { try { pageSize = Integer.parseInt(strPageSize); } catch (Exception e) { pageSize = 25; } } // determine the message count. the method varies if server side or client side // sorting is used. int messageCount = -1; if (!supportsServerSorting) { messageCount = headers.size(); } else { messageCount = sortedHeaders.size(); } int pageCount = messageCount / pageSize; if ((messageCount % pageSize) > 0) pageCount++; if (pageNo > pageCount) pageNo = pageCount; int startIdx = (pageNo - 1) * pageSize; if (startIdx < 0) startIdx = 0; int endIdx = startIdx + pageSize; if (endIdx > messageCount) endIdx = messageCount; out.print( "<span id=\"pagerParams\" style=\"display:none\">" + pageNo + ":" + pageCount + ":" + messageCount + ":" + pageSize + "</span>"); // If server side sorting is supported, it is time to fetch the message headers. // not all of the headers are fetched. if (supportsServerSorting) { int msgs[] = new int[endIdx - startIdx]; int counter = 0; for (int y = startIdx; y < endIdx; y++) { msgs[counter] = ((Integer) sortedHeaders.get(y)).intValue(); counter++; } headers = folderCont.getHeadersByFolder(currFolder, msgs); // we only have the headers to be displayed in the headers arraylist. for (int i = 0; i < headers.size(); i++) { tmp = (EmailHeader) headers.get(i); writeHeaderInfoToOut(tmp, out, request, myFolder); } } else { // with the client side sorting method the headers array has all the message headers // so with a for statement display them. for (int i = startIdx; i < endIdx; i++) { tmp = (EmailHeader) headers.get(i); writeHeaderInfoToOut(tmp, out, request, myFolder); } } } out.print("</div></div>"); } catch (Exception e) { out.print( "<p class='title'>" + "<span class='flag' style='background-image:url(images/unchecked.gif);background-repeat:no-repeat;' onclick='clickAll();'><a href='javascript:;'> </a></span>" + "<span class='attributes'><a href='javascript:;'><span> </span></a></span>" + "<span class='from asc'><a href='javascript:;'><span>" + getText(request, "from") + "</span></a></span>" + "<span class='subject'><a href='javascript:;'><span>" + getText(request, "subject") + "</span></a></span>" + "<span class='date'><a href='javascript:;'><span>" + getText(request, "date") + "</span></a></span>" + "<span class='size'><a href='javascript:;'><span>" + getText(request, "size") + "</span></a></span>" + "<span class='attach'><a href='javascript:;'> </a></span>" + "</p>"); } }