Or just do an svn cp ? Bye, Norman 2010/12/17 Niklas Therning : > I did an svn merge but I got a conflict on the entire files so I assumed > that it had changed too much or that whitespaces had changed or something. > But I can look into it later today. > > /Niklas > > On 12/17/2010 11:04 AM, Norman Maurer wrote: >> >> Hi there, >> >> would it be possible to really only merge the changes ? It seems like >> it replaced all the old content so history is almost lost :( >> >> Bye, >> Norman >> >> >> 2010/12/17: >>> >>> Author: niklas >>> Date: Fri Dec 17 10:02:31 2010 >>> New Revision: 1050333 >>> >>> URL: http://svn.apache.org/viewvc?rev=1050333&view=rev >>> Log: >>> Merged in changes to DecoderUtil and DecoderUtilTest from revision 809204 >>> (MIME4J-138). >>> >>> Modified: >>> >>>  james/mime4j/branches/apache-mime4j-0.6/src/main/java/org/apache/james/mime4j/codec/DecoderUtil.java >>>   (contents, props changed) >>> >>>  james/mime4j/branches/apache-mime4j-0.6/src/test/java/org/apache/james/mime4j/codec/DecoderUtilTest.java >>>   (contents, props changed) >>> >>> Modified: >>> james/mime4j/branches/apache-mime4j-0.6/src/main/java/org/apache/james/mime4j/codec/DecoderUtil.java >>> URL: >>> http://svn.apache.org/viewvc/james/mime4j/branches/apache-mime4j-0.6/src/main/java/org/apache/james/mime4j/codec/DecoderUtil.java?rev=1050333&r1=1050332&r2=1050333&view=diff >>> >>> ============================================================================== >>> --- >>> james/mime4j/branches/apache-mime4j-0.6/src/main/java/org/apache/james/mime4j/codec/DecoderUtil.java >>> (original) >>> +++ >>> james/mime4j/branches/apache-mime4j-0.6/src/main/java/org/apache/james/mime4j/codec/DecoderUtil.java >>> Fri Dec 17 10:02:31 2010 >>> @@ -1,252 +1,253 @@ >>> -/**************************************************************** >>> - * Licensed to the Apache Software Foundation (ASF) under one   * >>> - * or more contributor license agreements.  See the NOTICE file * >>> - * distributed with this work for additional information        * >>> - * regarding copyright ownership.  The ASF licenses this file   * >>> - * to you under the Apache License, Version 2.0 (the            * >>> - * "License"); you may not use this file except in compliance   * >>> - * with the License.  You may obtain a copy of the License at   * >>> - *                                                              * >>> - *   http://www.apache.org/licenses/LICENSE-2.0                 * >>> - *                                                              * >>> - * Unless required by applicable law or agreed to in writing,   * >>> - * software distributed under the License is distributed on an  * >>> - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       * >>> - * KIND, either express or implied.  See the License for the    * >>> - * specific language governing permissions and limitations      * >>> - * under the License.                                           * >>> - ****************************************************************/ >>> - >>> -package org.apache.james.mime4j.codec; >>> - >>> -import java.io.ByteArrayInputStream; >>> -import java.io.ByteArrayOutputStream; >>> -import java.io.IOException; >>> -import java.io.UnsupportedEncodingException; >>> - >>> -import org.apache.commons.logging.Log; >>> -import org.apache.commons.logging.LogFactory; >>> -import org.apache.james.mime4j.util.CharsetUtil; >>> - >>> -/** >>> - * Static methods for decoding strings, byte arrays and encoded words. >>> - */ >>> -public class DecoderUtil { >>> -    private static Log log = LogFactory.getLog(DecoderUtil.class); >>> - >>> -    /** >>> -     * Decodes a string containing quoted-printable encoded data. >>> -     * >>> -     * @param s the string to decode. >>> -     * @return the decoded bytes. >>> -     */ >>> -    public static byte[] decodeBaseQuotedPrintable(String s) { >>> -        ByteArrayOutputStream baos = new ByteArrayOutputStream(); >>> - >>> -        try { >>> -            byte[] bytes = s.getBytes("US-ASCII"); >>> - >>> -            QuotedPrintableInputStream is = new >>> QuotedPrintableInputStream( >>> -                                               new >>> ByteArrayInputStream(bytes)); >>> - >>> -            int b = 0; >>> -            while ((b = is.read()) != -1) { >>> -                baos.write(b); >>> -            } >>> -        } catch (IOException e) { >>> -            /* >>> -             * This should never happen! >>> -             */ >>> -            log.error(e); >>> -        } >>> - >>> -        return baos.toByteArray(); >>> -    } >>> - >>> -    /** >>> -     * Decodes a string containing base64 encoded data. >>> -     * >>> -     * @param s the string to decode. >>> -     * @return the decoded bytes. >>> -     */ >>> -    public static byte[] decodeBase64(String s) { >>> -        ByteArrayOutputStream baos = new ByteArrayOutputStream(); >>> - >>> -        try { >>> -            byte[] bytes = s.getBytes("US-ASCII"); >>> - >>> -            Base64InputStream is = new Base64InputStream( >>> -                                        new >>> ByteArrayInputStream(bytes)); >>> - >>> -            int b = 0; >>> -            while ((b = is.read()) != -1) { >>> -                baos.write(b); >>> -            } >>> -        } catch (IOException e) { >>> -            /* >>> -             * This should never happen! >>> -             */ >>> -            log.error(e); >>> -        } >>> - >>> -        return baos.toByteArray(); >>> -    } >>> - >>> -    /** >>> -     * Decodes an encoded word encoded with the 'B' encoding (described >>> in >>> -     * RFC 2047) found in a header field body. >>> -     * >>> -     * @param encodedWord the encoded word to decode. >>> -     * @param charset the Java charset to use. >>> -     * @return the decoded string. >>> -     * @throws UnsupportedEncodingException if the given Java charset >>> isn't >>> -     *         supported. >>> -     */ >>> -    public static String decodeB(String encodedWord, String charset) >>> -            throws UnsupportedEncodingException { >>> - >>> -        return new String(decodeBase64(encodedWord), charset); >>> -    } >>> - >>> -    /** >>> -     * Decodes an encoded word encoded with the 'Q' encoding (described >>> in >>> -     * RFC 2047) found in a header field body. >>> -     * >>> -     * @param encodedWord the encoded word to decode. >>> -     * @param charset the Java charset to use. >>> -     * @return the decoded string. >>> -     * @throws UnsupportedEncodingException if the given Java charset >>> isn't >>> -     *         supported. >>> -     */ >>> -    public static String decodeQ(String encodedWord, String charset) >>> -            throws UnsupportedEncodingException { >>> - >>> -        /* >>> -         * Replace _ with =20 >>> -         */ >>> -        StringBuilder sb = new StringBuilder(128); >>> -        for (int i = 0; i<  encodedWord.length(); i++) { >>> -            char c = encodedWord.charAt(i); >>> -            if (c == '_') { >>> -                sb.append("=20"); >>> -            } else { >>> -                sb.append(c); >>> -            } >>> -        } >>> - >>> -        return new String(decodeBaseQuotedPrintable(sb.toString()), >>> charset); >>> -    } >>> - >>> -    /** >>> -     * Decodes a string containing encoded words as defined by RFC 2047. >>> -     * Encoded words in have the form >>> -     * =?charset?enc?Encoded word?= where enc is either 'Q' or 'q' for >>> -     * quoted-printable and 'B' or 'b' for Base64. >>> -     * >>> -     * @param body the string to decode. >>> -     * @return the decoded string. >>> -     */ >>> -    public static String decodeEncodedWords(String body) { >>> -        int previousEnd = 0; >>> -        boolean previousWasEncoded = false; >>> - >>> -        StringBuilder sb = new StringBuilder(); >>> - >>> -        while (true) { >>> -            int begin = body.indexOf("=?", previousEnd); >>> -            int end = begin == -1 ? -1 : body.indexOf("?=", begin + 2); >>> -            if (end == -1) { >>> -                if (previousEnd == 0) >>> -                    return body; >>> - >>> -                sb.append(body.substring(previousEnd)); >>> -                return sb.toString(); >>> -            } >>> -            end += 2; >>> - >>> -            String sep = body.substring(previousEnd, begin); >>> - >>> -            String decoded = decodeEncodedWord(body, begin, end); >>> -            if (decoded == null) { >>> -                sb.append(sep); >>> -                sb.append(body.substring(begin, end)); >>> -            } else { >>> -                if (!previousWasEncoded || >>> !CharsetUtil.isWhitespace(sep)) { >>> -                    sb.append(sep); >>> -                } >>> -                sb.append(decoded); >>> -            } >>> - >>> -            previousEnd = end; >>> -            previousWasEncoded = decoded != null; >>> -        } >>> -    } >>> - >>> -    // return null on error >>> -    private static String decodeEncodedWord(String body, int begin, int >>> end) { >>> -        int qm1 = body.indexOf('?', begin + 2); >>> -        if (qm1 == end - 2) >>> -            return null; >>> - >>> -        int qm2 = body.indexOf('?', qm1 + 1); >>> -        if (qm2 == end - 2) >>> -            return null; >>> - >>> -        String mimeCharset = body.substring(begin + 2, qm1); >>> -        String encoding = body.substring(qm1 + 1, qm2); >>> -        String encodedText = body.substring(qm2 + 1, end - 2); >>> - >>> -        String charset = CharsetUtil.toJavaCharset(mimeCharset); >>> -        if (charset == null) { >>> -            if (log.isWarnEnabled()) { >>> -                log.warn("MIME charset '" + mimeCharset + "' in encoded >>> word '" >>> -                        + body.substring(begin, end) + "' doesn't have a >>> " >>> -                        + "corresponding Java charset"); >>> -            } >>> -            return null; >>> -        } else if (!CharsetUtil.isDecodingSupported(charset)) { >>> -            if (log.isWarnEnabled()) { >>> -                log.warn("Current JDK doesn't support decoding of >>> charset '" >>> -                        + charset + "' (MIME charset '" + mimeCharset >>> -                        + "' in encoded word '" + body.substring(begin, >>> end) >>> -                        + "')"); >>> -            } >>> -            return null; >>> -        } >>> - >>> -        if (encodedText.length() == 0) { >>> -            if (log.isWarnEnabled()) { >>> -                log.warn("Missing encoded text in encoded word: '" >>> -                        + body.substring(begin, end) + "'"); >>> -            } >>> -            return null; >>> -        } >>> - >>> -        try { >>> -            if (encoding.equalsIgnoreCase("Q")) { >>> -                return DecoderUtil.decodeQ(encodedText, charset); >>> -            } else if (encoding.equalsIgnoreCase("B")) { >>> -                return DecoderUtil.decodeB(encodedText, charset); >>> -            } else { >>> -                if (log.isWarnEnabled()) { >>> -                    log.warn("Warning: Unknown encoding in encoded word >>> '" >>> -                            + body.substring(begin, end) + "'"); >>> -                } >>> -                return null; >>> -            } >>> -        } catch (UnsupportedEncodingException e) { >>> -            // should not happen because of isDecodingSupported check >>> above >>> -            if (log.isWarnEnabled()) { >>> -                log.warn("Unsupported encoding in encoded word '" >>> -                        + body.substring(begin, end) + "'", e); >>> -            } >>> -            return null; >>> -        } catch (RuntimeException e) { >>> -            if (log.isWarnEnabled()) { >>> -                log.warn("Could not decode encoded word '" >>> -                        + body.substring(begin, end) + "'", e); >>> -            } >>> -            return null; >>> -        } >>> -    } >>> -} >>> +/**************************************************************** >>> + * Licensed to the Apache Software Foundation (ASF) under one   * >>> + * or more contributor license agreements.  See the NOTICE file * >>> + * distributed with this work for additional information        * >>> + * regarding copyright ownership.  The ASF licenses this file   * >>> + * to you under the Apache License, Version 2.0 (the            * >>> + * "License"); you may not use this file except in compliance   * >>> + * with the License.  You may obtain a copy of the License at   * >>> + *                                                              * >>> + *   http://www.apache.org/licenses/LICENSE-2.0                 * >>> + *                                                              * >>> + * Unless required by applicable law or agreed to in writing,   * >>> + * software distributed under the License is distributed on an  * >>> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       * >>> + * KIND, either express or implied.  See the License for the    * >>> + * specific language governing permissions and limitations      * >>> + * under the License.                                           * >>> + ****************************************************************/ >>> + >>> +package org.apache.james.mime4j.codec; >>> + >>> +import java.io.ByteArrayInputStream; >>> +import java.io.ByteArrayOutputStream; >>> +import java.io.IOException; >>> +import java.io.UnsupportedEncodingException; >>> +import java.util.regex.Matcher; >>> +import java.util.regex.Pattern; >>> + >>> +import org.apache.commons.logging.Log; >>> +import org.apache.commons.logging.LogFactory; >>> +import org.apache.james.mime4j.util.CharsetUtil; >>> + >>> +/** >>> + * Static methods for decoding strings, byte arrays and encoded words. >>> + */ >>> +public class DecoderUtil { >>> +    private static Log log = LogFactory.getLog(DecoderUtil.class); >>> + >>> +    private static final Pattern PATTERN_ENCODED_WORD = Pattern.compile( >>> +            "(.*?)=\\?([^\\?]+?)\\?(\\w)\\?([^\\?]+?)\\?=", >>> Pattern.DOTALL); >>> + >>> +    /** >>> +     * Decodes a string containing quoted-printable encoded data. >>> +     * >>> +     * @param s the string to decode. >>> +     * @return the decoded bytes. >>> +     */ >>> +    public static byte[] decodeQuotedPrintable(String s) { >>> +        ByteArrayOutputStream baos = new ByteArrayOutputStream(); >>> + >>> +        try { >>> +            byte[] bytes = s.getBytes("US-ASCII"); >>> + >>> +            QuotedPrintableInputStream is = new >>> QuotedPrintableInputStream( >>> +                                               new >>> ByteArrayInputStream(bytes)); >>> + >>> +            int b = 0; >>> +            while ((b = is.read()) != -1) { >>> +                baos.write(b); >>> +            } >>> +        } catch (IOException e) { >>> +            // This should never happen! >>> +            log.error(e); >>> +            throw new IllegalStateException(e); >>> +        } >>> + >>> +        return baos.toByteArray(); >>> +    } >>> + >>> +    /** >>> +     * Decodes a string containing base64 encoded data. >>> +     * >>> +     * @param s the string to decode. >>> +     * @return the decoded bytes. >>> +     */ >>> +    public static byte[] decodeBase64(String s) { >>> +        ByteArrayOutputStream baos = new ByteArrayOutputStream(); >>> + >>> +        try { >>> +            byte[] bytes = s.getBytes("US-ASCII"); >>> + >>> +            Base64InputStream is = new Base64InputStream( >>> +                                        new >>> ByteArrayInputStream(bytes)); >>> + >>> +            int b = 0; >>> +            while ((b = is.read()) != -1) { >>> +                baos.write(b); >>> +            } >>> +        } catch (IOException e) { >>> +            // This should never happen! >>> +            log.error(e); >>> +            throw new IllegalStateException(e); >>> +        } >>> + >>> +        return baos.toByteArray(); >>> +    } >>> + >>> +    /** >>> +     * Decodes an encoded text encoded with the 'B' encoding (described >>> in >>> +     * RFC 2047) found in a header field body. >>> +     * >>> +     * @param encodedText the encoded text to decode. >>> +     * @param charset the Java charset to use. >>> +     * @return the decoded string. >>> +     * @throws UnsupportedEncodingException if the given Java charset >>> isn't >>> +     *         supported. >>> +     */ >>> +    public static String decodeB(String encodedText, String charset) >>> +            throws UnsupportedEncodingException { >>> +        byte[] decodedBytes = decodeBase64(encodedText); >>> +        return new String(decodedBytes, charset); >>> +    } >>> + >>> +    /** >>> +     * Decodes an encoded text encoded with the 'Q' encoding (described >>> in >>> +     * RFC 2047) found in a header field body. >>> +     * >>> +     * @param encodedText the encoded text to decode. >>> +     * @param charset the Java charset to use. >>> +     * @return the decoded string. >>> +     * @throws UnsupportedEncodingException if the given Java charset >>> isn't >>> +     *         supported. >>> +     */ >>> +    public static String decodeQ(String encodedText, String charset) >>> +            throws UnsupportedEncodingException { >>> +        encodedText = replaceUnderscores(encodedText); >>> + >>> +        byte[] decodedBytes = decodeQuotedPrintable(encodedText); >>> +        return new String(decodedBytes, charset); >>> +    } >>> + >>> +    /** >>> +     * Decodes a string containing encoded words as defined by RFC 2047. >>> Encoded >>> +     * words have the form =?charset?enc?encoded-text?= where enc is >>> either 'Q' >>> +     * or 'q' for quoted-printable and 'B' or 'b' for base64. >>> +     * >>> +     * @param body the string to decode. >>> +     * @return the decoded string. >>> +     */ >>> +    public static String decodeEncodedWords(String body) { >>> +        int tailIndex = 0; >>> +        boolean lastMatchValid = false; >>> + >>> +        StringBuilder sb = new StringBuilder(); >>> + >>> +        for (Matcher matcher = PATTERN_ENCODED_WORD.matcher(body); >>> matcher.find();) { >>> +            String separator = matcher.group(1); >>> +            String mimeCharset = matcher.group(2); >>> +            String encoding = matcher.group(3); >>> +            String encodedText = matcher.group(4); >>> + >>> +            String decoded = tryDecodeEncodedWord(mimeCharset, encoding, >>> encodedText); >>> +            if (decoded == null) { >>> +                sb.append(matcher.group(0)); >>> +            } else { >>> +                if (!lastMatchValid || >>> !CharsetUtil.isWhitespace(separator)) { >>> +                    sb.append(separator); >>> +                } >>> +                sb.append(decoded); >>> +            } >>> + >>> +            tailIndex = matcher.end(); >>> +            lastMatchValid = decoded != null; >>> +        } >>> + >>> +        if (tailIndex == 0) { >>> +            return body; >>> +        } else { >>> +            sb.append(body.substring(tailIndex)); >>> +            return sb.toString(); >>> +        } >>> +    } >>> + >>> +    // return null on error >>> +    private static String tryDecodeEncodedWord(final String mimeCharset, >>> +            final String encoding, final String encodedText) { >>> +        String charset = CharsetUtil.toJavaCharset(mimeCharset); >>> +        if (charset == null) { >>> +            if (log.isWarnEnabled()) { >>> +                log.warn("MIME charset '" + mimeCharset + "' in encoded >>> word '" >>> +                        + recombine(mimeCharset, encoding, encodedText) >>> + "' doesn't have a " >>> +                        + "corresponding Java charset"); >>> +            } >>> +            return null; >>> +        } else if (!CharsetUtil.isDecodingSupported(charset)) { >>> +            if (log.isWarnEnabled()) { >>> +                log.warn("Current JDK doesn't support decoding of >>> charset '" >>> +                        + charset + "' (MIME charset '" + mimeCharset >>> +                        + "' in encoded word '" + recombine(mimeCharset, >>> encoding, encodedText) >>> +                        + "')"); >>> +            } >>> +            return null; >>> +        } >>> + >>> +        if (encodedText.length() == 0) { >>> +            if (log.isWarnEnabled()) { >>> +                log.warn("Missing encoded text in encoded word: '" >>> +                        + recombine(mimeCharset, encoding, encodedText) >>> + "'"); >>> +            } >>> +            return null; >>> +        } >>> + >>> +        try { >>> +            if (encoding.equalsIgnoreCase("Q")) { >>> +                return DecoderUtil.decodeQ(encodedText, charset); >>> +            } else if (encoding.equalsIgnoreCase("B")) { >>> +                return DecoderUtil.decodeB(encodedText, charset); >>> +            } else { >>> +                if (log.isWarnEnabled()) { >>> +                    log.warn("Warning: Unknown encoding in encoded word >>> '" >>> +                            + recombine(mimeCharset, encoding, >>> encodedText) + "'"); >>> +                } >>> +                return null; >>> +            } >>> +        } catch (UnsupportedEncodingException e) { >>> +            // should not happen because of isDecodingSupported check >>> above >>> +            if (log.isWarnEnabled()) { >>> +                log.warn("Unsupported encoding in encoded word '" >>> +                        + recombine(mimeCharset, encoding, encodedText) >>> + "'", e); >>> +            } >>> +            return null; >>> +        } catch (RuntimeException e) { >>> +            if (log.isWarnEnabled()) { >>> +                log.warn("Could not decode encoded word '" >>> +                        + recombine(mimeCharset, encoding, encodedText) >>> + "'", e); >>> +            } >>> +            return null; >>> +        } >>> +    } >>> + >>> +    private static String recombine(final String mimeCharset, >>> +            final String encoding, final String encodedText) { >>> +        return "=?" + mimeCharset + "?" + encoding + "?" + encodedText + >>> "?="; >>> +    } >>> + >>> +    // Replace _ with =20 >>> +    private static String replaceUnderscores(String str) { >>> +        // probably faster than String#replace(CharSequence, >>> CharSequence) >>> + >>> +        StringBuilder sb = new StringBuilder(128); >>> + >>> +        for (int i = 0; i<  str.length(); i++) { >>> +            char c = str.charAt(i); >>> +            if (c == '_') { >>> +                sb.append("=20"); >>> +            } else { >>> +                sb.append(c); >>> +            } >>> +        } >>> + >>> +        return sb.toString(); >>> +    } >>> +} >>> >>> Propchange: >>> james/mime4j/branches/apache-mime4j-0.6/src/main/java/org/apache/james/mime4j/codec/DecoderUtil.java >>> >>> ------------------------------------------------------------------------------ >>> --- svn:mergeinfo (added) >>> +++ svn:mergeinfo Fri Dec 17 10:02:31 2010 >>> @@ -0,0 +1 @@ >>> >>> +/james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/codec/DecoderUtil.java:809204 >>> >>> Modified: >>> james/mime4j/branches/apache-mime4j-0.6/src/test/java/org/apache/james/mime4j/codec/DecoderUtilTest.java >>> URL: >>> http://svn.apache.org/viewvc/james/mime4j/branches/apache-mime4j-0.6/src/test/java/org/apache/james/mime4j/codec/DecoderUtilTest.java?rev=1050333&r1=1050332&r2=1050333&view=diff >>> >>> ============================================================================== >>> --- >>> james/mime4j/branches/apache-mime4j-0.6/src/test/java/org/apache/james/mime4j/codec/DecoderUtilTest.java >>> (original) >>> +++ >>> james/mime4j/branches/apache-mime4j-0.6/src/test/java/org/apache/james/mime4j/codec/DecoderUtilTest.java >>> Fri Dec 17 10:02:31 2010 >>> @@ -1,105 +1,127 @@ >>> -/**************************************************************** >>> - * Licensed to the Apache Software Foundation (ASF) under one   * >>> - * or more contributor license agreements.  See the NOTICE file * >>> - * distributed with this work for additional information        * >>> - * regarding copyright ownership.  The ASF licenses this file   * >>> - * to you under the Apache License, Version 2.0 (the            * >>> - * "License"); you may not use this file except in compliance   * >>> - * with the License.  You may obtain a copy of the License at   * >>> - *                                                              * >>> - *   http://www.apache.org/licenses/LICENSE-2.0                 * >>> - *                                                              * >>> - * Unless required by applicable law or agreed to in writing,   * >>> - * software distributed under the License is distributed on an  * >>> - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       * >>> - * KIND, either express or implied.  See the License for the    * >>> - * specific language governing permissions and limitations      * >>> - * under the License.                                           * >>> - ****************************************************************/ >>> - >>> -package org.apache.james.mime4j.codec; >>> - >>> -import java.io.UnsupportedEncodingException; >>> - >>> -import junit.framework.TestCase; >>> - >>> -import org.apache.log4j.BasicConfigurator; >>> - >>> -public class DecoderUtilTest extends TestCase { >>> - >>> -    @Override >>> -    public void setUp() { >>> -        BasicConfigurator.resetConfiguration(); >>> -        BasicConfigurator.configure(); >>> -    } >>> -    /* >>> -    public void testDecodeEncodedWords() { >>> -        String s = >>> "=?ISO-2022-JP?B?GyRCTCQbKEobJEI+NRsoShskQkJ6GyhKGyRCOS0bKEo=?= " >>> -                 + >>> "=?ISO-2022-JP?B?GyRCOXAbKEobJEIiKBsoShskQiU1GyhKGyRCJSQbKEo=?= " >>> -                 + >>> "=?ISO-2022-JP?B?GyRCJUkbKEobJEIlUxsoShskQiU4GyhKGyRCJU0bKEo=?= " >>> -                 + >>> "=?ISO-2022-JP?B?GyRCJTkbKEobJEIkThsoShskQjdoGyhKGyRCRGobKEo=?= " >>> -                 + >>> "=?ISO-2022-JP?B?GyRCSEcbKEobJEIkRxsoShskQiQ5GyhKGyRCISobKEo=?="; >>> - >>> -        s = DecoderUtil.decodeEncodedWords(s); >>> -        System.out.println(s); >>> -    }*/ >>> - >>> -    public void testDecodeB() throws UnsupportedEncodingException { >>> -        String s = DecoderUtil.decodeB("VGhpcyBpcyB0aGUgcGxhaW4gd" >>> -                    + "GV4dCBtZXNzYWdlIQ==", "ISO8859-1"); >>> -        assertEquals("This is the plain text message!", s); >>> -    } >>> - >>> - >>> -    public void testDecodeQ() throws UnsupportedEncodingException { >>> -        String s = DecoderUtil.decodeQ("=e1_=e2=09=E3_=E4_", >>> -                                                         "ISO8859-1"); >>> -        assertEquals("\u00e1 \u00e2\t\u00e3 \u00e4 ", s); >>> -    } >>> - >>> -    public void testDecodeEncodedWords() { >>> -        assertEquals("", DecoderUtil.decodeEncodedWords("")); >>> -        assertEquals("Yada yada", DecoderUtil.decodeEncodedWords("Yada >>> yada")); >>> -        assertEquals("  \u00e1\u00e2\u00e3\t\u00e4", >>> - >>>  DecoderUtil.decodeEncodedWords("=?iso-8859-1?Q?_=20=e1=e2=E3=09=E4?=")); >>> -        assertEquals("Word 1 '  \u00e2\u00e3\t\u00e4'. Word 2 ' >>>  \u00e2\u00e3\t\u00e4'", >>> -                DecoderUtil.decodeEncodedWords("Word 1 >>> '=?iso-8859-1?Q?_=20=e2=E3=09=E4?=" >>> -                        + "'. Word 2 >>> '=?iso-8859-1?q?_=20=e2=E3=09=E4?='")); >>> -        assertEquals("=?iso-8859-YADA?Q?_=20=t1=e2=E3=09=E4?=", >>> - >>>  DecoderUtil.decodeEncodedWords("=?iso-8859-YADA?Q?_=20=t1=e2=E3=09=E4?=")); >>> -        assertEquals("A short text", >>> - >>>  DecoderUtil.decodeEncodedWords("=?US-ASCII?B?QSBzaG9ydCB0ZXh0?=")); >>> -        assertEquals("A short text again!", >>> - >>>  DecoderUtil.decodeEncodedWords("=?US-ASCII?b?QSBzaG9ydCB0ZXh0IGFnYWluIQ==?=")); >>> - >>> -        // invalid encoded words should be returned unchanged >>> -        assertEquals("=?iso8859-1?Q?=", >>> DecoderUtil.decodeEncodedWords("=?iso8859-1?Q?=")); >>> -        assertEquals("=?iso8859-1?b?=", >>> DecoderUtil.decodeEncodedWords("=?iso8859-1?b?=")); >>> -        assertEquals("=?ISO-8859-1?Q?", >>> DecoderUtil.decodeEncodedWords("=?ISO-8859-1?Q?")); >>> -        assertEquals("=?ISO-8859-1?R?abc?=", >>> DecoderUtil.decodeEncodedWords("=?ISO-8859-1?R?abc?=")); >>> - >>> -        // encoded-text requires at least one character according to rfc >>> 2047 >>> -        assertEquals("=?ISO-8859-1?Q??=", >>> DecoderUtil.decodeEncodedWords("=?ISO-8859-1?Q??=")); >>> -        assertEquals("=?ISO-8859-1?B??=", >>> DecoderUtil.decodeEncodedWords("=?ISO-8859-1?B??=")); >>> - >>> -        // white space between encoded words should be removed >>> (MIME4J-104) >>> -        assertEquals("a", >>> DecoderUtil.decodeEncodedWords("=?ISO-8859-1?Q?a?=")); >>> -        assertEquals("a b", >>> DecoderUtil.decodeEncodedWords("=?ISO-8859-1?Q?a?= b")); >>> -        assertEquals("ab", >>> DecoderUtil.decodeEncodedWords("=?ISO-8859-1?Q?a?= =?ISO-8859-1?Q?b?=")); >>> -        assertEquals("ab", >>> DecoderUtil.decodeEncodedWords("=?ISO-8859-1?Q?a?=  =?ISO-8859-1?Q?b?=")); >>> -        assertEquals("ab", >>> DecoderUtil.decodeEncodedWords("=?ISO-8859-1?Q?a?=\r\n >>>  =?ISO-8859-1?Q?b?=")); >>> -        assertEquals("a b", >>> DecoderUtil.decodeEncodedWords("=?ISO-8859-1?Q?a_b?=")); >>> -        assertEquals("a b", >>> DecoderUtil.decodeEncodedWords("=?ISO-8859-1?Q?a?= =?ISO-8859-2?Q?_b?=")); >>> - >>> -        // non white space between encoded words should be retained >>> -        assertEquals("a b c", >>> DecoderUtil.decodeEncodedWords("=?ISO-8859-1?Q?a?= b =?ISO-8859-1?Q?c?=")); >>> - >>> -        // text before and after encoded words should be retained >>> -        assertEquals(" a b c ", DecoderUtil.decodeEncodedWords(" >>> =?ISO-8859-1?Q?a?= b =?ISO-8859-1?Q?c?= ")); >>> -        assertEquals("! a b c !", DecoderUtil.decodeEncodedWords("! >>> =?ISO-8859-1?Q?a?= b =?ISO-8859-1?Q?c?= !")); >>> - >>> -        // Bug detected on June 7, 2005. Decoding the following string >>> caused >>> -        // OutOfMemoryError. >>> -        assertEquals("=3?!!\\=?\"!g6P\"!Xp:\"!", >>> DecoderUtil.decodeEncodedWords("=3?!!\\=?\"!g6P\"!Xp:\"!")); >>> -    } >>> -} >>> +/**************************************************************** >>> + * Licensed to the Apache Software Foundation (ASF) under one   * >>> + * or more contributor license agreements.  See the NOTICE file * >>> + * distributed with this work for additional information        * >>> + * regarding copyright ownership.  The ASF licenses this file   * >>> + * to you under the Apache License, Version 2.0 (the            * >>> + * "License"); you may not use this file except in compliance   * >>> + * with the License.  You may obtain a copy of the License at   * >>> + *                                                              * >>> + *   http://www.apache.org/licenses/LICENSE-2.0                 * >>> + *                                                              * >>> + * Unless required by applicable law or agreed to in writing,   * >>> + * software distributed under the License is distributed on an  * >>> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       * >>> + * KIND, either express or implied.  See the License for the    * >>> + * specific language governing permissions and limitations      * >>> + * under the License.                                           * >>> + ****************************************************************/ >>> + >>> +package org.apache.james.mime4j.codec; >>> + >>> +import java.io.UnsupportedEncodingException; >>> + >>> +import junit.framework.TestCase; >>> + >>> +import org.apache.log4j.BasicConfigurator; >>> + >>> +public class DecoderUtilTest extends TestCase { >>> + >>> +    @Override >>> +    public void setUp() { >>> +        BasicConfigurator.resetConfiguration(); >>> +        BasicConfigurator.configure(); >>> +    } >>> + >>> +    public void testDecodeB() throws UnsupportedEncodingException { >>> +        String s = DecoderUtil.decodeB("VGhpcyBpcyB0aGUgcGxhaW4gd" >>> +                    + "GV4dCBtZXNzYWdlIQ==", "ISO8859-1"); >>> +        assertEquals("This is the plain text message!", s); >>> +    } >>> + >>> +    public void testDecodeQ() throws UnsupportedEncodingException { >>> +        String s = DecoderUtil.decodeQ("=e1_=e2=09=E3_=E4_", >>> "ISO8859-1"); >>> +        assertEquals("\u00e1 \u00e2\t\u00e3 \u00e4 ", s); >>> +    } >>> + >>> +    public void testNonEncodedWordsAreIgnored() { >>> +        assertEquals("", DecoderUtil.decodeEncodedWords("")); >>> +        assertEquals("Yada yada", DecoderUtil.decodeEncodedWords("Yada >>> yada")); >>> +    } >>> + >>> +    public void testDecodeSomeEncodedWords() { >>> +        assertEquals("  \u00e1\u00e2\u00e3\t\u00e4", >>> + >>>  DecoderUtil.decodeEncodedWords("=?iso-8859-1?Q?_=20=e1=e2=E3=09=E4?=")); >>> +        assertEquals("Word 1 '  \u00e2\u00e3\t\u00e4'. Word 2 ' >>>  \u00e2\u00e3\t\u00e4'", >>> +                DecoderUtil.decodeEncodedWords("Word 1 >>> '=?iso-8859-1?Q?_=20=e2=E3=09=E4?=" >>> +                        + "'. Word 2 >>> '=?iso-8859-1?q?_=20=e2=E3=09=E4?='")); >>> +        assertEquals("=?iso-8859-YADA?Q?_=20=t1=e2=E3=09=E4?=", >>> + >>>  DecoderUtil.decodeEncodedWords("=?iso-8859-YADA?Q?_=20=t1=e2=E3=09=E4?=")); >>> +        assertEquals("A short text", >>> + >>>  DecoderUtil.decodeEncodedWords("=?US-ASCII?B?QSBzaG9ydCB0ZXh0?=")); >>> +        assertEquals("A short text again!", >>> + >>>  DecoderUtil.decodeEncodedWords("=?US-ASCII?b?QSBzaG9ydCB0ZXh0IGFnYWluIQ==?=")); >>> +    } >>> + >>> +    public void testDecodeJapaneseEncodedWords() { >>> +        String enc = >>> "=?ISO-2022-JP?B?GyRCTCQbKEobJEI+NRsoShskQkJ6GyhKGyRCOS0bKEo=?= " >>> +                 + >>> "=?ISO-2022-JP?B?GyRCOXAbKEobJEIiKBsoShskQiU1GyhKGyRCJSQbKEo=?= " >>> +                 + >>> "=?ISO-2022-JP?B?GyRCJUkbKEobJEIlUxsoShskQiU4GyhKGyRCJU0bKEo=?= " >>> +                 + >>> "=?ISO-2022-JP?B?GyRCJTkbKEobJEIkThsoShskQjdoGyhKGyRCRGobKEo=?= " >>> +                 + >>> "=?ISO-2022-JP?B?GyRCSEcbKEobJEIkRxsoShskQiQ5GyhKGyRCISobKEo=?="; >>> + >>> +        String dec = DecoderUtil.decodeEncodedWords(enc); >>> + >>>  assertEquals("\u672A\u627F\u8AFE\u5E83\u544A\u203B\u30B5\u30A4\u30C9\u30D3" >>> +                + >>> "\u30B8\u30CD\u30B9\u306E\u6C7A\u5B9A\u7248\u3067\u3059\uFF01", dec); >>> +    } >>> + >>> +    public void testInvalidEncodedWordsAreIgnored() { >>> +        assertEquals("=?iso8859-1?Q?=", >>> DecoderUtil.decodeEncodedWords("=?iso8859-1?Q?=")); >>> +        assertEquals("=?iso8859-1?b?=", >>> DecoderUtil.decodeEncodedWords("=?iso8859-1?b?=")); >>> +        assertEquals("=?ISO-8859-1?Q?", >>> DecoderUtil.decodeEncodedWords("=?ISO-8859-1?Q?")); >>> +        assertEquals("=?ISO-8859-1?R?abc?=", >>> DecoderUtil.decodeEncodedWords("=?ISO-8859-1?R?abc?=")); >>> +        assertEquals("test =?ISO-8859-1?R?abc?=", >>> DecoderUtil.decodeEncodedWords("test =?ISO-8859-1?R?abc?=")); >>> +    } >>> + >>> +    public void testEmptyEncodedTextIsIgnored() { >>> +        // encoded-text requires at least one character according to rfc >>> 2047 >>> +        assertEquals("=?ISO-8859-1?Q??=", >>> DecoderUtil.decodeEncodedWords("=?ISO-8859-1?Q??=")); >>> +        assertEquals("=?ISO-8859-1?B??=", >>> DecoderUtil.decodeEncodedWords("=?ISO-8859-1?B??=")); >>> +    } >>> + >>> +    // see MIME4J-104 >>> +    public void testWhiteSpaceBetweenEncodedWordsGetsRemoved() { >>> +        assertEquals("a", >>> DecoderUtil.decodeEncodedWords("=?ISO-8859-1?Q?a?=")); >>> +        assertEquals("a b", >>> DecoderUtil.decodeEncodedWords("=?ISO-8859-1?Q?a?= b")); >>> +        assertEquals("ab", >>> DecoderUtil.decodeEncodedWords("=?ISO-8859-1?Q?a?= =?ISO-8859-1?Q?b?=")); >>> +        assertEquals("ab", >>> DecoderUtil.decodeEncodedWords("=?ISO-8859-1?Q?a?=  =?ISO-8859-1?Q?b?=")); >>> +        assertEquals("ab", >>> DecoderUtil.decodeEncodedWords("=?ISO-8859-1?Q?a?=\r\n >>>  =?ISO-8859-1?Q?b?=")); >>> +        assertEquals("a b", >>> DecoderUtil.decodeEncodedWords("=?ISO-8859-1?Q?a_b?=")); >>> +        assertEquals("a b", >>> DecoderUtil.decodeEncodedWords("=?ISO-8859-1?Q?a?= =?ISO-8859-2?Q?_b?=")); >>> +    } >>> + >>> +    // see MIME4J-138 >>> +    public void testEncodedTextMayStartWithAnEqualsSign() { >>> +        assertEquals(" foo", >>> DecoderUtil.decodeEncodedWords("=?utf-8?Q?=20foo?=")); >>> +        assertEquals("Re: How to place a view at the bottom with a 100% >>> width", >>> + >>>  DecoderUtil.decodeEncodedWords("=?utf-8?Q?Re:=20How=20to=20place=20a=20view=20at=20the=20bottom?= >>> " >>> +                    + "=?utf-8?Q?=20with=20a=20100%=20width?=")); >>> +        assertEquals("Test \u00fc and more", >>> +            DecoderUtil.decodeEncodedWords("Test =?ISO-8859-1?Q?=FC_?= >>> =?ISO-8859-1?Q?and_more?=")); >>> +    } >>> + >>> +    public void testNonWhiteSpaceBetweenEncodedWordsIsRetained() { >>> +        assertEquals("a b c", >>> DecoderUtil.decodeEncodedWords("=?ISO-8859-1?Q?a?= b =?ISO-8859-1?Q?c?=")); >>> +        assertEquals("a\rb\nc", >>> DecoderUtil.decodeEncodedWords("=?ISO-8859-1?Q?a?=\rb\n=?ISO-8859-1?Q?c?=")); >>> +    } >>> + >>> +    public void testTextBeforeAndAfterEncodedWordIsRetained() { >>> +        assertEquals(" a b c ", DecoderUtil.decodeEncodedWords(" >>> =?ISO-8859-1?Q?a?= b =?ISO-8859-1?Q?c?= ")); >>> +        assertEquals("! a b c !", DecoderUtil.decodeEncodedWords("! >>> =?ISO-8859-1?Q?a?= b =?ISO-8859-1?Q?c?= !")); >>> +    } >>> + >>> +    public void testFunnyInputDoesNotRaiseOutOfMemoryError() { >>> +        // Bug detected on June 7, 2005. Decoding the following string >>> caused OutOfMemoryError. >>> +        assertEquals("=3?!!\\=?\"!g6P\"!Xp:\"!", >>> DecoderUtil.decodeEncodedWords("=3?!!\\=?\"!g6P\"!Xp:\"!")); >>> +    } >>> +} >>> >>> Propchange: >>> james/mime4j/branches/apache-mime4j-0.6/src/test/java/org/apache/james/mime4j/codec/DecoderUtilTest.java >>> >>> ------------------------------------------------------------------------------ >>> --- svn:mergeinfo (added) >>> +++ svn:mergeinfo Fri Dec 17 10:02:31 2010 >>> @@ -0,0 +1 @@ >>> >>> +/james/mime4j/trunk/core/src/test/java/org/apache/james/mime4j/codec/DecoderUtilTest.java:809204 >>> >>> >>> > >