<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2FEmail%2FFormatter</id>
		<title>Java/Email/Formatter - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2FEmail%2FFormatter"/>
		<link rel="alternate" type="text/html" href="http://jexp.ru/index.php?title=Java/Email/Formatter&amp;action=history"/>
		<updated>2026-04-06T20:53:30Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://jexp.ru/index.php?title=Java/Email/Formatter&amp;diff=6685&amp;oldid=prev</id>
		<title>Admin: 1 версия</title>
		<link rel="alternate" type="text/html" href="http://jexp.ru/index.php?title=Java/Email/Formatter&amp;diff=6685&amp;oldid=prev"/>
				<updated>2010-06-01T06:17:16Z</updated>
		
		<summary type="html">&lt;p&gt;1 версия&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr style=&quot;vertical-align: top;&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Версия 06:17, 1 июня 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; style=&quot;text-align: center;&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>http://jexp.ru/index.php?title=Java/Email/Formatter&amp;diff=6684&amp;oldid=prev</id>
		<title> в 18:01, 31 мая 2010</title>
		<link rel="alternate" type="text/html" href="http://jexp.ru/index.php?title=Java/Email/Formatter&amp;diff=6684&amp;oldid=prev"/>
				<updated>2010-05-31T18:01:44Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Convert date information contained in Date into RFC2822 and UTC (&amp;quot;Zulu&amp;quot;) strings ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
/*&lt;br /&gt;
 * Funambol is a mobile platform developed by Funambol, Inc. &lt;br /&gt;
 * Copyright (C) 2003 - 2007 Funambol, Inc.&lt;br /&gt;
 * &lt;br /&gt;
 * This program is free software; you can redistribute it and/or modify it under&lt;br /&gt;
 * the terms of the GNU Affero General Public License version 3 as published by&lt;br /&gt;
 * the Free Software Foundation with the addition of the following permission &lt;br /&gt;
 * added to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED&lt;br /&gt;
 * WORK IN WHICH THE COPYRIGHT IS OWNED BY FUNAMBOL, FUNAMBOL DISCLAIMS THE &lt;br /&gt;
 * WARRANTY OF NON INFRINGEMENT  OF THIRD PARTY RIGHTS.&lt;br /&gt;
 * &lt;br /&gt;
 * This program is distributed in the hope that it will be useful, but WITHOUT&lt;br /&gt;
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS&lt;br /&gt;
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more&lt;br /&gt;
 * details.&lt;br /&gt;
 * &lt;br /&gt;
 * You should have received a copy of the GNU Affero General Public License &lt;br /&gt;
 * along with this program; if not, see http://www.gnu.org/licenses or write to&lt;br /&gt;
 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,&lt;br /&gt;
 * MA 02110-1301 USA.&lt;br /&gt;
 * &lt;br /&gt;
 * You can contact Funambol, Inc. headquarters at 643 Bair Island Road, Suite &lt;br /&gt;
 * 305, Redwood City, CA 94063, USA, or at email address info@funambol.ru.&lt;br /&gt;
 * &lt;br /&gt;
 * The interactive user interfaces in modified source and object code versions&lt;br /&gt;
 * of this program must display Appropriate Legal Notices, as required under&lt;br /&gt;
 * Section 5 of the GNU Affero General Public License version 3.&lt;br /&gt;
 * &lt;br /&gt;
 * In accordance with Section 7(b) of the GNU Affero General Public License&lt;br /&gt;
 * version 3, these Appropriate Legal Notices must retain the display of the&lt;br /&gt;
 * &amp;quot;Powered by Funambol&amp;quot; logo. If the display of the logo is not reasonably &lt;br /&gt;
 * feasible for technical reasons, the Appropriate Legal Notices must display&lt;br /&gt;
 * the words &amp;quot;Powered by Funambol&amp;quot;.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
import java.util.Calendar;&lt;br /&gt;
import java.util.Date;&lt;br /&gt;
import java.util.Hashtable;&lt;br /&gt;
/**&lt;br /&gt;
 * A utility class providing methods to convert date information contained in&lt;br /&gt;
 * &amp;lt;code&amp;gt;Date&amp;lt;/code&amp;gt; objects into RFC2822 and UTC (&amp;quot;Zulu&amp;quot;) strings, and to&lt;br /&gt;
 * build &amp;lt;code&amp;gt;Date&amp;lt;/code&amp;gt; objects starting from string representations of&lt;br /&gt;
 * dates in RFC2822 and UTC format&lt;br /&gt;
 */&lt;br /&gt;
