You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by py...@apache.org on 2006/08/17 11:42:46 UTC

svn commit: r432191 - in /incubator/harmony/enhanced/classlib/trunk/modules/nio_char: ./ src/main/java/java/nio/charset/ src/test/java/tests/api/java/nio/charset/ src/test/resources/jars/

Author: pyang
Date: Thu Aug 17 02:42:45 2006
New Revision: 432191

URL: http://svn.apache.org/viewvc?rev=432191&view=rev
Log:
Patch applied for HARMONY-1051 ([classlib][nio_char] Use system classloader as an alternative to load charset provider classes when thread's context classloader fails to load them)

Added:
    incubator/harmony/enhanced/classlib/trunk/modules/nio_char/src/test/resources/jars/
    incubator/harmony/enhanced/classlib/trunk/modules/nio_char/src/test/resources/jars/charset_provider.jar   (with props)
Modified:
    incubator/harmony/enhanced/classlib/trunk/modules/nio_char/.classpath
    incubator/harmony/enhanced/classlib/trunk/modules/nio_char/build.xml
    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/tests/api/java/nio/charset/CharsetTest.java

Modified: incubator/harmony/enhanced/classlib/trunk/modules/nio_char/.classpath
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/nio_char/.classpath?rev=432191&r1=432190&r2=432191&view=diff
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/nio_char/.classpath (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/nio_char/.classpath Thu Aug 17 02:42:45 2006
@@ -8,5 +8,6 @@
 	<classpathentry kind="lib" path="depends/jars/icu4jni-3.4.jar"/>
 	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
 	<classpathentry sourcepath="JUNIT_SRC_HOME/junitsrc.zip" kind="var" path="JUNIT_HOME/junit.jar"/>
+	<classpathentry kind="lib" path="src/test/resources/jars/charset_provider.jar"/>
 	<classpathentry kind="output" path="bin/main"/>
 </classpath>

Modified: incubator/harmony/enhanced/classlib/trunk/modules/nio_char/build.xml
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/nio_char/build.xml?rev=432191&r1=432190&r2=432191&view=diff
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/nio_char/build.xml (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/nio_char/build.xml Thu Aug 17 02:42:45 2006
@@ -121,6 +121,9 @@
                 <pathelement path="${hy.nio_char.bin.test}"/>
                 <pathelement path="../../build/tests" />
                 <pathelement path="${hy.hdk}/build/test/support.jar" />
+                <fileset dir="${hy.nio_char.src.test.resources}/jars">
+                    <include name="**/*.jar" />
+                </fileset>
             </classpath>
 
             <formatter type="xml" />

Modified: incubator/harmony/enhanced/classlib/trunk/modules/nio_char/src/main/java/java/nio/charset/Charset.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/nio_char/src/main/java/java/nio/charset/Charset.java?rev=432191&r1=432190&r2=432191&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 Thu Aug 17 02:42:45 2006
@@ -96,6 +96,8 @@
 	 * the comment string used in configuration files
 	 */
 	private static final String PROVIDER_CONFIGURATION_FILE_COMMENT = "#"; //$NON-NLS-1$
+    
+    private static ClassLoader systemClassLoader;
 
 	/*
 	 * --------------------------------------------------------------------
@@ -253,6 +255,20 @@
 					}
 				});
 	}
+    
+    /*
+     * Use privileged code to get the system class loader.
+     */
+    private static void getSystemClassLoader() {
+        if (null == systemClassLoader) {
+            systemClassLoader = AccessController
+                    .doPrivileged(new PrivilegedAction<ClassLoader>() {
+                        public ClassLoader run() {
+                            return ClassLoader.getSystemClassLoader();
+                        }
+                    });
+        }
+    }
 
 	/*
 	 * Add the charsets supported by the given provider to the map.
@@ -286,8 +302,8 @@
 	 * Read a configuration file and add the charsets supported by the providers
 	 * specified by this configuration file to the map.
 	 */
-	private static void loadConfiguredCharsets(URL configFile, ClassLoader cl,
-			TreeMap<String, Charset> charsets) {
+	private static void loadConfiguredCharsets(URL configFile,
+            ClassLoader contextClassLoader, TreeMap<String, Charset> charsets) {
 		BufferedReader reader = null;
 		try {
 			InputStream is = configFile.openStream();
@@ -302,14 +318,21 @@
 					// Load the charset provider
 					Object cp = null;
 					try {
-						Class c = Class.forName(providerClassName, true, cl);
-						cp = c.newInstance();
-					} catch (SecurityException ex) {
-						// assume no permission to use charset provider
-						throw ex;
-					} catch (Exception ex) {
-						throw new Error(ex.getMessage(), ex);
-					}
+                        Class c = Class.forName(providerClassName, true,
+                                contextClassLoader);
+                        cp = c.newInstance();
+                    } catch (Exception ex) {
+                        // try to use system classloader when context
+                        // classloader failed to load config file.
+                        try {
+                            getSystemClassLoader();
+                            Class c = Class.forName(providerClassName, true,
+                                    systemClassLoader);
+                            cp = c.newInstance();
+                        } catch (Exception e) {
+                            throw new Error(e.getMessage(), e);
+                        }
+                    }
 					// Put the charsets supported by this provider into the map
 					addCharsets((CharsetProvider) cp, charsets);
 				}
@@ -357,21 +380,25 @@
 				.clone();
 
 		// 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()) {
-					loadConfiguredCharsets((URL) e.nextElement(), cl, charsets);
-				}
-			} catch (IOException ex) {
-				// Unexpected ClassLoader exception, ignore
-			}
-		}
-
+        ClassLoader contextClassLoader = getContextClassLoader();
+        Enumeration e = null;
+        try {
+            if (null != contextClassLoader) {
+                e = contextClassLoader
+                        .getResources(PROVIDER_CONFIGURATION_FILE_NAME);
+            } else {
+                getSystemClassLoader();
+                e = systemClassLoader
+                        .getResources(PROVIDER_CONFIGURATION_FILE_NAME);
+            }
+            // Examine each configuration file
+            while (e.hasMoreElements()) {
+                loadConfiguredCharsets((URL) e.nextElement(),
+                        contextClassLoader, charsets);
+            }
+        } catch (IOException ex) {
+            // Unexpected ClassLoader exception, ignore
+        } 
 		return Collections.unmodifiableSortedMap(charsets);
 	}
 
