JavaMail-1.2-changes.txt
上传用户:dinglihq
上传日期:2013-02-04
资源大小:99958k
文件大小:41k
源码类别:

Java编程

开发平台:

Java

  1. JavaMail 1.2
  2. ============
  3. Following is a description of the new APIs that are being
  4. introduced in JavaMail 1.2.  The numbers in parentheses
  5. are bug numbers; you can find more information about the
  6. bug reports at:
  7.     http://developer.java.sun.com/developer/bugParade/index.html
  8. Please send comments and feedback to javamail@sun.com.
  9. ===================================================================
  10. 1. New protected field and methods (4129743)
  11. --------------------------------------------
  12. To simplify creating subclasses of MimeMessage, the following
  13. field and method that were previously private are now protected:
  14.     /**
  15.      * A flag indicating whether the message has been modified.
  16.      * If the message has not been modified, any data in the
  17.      * <code>content</code> array is assumed to be valid and is used
  18.      * directly in the <code>writeTo</code> method.  This flag is
  19.      * set to true when an empty message is created or when the
  20.      * <code>saveChanges</code> method is called.
  21.      */
  22.     protected boolean modified = false;
  23.     /**
  24.      * Parse the InputStream setting the <code>headers</code> and
  25.      * <code>content</code> fields appropriately.  Also resets the
  26.      * <code>modified</code> flag. <p>
  27.      *
  28.      * This method is intended for use by subclasses that need to
  29.      * control when the InputStream is parsed.
  30.      *
  31.      * @param is        The message input stream
  32.      * @exception       MessagingException
  33.      */
  34.     protected void parse(InputStream is) throws MessagingException
  35. The javadocs for the following exsting methods have been updated to
  36. describe the use of the modified flag:
  37.     /**
  38.      * Default constructor. An empty message object is created.
  39.      * The <code>headers</code> field is set to an empty InternetHeaders
  40.      * object. The <code>flags</code> field is set to an empty Flags
  41.      * object. The <code>modified</code> flag is set to true.
  42.      */
  43.     public MimeMessage(Session session)
  44.     /**
  45.      * Output the message as an RFC 822 format stream, without
  46.      * specified headers.  If the <code>modified</code> flag is not
  47.      * set and the <code>content</code> array is not null, the
  48.      * <code>content</code> array is written directly, after
  49.      * writing the appropriate message headers.
  50.      *
  51.      * @exception javax.mail.MessagingException
  52.      * @exception IOException   if an error occurs writing to the stream
  53.      *                          or if an error is generated by the
  54.      *                          javax.activation layer.
  55.      * @see javax.activation.DataHandler#writeTo
  56.      */
  57.     public void writeTo(OutputStream os, String[] ignoreList)
  58.                                 throws IOException, MessagingException
  59.     /**
  60.      * Updates the appropriate header fields of this message to be
  61.      * consistent with the message's contents. If this message is
  62.      * contained in a Folder, any changes made to this message are
  63.      * committed to the containing folder. <p>
  64.      *
  65.      * If any part of a message's headers or contents are changed,
  66.      * <code>saveChanges</code> must be called to ensure that those
  67.      * changes are permanent. Otherwise, any such modifications may or
  68.      * may not be saved, depending on the folder implementation. <p>
  69.      *
  70.      * Messages obtained from folders opened READ_ONLY should not be
  71.      * modified and saveChanges should not be called on such messages. <p>
  72.      *
  73.      * This method sets the <code>modified</code> flag to true and then
  74.      * calls the <code>updateHeaders<code> method.
  75.      *
  76.      * @exception       IllegalWriteException if the underlying
  77.      *                  implementation does not support modification
  78.      * @exception       IllegalStateException if this message is
  79.      *                  obtained from a READ_ONLY folder.
  80.      * @exception       MessagingException
  81.      */
  82.     public void saveChanges() throws MessagingException
  83. The following method is added to MimeMessage:
  84.     /**
  85.      * Create and return an InternetHeaders object that loads the
  86.      * headers from the given InputStream.  Subclasses can override
  87.      * this method to return a subclass of InternetHeaders, if
  88.      * necessary.  This implementation simply constructs and returns 
  89.      * an InternetHeaders object.
  90.      *
  91.      * @param   is      the InputStream to read the headers from
  92.      * @exception       MessagingException
  93.      */
  94.     protected InternetHeaders createInternetHeaders(InputStream is)
  95.                                 throws MessagingException
  96. Likewise, to simplify creating subclasses of MimeMultipart, the parse
  97. method is made protected:
  98.     /**
  99.      * Parse the InputStream from our DataSource, constructing the
  100.      * appropriate MimeBodyParts.  The <code>parsed</code> flag is
  101.      * set to true, and if true on entry nothing is done.  This
  102.      * method is called by all other methods that need data for
  103.      * the body parts, to make sure the data has been parsed.
  104.      */
  105.     protected synchronized void parse() throws MessagingException
  106. and the following protected methods are added:
  107.     /**
  108.      * Create and return an InternetHeaders object that loads the
  109.      * headers from the given InputStream.  Subclasses can override
  110.      * this method to return a subclass of InternetHeaders, if
  111.      * necessary.  This implementation simply constructs and returns
  112.      * an InternetHeaders object.
  113.      *
  114.      * @param   is      the InputStream to read the headers from
  115.      * @exception       MessagingException
  116.      */
  117.     protected InternetHeaders createInternetHeaders(InputStream is)
  118.                                 throws MessagingException
  119.     /**
  120.      * Create and return a MimeBodyPart object to represent a
  121.      * body part parsed from the InputStream.  Subclasses can override
  122.      * this method to return a subclass of MimeBodyPart, if
  123.      * necessary.  This implementation simply constructs and returns
  124.      * a MimeBodyPart object.
  125.      *
  126.      * @param   headers         the headers for the body part
  127.      * @param   content         the content ofthe body part
  128.      * @exception               MessagingException
  129.      */
  130.     protected MimeBodyPart createMimeBodyPart(InternetHeaders headers,
  131.                                 byte[] content) throws MessagingException
  132.     /**
  133.      * Create and return a MimeBodyPart object to represent a
  134.      * body part parsed from the InputStream.  Subclasses can override
  135.      * this method to return a subclass of MimeBodyPart, if
  136.      * necessary.  This implementation simply constructs and returns
  137.      * a MimeBodyPart object.
  138.      *
  139.      * @param is InputStream containing the body part
  140.      * @exception   MessagingException
  141.      */
  142.     protected MimeBodyPart createMimeBodyPart(InputStream is)
  143. throws MessagingException
  144. ===================================================================
  145. 2. MimeMessage and MimeBodyPart getRawInputStream method (4124840)
  146. ------------------------------------------------------------------
  147. In some cases it is desirable to get the data for a body part
  148. before JavaMail attempts to decode it.  This is particularly important
  149. if the Content-Transfer-Encoding header is incorrect.  (For example,
  150. some mail software is known to use "7-bit" instead of the MIME
  151. defined "7bit".)  Access to this data is currently provided
  152. through the protected getContentStream method.  Since simply
  153. making this method public has the potential to cause a source
  154. incompatibility for any subclasses that declare this method as
  155. protected, we instead add a new public method that calls this
  156. protected method:
  157.     /**
  158.      * Return an InputStream to the raw data with any Content-Transfer-Encoding
  159.      * intact.  This method is useful if the "Content-Transfer-Encoding"
  160.      * header is incorrect or corrupt, which would prevent the
  161.      * <code>getInputStream</code> method or <code>getContent</code> method
  162.      * from returning the correct data.  In such a case the application may
  163.      * use this method and attempt to decode the raw data itself. <p>
  164.      *
  165.      * This implementation simply calls the <code>getContentStream</code>
  166.      * method.
  167.      *
  168.      * @see #getInputStream
  169.      * @see #getContentStream
  170.      */
  171.     public InputStream getRawInputStream() throws MessagingException
  172. ===================================================================
  173. 3. ReadOnlyFolderException (4163360)
  174. ------------------------------------
  175. A new MessagingException subclass to indicate a read-only folder
  176. is needed.
  177. Currently, if a client attempts to open a folder in read-write mode
  178. and the folder is read-only, a MessagingException is thrown. This
  179. exception type does not indicate that the anomaly was caused due to
  180. the lack of write-permissions.
  181. /**
  182.  * This exception is thrown when an attempt is made to open a folder
  183.  * with read-write access when the folder is marked read-only. <p>
  184.  */
  185. public class ReadOnlyFolderException extends MessagingException {
  186.     /**
  187.      * Constructor.
  188.      * @param folder    the Folder
  189.      */
  190.     public ReadOnlyFolderException(Folder folder)
  191.     /**
  192.      * Constructor.
  193.      * @param folder    the Folder
  194.      * @param message   the detailed error message
  195.      */
  196.     public ReadOnlyFolderException(Folder folder, String message)
  197.     /**
  198.      * Returns the Folder object.
  199.      */
  200.     public Folder getFolder()
  201. ===================================================================
  202. 4. InternetAddress implements Cloneable (4181144)
  203. -------------------------------------------------
  204. To simplify copying of InternetAddress objects, the InternetAddress
  205. class will implement the Cloneable interface and will provide a
  206. public clone method.
  207. public class InternetAddress extends Address implements Cloneable {
  208.     /**
  209.      * Return a copy of this InternetAddress object.
  210.      */
  211.     public Object clone()
  212. }
  213. ===================================================================
  214. 5. MimeMessage copy constructor (4107752)
  215. -----------------------------------------
  216. When forwarding or saving a message retrieved from a Store, it is
  217. sometimes desirable to be able to modify the message first.  Since
  218. most Stores do not allow their Message objects to be modified, the
  219. message must first be copied.  To simplify copying a MimeMessage,
  220. we introduce a copy constructor that allows a new MimeMessage to
  221. be created and initialized with a copy of another MimeMessage.
  222.     /**
  223.      * Constructs a new MimeMessage with content initialized form the
  224.      * <code>source</code> MimeMessage.  The new message is independent
  225.      * of the original. <p>
  226.      * 
  227.      * @param   source  the message to copy content from
  228.      * @exception       MessagingException
  229.      */
  230.     public MimeMessage(MimeMessage source) throws MessagingException
  231. ===================================================================
  232. 6. AuthenticationFailedException includes server message (4230553)
  233. ------------------------------------------------------------------
  234. When authentication with a server fails, the server often supplies
  235. some information in its protocol message that indicates the reason
  236. for the failure.  To allow a service provider to return this information
  237. to the user, we now allow the Service.protocolConnect() method to
  238. throw an AuthenticationFailedException in this case.  The exception
  239. may contain a string message that includes the additional information
  240. from the server.
  241.     /**
  242.      * The service implementation should override this method to
  243.      * perform the actual protocol-specific connection attempt.
  244.      * The default implementation of the <code>connect</code> method
  245.      * calls this method as needed. <p>
  246.      *
  247.      * The <code>protocolConnect</code> method should return
  248.      * <code>false</code> if a user name or password is required
  249.      * for authentication but the corresponding parameter is null;
  250.      * the <code>connect</code> method will prompt the user when
  251.      * needed to supply missing information.  This method may
  252.      * also return <code>false</code> if authentication fails for
  253.      * the supplied user name or password.  Alternatively, this method
  254.      * may throw an AuthenticationFailedException when authentication
  255.      * fails.  This exception may include a String message with more
  256.      * detail about the failure. <p>
  257.      *
  258.      * The <code>protocolConnect</code> method should throw an
  259.      * exception to report failures not related to authentication,
  260.      * such as an invalid host name or port number, loss of a
  261.      * connection during the authentication process, unavailability
  262.      * of the server, etc.
  263.      *
  264.      * @param   host            the name of the host to connect to
  265.      * @param   port            the port to use (-1 means use default port)
  266.      * @param   user            the name of the user to login as
  267.      * @param   password        the user's password
  268.      * @return  true if connection successful, false if authentication failed
  269.      * @exception AuthenticationFailedException for authentication failures
  270.      * @exception MessagingException    for non-authentication failures
  271.      */
  272.     protected boolean protocolConnect(String host, int port, String user,
  273.                                 String password) throws MessagingException
  274. ===================================================================
  275. 7. Support ESMTP 8BITMIME extension (4132029)
  276. ---------------------------------------------
  277. JavaMail chooses the encoding for body parts when the Message.saveChanges()
  278. method is called.  At the time this method is called, JavaMail has no
  279. information about the Transport that might be used to send the message.
  280. Thus, communicating the Transport's capabilities to the part of JavaMail
  281. that chooses body part encodings is problematic.
  282. To provide some minimal support for the 8BITMIME extension, the SMTP
  283. protocol provider is extended in the following way.  Note that this
  284. capability is part of Sun's SMTP protocol provider, and is *not* a
  285. part of the JavaMail API spec.  We include it here for convenience only.
  286. If the property "mail.smtp.allow8bitmime" is set to "true", and the
  287. SMTP server supports the 8BITMIME extension, the SMTP Transport will
  288. traverse the message and adjust the Content-Transfer-Encoding of text
  289. body parts from "quoted-printable" or "base64" to "8bit" as appropriate.
  290. Note that if the same message is subsequently sent over a Transport
  291. or to a server that does not support 8bit MIME, the message will *not*
  292. be converted back to a non-8bit encoding.  Normally this will not be a
  293. problem.  Note also that a message using "8bit" encoding can be safely
  294. appended to an IMAP folder.
  295. ===================================================================
  296. 8. Make MailDateFormat class public (4266390)
  297. ---------------------------------------------
  298. It would be useful to have the MailDateFormat class available as part
  299. of the javax.mail.internet package to allow parsing and formatting
  300. dates in other MIME headers.
  301. /**
  302.  * Formats and parses date specification based on the
  303.  * draft-ietf-drums-msg-fmt-08 dated January 26, 2000. This is a followup
  304.  * spec to RFC822.<p>
  305.  *
  306.  * This class does not take pattern strings. It always formats the
  307.  * date based on the specification below.<p>
  308.  *
  309.  * 3.3 Date and Time Specification<p>
  310.  *
  311.  * Date and time occur in several header fields of a message. This section
  312.  * specifies the syntax for a full date and time specification. Though folding
  313.  * whitespace is permitted throughout the date-time specification, it is
  314.  * recommended that only a single space be used where FWS is required and no
  315.  * space be used where FWS is optional in the date-time specification; some
  316.  * older implementations may not interpret other occurrences of folding
  317.  * whitespace correctly.<p>
  318.  *
  319.  * date-time = [ day-of-week "," ] date FWS time [CFWS]<p>
  320.  *
  321.  * day-of-week = ([FWS] day-name) / obs-day-of-week<p>
  322.  *
  323.  * day-name = "Mon" / "Tue" / "Wed" / "Thu" / "Fri" / "Sat" / "Sun"<p>
  324.  *
  325.  * date = day month year<p>
  326.  *
  327.  * year = 4*DIGIT / obs-year<p>
  328.  *
  329.  * month = (FWS month-name FWS) / obs-month<p>
  330.  *
  331.  *<pre>month-name = "Jan" / "Feb" / "Mar" / "Apr" /
  332.  *             "May" / "Jun" / "Jul" / "Aug" /
  333.  *             "Sep" / "Oct" / "Nov" / "Dec"
  334.  * </pre><p>
  335.  * day = ([FWS] 1*2DIGIT) / obs-day<p>
  336.  *
  337.  * time = time-of-day FWS zone<p>
  338.  *
  339.  * time-of-day = hour ":" minute [ ":" second ]<p>
  340.  *
  341.  * hour = 2DIGIT / obs-hour<p>
  342.  *
  343.  * minute = 2DIGIT / obs-minute<p>
  344.  *
  345.  * second = 2DIGIT / obs-second<p>
  346.  *
  347.  * zone = (( "+" / "-" ) 4DIGIT) / obs-zone<p>
  348.  *
  349.  *
  350.  * The day is the numeric day of the month. The year is any numeric year in
  351.  * the common era.<p>
  352.  *
  353.  * The time-of-day specifies the number of hours, minutes, and optionally
  354.  * seconds since midnight of the date indicated.<p>
  355.  *
  356.  * The date and time-of-day SHOULD express local time.<p>
  357.  *
  358.  * The zone specifies the offset from Coordinated Universal Time (UTC,
  359.  * formerly referred to as "Greenwich Mean Time") that the date and
  360.  * time-of-day represent. The "+" or "-" indicates whether the time-of-day is
  361.  * ahead of or behind Universal Time. The first two digits indicate the number
  362.  * of hours difference from Universal Time, and the last two digits indicate
  363.  * the number of minutes difference from Universal Time. (Hence, +hhmm means
  364.  * +(hh * 60 + mm) minutes, and -hhmm means -(hh * 60 + mm) minutes). The form
  365.  * "+0000" SHOULD be used to indicate a time zone at Universal Time. Though
  366.  * "-0000" also indicates Universal Time, it is used to indicate that the time
  367.  * was generated on a system that may be in a local time zone other than
  368.  * Universal Time.<p>
  369.  *
  370.  * A date-time specification MUST be semantically valid. That is, the
  371.  * day-of-the week (if included) MUST be the day implied by the date, the
  372.  * numeric day-of-month MUST be between 1 and the number of days allowed for
  373.  * the specified month (in the specified year), the time-of-day MUST be in the
  374.  * range 00:00:00 through 23:59:60 (the number of seconds allowing for a leap
  375.  * second; see [STD-12]), and the zone MUST be within the range -9959 through
  376.  * +9959.<p>
  377.  *
  378.  */
  379. public class MailDateFormat extends SimpleDateFormat {
  380.  
  381.     public MailDateFormat()
  382.     
  383.     /**
  384.      * Formats the given date in the format specified by
  385.      * draft-ietf-drums-msg-fmt-08 in the current TimeZone
  386.      *
  387.      * @param date the Date object
  388.      * @param dateStrBuf the formatted string
  389.      * @param fieldPosition the current field position
  390.      * @returns StringBuffer the formatted String
  391.      */
  392.     public StringBuffer format(Date date, StringBuffer dateStrBuf,
  393.                                FieldPosition fieldPosition)
  394.     /**
  395.      * Parses the given date in the format specified by
  396.      * draft-ietf-drums-msg-fmt-08 in the current TimeZone
  397.      *
  398.      * @param text the formatted date to be parsed
  399.      * @param pos the current parse position
  400.      * @returns Date the parsed date in a Date object
  401.      */
  402.     public Date parse(String text, ParsePosition pos)
  403. }
  404. ===================================================================
  405. 9. String-based MimeMessage setRecipients and addRecipients methods (4328824)
  406. -----------------------------------------------------------------------------
  407. The following convenience methods will be added to MimeMessage. They take a
  408. String for setting/adding a recipient (instead of javax.mail.Address objects).
  409.     /**  
  410.      * Set the specified recipient type to the given addresses.
  411.      * If the address parameter is <code>null</code>, the corresponding
  412.      * recipient field is removed.
  413.      *   
  414.      * @param type      Recipient type
  415.      * @param addresses Addresses
  416.      * @exception       IllegalWriteException if the underlying
  417.      *                  implementation does not support modification
  418.      *                  of existing values
  419.      * @exception       IllegalStateException if this message is
  420.      *                  obtained from a READ_ONLY folder.
  421.      * @exception       MessagingException
  422.      * @see             #getRecipients
  423.      */  
  424.     public void setRecipients(Message.RecipientType type, String addresses)
  425.                                 throws MessagingException
  426.     /**
  427.      * Add the given addresses to the specified recipient type.
  428.      *   
  429.      * @param type      Recipient type
  430.      * @param addresses Addresses
  431.      * @exception       IllegalWriteException if the underlying
  432.      *                  implementation does not support modification
  433.      *                  of existing values.
  434.      * @exception       IllegalStateException if this message is
  435.      *                  obtained from a READ_ONLY folder.
  436.      * @exception       MessagingException
  437.      */  
  438.     public void addRecipients(Message.RecipientType type, String addresses)
  439.                                 throws MessagingException
  440. ===================================================================
  441. 10. Add Session.getDefaultInstance(Properties props) and
  442.         Session.getInstance(Properties props) methods (4328826)
  443. ---------------------------------------------------------------
  444. These are convenience methods for retrieving the default Session or a new
  445. Session object which does not require an Authenticator parameter
  446. (it is assumed to be null).
  447.  
  448.     /**
  449.      * Get the default Session object. If a default has not yet been
  450.      * setup, a new Session object is created and installed as the
  451.      * default.<p>
  452.      *
  453.      * Note that a default session created with no Authenticator is
  454.      * available to all code executing in the same Java virtual
  455.      * machine, and the session can contain security sensitive
  456.      * information such as user names and passwords.
  457.      *
  458.      * @param   props   Properties object. Used only if a new Session
  459.      *                  object is created.<br>
  460.      *                  It is expected that the client supplies values
  461.      *                  for the properties listed in Appendix A of the
  462.      *                  JavaMail spec (particularly  mail.store.protocol,
  463.      *                  mail.transport.protocol, mail.host, mail.user,
  464.      *                  and mail.from) as the defaults are unlikely to
  465.      *                  work in all cases.
  466.      * @return          the default Session object
  467.      */
  468.     public static Session getDefaultInstance(Properties props)
  469.     /**  
  470.      * Get a new Session object.
  471.      *
  472.      * @param   props   Properties object that hold relevant properties.<br>
  473.      *                  It is expected that the client supplies values
  474.      *                  for the properties listed in Appendix A of the
  475.      *                  JavaMail spec (particularly  mail.store.protocol,
  476.      *                  mail.transport.protocol, mail.host, mail.user,
  477.      *                  and mail.from) as the defaults are unlikely to
  478.      *                  work in all cases.
  479.      * @return          a new Session object
  480.      * @see     javax.mail.Authenticator
  481.      */  
  482.     public static Session getInstance(Properties props)
  483. ===================================================================
  484. 11. Allow for providing a filename when using MimeUtility.encode() (4140579)
  485. ----------------------------------------------------------------------------
  486. The UUEncode encoder requires the filename to be inserted into the encoded
  487. stream. The public access point to the encoder is thru the MimeUtility.encode()
  488. method, which does not have any parameter that can provide the filename.
  489. Hence the uuencoded stream always has "encode.buf" as filename. This new
  490. method allows the setting of the filename.
  491.     /**
  492.      * Wrap an encoder around the given output stream.
  493.      * All the encodings defined in RFC 2045 are supported here.
  494.      * They include "base64", "quoted-printable", "7bit", "8bit" and
  495.      * "binary". In addition, "uuencode" is also supported.
  496.      * The <code>filename</code> parameter is used with the "uuencode"
  497.      * encoding and is included in the encoded output.
  498.      *
  499.      * @param   os              output stream
  500.      * @param   encoding        the encoding of the stream.
  501.      * @param   filename name for the file being encoded
  502.      * @exception       MessagingException
  503.      * @return                  output stream that applies the
  504.      *                          specified encoding.
  505.      */
  506.     public static OutputStream encode(OutputStream os, String encoding,
  507.                                       String filename)
  508.                 throws MessagingException
  509.   
  510. ===================================================================
  511. 12. New exception constructors (4259211)
  512. ----------------------------------------
  513. The FolderNotFoundException constructors are not consistant with other
  514. exceptions defined in the API. New constructors are needed to eliminate
  515. these inconsistencies.
  516.  
  517.     /**
  518.      * Constructs a MessagingException with the specified folder
  519.      * @param folder    the Folder
  520.      */
  521.     public FolderNotFoundException(Folder folder)
  522.  
  523.     /**
  524.      * Constructs a MessagingException with the specified detail message
  525.      * and the specified folder.
  526.      * @param folder    the Folder
  527.      * @param s         the detail message
  528.      */
  529.     public FolderNotFoundException(Folder folder, String s)
  530. ===================================================================
  531. 13. InternetAddress.toUnicodeString() method  (4281729)
  532. -------------------------------------------------------
  533. Problem: AddressStringTerm.match does not return the correct results
  534. in some situations.
  535. AddressStringTerm wants to do the match against the formatted address
  536. string in Unicode, not the ASCII version that might include charset
  537. encoding information.  To do this it attempts to format the address
  538. itself, but it's not smart enough to know all the rules about
  539. formatting an address (e.g., when to quote the personal name) so it
  540. does this formatting differently than InternetAddress.toString does.
  541. When the address contains only ASCII characters, the formatting should
  542. be identical.
  543.     /**
  544.      * Returns a properly formatted address (RFC 822 syntax) of
  545.      * Unicode characters.
  546.      *   
  547.      * @return          Unicode address string
  548.      */  
  549.     public String toUnicodeString()
  550.     
  551. ===================================================================
  552. 14. Call saveChanges automatically on newly constructed message (4339203)
  553. -------------------------------------------------------------------------
  554. One of the most common errors when constructing new messages is forgetting
  555. to call the saveChanges() method before writing out the message or calling
  556. the Transport.sendMessage() method.  To solve this problem we add a flag
  557. to MimeMessage and change the writeTo() method accordingly:
  558.     /**
  559.      * Does the <code>saveChanges</code> method need to be called on
  560.      * this message?  This flag is set to false by the public constructor
  561.      * and set to true by the <code>saveChanges</code> method.  The
  562.      * <code>writeTo</code> method checks this flag and calls the
  563.      * <code>saveChanges</code> method as necessary.  This avoids the
  564.      * common mistake of forgetting to call the <code>saveChanges</code>
  565.      * method on a newly constructed message.
  566.      */
  567.     protected boolean saved = false;
  568.     /**
  569.      * Updates the appropriate header fields of this message to be
  570.      * consistent with the message's contents. If this message is
  571.      * contained in a Folder, any changes made to this message are
  572.      * committed to the containing folder. <p>
  573.      *
  574.      * If any part of a message's headers or contents are changed,
  575.      * <code>saveChanges</code> must be called to ensure that those
  576.      * changes are permanent. Otherwise, any such modifications may or
  577.      * may not be saved, depending on the folder implementation. <p>
  578.      *
  579.      * Messages obtained from folders opened READ_ONLY should not be
  580.      * modified and saveChanges should not be called on such messages. <p>
  581.      *
  582.      * This method sets the <code>modified</code> flag to true, the
  583.      * <code>save</code> flag to true, and then calls the
  584.      * <code>updateHeaders<code> method.
  585.      *
  586.      * @exception       IllegalWriteException if the underlying
  587.      *                  implementation does not support modification
  588.      * @exception       IllegalStateException if this message is
  589.      *                  obtained from a READ_ONLY folder.
  590.      * @exception       MessagingException
  591.      */
  592.     public void saveChanges() throws MessagingException
  593.     /**
  594.      * Output the message as an RFC 822 format stream, without
  595.      * specified headers.  If the <code>saved</code> flag is not set,
  596.      * the <code>saveChanges</code> method is called.
  597.      * If the <code>modified</code> flag is not
  598.      * set and the <code>content</code> array is not null, the
  599.      * <code>content</code> array is written directly, after
  600.      * writing the appropriate message headers.
  601.      *
  602.      * @exception javax.mail.MessagingException
  603.      * @exception IOException   if an error occurs writing to the stream
  604.      *                          or if an error is generated by the
  605.      *                          javax.activation layer.
  606.      * @see javax.activation.DataHandler#writeTo
  607.      */
  608.     public void writeTo(OutputStream os, String[] ignoreList)
  609.                                 throws IOException, MessagingException
  610. ===================================================================
  611. 15. New MimeUtility.getEncoding(DataHandler) method (4340648)
  612. -------------------------------------------------------------
  613. To improve the performance of JavaMail, we previously added a (package
  614. private) getEncoding() method to MimeUtility.  This method is now public:
  615.     /**
  616.      * Same as <code>getEncoding(DataSource)</code> except that instead
  617.      * of reading the data from an <code>InputStream</code> it uses the
  618.      * <code>writeTo</code> method to examine the data.  This is more
  619.      * efficient in the common case of a <code>DataHandler</code>
  620.      * created with an object and a MIME type (for example, a
  621.      * "text/plain" String) because all the I/O is done in this
  622.      * thread.  In the case requiring an <code>InputStream</code> the
  623.      * <code>DataHandler</code> uses a thread, a pair of pipe streams,
  624.      * and the <code>writeTo</code> method to produce the data. <p>
  625.      */
  626.     public static String getEncoding(DataHandler dh)
  627. ===================================================================
  628. 16. New TransportEvent.getMessage()  method (4331674)
  629. -----------------------------------------------------
  630. The TransportEvent class saves the message that caused the error,
  631. but provides no getMessage method for the listener to retrieve the
  632. Message object. The following method will be added:
  633.     /**
  634.      * Get the Message object associated with this Transport Event.
  635.      *   
  636.      * @return          the Message object 
  637.      */
  638.     public Message getMessage()
  639. ===================================================================
  640. 17. javax.mail.search terms should be serializable (4126013)
  641. ------------------------------------------------------------
  642. The javax.mail.search package allows you to programmatically construct
  643. a search term.  It would be convenient if those terms could be saved
  644. in persistent storage and restored in a later session.  Using
  645. serialization to store these expressions is the simplest approach.
  646. Many of the search terms reference other objects that must also be
  647. serializable.  The most problematic such objects are of the class
  648. Message.RecipientType.  This class uses the java "type-safe enum"
  649. idiom, which involves a number of static final instances of the class.
  650. Applications are allowed to test for equivalence with these "constants"
  651. by using the "==" equality operator.  Thus, it's critical that only a
  652. single instance of each constant exist in the Java virtual machine.
  653. To ensure that this constraint is met when deserializing an object
  654. of this class, we must take advantage of the JDK 1.2 readReplace()
  655. method.  Since this method is not available on JDK 1.1, objects of
  656. this class, and thus search terms that reference them, can not be
  657. correctly deserialized on JDK 1.1.  This is a limitation of this
  658. new capability.
  659. To provide this support, the following classes and all their subclasses
  660. now implement the Serializable interface:
  661.     javax.mail.search.SearchTerm
  662.     javax.mail.Address
  663.     javax.mail.Flags
  664.     javax.mail.Message.RecipientType
  665. In addition, to allow comparison between search terms, the equals
  666. and hashCode methods on SearchTerm (and all subclasses) now implement
  667. "value" equivalence rather than identity equivalence.
  668. ===================================================================
  669. 18. Support IMAP NAMESPACE extension (4364827)
  670. ------------------------------------------------------------
  671. We propose the following new APIs to be added to javax.mail.Store to
  672. provide namespace information.  If the IMAP server supports the
  673. NAMESPACE extension, it will be used to return this information.
  674.     /**
  675.      * Return a set of folders representing the <i>personal</i> namespaces
  676.      * for the current user.  A personal namespace is a set of names that
  677.      * is considered within the personal scope of the authenticated user.
  678.      * Typically, only the authenticated user has access to mail folders
  679.      * in their personal namespace.  If an INBOX exists for a user, it
  680.      * must appear within the user's personal namespace.  In the
  681.      * typical case, there should be only one personal namespace for each
  682.      * user in each Store. <p>
  683.      *
  684.      * This implementation returns an array with a single entry containing
  685.      * the return value of the <code>getDefaultFolder</code> method.
  686.      * Subclasses should override this method to return appropriate information.
  687.      *
  688.      * @exception  IllegalStateException if this Store is not connected.
  689.      * @return array of Folder objects
  690.      */
  691.     public Folder[] getPersonalNamespaces() throws MessagingException
  692.     /**
  693.      * Return a set of folders representing the namespaces for
  694.      * <code>user</code>.  The namespaces returned represent the
  695.      * personal namespaces for the user.  To access mail folders in the
  696.      * other user's namespace, the currently authenticated user must be
  697.      * explicitly granted access rights.  For example, it is common for
  698.      * a manager to grant to their secretary access rights to their
  699.      * mail folders. <p>
  700.      *
  701.      * This implementation returns an empty array.  Subclasses should
  702.      * override this method to return appropriate information.
  703.      *
  704.      * @exception  IllegalStateException if this Store is not connected.
  705.      * @return array of Folder objects
  706.      */
  707.     public Folder[] getUserNamespaces(String user) throws MessagingException
  708.     /**
  709.      * Return a set of folders representing the <i>shared</i> namespaces.
  710.      * A shared namespace is a namespace that consists of mail folders
  711.      * that are intended to be shared amongst users and do not exist
  712.      * within a user's personal namespace. <p>
  713.      *
  714.      * This implementation returns an empty array.  Subclasses should
  715.      * override this method to return appropriate information.
  716.      *
  717.      * @exception  IllegalStateException if this Store is not connected.
  718.      * @return array of Folder objects
  719.      */
  720.     public Folder[] getSharedNamespaces() throws MessagingException
  721. ===================================================================
  722. 19. Make ContentDisposition class public (4366373)
  723. --------------------------------------------------
  724. The javax.mail.internet.ContentDisposition class is package private
  725. and should be made public.  The API is:
  726. /**
  727.  * This class represents a MIME ContentDisposition value. It provides
  728.  * methods to parse a ContentDisposition string into individual components
  729.  * and to generate a MIME style ContentDisposition string.
  730.  */
  731. public class ContentDisposition
  732.     /**
  733.      * No-arg Constructor.
  734.      */
  735.     public ContentDisposition()
  736.     /**
  737.      * Constructor.
  738.      *
  739.      * @param disposition disposition
  740.      * @param list ParameterList
  741.      */
  742.     public ContentDisposition(String disposition, ParameterList list)
  743.     /**
  744.      * Constructor that takes a ContentDisposition string. The String
  745.      * is parsed into its constituents: dispostion and parameters. 
  746.      * A ParseException is thrown if the parse fails. 
  747.      *
  748.      * @param s the ContentDisposition string.
  749.      * @exception ParseException if the parse fails.
  750.      */
  751.     public ContentDisposition(String s) throws ParseException
  752.     /**
  753.      * Return the disposition value.
  754.      * @return the disposition
  755.      */
  756.     public String getDisposition()
  757.     /**
  758.      * Return the specified parameter value. Returns <code>null</code>
  759.      * if this parameter is absent.
  760.      * @return parameter value
  761.      */
  762.     public String getParameter(String name)
  763.     /**
  764.      * Return a ParameterList object that holds all the available 
  765.      * parameters. Returns null if no parameters are available.
  766.      *
  767.      * @return ParameterList
  768.      */
  769.     public ParameterList getParameterList()
  770.     /**
  771.      * Set the primary type. Overrides existing primary type.
  772.      * @param primaryType primary type
  773.      */
  774.     public void setDisposition(String disposition)
  775.     /**
  776.      * Set the specified parameter. If this parameter already exists,
  777.      * it is replaced by this new value.
  778.      *
  779.      * @param name parameter name
  780.      * @param value parameter value
  781.      */
  782.     public void setParameter(String name, String value)
  783.     /**
  784.      * Set a new ParameterList.
  785.      * @param list ParameterList
  786.      */
  787.     public void setParameterList(ParameterList list)
  788.     /**
  789.      * Retrieve a RFC2045 style string representation of
  790.      * this ContentDisposition. Returns <code>null</code> if
  791.      * the conversion failed.
  792.      *
  793.      * @return RFC2045 style string
  794.      */
  795.     public String toString()
  796. }
  797. ===================================================================
  798. 20. Improve performance of MimeMessage (4371862)
  799. --------------------------------------------------
  800. To allow us to improve the performance of the MimeMessage and MimeMultipart
  801. classes when parsing data from an InputStream, we introduce a new
  802. interface that allows the data in the InputStream to be shared instead
  803. of copied, and we use this new interface in key parts of the implementation.
  804. The following field is added to MimeMessage:
  805.     /**
  806.      * If the data for this message was supplied by an
  807.      * InputStream that implements the SharedInputStream interface,
  808.      * <code>contentStream</code> is another such stream representing
  809.      * the content of this message.  In this case, <code>content</code>
  810.      * will be null.
  811.      */
  812.     protected InputStream contentStream;
  813. The following field is added to MimeBodyPart:
  814.     /**
  815.      * If the data for this body part was supplied by an
  816.      * InputStream that implements the SharedInputStream interface,
  817.      * <code>contentStream</code> is another such stream representing
  818.      * the content of this body part.  In this case, <code>content</code>
  819.      * will be null.
  820.      */
  821.     protected InputStream contentStream;
  822. The following interface is added:
  823. package javax.mail.internet;
  824. /**
  825.  * An InputStream that is backed by data that can be shared by multiple
  826.  * readers may implement this interface.  This allows users of such an
  827.  * InputStream to determine the current positionin the InputStream, and
  828.  * to create new InputStreams representing a subset of the data in the
  829.  * original InputStream.  The new InputStream will access the same
  830.  * underlying data as the original, without copying the data.
  831.  */
  832. public interface SharedInputStream {
  833.     /**
  834.      * Return the current position in the InputStream, as an
  835.      * offset from the beginning of the InputStream.
  836.      *
  837.      * @return the current position
  838.      */
  839.     public long getPosition();
  840.     /**
  841.      * Return a new InputStream representing a subset of the data
  842.      * from this InputStream, starting at <code>start</code> (inclusive)
  843.      * up to <code>end</code> (exclusive).  <code>start</code> must be
  844.      * non-negative.  If <code>end</code> is -1, the new stream ends
  845.      * at the same place as this stream.  The returned InputStream
  846.      * will also implement the SharedInputStream interface.
  847.      *
  848.      * @param start the starting position
  849.      * @param end the ending position + 1
  850.      * @return the new stream
  851.      */
  852.     public InputStream newStream(long start, long end);
  853. }
  854. ===================================================================
  855. 21. New ParameterList.toString(int used) method.
  856. --------------------------------------------------
  857. The ParameterList.toString() method returns its results "unfolded". It
  858. would be useful to have the results "folded" in certain situations. A
  859. new method will be added to the ParamterList class which will return
  860. "folded" results. Folding is defined by RFC 822 as the process of splitting
  861. a header field into multiple lines. "The general rule is that wherever there
  862. may be linear-white-space (NOT simply LWSP-chars), a CRLF immediately
  863. followed by AT LEAST one LWSP-char may instead be inserted." Unfolding is 
  864. the process of returning to a single line representation. "Unfolding is 
  865. accomplished  by regarding CRLF immediately followed by a LWSP-char as
  866. equivalent to the LWSP-char."
  867.     /**
  868.      * Convert this ParameterList into a MIME String. If this is
  869.      * an empty list, an empty string is returned.
  870.      *   
  871.      * The 'used' parameter specifies the number of character positions
  872.      * already taken up in the field into which the resulting address
  873.      * sequence string is to be inserted. It's used to determine where
  874.      * to "fold" the resulting parameter list.
  875.      *
  876.      * @param used      number of character positions already used, in
  877.      *                  the field into which the parameter list is to
  878.      *                  be inserted.
  879.      * @return          String
  880.      */  
  881.     public String toString(int used)