You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by te...@apache.org on 2006/03/07 13:44:29 UTC

svn commit: r383867 - in /incubator/harmony/enhanced/classlib/trunk/modules/nio_char/src: main/java/java/nio/charset/Charset.java test/java/org/apache/harmony/tests/java/nio/charset/CharsetTest.java

Author: tellison
Date: Tue Mar  7 04:44:27 2006
New Revision: 383867

URL: http://svn.apache.org/viewcvs?rev=383867&view=rev
Log:
Fix for HARMONY-149 (java.nio.charset.Charset.forName(name) return different reference value when requiring the same Charset)

Modified:
    incubator/harmony/enhanced/classlib/trunk/modules/nio_char/src/main/java/java/nio/charset/Charset.java
    incubator/harmony/enhanced/classlib/trunk/modules/nio_char/src/test/java/org/apache/harmony/tests/java/nio/charset/CharsetTest.java

Modified: incubator/harmony/enhanced/classlib/trunk/modules/nio_char/src/main/java/java/nio/charset/Charset.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/classlib/trunk/modules/nio_char/src/main/java/java/nio/charset/Charset.java?rev=383867&r1=383866&r2=383867&view=diff
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/nio_char/src/main/java/java/nio/charset/Charset.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/nio_char/src/main/java/java/nio/charset/Charset.java Tue Mar  7 04:44:27 2006
@@ -28,6 +28,7 @@
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.Enumeration;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Locale;
@@ -139,6 +140,8 @@
 	// the aliases set
 	private final HashSet aliasesSet;
 
+	// cached Charset table
+	private static HashMap cachedCharsetTable = new HashMap();
 	/*
 	 * -------------------------------------------------------------------
 	 * Global initialization
@@ -447,34 +450,63 @@
 			throw new IllegalArgumentException();
 		}
 		checkCharsetName(charsetName);
-		// Try built-in charsets
-		Charset cs = _builtInProvider.charsetForName(charsetName);
-		if (null != cs) {
-			return cs;
-		}
-
-		// Collect all charsets provided by charset providers
-		final ClassLoader cl = getContextClassLoader();
-		if (null != cl) {
-			try {
-				// Load all configuration files
-				Enumeration e = cl
-						.getResources(PROVIDER_CONFIGURATION_FILE_NAME);
-				// Examine each configuration file
-				while (e.hasMoreElements()) {
-					cs = searchConfiguredCharsets(charsetName, (URL) e
-							.nextElement(), cl);
-					if (null != cs) {
-						return cs;
+		synchronized(Charset.class){
+			// Try to get Charset from cachedCharsetTable
+			Charset cs = getCachedCharset(charsetName);
+			if (null != cs) {
+				return cs;
+			}	
+			// Try built-in charsets
+			cs = _builtInProvider.charsetForName(charsetName);
+			if (null != cs) {
+				cacheCharset(cs);
+				return cs;
+			}
+	
+			// Collect all charsets provided by charset providers
+			final ClassLoader cl = getContextClassLoader();
+			if (null != cl) {
+				try {
+					// Load all configuration files
+					Enumeration e = cl
+							.getResources(PROVIDER_CONFIGURATION_FILE_NAME);
+					// Examine each configuration file
+					while (e.hasMoreElements()) {
+						cs = searchConfiguredCharsets(charsetName, (URL) e
+								.nextElement(), cl);
+						if (null != cs) {
+							cacheCharset(cs);
+							return cs;
+						}
 					}
+				} catch (IOException ex) {
+					// Unexpected ClassLoader exception, ignore
 				}
-			} catch (IOException ex) {
-				// Unexpected ClassLoader exception, ignore
 			}
 		}
 		return null;
 	}
 
+	/*
+	 * save charset into cachedCharsetTable
+	 */
+	private static void cacheCharset(Charset cs){
+		cachedCharsetTable.put(cs.name(), cs);
+		Set aliasesSet = cs.aliases();
+		if(null != aliasesSet){
+			Iterator iter = aliasesSet.iterator();
+			while(iter.hasNext()){
+				String alias = (String)iter.next();
+				cachedCharsetTable.put(alias,cs);
+			}
+		}
+	}
+	/*
+	 * get cached charset reference by name
+	 */
+	private static Charset getCachedCharset(String name){
+		return (Charset)cachedCharsetTable.get(name);
+	}
 	/**
 	 * Gets a <code>Charset</code> instance for the specified charset name.
 	 * 

Modified: incubator/harmony/enhanced/classlib/trunk/modules/nio_char/src/test/java/org/apache/harmony/tests/java/nio/charset/CharsetTest.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/classlib/trunk/modules/nio_char/src/test/java/org/apache/harmony/tests/java/nio/charset/CharsetTest.java?rev=383867&r1=383866&r2=383867&view=diff
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/nio_char/src/test/java/org/apache/harmony/tests/java/nio/charset/CharsetTest.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/nio_char/src/test/java/org/apache/harmony/tests/java/nio/charset/CharsetTest.java Tue Mar  7 04:44:27 2006
@@ -130,4 +130,25 @@
 			System.setProperties(oldProps);
 		}
 	}
+	
+    /**
+	 * @tests java.nio.charset.Charset#forName(java.lang.String)
+	 */
+	public void test_forNameLjava_lang_String() {
+		/*
+		 * invoke forName two times with the same canonical name, it
+		 * should return the same reference.
+		 */
+		Charset cs1 = Charset.forName("UTF-8");
+		Charset cs2 = Charset.forName("UTF-8");
+		assertSame(cs1, cs2);
+
+		/*
+		 * test forName: invoke forName two times for the same Charset using
+		 * canonical name and alias, it should return the same reference.
+		 */
+		Charset cs3 = Charset.forName("ASCII");
+		Charset cs4 = Charset.forName("US-ASCII");
+		assertSame(cs3, cs4);
+	} 
 }