james-mime4j-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Norman Maurer <nor...@apache.org>
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:15:41 GMT
Or just do an svn cp ?

Bye,
Norman


2010/12/17 Niklas Therning <niklas@trillian.se>:
> 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