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<[email protected]>:
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<[email protected]>:
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





Reply via email to