public class MailDateFormatter {&lt;br /&gt;
    &lt;br /&gt;
    /** Format date as: MM/DD */&lt;br /&gt;
    public static final int FORMAT_MONTH_DAY = 0;&lt;br /&gt;
    /** Format date as: MM/DD/YYYY */&lt;br /&gt;
    public static final int FORMAT_MONTH_DAY_YEAR = 1;&lt;br /&gt;
    /** Format date as: hh:mm */&lt;br /&gt;
    public static final int FORMAT_HOURS_MINUTES = 2;&lt;br /&gt;
    /** Format date as: hh:mm:ss */&lt;br /&gt;
    public static final int FORMAT_HOURS_MINUTES_SECONDS = 3;&lt;br /&gt;
    /** Format date as: DD/MM */&lt;br /&gt;
    public static final int FORMAT_DAY_MONTH = 4;&lt;br /&gt;
    /** Format date as: DD/MM/YYYY */&lt;br /&gt;
    public static final int FORMAT_DAY_MONTH_YEAR = 5;&lt;br /&gt;
    &lt;br /&gt;
    /** Device offset, as string */&lt;br /&gt;
    private static String deviceOffset = &amp;quot;+0000&amp;quot;;&lt;br /&gt;
    /** Device offset, in millis */&lt;br /&gt;
    private static long millisDeviceOffset = 0;&lt;br /&gt;
    /** Names of the months */&lt;br /&gt;
    private static String[] monthNames = new String[] {&lt;br /&gt;
        &amp;quot;Jan&amp;quot;, &amp;quot;Feb&amp;quot;, &amp;quot;Mar&amp;quot;, &amp;quot;Apr&amp;quot;, &amp;quot;May&amp;quot;, &amp;quot;Jun&amp;quot;,&lt;br /&gt;
        &amp;quot;Jul&amp;quot;, &amp;quot;Aug&amp;quot;, &amp;quot;Sep&amp;quot;, &amp;quot;Oct&amp;quot;, &amp;quot;Nov&amp;quot;, &amp;quot;Dec&amp;quot;&lt;br /&gt;
    };&lt;br /&gt;
     &lt;br /&gt;
    /**&lt;br /&gt;
     * Transforms data contained in a &amp;lt;code&amp;gt;Date&amp;lt;/code&amp;gt; object (expressed in&lt;br /&gt;
     * UTC) in a string formatted as per RFC2822 in local time (par. 3.3)&lt;br /&gt;
     *&lt;br /&gt;
     * @return A string representing the date contained in the passed&lt;br /&gt;
     *         &amp;lt;code&amp;gt;Date&amp;lt;/code&amp;gt; object formatted as per RFC 2822 and in local&lt;br /&gt;
     *         time&lt;br /&gt;
     */&lt;br /&gt;
    public static String dateToRfc2822(Date date) {&lt;br /&gt;
        &lt;br /&gt;
        Calendar deviceTime = Calendar.getInstance();&lt;br /&gt;
        deviceTime.setTime(date);&lt;br /&gt;
   &lt;br /&gt;
        String dayweek = &amp;quot;&amp;quot;;&lt;br /&gt;
        int dayOfWeek = deviceTime.get(deviceTime.DAY_OF_WEEK);&lt;br /&gt;
        switch (dayOfWeek) {&lt;br /&gt;
            case 1 : dayweek = &amp;quot;Sun&amp;quot;; break;&lt;br /&gt;
            case 2 : dayweek = &amp;quot;Mon&amp;quot;; break;&lt;br /&gt;
            case 3 : dayweek = &amp;quot;Tue&amp;quot;; break;&lt;br /&gt;
            case 4 : dayweek = &amp;quot;Wed&amp;quot;; break;&lt;br /&gt;
            case 5 : dayweek = &amp;quot;Thu&amp;quot;; break;&lt;br /&gt;
            case 6 : dayweek = &amp;quot;Fri&amp;quot;; break;&lt;br /&gt;
            case 7 : dayweek = &amp;quot;Sat&amp;quot;; break;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        int dayOfMonth = deviceTime.get(deviceTime.DAY_OF_MONTH);&lt;br /&gt;
        &lt;br /&gt;
        String monthInYear = getMonthName(deviceTime.get(deviceTime.MONTH));&lt;br /&gt;
        &lt;br /&gt;
        int year = deviceTime.get(deviceTime.YEAR);&lt;br /&gt;
        int hourOfDay = deviceTime.get(deviceTime.HOUR_OF_DAY);&lt;br /&gt;
        int minutes = deviceTime.get(deviceTime.MINUTE);&lt;br /&gt;
        int seconds = deviceTime.get(deviceTime.SECOND);&lt;br /&gt;
        &lt;br /&gt;
        String rfc = dayweek + &amp;quot;, &amp;quot; +                                   // Tue&lt;br /&gt;
                dayOfMonth + &amp;quot; &amp;quot; +                                      // 7&lt;br /&gt;
                monthInYear + &amp;quot; &amp;quot; +                                     // Nov&lt;br /&gt;
                year + &amp;quot; &amp;quot; +                                            // 2006&lt;br /&gt;
                hourOfDay + &amp;quot;:&amp;quot; + minutes + &amp;quot;:&amp;quot; + seconds + &amp;quot; &amp;quot; +       // 14:13:26&lt;br /&gt;
                deviceOffset;                                           //+0200  &lt;br /&gt;
        return rfc;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    /**&lt;br /&gt;
     * Converts a &amp;lt;code&amp;gt;Date&amp;lt;/code&amp;gt; object into a string in &amp;quot;Zulu&amp;quot; format&lt;br /&gt;
     *&lt;br /&gt;
     * @param d&lt;br /&gt;
     *            A &amp;lt;code&amp;gt;Date&amp;lt;/code&amp;gt; object to be converted into a string in&lt;br /&gt;
     *            &amp;quot;Zulu&amp;quot; format&lt;br /&gt;
     * @return A string representing the date contained in the passed&lt;br /&gt;
     *         &amp;lt;code&amp;gt;Date&amp;lt;/code&amp;gt; object in &amp;quot;Zulu&amp;quot; format (e.g.&lt;br /&gt;
     *         yyyyMMDDThhmmssZ)&lt;br /&gt;
     */&lt;br /&gt;
    public static String dateToUTC(Date d) {&lt;br /&gt;
        StringBuffer date = new StringBuffer();&lt;br /&gt;
        Calendar cal = Calendar.getInstance();&lt;br /&gt;
        cal.setTime(d);&lt;br /&gt;
        &lt;br /&gt;
        date.append(cal.get(Calendar.YEAR));&lt;br /&gt;
        &lt;br /&gt;
        date.append(printTwoDigits(cal.get(Calendar.MONTH) + 1))&lt;br /&gt;
            .append(printTwoDigits(cal.get(Calendar.DATE)))&lt;br /&gt;
            .append(&amp;quot;T&amp;quot;);&lt;br /&gt;
        &lt;br /&gt;
        date.append(printTwoDigits(cal.get(Calendar.HOUR_OF_DAY)))&lt;br /&gt;
            .append(printTwoDigits(cal.get(Calendar.MINUTE)))&lt;br /&gt;
            .append(printTwoDigits(cal.get(Calendar.SECOND)))&lt;br /&gt;
            .append(&amp;quot;Z&amp;quot;);&lt;br /&gt;
        &lt;br /&gt;
        return date.toString();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    /**&lt;br /&gt;
     * A method that returns a string rapresenting a date.&lt;br /&gt;
     *&lt;br /&gt;
     * @param date the date&lt;br /&gt;
     *&lt;br /&gt;
     * @param format the format as one of&lt;br /&gt;
     * FORMAT_MONTH_DAY,&lt;br /&gt;
     * FORMAT_MONTH_DAY_YEAR,&lt;br /&gt;
     * FORMAT_HOURS_MINUTES,&lt;br /&gt;
     * FORMAT_HOURS_MINUTES_SECONDS&lt;br /&gt;
     * FORMAT_DAY_MONTH&lt;br /&gt;
     * FORMAT_DAY_MONTH_YEAR&lt;br /&gt;
     * constants&lt;br /&gt;
     *&lt;br /&gt;
     * @param separator the separator to be used&lt;br /&gt;
     */&lt;br /&gt;
    public static String getFormattedStringFromDate(&lt;br /&gt;
            Date date, int format, String separator) {&lt;br /&gt;
        &lt;br /&gt;
        Calendar cal=Calendar.getInstance();&lt;br /&gt;
        cal.setTime(date);&lt;br /&gt;
        StringBuffer ret = new StringBuffer();&lt;br /&gt;
        &lt;br /&gt;
        switch (format) {&lt;br /&gt;
            case FORMAT_HOURS_MINUTES:&lt;br /&gt;
                //if pm and hour == 0 we want to write 12, not 0&lt;br /&gt;
                if (cal.get(Calendar.AM_PM)==Calendar.PM&lt;br /&gt;
                        &amp;amp;&amp;amp; cal.get(Calendar.HOUR) == 0) {&lt;br /&gt;
                    ret.append(&amp;quot;12&amp;quot;);&lt;br /&gt;
                } else {&lt;br /&gt;
                    ret.append(cal.get(Calendar.HOUR));&lt;br /&gt;
                }&lt;br /&gt;
                ret.append(separator)&lt;br /&gt;
                    .append(printTwoDigits(cal.get(Calendar.MINUTE)))&lt;br /&gt;
                    .append(getAMPM(cal));&lt;br /&gt;
                break;&lt;br /&gt;
                &lt;br /&gt;
            case FORMAT_HOURS_MINUTES_SECONDS:&lt;br /&gt;
                //if pm and hour == 0 we want to write 12, not 0&lt;br /&gt;
                if (cal.get(Calendar.AM_PM)==Calendar.PM&lt;br /&gt;
                        &amp;amp;&amp;amp; cal.get(Calendar.HOUR) == 0) {&lt;br /&gt;
                    ret.append(&amp;quot;12&amp;quot;);&lt;br /&gt;
                } else {&lt;br /&gt;
                    ret.append(cal.get(Calendar.HOUR));&lt;br /&gt;
                }&lt;br /&gt;
                ret.append(separator)&lt;br /&gt;
                    .append(printTwoDigits(cal.get(Calendar.MINUTE)))&lt;br /&gt;
                    .append(separator)&lt;br /&gt;
                    .append(cal.get(Calendar.SECOND))&lt;br /&gt;
                    .append(getAMPM(cal));&lt;br /&gt;
                break;&lt;br /&gt;
                &lt;br /&gt;
            case FORMAT_MONTH_DAY:&lt;br /&gt;
                ret.append(cal.get(Calendar.MONTH)+1)&lt;br /&gt;
                    .append(separator)&lt;br /&gt;
                    .append(cal.get(Calendar.DAY_OF_MONTH));&lt;br /&gt;
                break;&lt;br /&gt;
                &lt;br /&gt;
            case FORMAT_DAY_MONTH:&lt;br /&gt;
                ret.append(cal.get(Calendar.DAY_OF_MONTH))&lt;br /&gt;
                    .append(separator)&lt;br /&gt;
                    .append(cal.get(Calendar.MONTH)+1);&lt;br /&gt;
                break;&lt;br /&gt;
                &lt;br /&gt;
            case FORMAT_MONTH_DAY_YEAR:&lt;br /&gt;
                ret.append(cal.get(Calendar.MONTH)+1)&lt;br /&gt;
                    .append(separator)&lt;br /&gt;
                    .append(cal.get(Calendar.DAY_OF_MONTH))&lt;br /&gt;
                    .append(separator)&lt;br /&gt;
                    .append(cal.get(Calendar.YEAR));&lt;br /&gt;
                break;&lt;br /&gt;
                &lt;br /&gt;
            case FORMAT_DAY_MONTH_YEAR:&lt;br /&gt;
                ret.append(cal.get(Calendar.DAY_OF_MONTH))&lt;br /&gt;
                    .append(separator)&lt;br /&gt;
                    .append(cal.get(Calendar.MONTH)+1)&lt;br /&gt;
                    .append(separator)&lt;br /&gt;
                    .append(cal.get(Calendar.YEAR));&lt;br /&gt;
                break;&lt;br /&gt;
                &lt;br /&gt;
            default:&lt;br /&gt;
              //  Log.error(&amp;quot;getFormattedStringFromDate: invalid format (&amp;quot;+&lt;br /&gt;
                //        format+&amp;quot;)&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        return ret.toString();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    /**&lt;br /&gt;
     * Returns a localized string representation of Date.&lt;br /&gt;
     */&lt;br /&gt;
    public static String formatLocalTime(Date d) {&lt;br /&gt;
        int dateFormat = FORMAT_MONTH_DAY_YEAR;&lt;br /&gt;
        int timeFormat = FORMAT_HOURS_MINUTES;&lt;br /&gt;
        &lt;br /&gt;
        if(!System.getProperty(&amp;quot;microedition.locale&amp;quot;).equals(&amp;quot;en&amp;quot;)) {&lt;br /&gt;
            dateFormat = FORMAT_DAY_MONTH_YEAR;&lt;br /&gt;
        }&lt;br /&gt;
        return getFormattedStringFromDate(d,FORMAT_MONTH_DAY_YEAR,&amp;quot;/&amp;quot;)&lt;br /&gt;
                +&amp;quot; &amp;quot;+getFormattedStringFromDate(d,FORMAT_HOURS_MINUTES,&amp;quot;:&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    /**&lt;br /&gt;
     * Parses the string in RFC 2822 format and return a &amp;lt;code&amp;gt;Date&amp;lt;/code&amp;gt;&lt;br /&gt;
     * object. &amp;lt;p&amp;gt;&lt;br /&gt;
     * Parse strings like:&lt;br /&gt;
     * Thu, 03 May 2007 14:45:38 GMT&lt;br /&gt;
     * Thu, 03 May 2007 14:45:38 GMT+0200&lt;br /&gt;
     * Thu,  1 Feb 2007 03:57:01 -0800&lt;br /&gt;
     * Fri, 04 May 2007 13:40:17 PDT&lt;br /&gt;
     * &lt;br /&gt;
     * @param d the date representation to parse&lt;br /&gt;
     * @return a date, if valid, or null on error&lt;br /&gt;
     *&lt;br /&gt;
     */&lt;br /&gt;
    public static Date parseRfc2822Date(String stringDate) {&lt;br /&gt;
        if (stringDate == null) {&lt;br /&gt;
            return null;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        long hourOffset=0;&lt;br /&gt;
        long minOffset=0;&lt;br /&gt;
        Calendar cal = Calendar.getInstance();&lt;br /&gt;
        &lt;br /&gt;
        try {&lt;br /&gt;
            &lt;br /&gt;
            // We use the &amp;quot; &amp;quot; as separator and we expect only one space. We&lt;br /&gt;
            // clean the string to remove extra spaces&lt;br /&gt;
            StringBuffer cleanedDate = new StringBuffer();&lt;br /&gt;
            char previous = &amp;quot;a&amp;quot;;&lt;br /&gt;
            for(int i=0;i&amp;lt;stringDate.length();++i) {&lt;br /&gt;
                char ch = stringDate.charAt(i);&lt;br /&gt;
                if (ch != &amp;quot; &amp;quot; || previous != &amp;quot; &amp;quot;) {&lt;br /&gt;
                    cleanedDate.append(ch);&lt;br /&gt;
                }&lt;br /&gt;
                previous = ch;&lt;br /&gt;
            }&lt;br /&gt;
            stringDate = cleanedDate.toString();&lt;br /&gt;
           // Log.debug(&amp;quot;Cleaned date: &amp;quot; + stringDate);&lt;br /&gt;
            &lt;br /&gt;
            // Just skip the weekday if present&lt;br /&gt;
            int start = stringDate.indexOf(&amp;quot;,&amp;quot;);&lt;br /&gt;
            //put start after &amp;quot;, &amp;quot;&lt;br /&gt;
            start = (start == -1) ? 0 : start + 2;&lt;br /&gt;
            &lt;br /&gt;
            stringDate = stringDate.substring(start).trim();&lt;br /&gt;
            start = 0;&lt;br /&gt;
            &lt;br /&gt;
            // Get day of month&lt;br /&gt;
            int end = stringDate.indexOf(&amp;quot; &amp;quot;, start);&lt;br /&gt;
           &lt;br /&gt;
            //4  Nov 2008 10:30:05 -0400&lt;br /&gt;
            &lt;br /&gt;
            int day =1;&lt;br /&gt;
            try {&lt;br /&gt;
               day = Integer.parseInt(stringDate.substring(start, end)); &lt;br /&gt;
            } catch (NumberFormatException ex) {&lt;br /&gt;
                day = Integer.parseInt(stringDate.substring(start+3, end));&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            cal.set(Calendar.DAY_OF_MONTH,day);&lt;br /&gt;
            &lt;br /&gt;
            // Get month&lt;br /&gt;
            start = end + 1;&lt;br /&gt;
            end = stringDate.indexOf(&amp;quot; &amp;quot;, start);&lt;br /&gt;
            cal.set(Calendar.MONTH, getMonthNumber(stringDate.substring(start, end)));&lt;br /&gt;
            // Get year&lt;br /&gt;
            start = end + 1;&lt;br /&gt;
            end = stringDate.indexOf(&amp;quot; &amp;quot;, start);&lt;br /&gt;
            cal.set(Calendar.YEAR,&lt;br /&gt;
                    Integer.parseInt(stringDate.substring(start, end)));&lt;br /&gt;
            // Get hour&lt;br /&gt;
            start = end + 1;&lt;br /&gt;
            end = stringDate.indexOf(&amp;quot;:&amp;quot;, start);&lt;br /&gt;
            cal.set(Calendar.HOUR_OF_DAY,&lt;br /&gt;
                    Integer.parseInt(stringDate.substring(start, end).trim()));&lt;br /&gt;
            // Get min&lt;br /&gt;
            start = end + 1;&lt;br /&gt;
            end = stringDate.indexOf(&amp;quot;:&amp;quot;, start);&lt;br /&gt;
            cal.set(Calendar.MINUTE,&lt;br /&gt;
                    Integer.parseInt(stringDate.substring(start, end)));&lt;br /&gt;
            // Get sec&lt;br /&gt;
            start = end + 1;&lt;br /&gt;
            end = stringDate.indexOf(&amp;quot; &amp;quot;, start);&lt;br /&gt;
            cal.set(Calendar.SECOND,&lt;br /&gt;
                    Integer.parseInt(stringDate.substring(start, end)));&lt;br /&gt;
            // Get OFFSET&lt;br /&gt;
            start = end +1;&lt;br /&gt;
            end = stringDate.indexOf(&amp;quot;\r&amp;quot;, start);&lt;br /&gt;
            &lt;br /&gt;
            // Process Timezone, checking first for the actual RFC2822 format,&lt;br /&gt;
            // and then for nthe obsolete syntax.&lt;br /&gt;
            char sign = &amp;quot;+&amp;quot;;&lt;br /&gt;
            String hourDiff = &amp;quot;0&amp;quot;;&lt;br /&gt;
            String minDiff = &amp;quot;0&amp;quot;;&lt;br /&gt;
            String offset = stringDate.substring(start).trim();&lt;br /&gt;
            if (offset.startsWith(&amp;quot;+&amp;quot;) || offset.startsWith(&amp;quot;-&amp;quot;)) {&lt;br /&gt;
                if(offset.length() &amp;gt;= 5 ){&lt;br /&gt;
                    sign = offset.charAt(0);&lt;br /&gt;
                    hourDiff = offset.substring(1,3);&lt;br /&gt;
                    minDiff = offset.substring(3,5);&lt;br /&gt;
                }&lt;br /&gt;
                else if(offset.length() == 3){&lt;br /&gt;
                    sign = offset.charAt(0);&lt;br /&gt;
                    hourDiff = offset.substring(1);&lt;br /&gt;
                    minDiff = &amp;quot;00&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                // Convert offset to int&lt;br /&gt;
                hourOffset = Long.parseLong(hourDiff);&lt;br /&gt;
                minOffset = Long.parseLong(minDiff);&lt;br /&gt;
                if(sign == &amp;quot;-&amp;quot;) {&lt;br /&gt;
                    hourOffset = -hourOffset;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            else if(offset.equals(&amp;quot;EDT&amp;quot;)){&lt;br /&gt;
                hourOffset = -4;&lt;br /&gt;
            }&lt;br /&gt;
            else if(offset.equals(&amp;quot;EST&amp;quot;) || offset.equals(&amp;quot;CDT&amp;quot;)){&lt;br /&gt;
                hourOffset = -5;&lt;br /&gt;
            }&lt;br /&gt;
            else if(offset.equals(&amp;quot;CST&amp;quot;) || offset.equals(&amp;quot;MDT&amp;quot;)){&lt;br /&gt;
                hourOffset = -6;&lt;br /&gt;
            }&lt;br /&gt;
            else if(offset.equals(&amp;quot;PDT&amp;quot;) || offset.equals(&amp;quot;MST&amp;quot;)){&lt;br /&gt;
                hourOffset = -7;&lt;br /&gt;
            }&lt;br /&gt;
            else if(offset.equals(&amp;quot;PST&amp;quot;)){&lt;br /&gt;
                hourOffset = -8;&lt;br /&gt;
            }&lt;br /&gt;
            else if(offset.equals(&amp;quot;GMT&amp;quot;) || offset.equals(&amp;quot;UT&amp;quot;)){&lt;br /&gt;
                hourOffset = 0;&lt;br /&gt;
            }&lt;br /&gt;
            else if (offset.substring(0,3).equals(&amp;quot;GMT&amp;quot;) &amp;amp;&amp;amp; offset.length() &amp;gt; 3){&lt;br /&gt;
                sign = offset.charAt(3);&lt;br /&gt;
                hourDiff = offset.substring(4,6);&lt;br /&gt;
                minDiff = offset.substring(6,8);                &lt;br /&gt;
            }&lt;br /&gt;
            long millisOffset = (hourOffset * 3600000) + (minOffset * 60000);&lt;br /&gt;
     &lt;br /&gt;
            Date gmtDate = cal.getTime();&lt;br /&gt;
            long millisDate = gmtDate.getTime();&lt;br /&gt;
            &lt;br /&gt;
            millisDate -= millisOffset;&lt;br /&gt;
            &lt;br /&gt;
            gmtDate.setTime(millisDate);&lt;br /&gt;
            return gmtDate;&lt;br /&gt;
            &lt;br /&gt;
        } catch (Exception e) {&lt;br /&gt;
      &lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
            return null;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    /**&lt;br /&gt;
     * Convert the given date (GMT) into the local date.&lt;br /&gt;
     * NOTE: changes the original date too!&lt;br /&gt;
     * Should we change it to a void toLocalDate(Date) that changes the&lt;br /&gt;
     * input date only?&lt;br /&gt;
     */&lt;br /&gt;
    public static Date getDeviceLocalDate (Date gmtDate){&lt;br /&gt;
        if (null != gmtDate){&lt;br /&gt;
            /*long dateInMillis = gmtDate.getTime();&lt;br /&gt;
            Date deviceDate = new Date();&lt;br /&gt;
            deviceDate.setTime(dateInMillis+millisDeviceOffset);&lt;br /&gt;
            return deviceDate;&lt;br /&gt;
             **/&lt;br /&gt;
            gmtDate.setTime(gmtDate.getTime()+millisDeviceOffset);&lt;br /&gt;
            return gmtDate;&lt;br /&gt;
        }&lt;br /&gt;
        else {&lt;br /&gt;
            return null;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    /**&lt;br /&gt;
     * Gets a &amp;lt;code&amp;gt;Date&amp;lt;/code&amp;gt; object from a string representing a date in&lt;br /&gt;
     * &amp;quot;Zulu&amp;quot; format (yyyyMMddTHHmmssZ)&lt;br /&gt;
     *&lt;br /&gt;
     * @param utc&lt;br /&gt;
     *            date in &amp;quot;Zulu&amp;quot; format (yyyyMMddTHHmmssZ)&lt;br /&gt;
     * @return A &amp;lt;code&amp;gt;Date&amp;lt;/code&amp;gt; object obtained starting from a time in&lt;br /&gt;
     *         milliseconds from the Epoch&lt;br /&gt;
     */&lt;br /&gt;
    public static Date parseUTCDate(String utc) {&lt;br /&gt;
        &lt;br /&gt;
        int day = 0;&lt;br /&gt;
        int month = 0;&lt;br /&gt;
        int year = 0;&lt;br /&gt;
        int hour = 0;&lt;br /&gt;
        int minute = 0;&lt;br /&gt;
        int second = 0;&lt;br /&gt;
        Calendar calendar = null;&lt;br /&gt;
        &lt;br /&gt;
        day = Integer.parseInt(utc.substring(6, 8));&lt;br /&gt;
        month = Integer.parseInt(utc.substring(4, 6));&lt;br /&gt;
        year = Integer.parseInt(utc.substring(0, 4));&lt;br /&gt;
        hour = Integer.parseInt(utc.substring(9, 11));&lt;br /&gt;
        minute = Integer.parseInt(utc.substring(11, 13));&lt;br /&gt;
        second = Integer.parseInt(utc.substring(13, 15));&lt;br /&gt;
        &lt;br /&gt;
        &lt;br /&gt;
        calendar = Calendar.getInstance();&lt;br /&gt;
        &lt;br /&gt;
        calendar.set(Calendar.DAY_OF_MONTH, day);&lt;br /&gt;
        calendar.set(Calendar.MONTH, month - 1);&lt;br /&gt;
        calendar.set(Calendar.YEAR, year);&lt;br /&gt;
        calendar.set(Calendar.HOUR_OF_DAY, hour);&lt;br /&gt;
        calendar.set(Calendar.MINUTE, minute);&lt;br /&gt;
        calendar.set(Calendar.SECOND, second);&lt;br /&gt;
        &lt;br /&gt;
        &lt;br /&gt;
        Date date = calendar.getTime();&lt;br /&gt;
        long dateInMillis = date.getTime();&lt;br /&gt;
            &lt;br /&gt;
        date.setTime(dateInMillis+millisDeviceOffset);&lt;br /&gt;
            &lt;br /&gt;
        return date;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void setTimeZone(String timeZone){&lt;br /&gt;
        &lt;br /&gt;
        if (timeZone == null || timeZone.length() &amp;lt; 5) {&lt;br /&gt;
           // Log.error(&amp;quot;setTimeZone: invalid timezone &amp;quot; + timeZone);&lt;br /&gt;
        }&lt;br /&gt;
        try {&lt;br /&gt;
            deviceOffset = timeZone;&lt;br /&gt;
            String hstmz = deviceOffset.substring(1, 3);&lt;br /&gt;
            String mstmz = deviceOffset.substring(3, 5);&lt;br /&gt;
            &lt;br /&gt;
            long hhtmz = Long.parseLong(hstmz);&lt;br /&gt;
            long mmtmz = Long.parseLong(mstmz);&lt;br /&gt;
            millisDeviceOffset = (hhtmz * 3600000) + (mmtmz * 60000);&lt;br /&gt;
            if(deviceOffset.charAt(0)==&amp;quot;-&amp;quot;) {&lt;br /&gt;
                millisDeviceOffset *= -1;&lt;br /&gt;
            }   &lt;br /&gt;
        } catch(Exception e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    /**&lt;br /&gt;
     * returns a date with string representation of the month&lt;br /&gt;
     * @param date input date in the format MM/DD/YYYY HH:MMp/a&lt;br /&gt;
     * @return a representation of the date in the format &amp;lt;MonthName&amp;gt; DD, YYYY HH:MM&lt;br /&gt;
     */&lt;br /&gt;
    public static String getReplyDateString(String date) {&lt;br /&gt;
        StringBuffer ret = new StringBuffer();&lt;br /&gt;
        //Replace the month number with the month name&lt;br /&gt;
        String monthName = getMonthName(&lt;br /&gt;
                Integer.parseInt(date.substring(0, date.indexOf(&amp;quot;/&amp;quot;)))-1&lt;br /&gt;
                );&lt;br /&gt;
        String day = date.substring(date.indexOf(&amp;quot;/&amp;quot;)+1, date.lastIndexOf(&amp;quot;/&amp;quot;));&lt;br /&gt;
        String yearAndTime = date.substring(date.lastIndexOf(&amp;quot;/&amp;quot;)+1);&lt;br /&gt;
        &lt;br /&gt;
        ret.append(monthName).append(&amp;quot; &amp;quot;).append(day).append(&amp;quot;, &amp;quot;).append(yearAndTime);&lt;br /&gt;
        //Replace the slash char between DD and YYYY with &amp;quot;, &amp;quot;&lt;br /&gt;
        return ret.toString();&lt;br /&gt;
    } &lt;br /&gt;
    &lt;br /&gt;
    //------------------------------------------------------------- Private methods&lt;br /&gt;
    /**&lt;br /&gt;
     * Get the number of the month, given the name.&lt;br /&gt;
     */&lt;br /&gt;
    private static int getMonthNumber(String name) {&lt;br /&gt;
        for(int i=0, l=monthNames.length; i&amp;lt;l; i++) {&lt;br /&gt;
            if(monthNames[i].equals(name)) {&lt;br /&gt;
                return i;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        return -1;&lt;br /&gt;
    }&lt;br /&gt;
    /**&lt;br /&gt;
     * Get the name of the month, given the number.&lt;br /&gt;
     */&lt;br /&gt;
    private static String getMonthName(int number) {&lt;br /&gt;
        if(number&amp;gt;=0 &amp;amp;&amp;amp; number&amp;lt;monthNames.length) {&lt;br /&gt;
            return monthNames[number];&lt;br /&gt;
        }&lt;br /&gt;
        else return null;&lt;br /&gt;
    }&lt;br /&gt;
    private static String getAMPM(Calendar cal) {&lt;br /&gt;
        return (cal.get(Calendar.AM_PM)==Calendar.AM)?&amp;quot;a&amp;quot;:&amp;quot;p&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    /**&lt;br /&gt;
     * Returns a string representation of number with at least 2 digits&lt;br /&gt;
     */&lt;br /&gt;
    private static String printTwoDigits(int number) {&lt;br /&gt;
        if (number&amp;gt;9) {&lt;br /&gt;
            return String.valueOf(number);&lt;br /&gt;
        } else {&lt;br /&gt;
            return &amp;quot;0&amp;quot;+number;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
   &lt;br /&gt;
    &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Convert lines into the canonical MIME format, that is, terminate lines with CRLF ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
/*&lt;br /&gt;
 * @(#)CRLFOutputStream.java  1.3 01/05/23&lt;br /&gt;
 *&lt;br /&gt;
 * Copyright 1997-2000 Sun Microsystems, Inc. All Rights Reserved.&lt;br /&gt;
 *&lt;br /&gt;
 * Redistribution and use in source and binary forms, with or without&lt;br /&gt;
 * modification, are permitted provided that the following conditions&lt;br /&gt;
 * are met:&lt;br /&gt;
 * &lt;br /&gt;
 * - Redistributions of source code must retain the above copyright&lt;br /&gt;
 *   notice, this list of conditions and the following disclaimer.&lt;br /&gt;
 * &lt;br /&gt;
 * - Redistribution in binary form must reproduce the above copyright&lt;br /&gt;
 *   notice, this list of conditions and the following disclaimer in the&lt;br /&gt;
 *   documentation and/or other materials provided with the distribution.&lt;br /&gt;
 * &lt;br /&gt;
 * Neither the name of Sun Microsystems, Inc. or the names of contributors&lt;br /&gt;
 * may be used to endorse or promote products derived from this software&lt;br /&gt;
 * without specific prior written permission.&lt;br /&gt;
 * &lt;br /&gt;
 * This software is provided &amp;quot;AS IS,&amp;quot; without a warranty of any kind. ALL&lt;br /&gt;
 * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,&lt;br /&gt;
 * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A&lt;br /&gt;
 * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND&lt;br /&gt;
 * ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES OR LIABILITIES&lt;br /&gt;
 * SUFFERED BY LICENSEE AS A RESULT OF  OR RELATING TO USE, MODIFICATION&lt;br /&gt;
 * OR DISTRIBUTION OF THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL&lt;br /&gt;
 * SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR&lt;br /&gt;
 * FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE&lt;br /&gt;
 * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,&lt;br /&gt;
 * ARISING OUT OF THE USE OF OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS&lt;br /&gt;
 * BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.&lt;br /&gt;
 * &lt;br /&gt;
 * You acknowledge that Software is not designed, licensed or intended&lt;br /&gt;
 * for use in the design, construction, operation or maintenance of any&lt;br /&gt;
 * nuclear facility.&lt;br /&gt;
 */&lt;br /&gt;
import java.io.FilterOutputStream;&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import java.io.OutputStream;&lt;br /&gt;
/**&lt;br /&gt;
 * Convert lines into the canonical MIME format, that is, terminate lines with&lt;br /&gt;
 * CRLF.&lt;br /&gt;
 * &amp;lt;p&amp;gt;&lt;br /&gt;
 * &lt;br /&gt;
 * This stream can be used with the Part.writeTo and Message.writeTo methods to&lt;br /&gt;
 * generate the canonical MIME format of the data for the purpose of (e.g.)&lt;br /&gt;
 * sending it via SMTP or computing a digital signature.&lt;br /&gt;
 */&lt;br /&gt;
public class CRLFOutputStream extends FilterOutputStream {&lt;br /&gt;
  protected int lastb = -1;&lt;br /&gt;
  protected static byte[] newline;&lt;br /&gt;
  static {&lt;br /&gt;
    newline = new byte[2];&lt;br /&gt;
    newline[0] = (byte) &amp;quot;\r&amp;quot;;&lt;br /&gt;
    newline[1] = (byte) &amp;quot;\n&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  public CRLFOutputStream(OutputStream os) {&lt;br /&gt;
    super(os);&lt;br /&gt;
  }&lt;br /&gt;
  public void write(int b) throws IOException {&lt;br /&gt;
    if (b == &amp;quot;\r&amp;quot;) {&lt;br /&gt;
      out.write(newline);&lt;br /&gt;
    } else if (b == &amp;quot;\n&amp;quot;) {&lt;br /&gt;
      if (lastb != &amp;quot;\r&amp;quot;)&lt;br /&gt;
        out.write(newline);&lt;br /&gt;
    } else {&lt;br /&gt;
      out.write(b);&lt;br /&gt;
    }&lt;br /&gt;
    lastb = b;&lt;br /&gt;
  }&lt;br /&gt;
  public void write(byte b[]) throws IOException {&lt;br /&gt;
    write(b, 0, b.length);&lt;br /&gt;
  }&lt;br /&gt;
  public void write(byte b[], int off, int len) throws IOException {&lt;br /&gt;
    int start = off;&lt;br /&gt;
    len += off;&lt;br /&gt;
    for (int i = start; i &amp;lt; len; i++) {&lt;br /&gt;
      if (b[i] == &amp;quot;\r&amp;quot;) {&lt;br /&gt;
        out.write(b, start, i - start);&lt;br /&gt;
        out.write(newline);&lt;br /&gt;
        start = i + 1;&lt;br /&gt;
      } else if (b[i] == &amp;quot;\n&amp;quot;) {&lt;br /&gt;
        if (lastb != &amp;quot;\r&amp;quot;) {&lt;br /&gt;
          out.write(b, start, i - start);&lt;br /&gt;
          out.write(newline);&lt;br /&gt;
        }&lt;br /&gt;
        start = i + 1;&lt;br /&gt;
      }&lt;br /&gt;
      lastb = b[i];&lt;br /&gt;
    }&lt;br /&gt;
    if ((len - start) &amp;gt; 0)&lt;br /&gt;
      out.write(b, start, len - start);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
           &lt;br /&gt;
         &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Convert the various newline conventions to the local platform&amp;quot;s newline convention ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
/*&lt;br /&gt;
 * @(#)NewlineOutputStream.java 1.3 01/05/23&lt;br /&gt;
 *&lt;br /&gt;
 * Copyright 1997-2000 Sun Microsystems, Inc. All Rights Reserved.&lt;br /&gt;
 *&lt;br /&gt;
 * Redistribution and use in source and binary forms, with or without&lt;br /&gt;
 * modification, are permitted provided that the following conditions&lt;br /&gt;
 * are met:&lt;br /&gt;
 * &lt;br /&gt;
 * - Redistributions of source code must retain the above copyright&lt;br /&gt;
 *   notice, this list of conditions and the following disclaimer.&lt;br /&gt;
 * &lt;br /&gt;
 * - Redistribution in binary form must reproduce the above copyright&lt;br /&gt;
 *   notice, this list of conditions and the following disclaimer in the&lt;br /&gt;
 *   documentation and/or other materials provided with the distribution.&lt;br /&gt;
 * &lt;br /&gt;
 * Neither the name of Sun Microsystems, Inc. or the names of contributors&lt;br /&gt;
 * may be used to endorse or promote products derived from this software&lt;br /&gt;
 * without specific prior written permission.&lt;br /&gt;
 * &lt;br /&gt;
 * This software is provided &amp;quot;AS IS,&amp;quot; without a warranty of any kind. ALL&lt;br /&gt;
 * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,&lt;br /&gt;
 * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A&lt;br /&gt;
 * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND&lt;br /&gt;
 * ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES OR LIABILITIES&lt;br /&gt;
 * SUFFERED BY LICENSEE AS A RESULT OF  OR RELATING TO USE, MODIFICATION&lt;br /&gt;
 * OR DISTRIBUTION OF THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL&lt;br /&gt;
 * SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR&lt;br /&gt;
 * FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE&lt;br /&gt;
 * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,&lt;br /&gt;
 * ARISING OUT OF THE USE OF OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS&lt;br /&gt;
 * BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.&lt;br /&gt;
 * &lt;br /&gt;
 * You acknowledge that Software is not designed, licensed or intended&lt;br /&gt;
 * for use in the design, construction, operation or maintenance of any&lt;br /&gt;
 * nuclear facility.&lt;br /&gt;
 */&lt;br /&gt;
import java.io.FilterOutputStream;&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import java.io.OutputStream;&lt;br /&gt;
/**&lt;br /&gt;
 * Convert the various newline conventions to the local platform&amp;quot;s newline&lt;br /&gt;
 * convention.&lt;br /&gt;
 * &amp;lt;p&amp;gt;&lt;br /&gt;
 * &lt;br /&gt;
 * This stream can be used with the Message.writeTo method to generate a message&lt;br /&gt;
 * that uses the local plaform&amp;quot;s line terminator for the purpose of (e.g.)&lt;br /&gt;
 * saving the message to a local file.&lt;br /&gt;
 */&lt;br /&gt;
public class NewlineOutputStream extends FilterOutputStream {&lt;br /&gt;
  private int lastb = -1;&lt;br /&gt;
  private static byte[] newline;&lt;br /&gt;
  public NewlineOutputStream(OutputStream os) {&lt;br /&gt;
    super(os);&lt;br /&gt;
    if (newline == null) {&lt;br /&gt;
      String s = System.getProperty(&amp;quot;line.separator&amp;quot;);&lt;br /&gt;
      if (s == null || s.length() &amp;lt;= 0)&lt;br /&gt;
        s = &amp;quot;\n&amp;quot;;&lt;br /&gt;
      newline = new byte[s.length()];&lt;br /&gt;
      s.getBytes(0, s.length(), newline, 0);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public void write(int b) throws IOException {&lt;br /&gt;
    if (b == &amp;quot;\r&amp;quot;) {&lt;br /&gt;
      out.write(newline);&lt;br /&gt;
    } else if (b == &amp;quot;\n&amp;quot;) {&lt;br /&gt;
      if (lastb != &amp;quot;\r&amp;quot;)&lt;br /&gt;
        out.write(newline);&lt;br /&gt;
    } else {&lt;br /&gt;
      out.write(b);&lt;br /&gt;
    }&lt;br /&gt;
    lastb = b;&lt;br /&gt;
  }&lt;br /&gt;
  public void write(byte b[]) throws IOException {&lt;br /&gt;
    write(b, 0, b.length);&lt;br /&gt;
  }&lt;br /&gt;
  public void write(byte b[], int off, int len) throws IOException {&lt;br /&gt;
    for (int i = 0; i &amp;lt; len; i++) {&lt;br /&gt;
      write(b[off + i]);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
         &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;/div&gt;</summary>
			</entry>

	</feed>