You are viewing a plain text version of this content. The canonical link for it is here.
Posted to mime4j-dev@james.apache.org by ba...@apache.org on 2010/03/15 00:04:59 UTC

svn commit: r923000 - /james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/util/CharsetUtil.java

Author: bago
Date: Sun Mar 14 23:04:58 2010
New Revision: 923000

URL: http://svn.apache.org/viewvc?rev=923000&view=rev
Log:
Refactor org.mime4j.util.CharsetUtil to lazily determine supported encodings/decodings (MIME4J-174)
Patch kindly contributed by Richard von Keyserling.

Modified:
    james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/util/CharsetUtil.java

Modified: james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/util/CharsetUtil.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/util/CharsetUtil.java?rev=923000&r1=922999&r2=923000&view=diff
==============================================================================
--- james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/util/CharsetUtil.java (original)
+++ james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/util/CharsetUtil.java Sun Mar 14 23:04:58 2010
@@ -993,13 +993,13 @@ public class CharsetUtil {
      * Contains the canonical names of character sets which can be used to 
      * decode bytes into Java chars.
      */
-    private static SortedSet<String> decodingSupported = null;
+    private static SortedSet<String> decodingSupported = new TreeSet<String>();
     
     /**
      * Contains the canonical names of character sets which can be used to 
      * encode Java chars into bytes.
      */
-    private static SortedSet<String> encodingSupported = null;
+    private static SortedSet<String> encodingSupported = new TreeSet<String>();
     
     /**
      * Maps character set names to Charset objects. All possible names of
@@ -1007,26 +1007,15 @@ public class CharsetUtil {
      */
     private static Map<String, Charset> charsetMap = null;
     
+    /**
+     * Map tracking which charset encoding/decodings have been
+     * tested during runtime.
+     */
+    private static Map<String,Boolean> charsetsTested = new HashMap<String,Boolean>();
+    
     static {
-        decodingSupported = new TreeSet<String>();
-        encodingSupported = new TreeSet<String>();
-        byte[] dummy = new byte[] {'d', 'u', 'm', 'm', 'y'};
-        for (Charset c : JAVA_CHARSETS) {
-            try {
-                new String(dummy, c.canonical);
-                decodingSupported.add(c.canonical.toLowerCase());
-            } catch (UnsupportedOperationException e) {
-            } catch (UnsupportedEncodingException e) {
-            }
-            try {
-                "dummy".getBytes(c.canonical);
-                encodingSupported.add(c.canonical.toLowerCase());
-            } catch (UnsupportedOperationException e) {
-            } catch (UnsupportedEncodingException e) {
-            }
-        }
-        
-        charsetMap = new HashMap<String, Charset>();
+
+    	charsetMap = new HashMap<String, Charset>();
         for (Charset c : JAVA_CHARSETS) {
             charsetMap.put(c.canonical.toLowerCase(), c);
             if (c.mime != null) {
@@ -1148,6 +1137,9 @@ public class CharsetUtil {
      *         otherwise.
      */
     public static boolean isEncodingSupported(String charsetName) {
+    	if (!charsetsTested.containsKey(charsetName.toLowerCase())) {
+    		testCharset(charsetName.toLowerCase());
+    	}
         return encodingSupported.contains(charsetName.toLowerCase());
     }
     
@@ -1163,9 +1155,46 @@ public class CharsetUtil {
      *         otherwise.
      */
     public static boolean isDecodingSupported(String charsetName) {
+    	if (!charsetsTested.containsKey(charsetName.toLowerCase())) {
+    		testCharset(charsetName.toLowerCase());
+    	}
         return decodingSupported.contains(charsetName.toLowerCase());
     }
     
+    
+    /**
+     * Runs underlying encoding/decodings tests to determine appropriate
+     * responses for {@link #isDecodingSupported(String)} and {@link #isEncodingSupported(String)}
+     * 
+     * @param charsetName the characters set name.
+     */
+    private static void testCharset(String charsetName) {
+	    byte[] dummy = new byte[] {'d', 'u', 'm', 'm', 'y'};
+	    Charset c = charsetMap.get(charsetName.toLowerCase());
+	    if (null == c) {
+	    	charsetsTested.put(charsetName.toLowerCase(), null);
+	    	return;
+	    }
+
+    	try {
+            new String(dummy, c.canonical);
+            decodingSupported.add(c.canonical.toLowerCase());
+        } catch (UnsupportedOperationException e) {
+        } catch (UnsupportedEncodingException e) {
+        }
+        
+        try {
+            "dummy".getBytes(c.canonical);
+            encodingSupported.add(c.canonical.toLowerCase());
+        } catch (UnsupportedOperationException e) {
+        } catch (UnsupportedEncodingException e) {
+        }
+        
+        charsetsTested.put(charsetName.toLowerCase(), null);
+    }
+    
+    
+    
     /**
      * Gets the preferred MIME character set name for the specified
      * character set or <code>null</code> if not known.