@@ -381,7 +408,7 @@
 	 * file.
 	 */
 	private static Charset searchConfiguredCharsets(String charsetName,
-			URL configFile, ClassLoader cl) {
+            ClassLoader contextClassLoader, URL configFile) {
 		BufferedReader reader = null;
 		try {
 			InputStream is = configFile.openStream();
@@ -395,14 +422,20 @@
 					// Load the charset provider
 					Object cp = null;
 					try {
-						Class c = Class.forName(providerClassName, true, cl);
-						cp = c.newInstance();
-					} catch (SecurityException ex) {
-						// assume no permission to use charset provider
-						throw ex;
-					} catch (Exception ex) {
-						throw new Error(ex.getMessage(), ex);
-					}
+                        Class c = Class.forName(providerClassName, true, contextClassLoader);
+                        cp = c.newInstance();
+                    } catch (Exception ex) {
+                        // try to use system classloader when context
+                        // classloader failed to load config file.
+                        try {
+                            getSystemClassLoader();
+                            Class c = Class.forName(providerClassName, true,
+                                    systemClassLoader);
+                            cp = c.newInstance();
+                        } catch (Exception e) {
+                            throw new Error(e.getMessage(), e);
+                        }
+                    }
 					// Try to get the desired charset from this provider
 					Charset cs = ((CharsetProvider) cp)
 							.charsetForName(charsetName);
@@ -452,26 +485,30 @@
 				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
-				}
-			}
+            // Collect all charsets provided by charset providers
+            ClassLoader contextClassLoader = getContextClassLoader();
+            Enumeration e = null;
+            try {
+                if (null != contextClassLoader) {
+                    e = contextClassLoader
+                            .getResources(PROVIDER_CONFIGURATION_FILE_NAME);
+                } else {
+                    getSystemClassLoader();
+                    e = systemClassLoader
+                            .getResources(PROVIDER_CONFIGURATION_FILE_NAME);
+                }
+                // Examine each configuration file
+                while (e.hasMoreElements()) {
+                    cs = searchConfiguredCharsets(charsetName,
+                            contextClassLoader, (URL) e.nextElement());
+                    if (null != cs) {
+                        cacheCharset(cs);
+                        return cs;
+                    }
+                }
+            } catch (IOException ex) {
+                // Unexpected ClassLoader exception, ignore
+            } 
 		}
 		return null;
 	}

