From: <la...@us...> - 2003-11-04 19:24:53
|
Update of /cvsroot/portlet-opensrc/portlet-opensrc/jsr168/mail/src/portlet In directory sc8-pr-cvs1:/tmp/cvs-serv32381/jsr168/collaboration/mail/src/portlet Added Files: MailViewer.java PrefValidator.java Log Message: Mail Portlet --- NEW FILE: MailViewer.java --- package portlet.mail; import java.util.Properties; import java.io.IOException; import javax.servlet.http.Cookie; import javax.portlet.GenericPortlet; import javax.portlet.PortletRequest; import javax.portlet.RenderResponse; import javax.portlet.ActionResponse; import javax.portlet.PortletMode; import javax.portlet.PortletPreferences; import javax.portlet.PortletSession; import javax.portlet.PortletRequestDispatcher; import javax.portlet.PortletException; import javax.portlet.ValidatorException; import javax.portlet.ActionRequest; import javax.portlet.RenderRequest; import javax.mail.Store; import javax.mail.Message; import javax.mail.Folder; import javax.mail.Multipart; import javax.mail.BodyPart; import javax.mail.AuthenticationFailedException; import javax.mail.MessagingException; import javax.mail.internet.InternetAddress; import javax.naming.InitialContext; /** * <p>A mail viewer portlet.</p> */ public class MailViewer extends GenericPortlet { /** * <p>Handle actions.</p> */ public void processAction(ActionRequest request, ActionResponse response) throws PortletException { String action = request.getParameter("ACTION"); if(request.getPortletMode().equals(PortletMode.EDIT) && "EDIT_PREFS".equals(action)) { try { // Store storePreferences(request); // Switch to view mode response.setPortletMode(PortletMode.VIEW); response.setRenderParameter("target", "/sdk/portlets/mail/start.jsp"); } catch(PortletException pe) { // Set a message response.setRenderParameter("message", pe.getMessage()); response.setRenderParameter("target", "/sdk/portlets/mail/pref.jsp"); } } else if(request.getPortletMode().equals(PortletMode.VIEW)) { if("LOGIN".equals(action) || "REFRESH".equals(action)) { try { String remember = request.getParameter("remember"); // Update preferences if(remember != null) { String username = request.getParameter("username"); String password = request.getParameter("password"); // Set a cookie for the user name and // password. Additionally, encode or encrypt // the password. Cookie usernameCookie = new Cookie("USER_NAME_COOKIE", username); usernameCookie.setMaxAge(2592000); // 30 days Cookie passwordCookie = new Cookie("PASSWORD_COOKIE", password); usernameCookie.setMaxAge(86400); // 1 day response.setProperty("Cookie", usernameCookie.toString()); response.setProperty("Cookie", passwordCookie.toString()); } getMail(request); showMessage(request, response); response.setRenderParameter("target", "/sdk/portlets/mail/messages.jsp"); } catch(ValidatorException ve) { // Set a message response.setRenderParameter("message", ve.getMessage()); response.setRenderParameter("target", "/sdk/portlets/mail/start.jsp"); } catch(AuthenticationFailedException afe) { // Set a message response.setRenderParameter("message", afe.getMessage()); response.setRenderParameter("target", "/sdk/portlets/mail/start.jsp"); } catch(MessagingException me) { throw new PortletException(me); } catch(IOException ioe) { throw new PortletException(ioe); } } else if("SHOW_MESSAGE".equals(action)) { try { showMessage(request, response); response.setRenderParameter("target", "/sdk/portlets/mail/messages.jsp"); } catch(MessagingException me) { throw new PortletException(me); } catch(IOException ioe) { throw new PortletException(ioe); } } else if("RESTART".equals(action)) { response.setRenderParameter("target", "/sdk/portlets/mail/start.jsp"); } } } /** * <p>Generate content for view mode.</p> */ public void doView(RenderRequest request, RenderResponse response) throws PortletException, IOException { // Include the target JSP String target = request.getParameter("target"); if(target == null) { target = "/sdk/portlets/mail/start.jsp"; } PortletRequestDispatcher rd = getPortletContext().getRequestDispatcher(target); rd.include(request, response); } /** * <p>Store preferences.</p> */ private void storePreferences(ActionRequest request) throws PortletException { String host = request.getParameter("host"); String protocol = request.getParameter("protocol"); String username = request.getParameter("username"); String password = request.getParameter("password"); String maxMessages = request.getParameter("maxMessages"); try { PortletPreferences prefs = request.getPreferences(); if(host != null) prefs.setValue("host", host); if(protocol != null) prefs.setValue("protocol", protocol); if(username != null) prefs.setValue("username", username); if(password != null) prefs.setValue("password", password); if(maxMessages != null) prefs.setValue("maxMessages", maxMessages); prefs.store(); } catch(ValidatorException ve) { throw ve; } catch(Throwable t) { throw new PortletException(t); } } /** * <p>Retrive mail from INBOX store the messages in the session.</p> */ private void getMail(PortletRequest request) throws PortletException, AuthenticationFailedException { try { // Get mail preferences PortletPreferences prefs = request.getPreferences(); String host = prefs.getValue("host", ""); String protocol = prefs.getValue("protocol", "imap"); String username = request.getParameter("username"); if(username == null) { username = (String) request.getPortletSession().getAttribute("username", PortletSession.APPLICATION_SCOPE); } else { request.getPortletSession().setAttribute("username", username, PortletSession.APPLICATION_SCOPE); } String password = request.getParameter("password"); if(password == null) { password = (String) request.getPortletSession().getAttribute("password", PortletSession.APPLICATION_SCOPE); } else { request.getPortletSession().setAttribute("password", password, PortletSession.APPLICATION_SCOPE); } // Get a mail session InitialContext ic = new InitialContext(); javax.mail.Session mailSession = (javax.mail.Session) ic.lookup("exampleMailSession"); Properties props = new Properties(); props.put("mail.store.protocol", protocol); props.put("mail.imap.host", host); // Override defaults javax.mail.Session mailSession2 = javax.mail.Session.getInstance(props); // Get the store Store store = mailSession2.getStore(); store.connect(host, username, password); // Get INBOX Folder folder = store.getDefaultFolder(); folder = folder.getFolder("INBOX"); folder.open(Folder.READ_ONLY); // Get messages Message[] messages = null; int max = Integer.parseInt(prefs.getValue("maxMessages", "10")); int count = folder.getMessageCount(); if(count > max) { int start = count - max; int end = count - 1; messages = folder.getMessages(start, end); } else { messages = folder.getMessages(); } // Store the messages in the session PortletSession session = request.getPortletSession(); session.setAttribute("messages", messages, PortletSession.APPLICATION_SCOPE); } catch(AuthenticationFailedException afe) { throw afe; } catch(Throwable t) { throw new PortletException(t); } } /** * <p>Retrive a message.</p> */ private void showMessage(ActionRequest request, ActionResponse response) throws MessagingException, IOException { String messagePos = request.getParameter("MESSAGE_POS"); Message[] messages = (Message[]) request.getPortletSession().getAttribute("messages", PortletSession.APPLICATION_SCOPE); if(messages != null) { int pos = messages.length - 1; if(messagePos != null) { try { pos = Integer.parseInt(messagePos); } catch(NumberFormatException nfe) { } } Message message = messages[pos]; // From StringBuffer buf = new StringBuffer(); InternetAddress[] addresses = (InternetAddress[]) message.getFrom(); if(addresses == null || addresses.length == 0) { buf.append("Unknown"); } else { for(int i = 0; i < addresses.length; i++) { buf.append(addresses[i].getAddress()); if(i != (addresses.length - 1)) { buf.append(", "); } } } String from = buf.toString(); // To buf = new StringBuffer(); addresses = (InternetAddress[]) message.getRecipients(Message.RecipientType.TO); if(addresses == null || addresses.length == 0) { buf.append("Unknown"); } else { for(int i = 0; i < addresses.length; i++) { buf.append(addresses[i].getAddress()); if(i != (addresses.length - 1)) { buf.append(", "); } } } String to = buf.toString(); // CC buf = new StringBuffer(); addresses = (InternetAddress[]) message.getRecipients(Message.RecipientType.CC); if(addresses == null || addresses.length == 0) { // Nothing } else { for(int i = 0; i < addresses.length; i++) { buf.append(addresses[i].getAddress()); if(i != (addresses.length - 1)) { buf.append(", "); } } } String cc = buf.toString(); // Content String content = ""; if(message.getContent() == null || message.getContentType() == null) { content = "Can not display"; } else if(message.getContent() instanceof String) { content = (String) message.getContent(); } else if(message.getContent() instanceof Multipart) { // Try to display the first text part Multipart multipart = (Multipart) message.getContent(); if(multipart.getCount() > 0) { for(int i = 0; i < multipart.getCount(); i++) { BodyPart bodyPart = multipart.getBodyPart(i); if(bodyPart.getContent() instanceof String) { content = (String) bodyPart.getContent(); break; } } if(content.equals("")) { content = "Can not display this multi-part message"; } } else { content = "No body for this message"; } } // Set data in the request response.setRenderParameter("FROM", from); response.setRenderParameter("TO", to); response.setRenderParameter("CC", cc); response.setRenderParameter("CONTENT", content); response.setRenderParameter("SUBJECT", message.getSubject()); } } } --- NEW FILE: PrefValidator.java --- package portlet.mail; import javax.portlet.PortletPreferences; import javax.portlet.PreferencesValidator; import javax.portlet.ValidatorException; import java.util.ArrayList; /** * <p>Validates MailViewer preferences.</p> */ public class PrefValidator implements PreferencesValidator { public void validate(PortletPreferences prefs) throws ValidatorException { ArrayList failedKeys = new ArrayList(); String host = prefs.getValue("host", ""); if(host.equals("")) { failedKeys.add("host"); } String protocol = prefs.getValue("protocol", "imap"); if(!protocol.equals("imap") && !protocol.equals("pop3")) { failedKeys.add("protocol"); } String maxMessages = prefs.getValue("maxMessages", "10"); try { Integer.parseInt(maxMessages); } catch(NumberFormatException nfe) { failedKeys.add("maxMessages"); } if(failedKeys.size() > 0) { throw new ValidatorException("Failed validation", failedKeys); } } } |