You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by ma...@apache.org on 2009/11/27 14:24:52 UTC

svn commit: r884868 [1/2] - in /james/hupa/trunk: client/src/main/java/org/apache/hupa/client/mvp/ client/src/main/webapp/WEB-INF/ client/war/WEB-INF/ server/src/main/java/org/apache/hupa/server/ server/src/main/java/org/apache/hupa/server/guice/ serve...

Author: manolo
Date: Fri Nov 27 13:24:51 2009
New Revision: 884868

URL: http://svn.apache.org/viewvc?rev=884868&view=rev
Log:
Added a bunch of tests and utilities needed to fix various bugs in sending emails.
New tests are now using guice to inject mock classes.
Little refactoring in arguments and class names.
Unified all demo-mode constants in a class.
Added war to svnignore.

Added:
    james/hupa/trunk/server/src/main/java/org/apache/hupa/server/guice/DemoModeConstants.java
    james/hupa/trunk/server/src/main/java/org/apache/hupa/server/guice/GuiceServerModule.java
      - copied, changed from r884755, james/hupa/trunk/server/src/main/java/org/apache/hupa/server/guice/ServerModul.java
    james/hupa/trunk/server/src/main/java/org/apache/hupa/server/guice/GuiceServletConfig.java
      - copied, changed from r884755, james/hupa/trunk/server/src/main/java/org/apache/hupa/server/guice/MyGuiceServletConfig.java
    james/hupa/trunk/server/src/main/java/org/apache/hupa/server/handler/PrepareNewMessageHandler.java
    james/hupa/trunk/server/src/test/java/org/apache/hupa/server/guice/GuiceTestModule.java
    james/hupa/trunk/server/src/test/java/org/apache/hupa/server/guice/ServerModulTest.java
      - copied, changed from r884755, james/hupa/trunk/server/src/test/java/org/apache/hupa/server/guice/ServerModulTest.java
    james/hupa/trunk/server/src/test/java/org/apache/hupa/server/handler/FowardMessageHandlerTest.java
    james/hupa/trunk/server/src/test/java/org/apache/hupa/server/handler/MsgUtils.java
    james/hupa/trunk/server/src/test/java/org/apache/hupa/server/mock/MockLogProvider.java
Removed:
    james/hupa/trunk/server/src/main/java/org/apache/hupa/server/guice/MyGuiceServletConfig.java
    james/hupa/trunk/server/src/main/java/org/apache/hupa/server/guice/ServerModul.java
Modified:
    james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mvp/IMAPMessagePresenter.java
    james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mvp/MessageSendPresenter.java
    james/hupa/trunk/client/src/main/webapp/WEB-INF/web.xml
    james/hupa/trunk/client/war/WEB-INF/web.xml
    james/hupa/trunk/server/src/main/java/org/apache/hupa/server/InMemoryIMAPStoreCache.java
    james/hupa/trunk/server/src/main/java/org/apache/hupa/server/handler/AbstractSendMessageHandler.java
    james/hupa/trunk/server/src/main/java/org/apache/hupa/server/handler/ForwardMessageHandler.java
    james/hupa/trunk/server/src/main/java/org/apache/hupa/server/handler/GetMessageDetailsHandler.java
    james/hupa/trunk/server/src/main/java/org/apache/hupa/server/handler/NoopHandler.java
    james/hupa/trunk/server/src/main/java/org/apache/hupa/server/mock/MockIMAPFolder.java
    james/hupa/trunk/server/src/main/java/org/apache/hupa/server/mock/MockIMAPStore.java
    james/hupa/trunk/server/src/main/java/org/apache/hupa/server/mock/MockSMTPTransport.java
    james/hupa/trunk/server/src/main/java/org/apache/hupa/server/servlet/DownloadAttachmentServlet.java
    james/hupa/trunk/server/src/test/java/org/apache/hupa/server/DemoModeTest.java
    james/hupa/trunk/server/src/test/java/org/apache/hupa/server/handler/AbstractHandlerTest.java
    james/hupa/trunk/server/src/test/java/org/apache/hupa/server/handler/AbtractSendMessageHandlerTest.java
    james/hupa/trunk/server/src/test/java/org/apache/hupa/server/handler/CreateFolderHandlerTest.java
    james/hupa/trunk/server/src/test/java/org/apache/hupa/server/handler/DeleteFolderHandlerTest.java
    james/hupa/trunk/server/src/test/java/org/apache/hupa/server/handler/DeleteMessageByUidHandlerTest.java
    james/hupa/trunk/server/src/test/java/org/apache/hupa/server/handler/FetchFoldersHandlerTest.java
    james/hupa/trunk/server/src/test/java/org/apache/hupa/server/handler/LoginUserHandlerTest.java
    james/hupa/trunk/server/src/test/java/org/apache/hupa/server/handler/LogoutUserHandlerTest.java
    james/hupa/trunk/server/src/test/java/org/apache/hupa/server/handler/NoopHandlerTest.java
    james/hupa/trunk/server/src/test/java/org/apache/hupa/server/mock/MockHttpSession.java
    james/hupa/trunk/server/src/test/java/org/apache/hupa/server/mock/MockIMAPStoreCache.java
    james/hupa/trunk/server/src/test/java/org/apache/hupa/server/servlet/DownloadAttachmentServletTest.java
    james/hupa/trunk/shared/src/main/java/org/apache/hupa/shared/Util.java
    james/hupa/trunk/shared/src/main/java/org/apache/hupa/shared/data/AbstractMessage.java
    james/hupa/trunk/shared/src/main/java/org/apache/hupa/shared/data/SMTPMessage.java
    james/hupa/trunk/shared/src/main/java/org/apache/hupa/shared/rpc/SendMessage.java

Modified: james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mvp/IMAPMessagePresenter.java
URL: http://svn.apache.org/viewvc/james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mvp/IMAPMessagePresenter.java?rev=884868&r1=884867&r2=884868&view=diff
==============================================================================
--- james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mvp/IMAPMessagePresenter.java (original)
+++ james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mvp/IMAPMessagePresenter.java Fri Nov 27 13:24:51 2009
@@ -99,8 +99,8 @@
 
     private void updateDisplay() {
         display.getFrom().setText(message.getFrom());
-        display.getCc().setText(Util.arrayToString(message.getCc()));
-        display.getTo().setText(Util.arrayToString(message.getTo()));
+        display.getCc().setText(Util.listToString(message.getCc()));
+        display.getTo().setText(Util.listToString(message.getTo()));
         display.getSubject().setText(message.getSubject());
         display.getContent().setHTML(messageDetails.getText());
         display.setAttachments(messageDetails.getMessageAttachments(), folder.getFullName(),message.getUid());

Modified: james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mvp/MessageSendPresenter.java
URL: http://svn.apache.org/viewvc/james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mvp/MessageSendPresenter.java?rev=884868&r1=884867&r2=884868&view=diff
==============================================================================
--- james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mvp/MessageSendPresenter.java (original)
+++ james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mvp/MessageSendPresenter.java Fri Nov 27 13:24:51 2009
@@ -352,10 +352,10 @@
                 display.getToText().setText(oldmessage.getFrom());
             } else {
                 oldmessage.getCc().remove(user.getName());
-                display.getCcText().setText(Util.arrayToString(oldmessage.getCc()));
+                display.getCcText().setText(Util.listToString(oldmessage.getCc()));
                 oldmessage.getTo().remove(user.getName());
 
-                display.getToText().setText(Util.arrayToString(oldmessage.getTo()));
+                display.getToText().setText(Util.listToString(oldmessage.getTo()));
 
             }
         }

Modified: james/hupa/trunk/client/src/main/webapp/WEB-INF/web.xml
URL: http://svn.apache.org/viewvc/james/hupa/trunk/client/src/main/webapp/WEB-INF/web.xml?rev=884868&r1=884867&r2=884868&view=diff
==============================================================================
--- james/hupa/trunk/client/src/main/webapp/WEB-INF/web.xml (original)
+++ james/hupa/trunk/client/src/main/webapp/WEB-INF/web.xml Fri Nov 27 13:24:51 2009
@@ -38,6 +38,6 @@
 	</filter-mapping>
 
 	<listener>
-		<listener-class>org.apache.hupa.server.guice.MyGuiceServletConfig</listener-class>
+		<listener-class>org.apache.hupa.server.guice.GuiceServletConfig</listener-class>
 	</listener>
 </web-app>

Modified: james/hupa/trunk/client/war/WEB-INF/web.xml
URL: http://svn.apache.org/viewvc/james/hupa/trunk/client/war/WEB-INF/web.xml?rev=884868&r1=884867&r2=884868&view=diff
==============================================================================
--- james/hupa/trunk/client/war/WEB-INF/web.xml (original)
+++ james/hupa/trunk/client/war/WEB-INF/web.xml Fri Nov 27 13:24:51 2009
@@ -46,6 +46,6 @@
 	</filter-mapping>
 
 	<listener>
-		<listener-class>org.apache.hupa.server.guice.MyGuiceServletConfig</listener-class>
+		<listener-class>org.apache.hupa.server.guice.GuiceServletConfig</listener-class>
 	</listener>
 </web-app>

Modified: james/hupa/trunk/server/src/main/java/org/apache/hupa/server/InMemoryIMAPStoreCache.java
URL: http://svn.apache.org/viewvc/james/hupa/trunk/server/src/main/java/org/apache/hupa/server/InMemoryIMAPStoreCache.java?rev=884868&r1=884867&r2=884868&view=diff
==============================================================================
--- james/hupa/trunk/server/src/main/java/org/apache/hupa/server/InMemoryIMAPStoreCache.java (original)
+++ james/hupa/trunk/server/src/main/java/org/apache/hupa/server/InMemoryIMAPStoreCache.java Fri Nov 27 13:24:51 2009
@@ -28,6 +28,7 @@
 import javax.mail.Session;
 
 import org.apache.commons.logging.Log;
+import org.apache.hupa.server.guice.DemoModeConstants;
 import org.apache.hupa.server.mock.MockIMAPStore;
 import org.apache.hupa.shared.data.User;
 
@@ -40,8 +41,6 @@
 @Singleton
 public class InMemoryIMAPStoreCache implements IMAPStoreCache{
 
-    public static final String DEMO_MODE = "demo-mode";
-    
     private Session session;
     protected Log logger;
     private final Map<String,CachedIMAPStore> pool = new HashMap<String ,CachedIMAPStore>();
@@ -91,7 +90,9 @@
      * @see org.apache.hupa.server.IMAPStoreCache#get(java.lang.String, java.lang.String)
      */
     public IMAPStore get(String username, String password) throws MessagingException {
+
         CachedIMAPStore cstore = pool.get(username);
+
         if (cstore == null) {
             logger.debug("No cached store found for user " +username);
             cstore = createCachedIMAPStore();
@@ -126,16 +127,16 @@
     
     private CachedIMAPStore createCachedIMAPStore() throws NoSuchProviderException {
         CachedIMAPStore cstore;
-        if (DEMO_MODE.equals(this.address)) {
+        if (DemoModeConstants.DEMO_MODE.equals(this.address)) {
             cstore = new CachedIMAPStore(new MockIMAPStore(session), 300);
         } else if (useSSL) {
             cstore = new CachedIMAPStore((IMAPStore)session.getStore("imaps"),300);
         } else {
-            cstore =  new CachedIMAPStore((IMAPStore)session.getStore("imap"),300);
+            cstore = new CachedIMAPStore((IMAPStore)session.getStore("imap"),300);
         }
-        
         return cstore;
     }
+    
     /*
      * (non-Javadoc)
      * @see org.apache.hupa.server.IMAPStoreCache#delete(org.apache.hupa.shared.data.User)

Added: james/hupa/trunk/server/src/main/java/org/apache/hupa/server/guice/DemoModeConstants.java
URL: http://svn.apache.org/viewvc/james/hupa/trunk/server/src/main/java/org/apache/hupa/server/guice/DemoModeConstants.java?rev=884868&view=auto
==============================================================================
--- james/hupa/trunk/server/src/main/java/org/apache/hupa/server/guice/DemoModeConstants.java (added)
+++ james/hupa/trunk/server/src/main/java/org/apache/hupa/server/guice/DemoModeConstants.java Fri Nov 27 13:24:51 2009
@@ -0,0 +1,75 @@
+package org.apache.hupa.server.guice;
+
+import java.util.Properties;
+
+import org.apache.hupa.shared.data.Settings;
+import org.apache.hupa.shared.data.User;
+
+/**
+ * Constants and properties used for demo mode
+ */
+public class DemoModeConstants {
+    
+    private static final long serialVersionUID = 1L;
+
+    public static final String DEMO_MODE = "demo-mode";
+    public static final String DEMO_LOGIN = "demo";
+    
+    public static final String DEMO_MODE_SENT_FOLDER = "Demo-Sent";
+    public static final String DEMO_MODE_TRASH_FOLDER = "Demo-Trash";
+    public static final String DEMO_MODE_INBOX_FOLDER = "Demo-Inbox";
+    public static final String DEMO_MODE_DEFAULT_FOLDER = "";
+    
+    public static final String DEMO_MODE_MESSAGES_LOCATION = "mime/";
+    
+    public final static Settings mockSettings = new Settings() {
+        private static final long serialVersionUID = 1L;
+        {
+            setInboxFolderName(DEMO_MODE_INBOX_FOLDER);
+            setSentFolderName(DEMO_MODE_SENT_FOLDER);
+            setTrashFolderName(DEMO_MODE_TRASH_FOLDER);
+        }
+    };
+    
+    public final static Properties demoProperties = new Properties() {
+        private static final long serialVersionUID = 1L;
+        {
+            put("IMAPServerAddress", DEMO_MODE);
+            put("IMAPServerPort", "143");
+            put("IMAPS", "false");
+            
+            put("SMTPServerAddress", DEMO_MODE);
+            put("SMTPServerPort", "25");
+            put("SMTPS", "false");
+            put("SMTPAuth", "false");
+            
+            put("IMAPConnectionPoolSize", "4");
+            put("IMAPConnectionPoolTimeout", "300000");
+
+            put("DefaultInboxFolder", DEMO_MODE_INBOX_FOLDER);
+            put("DefaultTrashFolder", DEMO_MODE_TRASH_FOLDER);
+            put("DefaultSentFolder", DEMO_MODE_SENT_FOLDER);
+            
+            put("PostFetchMessageCount", "0");
+        }
+    };
+
+    public final static Settings demoUserSettings = new Settings() {
+        private static final long serialVersionUID = 1L;
+        {
+            setInboxFolderName(DEMO_MODE_INBOX_FOLDER);
+            setSentFolderName(DEMO_MODE_SENT_FOLDER);
+            setTrashFolderName(DEMO_MODE_TRASH_FOLDER);
+        }
+    };
+    
+    public final static User demoUser = new User() {
+        private static final long serialVersionUID = 1L;
+        {
+            setName(DEMO_LOGIN);
+            setPassword(DEMO_LOGIN);
+            setSettings(demoUserSettings);
+        }
+    };
+    
+}

Copied: james/hupa/trunk/server/src/main/java/org/apache/hupa/server/guice/GuiceServerModule.java (from r884755, james/hupa/trunk/server/src/main/java/org/apache/hupa/server/guice/ServerModul.java)
URL: http://svn.apache.org/viewvc/james/hupa/trunk/server/src/main/java/org/apache/hupa/server/guice/GuiceServerModule.java?p2=james/hupa/trunk/server/src/main/java/org/apache/hupa/server/guice/GuiceServerModule.java&p1=james/hupa/trunk/server/src/main/java/org/apache/hupa/server/guice/ServerModul.java&r1=884755&r2=884868&rev=884868&view=diff
==============================================================================
--- james/hupa/trunk/server/src/main/java/org/apache/hupa/server/guice/ServerModul.java (original)
+++ james/hupa/trunk/server/src/main/java/org/apache/hupa/server/guice/GuiceServerModule.java Fri Nov 27 13:24:51 2009
@@ -50,7 +50,6 @@
 import org.apache.hupa.server.handler.SendMessageHandler;
 import org.apache.hupa.server.handler.SetFlagsHandler;
 import org.apache.hupa.server.handler.TagMessagesHandler;
-import org.apache.hupa.server.mock.MockIMAPFolder;
 import org.apache.hupa.server.servlet.DownloadAttachmentServlet;
 import org.apache.hupa.server.servlet.MessageSourceServlet;
 import org.apache.hupa.server.servlet.UploadAttachmentServlet;
@@ -64,7 +63,7 @@
  * 
  * 
  */
-public class ServerModul extends ActionHandlerModule {
+public class GuiceServerModule extends ActionHandlerModule {
 
     public static final String SYS_PROP_CONFIG_FILE = "hupa.config.file";
 
@@ -77,7 +76,7 @@
 
     private String configDir;
     
-    public ServerModul(String rootPath) {
+    public GuiceServerModule(String rootPath) {
         configDir = rootPath + "/" + CONF_DIR;
     }
 
@@ -146,23 +145,9 @@
             properties = loadProperties(configDir + CONFIG_FILE_NAME);
         }
 
-        // Configure default parameters for Hupa in demo mode
-        if (properties == null || InMemoryIMAPStoreCache.DEMO_MODE.equals(properties.get("IMAPServerAddress"))) {
-            properties = new Properties();
-            properties.put("IMAPServerAddress", InMemoryIMAPStoreCache.DEMO_MODE);
-            properties.put("IMAPServerPort", "143");
-            properties.put("IMAPS", "false");
-            properties.put("SMTPServerAddress", InMemoryIMAPStoreCache.DEMO_MODE);
-            properties.put("SMTPServerPort", "25");
-            properties.put("SMTPS", "false");
-            properties.put("SMTPAuth", "false");
-            properties.put("IMAPConnectionPoolSize", "4");
-            properties.put("IMAPConnectionPoolTimeout", "300000");
-            
-            properties.put("DefaultInboxFolder", MockIMAPFolder.mockSettings.getInboxFolderName());
-            properties.put("DefaultTrashFolder", MockIMAPFolder.mockSettings.getTrashFolderName());
-            properties.put("DefaultSentFolder", MockIMAPFolder.mockSettings.getSentFolderName());
-            properties.put("PostFetchMessageCount", "0");
+        // Put Hupa in demo mode
+        if (properties == null || DemoModeConstants.DEMO_MODE.equals(properties.get("IMAPServerAddress"))) {
+            properties = DemoModeConstants.demoProperties;
         }
         
         return properties;

Copied: james/hupa/trunk/server/src/main/java/org/apache/hupa/server/guice/GuiceServletConfig.java (from r884755, james/hupa/trunk/server/src/main/java/org/apache/hupa/server/guice/MyGuiceServletConfig.java)
URL: http://svn.apache.org/viewvc/james/hupa/trunk/server/src/main/java/org/apache/hupa/server/guice/GuiceServletConfig.java?p2=james/hupa/trunk/server/src/main/java/org/apache/hupa/server/guice/GuiceServletConfig.java&p1=james/hupa/trunk/server/src/main/java/org/apache/hupa/server/guice/MyGuiceServletConfig.java&r1=884755&r2=884868&rev=884868&view=diff
==============================================================================
--- james/hupa/trunk/server/src/main/java/org/apache/hupa/server/guice/MyGuiceServletConfig.java (original)
+++ james/hupa/trunk/server/src/main/java/org/apache/hupa/server/guice/GuiceServletConfig.java Fri Nov 27 13:24:51 2009
@@ -33,7 +33,7 @@
  * @author norman
  *
  */
-public class MyGuiceServletConfig extends GuiceServletContextListener{
+public class GuiceServletConfig extends GuiceServletContextListener{
 
     private ServletContext context;
     @Override
@@ -50,7 +50,7 @@
 
     @Override
     protected Injector getInjector() {
-        return Guice.createInjector(new ServerModul(context.getRealPath("/")),new DispatchServletModule());
+        return Guice.createInjector(new GuiceServerModule(context.getRealPath("/")),new DispatchServletModule());
     }
 
 }

Modified: james/hupa/trunk/server/src/main/java/org/apache/hupa/server/handler/AbstractSendMessageHandler.java
URL: http://svn.apache.org/viewvc/james/hupa/trunk/server/src/main/java/org/apache/hupa/server/handler/AbstractSendMessageHandler.java?rev=884868&r1=884867&r2=884868&view=diff
==============================================================================
--- james/hupa/trunk/server/src/main/java/org/apache/hupa/server/handler/AbstractSendMessageHandler.java (original)
+++ james/hupa/trunk/server/src/main/java/org/apache/hupa/server/handler/AbstractSendMessageHandler.java Fri Nov 27 13:24:51 2009
@@ -24,6 +24,8 @@
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
 import java.util.Properties;
 
 import javax.activation.DataHandler;
@@ -40,6 +42,7 @@
 import javax.mail.internet.AddressException;
 import javax.mail.internet.InternetAddress;
 import javax.mail.internet.MimeBodyPart;
+import javax.mail.internet.MimeMessage;
 import javax.mail.internet.MimeMultipart;
 import javax.servlet.http.HttpSession;
 
@@ -50,7 +53,7 @@
 import org.apache.commons.logging.Log;
 import org.apache.hupa.server.FileItemRegistry;
 import org.apache.hupa.server.IMAPStoreCache;
-import org.apache.hupa.server.InMemoryIMAPStoreCache;
+import org.apache.hupa.server.guice.DemoModeConstants;
 import org.apache.hupa.server.mock.MockSMTPTransport;
 import org.apache.hupa.shared.data.MessageAttachment;
 import org.apache.hupa.shared.data.SMTPMessage;
@@ -78,7 +81,7 @@
     private boolean useSSL = false;
 
     @Inject
-    public AbstractSendMessageHandler(Log logger, FileItemRegistry registry,IMAPStoreCache store, Provider<HttpSession> provider, @Named("SMTPServerAddress") String address, @Named("SMTPServerPort") int port, @Named("SMTPAuth") boolean auth, @Named("SMTPS") boolean useSSL) {
+    public AbstractSendMessageHandler(Log logger, FileItemRegistry registry, IMAPStoreCache store, Provider<HttpSession> provider, @Named("SMTPServerAddress") String address, @Named("SMTPServerPort") int port, @Named("SMTPAuth") boolean auth, @Named("SMTPS") boolean useSSL) {
         super(store,logger,provider);
         this.registry = registry;
         this.auth = auth;
@@ -109,8 +112,9 @@
      * @return filledMessage
      * @throws MessagingException
      * @throws ActionException
+     * @throws IOException 
      */
-    protected Message fillBody(Message message, A action) throws MessagingException, ActionException {
+    protected Message fillBody(Message message, A action) throws MessagingException, ActionException, IOException {
 
         SMTPMessage m = action.getMessage();
         ArrayList<MessageAttachment> attachments = m.getMessageAttachments();
@@ -122,19 +126,16 @@
         if (attachments == null || attachments.isEmpty()) {
             message.setContent(body);
         } else {
-            // create the message part
+            // create the message part with the  body
             MimeBodyPart messageBodyPart = new MimeBodyPart();
-
-            // fill message
             messageBodyPart.setContent(body);
 
+            // create the multipart which contains the message and attachments
             Multipart multipart = new MimeMultipart();
-            
+            multipart.addBodyPart(messageBodyPart);
             multipart = handleAttachments(multipart, attachments);
             
-            // Put parts in message
             message.setContent(multipart);
-
         }
         // save message 
         message.saveChanges();
@@ -192,7 +193,6 @@
                 FileItem fItem = registry.get(attachment.getName());
                 if (fItem == null)
                     continue;
-                
                 // Part two is attachment
                 MimeBodyPart messageBodyPart = new MimeBodyPart();
                 DataSource source = new FileItemDataStore(fItem);
@@ -207,7 +207,7 @@
     protected void sendMessage(User user, Session session, Message message) throws MessagingException {
         Transport transport;
     
-        if (InMemoryIMAPStoreCache.DEMO_MODE.equals(address)) {
+        if (DemoModeConstants.DEMO_MODE.equals(address)) {
             transport = new MockSMTPTransport(session);
         } else if (useSSL) {
             transport = session.getTransport("smtps");
@@ -266,7 +266,7 @@
      * DataStore which wrap a FileItem
      * 
      */
-    private class FileItemDataStore implements DataSource {
+    protected static class FileItemDataStore implements DataSource {
 
         private FileItem item;
 
@@ -349,6 +349,17 @@
         }
         return result;
     }
+    
+    /**
+     * Get a Address array for a set of address passed as arguments 
+     * 
+     * @param addresses
+     * @return Address array
+     * @throws AddressException
+     */
+    static protected Address[] getRecipients(String... addresses) throws AddressException {
+        return getRecipients(Arrays.asList(addresses));
+    }
 
     /**
      * Get a Address array for the given ArrayList 
@@ -357,7 +368,7 @@
      * @return addressArray
      * @throws AddressException
      */
-    protected Address[] getRecipients(ArrayList<String> recipients) throws AddressException {
+    static protected Address[] getRecipients(List<String> recipients) throws AddressException {
         if (recipients == null) {
             return new InternetAddress[]{};
         }
@@ -368,5 +379,75 @@
         return array;
 
     }
+    
+    /**
+     * Generate a mime-message 
+     * 
+     * 
+     * @param session
+     * @param text
+     * @param html
+     * @param items
+     * @return
+     * @throws MessagingException
+     * @throws IOException
+     */
+    public static Message composeMessage (Session session, String text, String html, List<FileItem> items) throws MessagingException, IOException {
+        Message message = new MimeMessage(session);
+
+        MimeBodyPart txtPart = null;
+        MimeBodyPart htmlPart = null;
+        MimeMultipart mimeMultipart = null;
+
+        if (text != null) {
+            txtPart = new MimeBodyPart();
+            txtPart.setContent(text, "text/plain");
+        }
+        if (html != null) {
+            htmlPart = new MimeBodyPart();
+            htmlPart.setContent(html, "text/html");
+        }
+        if (html != null && text != null) {
+            mimeMultipart = new MimeMultipart();
+            mimeMultipart.setSubType("alternative");
+            mimeMultipart.addBodyPart(txtPart);
+            mimeMultipart.addBodyPart(htmlPart);
+        }
+
+        if (items == null || items.size() == 0) {
+            if (mimeMultipart != null) {
+                message.setContent(mimeMultipart);
+            } else if (html != null) {
+                message.setText(html);
+                message.setHeader("Content-type", "text/html");
+            } else if (text != null) {
+                message.setText(text);
+            }
+        } else {
+            Multipart multipart = new MimeMultipart();
+            MimeBodyPart bodyPart = new MimeBodyPart();
+            if (mimeMultipart != null) {
+                bodyPart.setContent(mimeMultipart);
+            } else if (html != null) {
+                bodyPart.setText(html);
+                bodyPart.setHeader("Content-type", "text/html");
+            } else if (text != null) {
+                bodyPart.setText(text);
+            }
+            multipart.addBodyPart(bodyPart);
+            for (FileItem fileItem: items) {
+                MimeBodyPart messageBodyPart = new MimeBodyPart();
+                DataSource source = new AbstractSendMessageHandler.FileItemDataStore(fileItem);
+                messageBodyPart.setDataHandler(new DataHandler(source));
+                messageBodyPart.setFileName(source.getName());
+                multipart.addBodyPart(messageBodyPart);
+            }
+            message.setContent(multipart);
+        }
+
+        message.saveChanges();
+        return message;
+
+    }
 
 }

Modified: james/hupa/trunk/server/src/main/java/org/apache/hupa/server/handler/ForwardMessageHandler.java
URL: http://svn.apache.org/viewvc/james/hupa/trunk/server/src/main/java/org/apache/hupa/server/handler/ForwardMessageHandler.java?rev=884868&r1=884867&r2=884868&view=diff
==============================================================================
--- james/hupa/trunk/server/src/main/java/org/apache/hupa/server/handler/ForwardMessageHandler.java (original)
+++ james/hupa/trunk/server/src/main/java/org/apache/hupa/server/handler/ForwardMessageHandler.java Fri Nov 27 13:24:51 2009
@@ -19,7 +19,7 @@
 
 package org.apache.hupa.server.handler;
 
-import java.util.ArrayList;
+import java.util.List;
 
 import javax.mail.Folder;
 import javax.mail.Message;
@@ -68,14 +68,14 @@
             MimeMessage message = new MimeMessage(session);
             SMTPMessage m = action.getMessage();
             message.setFrom(new InternetAddress(m.getFrom()));
-            ArrayList<String> to = m.getTo();
+            List<String> to = m.getTo();
             for (int i = 0; i < to.size(); i++) {
                 message.addRecipient(RecipientType.TO, new InternetAddress(to
                         .get(i)));
             }
 
-            ArrayList<String> cc = m.getCc();
-            for (int i = 0; i < cc.size(); i++) {
+            List<String> cc = m.getCc();
+            for (int i = 0; cc != null && i < cc.size(); i++) {
                 message.addRecipient(RecipientType.CC, new InternetAddress(cc
                         .get(i)));
             }

Modified: james/hupa/trunk/server/src/main/java/org/apache/hupa/server/handler/GetMessageDetailsHandler.java
URL: http://svn.apache.org/viewvc/james/hupa/trunk/server/src/main/java/org/apache/hupa/server/handler/GetMessageDetailsHandler.java?rev=884868&r1=884867&r2=884868&view=diff
==============================================================================
--- james/hupa/trunk/server/src/main/java/org/apache/hupa/server/handler/GetMessageDetailsHandler.java (original)
+++ james/hupa/trunk/server/src/main/java/org/apache/hupa/server/handler/GetMessageDetailsHandler.java Fri Nov 27 13:24:51 2009
@@ -158,7 +158,7 @@
      * @throws MessagingException
      * @throws IOException
      */
-    private boolean handleParts(MimeMessage message, Object con,
+    protected boolean handleParts(MimeMessage message, Object con,
             StringBuffer sbPlain,
             ArrayList<MessageAttachment> attachmentList)
             throws UnsupportedEncodingException, MessagingException,

Modified: james/hupa/trunk/server/src/main/java/org/apache/hupa/server/handler/NoopHandler.java
URL: http://svn.apache.org/viewvc/james/hupa/trunk/server/src/main/java/org/apache/hupa/server/handler/NoopHandler.java?rev=884868&r1=884867&r2=884868&view=diff
==============================================================================
--- james/hupa/trunk/server/src/main/java/org/apache/hupa/server/handler/NoopHandler.java (original)
+++ james/hupa/trunk/server/src/main/java/org/apache/hupa/server/handler/NoopHandler.java Fri Nov 27 13:24:51 2009
@@ -26,7 +26,7 @@
 
 import org.apache.commons.logging.Log;
 import org.apache.hupa.server.IMAPStoreCache;
-import org.apache.hupa.server.InMemoryIMAPStoreCache;
+import org.apache.hupa.server.guice.DemoModeConstants;
 import org.apache.hupa.shared.rpc.Noop;
 import org.apache.hupa.shared.rpc.NoopResult;
 
@@ -56,7 +56,7 @@
         try {
             IMAPStore store = cache.get(getUser());
             if (store.getURLName() != null &&
-                !InMemoryIMAPStoreCache.DEMO_MODE.equals(store.getURLName().getHost()) ) {
+                !DemoModeConstants.DEMO_MODE.equals(store.getURLName().getHost()) ) {
                 // just send a noop to keep the connection alive
                 store.idle();
             }

Added: james/hupa/trunk/server/src/main/java/org/apache/hupa/server/handler/PrepareNewMessageHandler.java
URL: http://svn.apache.org/viewvc/james/hupa/trunk/server/src/main/java/org/apache/hupa/server/handler/PrepareNewMessageHandler.java?rev=884868&view=auto
==============================================================================
--- james/hupa/trunk/server/src/main/java/org/apache/hupa/server/handler/PrepareNewMessageHandler.java (added)
+++ james/hupa/trunk/server/src/main/java/org/apache/hupa/server/handler/PrepareNewMessageHandler.java Fri Nov 27 13:24:51 2009
@@ -0,0 +1,77 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.hupa.server.handler;
+
+import javax.servlet.http.HttpSession;
+
+import net.customware.gwt.dispatch.server.ExecutionContext;
+import net.customware.gwt.dispatch.shared.ActionException;
+
+import org.apache.commons.logging.Log;
+import org.apache.hupa.server.IMAPStoreCache;
+import org.apache.hupa.server.guice.DemoModeConstants;
+import org.apache.hupa.shared.rpc.Noop;
+import org.apache.hupa.shared.rpc.NoopResult;
+
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.sun.mail.imap.IMAPStore;
+
+/**
+ * Handle Noops
+ * 
+ *
+ */
+public class PrepareNewMessageHandler extends AbstractSessionHandler<Noop, NoopResult>{
+
+
+    @Inject
+    public PrepareNewMessageHandler(IMAPStoreCache cache, Log logger, Provider<HttpSession> provider) {
+        super(cache,logger,provider);
+    }
+    
+    /*
+     * (non-Javadoc)
+     * @see org.apache.hupa.server.handler.AbstractSessionHandler#executeInternal(org.apache.hupa.shared.rpc.Session, net.customware.gwt.dispatch.server.ExecutionContext)
+     */
+    public NoopResult executeInternal(Noop action, ExecutionContext context)
+            throws ActionException {
+        try {
+            IMAPStore store = cache.get(getUser());
+            if (store.getURLName() != null &&
+                !DemoModeConstants.DEMO_MODE.equals(store.getURLName().getHost()) ) {
+                // just send a noop to keep the connection alive
+                store.idle();
+            }
+            return new NoopResult();
+        } catch (Exception e) {
+            throw new ActionException("Unable to send NOOP " + e.getMessage());
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see net.customware.gwt.dispatch.server.ActionHandler#getActionType()
+     */
+    public Class<Noop> getActionType() {
+        return Noop.class;
+    }
+
+}

Modified: james/hupa/trunk/server/src/main/java/org/apache/hupa/server/mock/MockIMAPFolder.java
URL: http://svn.apache.org/viewvc/james/hupa/trunk/server/src/main/java/org/apache/hupa/server/mock/MockIMAPFolder.java?rev=884868&r1=884867&r2=884868&view=diff
==============================================================================
--- james/hupa/trunk/server/src/main/java/org/apache/hupa/server/mock/MockIMAPFolder.java (original)
+++ james/hupa/trunk/server/src/main/java/org/apache/hupa/server/mock/MockIMAPFolder.java Fri Nov 27 13:24:51 2009
@@ -37,7 +37,8 @@
 import javax.mail.internet.MimeMessage;
 import javax.mail.search.SearchTerm;
 
-import org.apache.hupa.shared.data.Settings;
+import org.apache.hupa.server.guice.DemoModeConstants;
+
 
 import com.sun.mail.imap.IMAPFolder;
 import com.sun.mail.imap.IMAPStore;
@@ -45,27 +46,12 @@
 public class MockIMAPFolder extends IMAPFolder {
 
     public static final char SEPARATOR = '.';
-    public static final String DEMO_MODE_SENT_FOLDER = "Demo-Sent";
-    public static final String DEMO_MODE_TRASH_FOLDER = "Demo-Trash";
-    public static final String DEMO_MODE_INBOX_FOLDER = "Demo-Inbox";
-    public static final String DEMO_MODE_DEFAULT_FOLDER = "";
-    public static final String DEMO_MODE_MESSAGES_LOCATION = "mime/";
-
     public List<Message> messages = new ArrayList<Message>();
     private boolean closed;
     private boolean exists;
     
-    public final static Settings mockSettings = new Settings() {
-        private static final long serialVersionUID = -6650449479903482066L;
-        {
-            setInboxFolderName(MockIMAPFolder.DEMO_MODE_INBOX_FOLDER);
-            setSentFolderName(MockIMAPFolder.DEMO_MODE_SENT_FOLDER);
-            setTrashFolderName(MockIMAPFolder.DEMO_MODE_TRASH_FOLDER);
-        }
-    };
-
     public MockIMAPFolder(String fullName, IMAPStore store) {
-        super(fullName, (DEMO_MODE_DEFAULT_FOLDER.equals(fullName) ? '\0' : SEPARATOR), store);
+        super(fullName, (DemoModeConstants.DEMO_MODE_DEFAULT_FOLDER.equals(fullName) ? '\0' : SEPARATOR), store);
     }
 
     @Override
@@ -103,7 +89,7 @@
     
     public void loadDemoMessages(Session session) {
         for(int i=0;;i++) {
-            URL url = Thread.currentThread().getContextClassLoader().getResource(DEMO_MODE_MESSAGES_LOCATION + i + ".msg");
+            URL url = Thread.currentThread().getContextClassLoader().getResource(DemoModeConstants.DEMO_MODE_MESSAGES_LOCATION + i + ".msg");
             if (url == null) break;
             try {
                 FileInputStream is = new FileInputStream(url.getFile());

Modified: james/hupa/trunk/server/src/main/java/org/apache/hupa/server/mock/MockIMAPStore.java
URL: http://svn.apache.org/viewvc/james/hupa/trunk/server/src/main/java/org/apache/hupa/server/mock/MockIMAPStore.java?rev=884868&r1=884867&r2=884868&view=diff
==============================================================================
--- james/hupa/trunk/server/src/main/java/org/apache/hupa/server/mock/MockIMAPStore.java (original)
+++ james/hupa/trunk/server/src/main/java/org/apache/hupa/server/mock/MockIMAPStore.java Fri Nov 27 13:24:51 2009
@@ -30,8 +30,9 @@
 import javax.mail.Session;
 import javax.mail.URLName;
 
-import org.apache.hupa.server.InMemoryIMAPStoreCache;
+import org.apache.hupa.server.guice.DemoModeConstants;
 
+import com.google.inject.Inject;
 import com.sun.mail.imap.IMAPStore;
 
 public class MockIMAPStore extends IMAPStore{
@@ -40,11 +41,12 @@
     private Map<String, Integer> validServers = new HashMap<String, Integer>();
     private boolean connected = false;
     private List<MockIMAPFolder> folders = new ArrayList<MockIMAPFolder>();
-    static final URLName demoUrl = new URLName(null, InMemoryIMAPStoreCache.DEMO_MODE, 143, null, null, null);
+    static final URLName demoUrl = new URLName(null, DemoModeConstants.DEMO_MODE, 143, null, null, null);
     
     /**
      * Demo mode constructor
      */
+    @Inject
     public MockIMAPStore(Session session) {
         this(session, demoUrl);
     }
@@ -54,15 +56,14 @@
      */
     public MockIMAPStore(Session session, URLName url) {
         super(session, url);
-        
-        if (InMemoryIMAPStoreCache.DEMO_MODE.equals(url.getHost())) {
-            validServers.put(InMemoryIMAPStoreCache.DEMO_MODE, 143);
-            validLogins.put("demo", "demo");
+        if (DemoModeConstants.DEMO_MODE.equals(url.getHost())) {
+            validServers.put(DemoModeConstants.DEMO_MODE, 143);
+            validLogins.put(DemoModeConstants.DEMO_LOGIN, DemoModeConstants.DEMO_LOGIN);
             try {
-                new MockIMAPFolder(MockIMAPFolder.DEMO_MODE_INBOX_FOLDER, this).create(Folder.HOLDS_FOLDERS | Folder.HOLDS_MESSAGES);
-                new MockIMAPFolder(MockIMAPFolder.DEMO_MODE_SENT_FOLDER, this).create(Folder.HOLDS_FOLDERS | Folder.HOLDS_MESSAGES);
-                new MockIMAPFolder(MockIMAPFolder.DEMO_MODE_TRASH_FOLDER, this).create(Folder.HOLDS_FOLDERS | Folder.HOLDS_MESSAGES);
-                ((MockIMAPFolder)getFolder(MockIMAPFolder.DEMO_MODE_INBOX_FOLDER)).loadDemoMessages(session);
+                new MockIMAPFolder(DemoModeConstants.DEMO_MODE_INBOX_FOLDER, this).create(Folder.HOLDS_FOLDERS | Folder.HOLDS_MESSAGES);
+                new MockIMAPFolder(DemoModeConstants.DEMO_MODE_SENT_FOLDER, this).create(Folder.HOLDS_FOLDERS | Folder.HOLDS_MESSAGES);
+                new MockIMAPFolder(DemoModeConstants.DEMO_MODE_TRASH_FOLDER, this).create(Folder.HOLDS_FOLDERS | Folder.HOLDS_MESSAGES);
+                ((MockIMAPFolder)getFolder(DemoModeConstants.DEMO_MODE_INBOX_FOLDER)).loadDemoMessages(session);
             } catch (Exception e) {
                 e.printStackTrace();
             }
@@ -112,9 +113,9 @@
     
     public List<MockIMAPFolder> getChilds(MockIMAPFolder folder) {
         List<MockIMAPFolder> childs = new ArrayList<MockIMAPFolder>();
-        if (MockIMAPFolder.DEMO_MODE_DEFAULT_FOLDER.equals(folder.getFullName())) {
+        if (DemoModeConstants.DEMO_MODE_DEFAULT_FOLDER.equals(folder.getFullName())) {
             for(MockIMAPFolder f: folders) {
-                if (! MockIMAPFolder.DEMO_MODE_DEFAULT_FOLDER.equals(f.getFullName()))
+                if (! DemoModeConstants.DEMO_MODE_DEFAULT_FOLDER.equals(f.getFullName()))
                     childs.add(f);
             }
             return folders;
@@ -153,7 +154,7 @@
 
     @Override
     public synchronized Folder getDefaultFolder() throws MessagingException {
-        return getFolder(MockIMAPFolder.DEMO_MODE_DEFAULT_FOLDER);
+        return getFolder(DemoModeConstants.DEMO_MODE_DEFAULT_FOLDER);
     }
 
     @Override

Modified: james/hupa/trunk/server/src/main/java/org/apache/hupa/server/mock/MockSMTPTransport.java
URL: http://svn.apache.org/viewvc/james/hupa/trunk/server/src/main/java/org/apache/hupa/server/mock/MockSMTPTransport.java?rev=884868&r1=884867&r2=884868&view=diff
==============================================================================
--- james/hupa/trunk/server/src/main/java/org/apache/hupa/server/mock/MockSMTPTransport.java (original)
+++ james/hupa/trunk/server/src/main/java/org/apache/hupa/server/mock/MockSMTPTransport.java Fri Nov 27 13:24:51 2009
@@ -26,12 +26,12 @@
 import javax.mail.Transport;
 import javax.mail.URLName;
 
-import org.apache.hupa.server.InMemoryIMAPStoreCache;
+import org.apache.hupa.server.guice.DemoModeConstants;
 
 
 public class MockSMTPTransport extends Transport {
 
-    static final URLName demoUrl = new URLName(null, InMemoryIMAPStoreCache.DEMO_MODE, 143, null, null, null);
+    static final URLName demoUrl = new URLName(null, DemoModeConstants.DEMO_MODE, 143, null, null, null);
     
     public MockSMTPTransport(Session session) {
         super(session, demoUrl);

Modified: james/hupa/trunk/server/src/main/java/org/apache/hupa/server/servlet/DownloadAttachmentServlet.java
URL: http://svn.apache.org/viewvc/james/hupa/trunk/server/src/main/java/org/apache/hupa/server/servlet/DownloadAttachmentServlet.java?rev=884868&r1=884867&r2=884868&view=diff
==============================================================================
--- james/hupa/trunk/server/src/main/java/org/apache/hupa/server/servlet/DownloadAttachmentServlet.java (original)
+++ james/hupa/trunk/server/src/main/java/org/apache/hupa/server/servlet/DownloadAttachmentServlet.java Fri Nov 27 13:24:51 2009
@@ -99,7 +99,7 @@
             Message m = folder.getMessageByUID(Long.parseLong(message_uuid));
 
             Object content = m.getContent();
-            Part part  = handleMultiPart(content, attachmentName);
+            Part part  = handleMultiPart(logger, content, attachmentName);
             if (part.getContentType()!=null)
                 response.setContentType(part.getContentType());
             else
@@ -152,7 +152,7 @@
      * @throws MessagingException
      * @throws IOException
      */
-    static protected Part handleMultiPart(Object content, String attachmentName)
+    static protected Part handleMultiPart(Log logger, Object content, String attachmentName)
             throws MessagingException, IOException {
         if (content instanceof Multipart) {
             Multipart part = (Multipart) content;
@@ -161,7 +161,7 @@
                 String fileName = bodyPart.getFileName();
                 String[] contentId = bodyPart.getHeader("Content-ID");
                 if (bodyPart.isMimeType("multipart/*")) {
-                    Part p = handleMultiPart(bodyPart.getContent(), attachmentName);
+                    Part p = handleMultiPart(logger, bodyPart.getContent(), attachmentName);
                     if (p != null)
                         return p;
                 } else {
@@ -179,7 +179,7 @@
                 }
             }
         } else {
-            System.out.println("Unknown content: " + content.getClass().getName());
+            logger.error("Unknown content: " + content.getClass().getName());
         }
         return null;
     }

Modified: james/hupa/trunk/server/src/test/java/org/apache/hupa/server/DemoModeTest.java
URL: http://svn.apache.org/viewvc/james/hupa/trunk/server/src/test/java/org/apache/hupa/server/DemoModeTest.java?rev=884868&r1=884867&r2=884868&view=diff
==============================================================================
--- james/hupa/trunk/server/src/test/java/org/apache/hupa/server/DemoModeTest.java (original)
+++ james/hupa/trunk/server/src/test/java/org/apache/hupa/server/DemoModeTest.java Fri Nov 27 13:24:51 2009
@@ -7,6 +7,7 @@
 
 import net.customware.gwt.dispatch.shared.ActionException;
 
+import org.apache.hupa.server.guice.DemoModeConstants;
 import org.apache.hupa.server.handler.AbstractHandlerTest;
 import org.apache.hupa.server.handler.FetchFoldersHandler;
 import org.apache.hupa.server.handler.FetchMessagesHandler;
@@ -26,7 +27,7 @@
 
     private LoginUser demoUser = new LoginUser("demo", "demo");
     
-    private InMemoryIMAPStoreCache memoryStore = new InMemoryIMAPStoreCache(logger, InMemoryIMAPStoreCache.DEMO_MODE, 143, false, 1, 300000, provider);
+    private InMemoryIMAPStoreCache memoryStore = new InMemoryIMAPStoreCache(logger, DemoModeConstants.DEMO_MODE, 143, false, 1, 300000, provider);
     
     private LoginUserHandler loginUserHandler = new LoginUserHandler(memoryStore, logger, httpSessionProvider, settingsProvider);
     
@@ -61,7 +62,7 @@
     }
 
     public void testReadMessageFile() throws Exception {
-        URL url = Thread.currentThread().getContextClassLoader().getResource(MockIMAPFolder.DEMO_MODE_MESSAGES_LOCATION + "0.msg");
+        URL url = Thread.currentThread().getContextClassLoader().getResource(DemoModeConstants.DEMO_MODE_MESSAGES_LOCATION + "0.msg");
         assertNotNull("There aren't message files for demo mode, check that the files mime/\\d.msg are in your classpath", url);
     }
     

Added: james/hupa/trunk/server/src/test/java/org/apache/hupa/server/guice/GuiceTestModule.java
URL: http://svn.apache.org/viewvc/james/hupa/trunk/server/src/test/java/org/apache/hupa/server/guice/GuiceTestModule.java?rev=884868&view=auto
==============================================================================
--- james/hupa/trunk/server/src/test/java/org/apache/hupa/server/guice/GuiceTestModule.java (added)
+++ james/hupa/trunk/server/src/test/java/org/apache/hupa/server/guice/GuiceTestModule.java Fri Nov 27 13:24:51 2009
@@ -0,0 +1,76 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.hupa.server.guice;
+
+import javax.mail.Session;
+import javax.servlet.http.HttpSession;
+
+import org.apache.commons.logging.Log;
+import org.apache.hupa.server.FileItemRegistry;
+import org.apache.hupa.server.IMAPStoreCache;
+import org.apache.hupa.server.handler.AbstractSendMessageHandler;
+import org.apache.hupa.server.handler.ForwardMessageHandler;
+import org.apache.hupa.server.handler.GetMessageDetailsHandler;
+import org.apache.hupa.server.handler.SendMessageHandler;
+import org.apache.hupa.server.mock.MockHttpSession;
+import org.apache.hupa.server.mock.MockIMAPStore;
+import org.apache.hupa.server.mock.MockIMAPStoreCache;
+import org.apache.hupa.server.mock.MockLogProvider;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import com.google.inject.Singleton;
+import com.google.inject.name.Names;
+import com.sun.mail.imap.IMAPStore;
+
+public class GuiceTestModule extends AbstractModule {
+
+    @Override
+    protected void configure() {
+
+        DemoModeConstants.demoProperties.put("DefaultUserSessionId", "just_an_id");
+        Names.bindProperties(binder(), DemoModeConstants.demoProperties);
+
+        bind(Log.class).toProvider(MockLogProvider.class).in(Singleton.class);
+        bind(FileItemRegistry.class).in(Singleton.class);
+        bind(Session.class).toProvider(SessionProvider.class);
+        bind(HttpSession.class).to(MockHttpSession.class).in(Singleton.class);
+
+        bind(IMAPStoreCache.class).to(MockIMAPStoreCache.class).in(Singleton.class);
+        bind(IMAPStore.class).to(MockIMAPStore.class);
+
+        bind(GetMessageDetailsHandler.class);
+        
+        bind(AbstractSendMessageHandler.class).to(SendMessageHandler.class);
+        bind(SendMessageHandler.class);
+        bind(ForwardMessageHandler.class);
+
+    }
+
+    private Injector injector;
+    public Injector getInjector() {
+        if (injector == null)
+            injector = Guice.createInjector(this);
+        return injector;
+    }
+
+
+}

Copied: james/hupa/trunk/server/src/test/java/org/apache/hupa/server/guice/ServerModulTest.java (from r884755, james/hupa/trunk/server/src/test/java/org/apache/hupa/server/guice/ServerModulTest.java)
URL: http://svn.apache.org/viewvc/james/hupa/trunk/server/src/test/java/org/apache/hupa/server/guice/ServerModulTest.java?p2=james/hupa/trunk/server/src/test/java/org/apache/hupa/server/guice/ServerModulTest.java&p1=james/hupa/trunk/server/src/test/java/org/apache/hupa/server/guice/ServerModulTest.java&r1=884755&r2=884868&rev=884868&view=diff
==============================================================================
--- james/hupa/trunk/server/src/test/java/org/apache/hupa/server/guice/ServerModulTest.java (original)
+++ james/hupa/trunk/server/src/test/java/org/apache/hupa/server/guice/ServerModulTest.java Fri Nov 27 13:24:51 2009
@@ -24,19 +24,17 @@
 import junit.framework.Assert;
 
 import org.apache.commons.io.FileUtils;
-import org.apache.hupa.server.InMemoryIMAPStoreCache;
-import org.apache.hupa.server.mock.MockIMAPFolder;
 import org.junit.Before;
 import org.junit.Test;
 
 public class ServerModulTest {
     private String tmpDir = System.getProperty("java.io.tmpdir");
-    private ServerModul module = new ServerModul(tmpDir);
+    private GuiceServerModule module = new GuiceServerModule(tmpDir);
 
     @Before
     public void setUp() {
         // create config directory
-        File f = new File(tmpDir + File.separator + ServerModul.CONF_DIR);
+        File f = new File(tmpDir + File.separator + GuiceServerModule.CONF_DIR);
         f.delete();
         f.deleteOnExit();
         f.mkdirs();
@@ -54,7 +52,7 @@
         file.delete();
         
         // load file from not absolute file
-        fileName = tmpDir + File.separator + ServerModul.CONF_DIR + File.separator + "foo2.properties";
+        fileName = tmpDir + File.separator + GuiceServerModule.CONF_DIR + File.separator + "foo2.properties";
         file = new File(fileName);
         file.createNewFile();
         p = module.loadProperties(file.getName());
@@ -72,11 +70,11 @@
         Assert.assertNotNull(p);
         Assert.assertNull(p.get("IMAPServerAddress"));
 
-        System.setProperty(ServerModul.SYS_PROP_CONFIG_FILE, tmp.toString());
+        System.setProperty(GuiceServerModule.SYS_PROP_CONFIG_FILE, tmp.toString());
         p = module.loadProperties();
         Assert.assertNotNull(p);
         Assert.assertNull(p.get("IMAPServerAddress"));
-        System.clearProperty(ServerModul.SYS_PROP_CONFIG_FILE);
+        System.clearProperty(GuiceServerModule.SYS_PROP_CONFIG_FILE);
 
     }
 
@@ -84,16 +82,16 @@
     public void testLoadDemoProperties() throws Exception {
         File tmp = File.createTempFile("foo", ".properties");
         tmp.deleteOnExit();
-        FileUtils.writeStringToFile(tmp, "IMAPServerAddress=" + InMemoryIMAPStoreCache.DEMO_MODE);
+        FileUtils.writeStringToFile(tmp, "IMAPServerAddress=" + DemoModeConstants.DEMO_MODE);
 
-        System.setProperty(ServerModul.SYS_PROP_CONFIG_FILE, tmp.toString());
+        System.setProperty(GuiceServerModule.SYS_PROP_CONFIG_FILE, tmp.toString());
         Properties p = module.loadProperties();
         Assert.assertNotNull(p);
-        Assert.assertEquals(MockIMAPFolder.mockSettings.getInboxFolderName(), p.get("DefaultInboxFolder"));
-        Assert.assertEquals(MockIMAPFolder.mockSettings.getTrashFolderName(), p.get("DefaultTrashFolder"));
-        Assert.assertEquals(MockIMAPFolder.mockSettings.getSentFolderName(), p.get("DefaultSentFolder"));
+        Assert.assertEquals(DemoModeConstants.mockSettings.getInboxFolderName(), p.get("DefaultInboxFolder"));
+        Assert.assertEquals(DemoModeConstants.mockSettings.getTrashFolderName(), p.get("DefaultTrashFolder"));
+        Assert.assertEquals(DemoModeConstants.mockSettings.getSentFolderName(), p.get("DefaultSentFolder"));
         
-        System.clearProperty(ServerModul.SYS_PROP_CONFIG_FILE);
+        System.clearProperty(GuiceServerModule.SYS_PROP_CONFIG_FILE);
 
     }
 

Modified: james/hupa/trunk/server/src/test/java/org/apache/hupa/server/handler/AbstractHandlerTest.java
URL: http://svn.apache.org/viewvc/james/hupa/trunk/server/src/test/java/org/apache/hupa/server/handler/AbstractHandlerTest.java?rev=884868&r1=884867&r2=884868&view=diff
==============================================================================
--- james/hupa/trunk/server/src/test/java/org/apache/hupa/server/handler/AbstractHandlerTest.java (original)
+++ james/hupa/trunk/server/src/test/java/org/apache/hupa/server/handler/AbstractHandlerTest.java Fri Nov 27 13:24:51 2009
@@ -31,8 +31,8 @@
 import junit.framework.TestCase;
 
 import org.apache.commons.logging.Log;
+import org.apache.hupa.server.guice.DemoModeConstants;
 import org.apache.hupa.server.mock.MockHttpSession;
-import org.apache.hupa.server.mock.MockIMAPFolder;
 import org.apache.hupa.server.mock.MockIMAPStore;
 import org.apache.hupa.server.mock.MockIMAPStoreCache;
 import org.apache.hupa.server.mock.MockLog;
@@ -66,7 +66,7 @@
     
     protected Provider<Settings> settingsProvider = new Provider<Settings> () {
         public Settings get() {
-            return MockIMAPFolder.mockSettings;
+            return DemoModeConstants.mockSettings;
         }
     };
     
@@ -95,7 +95,7 @@
     }
     
     protected MimeMessage loadMessage(String msgFile) throws Exception {
-        msgFile = MockIMAPFolder.DEMO_MODE_MESSAGES_LOCATION + msgFile;
+        msgFile = DemoModeConstants.DEMO_MODE_MESSAGES_LOCATION + msgFile;
         URL url = Thread.currentThread().getContextClassLoader().getResource(msgFile);
         assertNotNull("Check that the file " + msgFile + " is in the classpath", url);
     

Modified: james/hupa/trunk/server/src/test/java/org/apache/hupa/server/handler/AbtractSendMessageHandlerTest.java
URL: http://svn.apache.org/viewvc/james/hupa/trunk/server/src/test/java/org/apache/hupa/server/handler/AbtractSendMessageHandlerTest.java?rev=884868&r1=884867&r2=884868&view=diff
==============================================================================
--- james/hupa/trunk/server/src/test/java/org/apache/hupa/server/handler/AbtractSendMessageHandlerTest.java (original)
+++ james/hupa/trunk/server/src/test/java/org/apache/hupa/server/handler/AbtractSendMessageHandlerTest.java Fri Nov 27 13:24:51 2009
@@ -19,35 +19,117 @@
 
 package org.apache.hupa.server.handler;
 
+
 import javax.mail.Message;
-import javax.mail.MessagingException;
 import javax.mail.Session;
-import javax.mail.internet.AddressException;
+import javax.servlet.http.HttpSession;
 
-import net.customware.gwt.dispatch.shared.ActionException;
+import junit.framework.TestCase;
 
 import org.apache.hupa.server.FileItemRegistry;
+import org.apache.hupa.server.IMAPStoreCache;
+import org.apache.hupa.server.guice.DemoModeConstants;
+import org.apache.hupa.server.guice.GuiceTestModule;
+import org.apache.hupa.server.mock.MockIMAPFolder;
+import org.apache.hupa.server.mock.MockIMAPStoreCache;
+import org.apache.hupa.shared.data.SMTPMessage;
+import org.apache.hupa.shared.data.User;
 import org.apache.hupa.shared.rpc.SendMessage;
 
-public class AbtractSendMessageHandlerTest extends AbstractHandlerTest {
+import com.google.inject.Injector;
+import com.sun.mail.imap.IMAPStore;
+
+public class AbtractSendMessageHandlerTest extends TestCase {
     
+    GuiceTestModule module = new GuiceTestModule();
+    Injector injector = module.getInjector();
     
-    FileItemRegistry registry = null;
+    public void testFillMockMessages () throws Exception{
+        Session session = injector.getInstance(Session.class);
+        
+        Message msg = MsgUtils.fillMockMimeMessage(session, "Hola", null, 0);
+        String exp = "text/plain\n";
+        assertEquals(exp, MsgUtils.summaryzeContent(msg).toString());
+
+        msg = MsgUtils.fillMockMimeMessage(session, null, "<div>hola</div>", 0);
+        exp = "text/html\n";
+        assertEquals(exp, MsgUtils.summaryzeContent(msg).toString());
+
+        msg = MsgUtils.fillMockMimeMessage(session, "hola", "<div>hola</div>", 0);
+        exp = "multipart/alternative\n" +
+              " text/plain\n" +
+              " text/html\n";
+        assertEquals(exp, MsgUtils.summaryzeContent(msg).toString());
+        
+        msg = MsgUtils.fillMockMimeMessage(session, "hola", "<div>hola</div>", 1);
+        exp = "multipart/mixed\n" +
+              " multipart/alternative\n" +
+              "  text/plain\n" +
+              "  text/html\n" +
+              " mock/attachment => file_1.bin\n";
+        assertEquals(exp, MsgUtils.summaryzeContent(msg).toString());
+        
+        msg = MsgUtils.fillMockMimeMessage(session, "hola", "<div>hola</div>", 3);
+        exp = "multipart/mixed\n" +
+              " multipart/alternative\n" +
+              "  text/plain\n" +
+              "  text/html\n" +
+              " mock/attachment => file_1.bin\n" +
+              " mock/attachment => file_2.bin\n" +
+              " mock/attachment => file_3.bin\n";
+        assertEquals(exp, MsgUtils.summaryzeContent(msg).toString());
+    }
     
-    AbstractSendMessageHandler<SendMessage> handler = new AbstractSendMessageHandler<SendMessage>(logger, registry, storeCache, httpSessionProvider, "demo-mode", 25, false, false){
-        protected Message createMessage(Session session, SendMessage action) throws AddressException, MessagingException, ActionException {
-            return null;
-        }
-        public Class<SendMessage> getActionType() {
-            return null;
-        }
-    };
-
     public void testHtmlmessageToText() {
         String txt, res;
         txt = "<div>Hola:</div>Como \n estas<br/>Adios\n\n";
+        
+        @SuppressWarnings("unchecked")
+        AbstractSendMessageHandler<SendMessage> handler = injector.getInstance(AbstractSendMessageHandler.class);
+
         res = handler.htmlToText(txt);
         assertEquals("Hola:\nComo estas\nAdios ", res);
     }
+    
+    public void testSendEmailWithAttachments() throws Exception {
+        
+        Session session = injector.getInstance(Session.class);
+        User demouser = DemoModeConstants.demoUser;
+
+        HttpSession httpSession = injector.getInstance(HttpSession.class);
+        httpSession.setAttribute("user", demouser);
+
+        IMAPStoreCache storeCache = injector.getInstance(IMAPStoreCache.class);
+        IMAPStore store = injector.getInstance(IMAPStore.class);
+        ((MockIMAPStoreCache)storeCache).addValidUser(demouser, store);
+        
+        FileItemRegistry registry = injector.getInstance(FileItemRegistry.class);
+        
+        @SuppressWarnings("unchecked")
+        AbstractSendMessageHandler<SendMessage> handler = injector.getInstance(AbstractSendMessageHandler.class);
+
+        MockIMAPFolder sentbox = (MockIMAPFolder) store.getFolder(DemoModeConstants.DEMO_MODE_SENT_FOLDER);
+        assertTrue(sentbox.getMessages().length == 0);
+        
+        SMTPMessage smtpmsg = MsgUtils.fillSMTPMessage(registry, 2);
+        SendMessage action = new SendMessage(smtpmsg);
+        
+        Message message = handler.createMessage(session, action);
+        message =  handler.fillBody(message, action);
+        
+        String expected = "multipart/mixed\n"
+                        + " multipart/alternative\n"
+                        + "  text/plain\n"
+                        + "  text/html\n"
+                        + " mock/attachment => file_1.bin\n"
+                        + " mock/attachment => file_2.bin\n";
+        
+        assertEquals(expected, MsgUtils.summaryzeContent(message).toString());
+        
+        handler.sendMessage(demouser, session, message);
+        handler.saveSentMessage(demouser, message);
+        assertTrue(sentbox.getMessages().length == 1);
+        
+    }
 
 }

Modified: james/hupa/trunk/server/src/test/java/org/apache/hupa/server/handler/CreateFolderHandlerTest.java
URL: http://svn.apache.org/viewvc/james/hupa/trunk/server/src/test/java/org/apache/hupa/server/handler/CreateFolderHandlerTest.java?rev=884868&r1=884867&r2=884868&view=diff
==============================================================================
--- james/hupa/trunk/server/src/test/java/org/apache/hupa/server/handler/CreateFolderHandlerTest.java (original)
+++ james/hupa/trunk/server/src/test/java/org/apache/hupa/server/handler/CreateFolderHandlerTest.java Fri Nov 27 13:24:51 2009
@@ -46,7 +46,7 @@
         Folder f1 = store.getFolder(folder.getFullName());
         assertFalse("not exists",f1.exists());
         
-        CreateFolderHandler handler = new CreateFolderHandler(storeCache,new MockLog(),httpSessionProvider);
+        CreateFolderHandler handler = new CreateFolderHandler(storeCache, logger,httpSessionProvider);
         try {
             handler.execute(new CreateFolder(folder), null);
             Folder f = store.getFolder(folder.getFullName());
@@ -71,7 +71,7 @@
         
         f1.create(Folder.HOLDS_FOLDERS);
 
-        CreateFolderHandler handler = new CreateFolderHandler(storeCache,new MockLog(),httpSessionProvider);
+        CreateFolderHandler handler = new CreateFolderHandler(storeCache, logger, httpSessionProvider);
         try {
             handler.execute(new CreateFolder(folder), null);
             fail("Folder already exists");
@@ -84,7 +84,7 @@
     
     public void testInvalidSessionId() {
         IMAPFolder folder = createFolder();
-        CreateFolderHandler handler = new CreateFolderHandler(storeCache,new MockLog(),httpSessionProvider);
+        CreateFolderHandler handler = new CreateFolderHandler(storeCache, logger, httpSessionProvider);
         try {
             handler.execute(new CreateFolder(folder), null);
             fail("Invalid session");

Modified: james/hupa/trunk/server/src/test/java/org/apache/hupa/server/handler/DeleteFolderHandlerTest.java
URL: http://svn.apache.org/viewvc/james/hupa/trunk/server/src/test/java/org/apache/hupa/server/handler/DeleteFolderHandlerTest.java?rev=884868&r1=884867&r2=884868&view=diff
==============================================================================
--- james/hupa/trunk/server/src/test/java/org/apache/hupa/server/handler/DeleteFolderHandlerTest.java (original)
+++ james/hupa/trunk/server/src/test/java/org/apache/hupa/server/handler/DeleteFolderHandlerTest.java Fri Nov 27 13:24:51 2009
@@ -44,7 +44,7 @@
         Folder f1 = store.getFolder(folder.getFullName());
         f1.create(Folder.HOLDS_FOLDERS);
         
-        DeleteFolderHandler handler = new DeleteFolderHandler(storeCache,new MockLog(),httpSessionProvider);
+        DeleteFolderHandler handler = new DeleteFolderHandler(storeCache, logger, httpSessionProvider);
 
         try {
             handler.execute(new DeleteFolder(folder), null);
@@ -64,7 +64,7 @@
         httpSession.setAttribute("user", user);
         storeCache.addValidUser(user.getName(),user.getPassword());
         IMAPFolder folder = createFolder();
-        DeleteFolderHandler handler = new DeleteFolderHandler(storeCache,new MockLog(),httpSessionProvider);
+        DeleteFolderHandler handler = new DeleteFolderHandler(storeCache, logger, httpSessionProvider);
 
         try {
             handler.execute(new DeleteFolder(folder), null);
@@ -76,7 +76,7 @@
     
     public void testInvalidSessionId() {
         IMAPFolder folder = createFolder();
-        DeleteFolderHandler handler = new DeleteFolderHandler(storeCache,new MockLog(),httpSessionProvider);
+        DeleteFolderHandler handler = new DeleteFolderHandler(storeCache, logger, httpSessionProvider);
         try {
             handler.execute(new DeleteFolder(folder), null);
             fail("Invalid session");

Modified: james/hupa/trunk/server/src/test/java/org/apache/hupa/server/handler/DeleteMessageByUidHandlerTest.java
URL: http://svn.apache.org/viewvc/james/hupa/trunk/server/src/test/java/org/apache/hupa/server/handler/DeleteMessageByUidHandlerTest.java?rev=884868&r1=884867&r2=884868&view=diff
==============================================================================
--- james/hupa/trunk/server/src/test/java/org/apache/hupa/server/handler/DeleteMessageByUidHandlerTest.java (original)
+++ james/hupa/trunk/server/src/test/java/org/apache/hupa/server/handler/DeleteMessageByUidHandlerTest.java Fri Nov 27 13:24:51 2009
@@ -41,7 +41,7 @@
 
     
     public void testDeleteFolderNotExists() throws MessagingException {
-        DeleteMessageByUidHandler handler = new DeleteMessageByUidHandler(storeCache,new MockLog(),httpSessionProvider);
+        DeleteMessageByUidHandler handler = new DeleteMessageByUidHandler(storeCache, logger, httpSessionProvider);
     
         User user = createUser();
         storeCache.addValidUser(user.getName(), user.getPassword());
@@ -60,7 +60,7 @@
     
     public void testDeleteFolderExistsAndNotTrash() throws MessagingException {
         Session s = Session.getInstance(new Properties());
-        DeleteMessageByUidHandler handler = new DeleteMessageByUidHandler(storeCache,new MockLog(),httpSessionProvider);
+        DeleteMessageByUidHandler handler = new DeleteMessageByUidHandler(storeCache, logger, httpSessionProvider);
     
         User user = createUser();
         storeCache.addValidUser(user.getName(), user.getPassword());
@@ -96,7 +96,7 @@
     
     public void testDeleteFolderExistsAndIsTrash() throws MessagingException {
         Session s = Session.getInstance(new Properties());
-        DeleteMessageByUidHandler handler = new DeleteMessageByUidHandler(storeCache,new MockLog(),httpSessionProvider);
+        DeleteMessageByUidHandler handler = new DeleteMessageByUidHandler(storeCache, logger, httpSessionProvider);
     
         User user = createUser();
         storeCache.addValidUser(user.getName(), user.getPassword());

Modified: james/hupa/trunk/server/src/test/java/org/apache/hupa/server/handler/FetchFoldersHandlerTest.java
URL: http://svn.apache.org/viewvc/james/hupa/trunk/server/src/test/java/org/apache/hupa/server/handler/FetchFoldersHandlerTest.java?rev=884868&r1=884867&r2=884868&view=diff
==============================================================================
--- james/hupa/trunk/server/src/test/java/org/apache/hupa/server/handler/FetchFoldersHandlerTest.java (original)
+++ james/hupa/trunk/server/src/test/java/org/apache/hupa/server/handler/FetchFoldersHandlerTest.java Fri Nov 27 13:24:51 2009
@@ -38,7 +38,7 @@
 public class FetchFoldersHandlerTest extends AbstractHandlerTest{
 
     public void testInvalidSessionId() {
-        FetchFoldersHandler handler = new FetchFoldersHandler(storeCache,new MockLog(),httpSessionProvider);
+        FetchFoldersHandler handler = new FetchFoldersHandler(storeCache, logger, httpSessionProvider);
         try {
             handler.execute(new FetchFolders(), null);
             fail("Invalid session");
@@ -54,7 +54,7 @@
         User user = createUser();
         httpSession.setAttribute("user", user);
         storeCache.addValidUser(user.getName(), user.getPassword());
-        FetchFoldersHandler handler = new FetchFoldersHandler(storeCache,new MockLog(),httpSessionProvider);
+        FetchFoldersHandler handler = new FetchFoldersHandler(storeCache, logger, httpSessionProvider);
         try {
             FetchFoldersResult result = handler.execute(new FetchFolders(), null);
             assertTrue(result.getFolders().isEmpty());
@@ -74,7 +74,7 @@
         store.getFolder("WHATEVER1").create(Folder.HOLDS_FOLDERS);
         store.getFolder("WHATEVER.XXX").create(Folder.HOLDS_FOLDERS);
 
-        FetchFoldersHandler handler = new FetchFoldersHandler(storeCache,new MockLog(),httpSessionProvider);
+        FetchFoldersHandler handler = new FetchFoldersHandler(storeCache, logger, httpSessionProvider);
         try {
             FetchFoldersResult result = handler.execute(new FetchFolders(), null);
             ArrayList<IMAPFolder> folders = result.getFolders();

Added: james/hupa/trunk/server/src/test/java/org/apache/hupa/server/handler/FowardMessageHandlerTest.java
URL: http://svn.apache.org/viewvc/james/hupa/trunk/server/src/test/java/org/apache/hupa/server/handler/FowardMessageHandlerTest.java?rev=884868&view=auto
==============================================================================
--- james/hupa/trunk/server/src/test/java/org/apache/hupa/server/handler/FowardMessageHandlerTest.java (added)
+++ james/hupa/trunk/server/src/test/java/org/apache/hupa/server/handler/FowardMessageHandlerTest.java Fri Nov 27 13:24:51 2009
@@ -0,0 +1,125 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.hupa.server.handler;
+
+import javax.mail.Message;
+import javax.mail.Session;
+import javax.servlet.http.HttpSession;
+
+import junit.framework.TestCase;
+
+import org.apache.commons.logging.Log;
+import org.apache.hupa.server.FileItemRegistry;
+import org.apache.hupa.server.IMAPStoreCache;
+import org.apache.hupa.server.InMemoryIMAPStoreCache;
+import org.apache.hupa.server.guice.DemoModeConstants;
+import org.apache.hupa.server.guice.GuiceTestModule;
+import org.apache.hupa.server.guice.SessionProvider;
+import org.apache.hupa.server.mock.MockHttpSession;
+import org.apache.hupa.server.mock.MockIMAPFolder;
+import org.apache.hupa.server.mock.MockIMAPStoreCache;
+import org.apache.hupa.server.mock.MockLogProvider;
+import org.apache.hupa.shared.data.IMAPFolder;
+import org.apache.hupa.shared.data.SMTPMessage;
+import org.apache.hupa.shared.data.User;
+import org.apache.hupa.shared.rpc.ForwardMessage;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.Injector;
+import com.google.inject.Singleton;
+import com.google.inject.name.Names;
+import com.sun.mail.imap.IMAPStore;
+
+public class FowardMessageHandlerTest extends TestCase {
+
+    public class TestConfigurationModule extends AbstractModule {
+        @Override
+        protected void configure() {
+
+            DemoModeConstants.demoProperties.put("DefaultUserSessionId", "WhateverId");
+            Names.bindProperties(binder(), DemoModeConstants.demoProperties);
+
+            bind(Log.class).toProvider(MockLogProvider.class).in(Singleton.class);
+            bind(FileItemRegistry.class).in(Singleton.class);
+            bind(Session.class).toProvider(SessionProvider.class);
+            bind(HttpSession.class).to(MockHttpSession.class).in(Singleton.class);
+
+            bind(IMAPStoreCache.class).to(InMemoryIMAPStoreCache.class);
+
+            bind(ForwardMessageHandler.class);
+            bind(GetMessageDetailsHandler.class);
+
+        }
+    }
+
+    public void testMine() throws Exception {
+        
+        
+        GuiceTestModule module = new GuiceTestModule();
+        Injector injector = module.getInjector();
+
+        Session session = injector.getInstance(Session.class);
+        User demouser = DemoModeConstants.demoUser;
+
+        HttpSession httpSession = injector.getInstance(HttpSession.class);
+        httpSession.setAttribute("user", demouser);
+
+        IMAPStoreCache storeCache = injector.getInstance(IMAPStoreCache.class);
+        IMAPStore store = injector.getInstance(IMAPStore.class);
+        ((MockIMAPStoreCache)storeCache).addValidUser(demouser, store);
+        
+        FileItemRegistry registry = injector.getInstance(FileItemRegistry.class);
+        
+        ForwardMessageHandler handler = injector.getInstance(ForwardMessageHandler.class);
+
+        MockIMAPFolder sentbox = (MockIMAPFolder) store.getFolder(DemoModeConstants.DEMO_MODE_SENT_FOLDER);
+        assertTrue(sentbox.getMessages().length == 0);
+
+        MockIMAPFolder inbox = (MockIMAPFolder) store.getFolder(DemoModeConstants.DEMO_MODE_INBOX_FOLDER);
+        assertTrue(inbox.getMessages().length >= 0);
+        
+        Message message = MsgUtils.fillMockMimeMessage(session, "hola", null, 2);
+        inbox.appendMessages(new Message[]{message});
+        long msgUid = inbox.getUID(message);
+        message = inbox.getMessageByUID(msgUid);
+        assertNotNull(message);
+        
+        IMAPFolder ifolder = new IMAPFolder(inbox.getFullName());
+        SMTPMessage smtpmsg = MsgUtils.fillSMTPMessage(registry, 2);
+        ForwardMessage action = new ForwardMessage(smtpmsg, ifolder, msgUid);
+        
+        message = handler.createMessage(session, action);
+        message = handler.fillBody(message, action);
+
+        // TODO: this is the expected behavior of the handler, but it doesn't work
+        // It's commented to avoid breaking the build
+        
+//        String expected = "multipart/mixed\n"
+//            + " multipart/alternative\n"
+//            + "  text/plain\n"
+//            + "  text/html\n"
+//            + " mock/attachment => file_1.bin\n"
+//            + " mock/attachment => file_2.bin\n";
+//        
+//        assertEquals(expected, MsgUtils.summaryzeContent(message).toString());
+
+    }
+
+}

Modified: james/hupa/trunk/server/src/test/java/org/apache/hupa/server/handler/LoginUserHandlerTest.java
URL: http://svn.apache.org/viewvc/james/hupa/trunk/server/src/test/java/org/apache/hupa/server/handler/LoginUserHandlerTest.java?rev=884868&r1=884867&r2=884868&view=diff
==============================================================================
--- james/hupa/trunk/server/src/test/java/org/apache/hupa/server/handler/LoginUserHandlerTest.java (original)
+++ james/hupa/trunk/server/src/test/java/org/apache/hupa/server/handler/LoginUserHandlerTest.java Fri Nov 27 13:24:51 2009
@@ -21,7 +21,6 @@
 
 import net.customware.gwt.dispatch.shared.ActionException;
 
-import org.apache.hupa.server.mock.MockLog;
 import org.apache.hupa.shared.data.Settings;
 import org.apache.hupa.shared.data.User;
 import org.apache.hupa.shared.rpc.LoginUser;
@@ -30,12 +29,13 @@
 import com.google.inject.Provider;
 
 public class LoginUserHandlerTest extends AbstractHandlerTest {
-    private LoginUserHandler handler = new LoginUserHandler(storeCache, new MockLog(),httpSessionProvider, new Provider<Settings>() {
-
+    
+    private LoginUserHandler handler = new LoginUserHandler(storeCache, logger, httpSessionProvider, new Provider<Settings>() {
         public Settings get() {
             return new Settings();
         }
     });
+    
     public void testInvalidLogin() {
         try {
             handler.execute(new LoginUser("invalid","invalid"), null);

Modified: james/hupa/trunk/server/src/test/java/org/apache/hupa/server/handler/LogoutUserHandlerTest.java
URL: http://svn.apache.org/viewvc/james/hupa/trunk/server/src/test/java/org/apache/hupa/server/handler/LogoutUserHandlerTest.java?rev=884868&r1=884867&r2=884868&view=diff
==============================================================================
--- james/hupa/trunk/server/src/test/java/org/apache/hupa/server/handler/LogoutUserHandlerTest.java (original)
+++ james/hupa/trunk/server/src/test/java/org/apache/hupa/server/handler/LogoutUserHandlerTest.java Fri Nov 27 13:24:51 2009
@@ -38,7 +38,7 @@
         user.setPassword(password);
         user.setAuthenticated(true);
         httpSession.setAttribute("user", user);
-        LogoutUserHandler handler = new LogoutUserHandler(storeCache,new MockLog(),httpSessionProvider);
+        LogoutUserHandler handler = new LogoutUserHandler(storeCache, logger, httpSessionProvider);
         try {
             LogoutUserResult result = handler.execute(new LogoutUser(), null);
             assertFalse("Not authenticated anymore", result.getUser().getAuthenticated());

Added: james/hupa/trunk/server/src/test/java/org/apache/hupa/server/handler/MsgUtils.java
URL: http://svn.apache.org/viewvc/james/hupa/trunk/server/src/test/java/org/apache/hupa/server/handler/MsgUtils.java?rev=884868&view=auto
==============================================================================
--- james/hupa/trunk/server/src/test/java/org/apache/hupa/server/handler/MsgUtils.java (added)
+++ james/hupa/trunk/server/src/test/java/org/apache/hupa/server/handler/MsgUtils.java Fri Nov 27 13:24:51 2009
@@ -0,0 +1,176 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.hupa.server.handler;
+
+import gwtupload.server.MemoryFileItemFactory;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+
+import javax.mail.Message;
+import javax.mail.MessagingException;
+import javax.mail.Multipart;
+import javax.mail.Part;
+import javax.mail.Session;
+import javax.mail.internet.AddressException;
+import javax.mail.internet.MimeMessage;
+
+import org.apache.commons.fileupload.FileItem;
+import org.apache.hupa.server.FileItemRegistry;
+import org.apache.hupa.shared.data.MessageAttachment;
+import org.apache.hupa.shared.data.SMTPMessage;
+
+public class MsgUtils {
+
+    /**
+     * Creates a FileItem which is stored in memory
+     * 
+     * @param filename
+     * @return a new item
+     * @throws IOException
+     */
+    public static FileItem createMockFileItem(String filename) throws IOException {
+        MemoryFileItemFactory f = new MemoryFileItemFactory();
+        FileItem item = f.createItem("fieldname_" + filename, "mock/attachment", false, filename);
+        item.getOutputStream().write("file content".getBytes());
+        item.getOutputStream().close();
+        return item;
+    }
+
+    /**
+     * Parses a mime message and returns an array of content-types which is a
+     * simple representation of its structure. Each line of the array represents
+     * a part and it is indented with spaces. It's used in testing or debugging.
+     * 
+     * @param msg
+     * @return
+     * @throws IOException
+     * @throws MessagingException
+     */
+    protected static ArrayList<String> summaryzeContent(Message msg) throws IOException, MessagingException {
+        return summaryzeContent(msg.getContent(), msg.getContentType(), 0);
+    }
+
+    static ArrayList<String> summaryzeContent(Object content, String contentType, final int spaces) throws IOException, MessagingException {
+
+        ContenTypeArrayList ret = new ContenTypeArrayList();
+
+        ret.add(contentType, spaces);
+        if (content instanceof Multipart) {
+            Multipart mp = (Multipart) content;
+            contentType = mp.getContentType();
+            for (int i = 0; i < mp.getCount(); i++) {
+                Part part = mp.getBodyPart(i);
+                contentType = part.getContentType();
+                if (contentType.startsWith("text")) {
+                    ret.add(contentType, spaces + 1);
+                } else if (contentType.startsWith("message/rfc822")) {
+                    MimeMessage msg = (MimeMessage) part.getDataHandler().getContent();
+                    ret.addAll(summaryzeContent(msg.getContent(), msg.getContentType(), spaces + 1));
+                } else {
+                    if (part.getFileName() != null) {
+                        ret.add(part.getContentType(), part.getFileName(), spaces + 1);
+                    } else {
+                        ret.addAll(summaryzeContent(part.getContent(), contentType, spaces + 1));
+                    }
+                }
+            }
+        }
+        return ret;
+    }
+
+    /**
+     * A class which represents the tree of content-types present in a mime
+     * message. It is thought to be used only for testing assertions or
+     * debugging purposes
+     */
+    static class ContenTypeArrayList extends ArrayList<String> {
+
+        private static final long serialVersionUID = 1L;
+
+        public boolean add(String type, int spaces) {
+            return super.add(ident(spaces, cleanCType(type)));
+        }
+
+        public boolean add(String type, String name, int spaces) {
+            return super.add(ident(spaces, cleanCType(type) + " => " + name));
+        }
+
+        public String toString() {
+            String ret = "";
+            for (String s : this) {
+                ret += s + "\n";
+            }
+            return ret;
+        }
+
+        private String cleanCType(String contenType) {
+            return contenType.toLowerCase().replaceAll("(?s)[\"\\s]*(.+);.*$", "$1");
+        }
+
+        private String ident(int spaces, String text) {
+            String ret = "";
+            for (int i = 0; i < spaces; i++)
+                ret += " ";
+            return ret + text;
+        }
+    }
+
+    public static SMTPMessage fillSMTPMessage(FileItemRegistry registry, int nfiles) throws AddressException, MessagingException, IOException {
+        ArrayList<MessageAttachment> attachments = new ArrayList<MessageAttachment>();
+
+        for (int i = 1; i <= nfiles; i++) {
+            FileItem fileItem;
+            fileItem = MsgUtils.createMockFileItem("file_" + i + ".bin");
+            registry.add(fileItem);
+
+            MessageAttachment msgAttach = new MessageAttachment();
+            msgAttach.setName(fileItem.getFieldName());
+            msgAttach.setContentType(fileItem.getContentType());
+            msgAttach.setSize((int) fileItem.getSize());
+
+            attachments.add(msgAttach);
+        }
+
+        SMTPMessage smtpMessage = new SMTPMessage();
+        smtpMessage.setFrom("from@dom.com");
+        smtpMessage.setTo(Arrays.asList("to@dom.com"));
+        smtpMessage.setCc(Arrays.asList("cc@dom.com"));
+        smtpMessage.setBcc(Arrays.asList("bcc@dom.com"));
+        smtpMessage.setSubject("Subject");
+        smtpMessage.setText("<div>Body</div>");
+        smtpMessage.setMessageAttachments(attachments);
+
+        return smtpMessage;
+
+    }
+
+    public static Message fillMockMimeMessage(Session session, String text, String html, int nfiles) throws MessagingException, IOException {
+        ArrayList<FileItem> items = new ArrayList<FileItem>();
+        for (int i = 1; i <= nfiles; i++) {
+            FileItem fileItem;
+            fileItem = MsgUtils.createMockFileItem("file_" + i + ".bin");
+            items.add(fileItem);
+        }
+        return AbstractSendMessageHandler.composeMessage(session, text, html, items);
+    }
+
+}
\ No newline at end of file

Modified: james/hupa/trunk/server/src/test/java/org/apache/hupa/server/handler/NoopHandlerTest.java
URL: http://svn.apache.org/viewvc/james/hupa/trunk/server/src/test/java/org/apache/hupa/server/handler/NoopHandlerTest.java?rev=884868&r1=884867&r2=884868&view=diff
==============================================================================
--- james/hupa/trunk/server/src/test/java/org/apache/hupa/server/handler/NoopHandlerTest.java (original)
+++ james/hupa/trunk/server/src/test/java/org/apache/hupa/server/handler/NoopHandlerTest.java Fri Nov 27 13:24:51 2009
@@ -21,7 +21,6 @@
 
 import net.customware.gwt.dispatch.shared.ActionException;
 
-import org.apache.hupa.server.mock.MockLog;
 import org.apache.hupa.shared.data.User;
 import org.apache.hupa.shared.rpc.Noop;
 import org.apache.hupa.shared.rpc.NoopResult;
@@ -29,7 +28,7 @@
 public class NoopHandlerTest extends AbstractHandlerTest{
 
     public void testNoop() {
-        NoopHandler handler = new NoopHandler(storeCache,new MockLog(),httpSessionProvider);
+        NoopHandler handler = new NoopHandler(storeCache, logger, httpSessionProvider);
         User user = createUser();
         Noop action = new Noop();
         storeCache.addValidUser(user.getName(), user.getPassword());

Modified: james/hupa/trunk/server/src/test/java/org/apache/hupa/server/mock/MockHttpSession.java
URL: http://svn.apache.org/viewvc/james/hupa/trunk/server/src/test/java/org/apache/hupa/server/mock/MockHttpSession.java?rev=884868&r1=884867&r2=884868&view=diff
==============================================================================
--- james/hupa/trunk/server/src/test/java/org/apache/hupa/server/mock/MockHttpSession.java (original)
+++ james/hupa/trunk/server/src/test/java/org/apache/hupa/server/mock/MockHttpSession.java Fri Nov 27 13:24:51 2009
@@ -30,6 +30,9 @@
 import javax.servlet.http.HttpSession;
 import javax.servlet.http.HttpSessionContext;
 
+import com.google.inject.Inject;
+import com.google.inject.name.Named;
+
 @SuppressWarnings("deprecation")
 public class MockHttpSession implements HttpSession{
     private Map<String,Object> attributeMap = new HashMap<String, Object>();
@@ -37,7 +40,8 @@
     private long cTime;
     private String id;
     
-    public MockHttpSession(String id) {
+    @Inject
+    public MockHttpSession(@Named("DefaultUserSessionId") String id) {
         cTime = System.currentTimeMillis();
         this.id = id;
     }



---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org