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