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 13:24:12 GMT
The merged in changes from trunk uses LF as line endings while the files 
in 0.6 use CRLF. This is why the diff shows that the entire files have 
been changed and why I got a conflict on the entire files. svn cp won't 
do any difference. If you do a svn diff between the old and new versions 
it will still appear as if the whole files have been changed. I would 
have to revert the merge, copy the files manually and change the line 
endings in the new files to CRLF and then commit. Let me know if you 
want me to do this. AFAIK it's not possible to delete a revision so the 
files with incorrect line endings will still appear in the history forever.

/Niklas

On 12/17/2010 11:15 AM, Norman Maurer wrote:
> 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