Modified: incubator/harmony/enhanced/classlib/trunk/modules/nio_char/src/test/java/tests/api/java/nio/charset/CharsetTest.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/nio_char/src/test/java/tests/api/java/nio/charset/CharsetTest.java?rev=432191&r1=432190&r2=432191&view=diff
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/nio_char/src/test/java/tests/api/java/nio/charset/CharsetTest.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/nio_char/src/test/java/tests/api/java/nio/charset/CharsetTest.java Thu Aug 17 02:42:45 2006
@@ -27,6 +27,7 @@
 import java.security.Permission;
 import java.util.Iterator;
 import java.util.Locale;
+import java.util.SortedMap;
 import java.util.Vector;
 
 import junit.framework.TestCase;
@@ -701,6 +702,39 @@
 		assertTrue(-1 != c1.toString().indexOf("mock"));
 	}
 
+    /**
+     * @tests java.nio.charset.Charset#availableCharsets()
+     */
+    public void test_availableCharsets() throws Exception {
+        // regression test for Harmony-1051
+        ClassLoader originalClassLoader = Thread.currentThread()
+                .getContextClassLoader();
+        try {
+            Thread.currentThread().setContextClassLoader(null);
+            SortedMap<String, Charset> charsets = Charset.availableCharsets();
+            // make sure "mockCharset00" is loaded by MockCharsetProvider
+            assertTrue(charsets.containsKey("mockCharset00"));
+        } finally {
+            Thread.currentThread().setContextClassLoader(originalClassLoader);
+        }
+    }
+    
+    /**
+     * @tests java.nio.charset.Charset#availableCharsets()
+     */
+    public void test_forNameLString() throws Exception {
+        // regression test for Harmony-1051
+        ClassLoader originalClassLoader = Thread.currentThread()
+                .getContextClassLoader();
+        try {
+            Thread.currentThread().setContextClassLoader(null);
+            // make sure "mockCharset00" is loaded by MockCharsetProvider
+            assertNotNull(Charset.forName("mockCharset00"));
+        } finally {
+            Thread.currentThread().setContextClassLoader(originalClassLoader);
+        }
+    }
+    
 	/*
 	 * Mock charset class.
 	 */
@@ -802,48 +836,7 @@
 			return v.iterator();
 		}
 	}
-
-	/*
-	 * Another mock charset provider.
-	 */
-	public static class MockCharsetProvider2 extends CharsetProvider {
-
-		public Charset charsetForName(String charsetName) {
-			if ("MockCharset10".equalsIgnoreCase(charsetName)
-					|| "MockCharset11".equals(charsetName)
-					|| "MockCharset12".equalsIgnoreCase(charsetName)) {
-				return charset2;
-			}
-			return null;
-		}
-
-		public Iterator charsets() {
-			Vector v = new Vector();
-			v.add(charset2);
-			return v.iterator();
-		}
-	}
-
-	/*
-	 * Another mock charset provider providing build-in charset "ascii".
-	 */
-	public static class MockCharsetProvider3 extends CharsetProvider {
-
-		public Charset charsetForName(String charsetName) {
-			if ("US-ASCII".equalsIgnoreCase(charsetName)
-					|| "ASCII".equalsIgnoreCase(charsetName)) {
-				return new MockCharset("US-ASCII", new String[] { "ASCII" });
-			}
-			return null;
-		}
-
-		public Iterator charsets() {
-			Vector v = new Vector();
-			v.add(new MockCharset("US-ASCII", new String[] { "ASCII" }));
-			return v.iterator();
-		}
-	}
-
+    
 	/*
 	 * Used to grant all permissions except charset provider access.
 	 */

Added: incubator/harmony/enhanced/classlib/trunk/modules/nio_char/src/test/resources/jars/charset_provider.jar
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/nio_char/src/test/resources/jars/charset_provider.jar?rev=432191&view=auto
==============================================================================
Binary file - no diff available.

Propchange: incubator/harmony/enhanced/classlib/trunk/modules/nio_char/src/test/resources/jars/charset_provider.jar
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream