View Javadoc

1   package org.codehaus.xfire.attachments;
2   
3   import java.io.IOException;
4   import java.io.OutputStream;
5   import java.util.HashMap;
6   import java.util.Iterator;
7   import java.util.Map;
8   import java.util.Properties;
9   
10  import javax.mail.MessagingException;
11  import javax.mail.Session;
12  import javax.mail.internet.MimeBodyPart;
13  import javax.mail.internet.MimeMessage;
14  import javax.mail.internet.MimeMultipart;
15  
16  import org.codehaus.xfire.XFireRuntimeException;
17  
18  /***
19   * 
20   * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse</a>
21   */
22  public class JavaMailAttachments 
23  	implements Attachments
24  {
25      private static final String[] filter = new String[]{"Message-ID", "Mime-Version", "Content-Type"};
26      
27      private Map parts;
28      
29      private Attachment soapMessage;
30      
31      private MimeMultipart mimeMP;
32      
33      public JavaMailAttachments()
34      {
35          parts = new HashMap();
36      }
37      
38      /***
39       * Create Attachments from the MimeMultipart message.
40       * 
41       * @param multipart
42       * @throws MessagingException
43       */
44      public JavaMailAttachments(MimeMultipart multipart) 
45      	throws MessagingException
46      {
47          this();
48          
49          this.mimeMP = multipart;
50          
51          MimeBodyPart part = (MimeBodyPart) multipart.getBodyPart(0);
52          setSoapMessage(new SimpleAttachment(part.getContentID(), part.getDataHandler()));
53          
54          for ( int i = 1; i < multipart.getCount(); i++ )
55          {
56              part = (MimeBodyPart) multipart.getBodyPart(i);
57              addPart(new SimpleAttachment(part.getContentID(), part.getDataHandler()));
58          }
59      }
60      
61      /***
62       * @return Returns the soapMessage.
63       */
64      public Attachment getSoapMessage()
65      {
66          return soapMessage;
67      }
68      
69      /***
70       * @param soapMessage The soapMessage to set.
71       */
72      public void setSoapMessage(Attachment soapMessage)
73      {
74          this.soapMessage = soapMessage;
75      }
76      
77      public void addPart(Attachment part)
78      {
79          parts.put(part.getId(), part);
80      }
81      
82      public Iterator getParts()
83      {
84          return parts.values().iterator();
85      }
86      
87      public Attachment getPart(String id)
88      {
89          return (Attachment) parts.get(id);
90      }
91  
92      public int size()
93      {
94          return parts.size();
95      }
96      
97      public void write(OutputStream out) 
98      	throws IOException
99      {
100         Session session = Session.getDefaultInstance(new Properties(), null);
101         MimeMessage message = new MimeMessage(session);
102         
103         try
104         {
105             message.setContent(getMimeMultipart());
106 	        message.writeTo(out, filter);
107         }
108         catch( MessagingException e )
109         {
110             throw new XFireRuntimeException("Couldn't create message.", e);
111         }
112     }
113     
114     public MimeMultipart getMimeMultipart()
115     {
116         if ( mimeMP == null )
117         {
118             mimeMP = new MimeMultipart("related; type=\"text/xml\";start=\"<"
119                     + getSoapMessage().getId() + ">\"");
120            
121             try
122             {
123                 MimeBodyPart soapPart = new MimeBodyPart();
124                 soapPart.setDataHandler(soapMessage.getDataHandler());
125                 soapPart.setContentID("<"+soapMessage.getId()+">");
126                 mimeMP.addBodyPart(soapPart);
127                 
128                 for (Iterator itr = getParts(); itr.hasNext(); )
129     	        {
130     	            Attachment att = (Attachment) itr.next();
131     	            
132     	            MimeBodyPart part = new MimeBodyPart();
133     	            part.setDataHandler(att.getDataHandler());
134     	            part.setContentID("<"+att.getId()+">");
135     	            mimeMP.addBodyPart(part);
136     	        }
137             }
138             catch( MessagingException e )
139             {
140                 throw new XFireRuntimeException("Couldn't create message.", e);
141             }
142         }
143 
144         return mimeMP;
145     }
146     
147     public String getContentType()
148     {
149         return getMimeMultipart().getContentType();
150     }
151 }