james-mime4j-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Niklas Therning <nik...@trillian.se>
Subject Re: svn commit: r1050333 - in /james/mime4j/branches/apache-mime4j-0.6/src: main/java/org/apache/james/mime4j/codec/DecoderUtil.java test/java/org/apache/james/mime4j/codec/DecoderUtilTest.java
Date Fri, 17 Dec 2010 10:13:07 GMT
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<niklas@apache.org>:
>> 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
>>
>>
>>


Mime
View raw message