You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-commits@db.apache.org by dj...@apache.org on 2006/11/10 17:39:21 UTC

svn commit: r473387 - /db/derby/code/trunk/java/engine/org/apache/derby/impl/services/reflect/UpdateLoader.java

Author: djd
Date: Fri Nov 10 08:39:20 2006
New Revision: 473387

URL: http://svn.apache.org/viewvc?view=rev&rev=473387
Log:
DERBY-2040 (partial) Create the class loaders (JarLoader instances) for database class loading
within a privileged block.

Modified:
    db/derby/code/trunk/java/engine/org/apache/derby/impl/services/reflect/UpdateLoader.java

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/services/reflect/UpdateLoader.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/services/reflect/UpdateLoader.java?view=diff&rev=473387&r1=473386&r2=473387
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/services/reflect/UpdateLoader.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/services/reflect/UpdateLoader.java Fri Nov 10 08:39:20 2006
@@ -40,12 +40,13 @@
 import org.apache.derby.iapi.reference.Property;
 
 import java.io.InputStream;
+import java.security.AccessController;
 
 import org.apache.derby.iapi.reference.MessageId;
 import org.apache.derby.iapi.reference.Module;
 import org.apache.derby.iapi.services.i18n.MessageService;
 
-public class UpdateLoader {
+class UpdateLoader {
 
 	private JarLoader[] jarList;
 	private HeaderPrintWriter vs;
@@ -61,7 +62,7 @@
 	private boolean needReload;
 	private JarReader jarReader;
 
-	public UpdateLoader(String classpath, DatabaseClasses parent, boolean verbose, boolean normalizeToUpper) 
+	UpdateLoader(String classpath, DatabaseClasses parent, boolean verbose, boolean normalizeToUpper) 
 		throws StandardException {
 
         this.normalizeToUpper = normalizeToUpper;
@@ -81,15 +82,25 @@
 
 	private void initializeFromClassPath(String classpath) throws StandardException {
 
-		String[][] elements = IdUtil.parseDbClassPath(classpath, normalizeToUpper);
+		final String[][] elements = IdUtil.parseDbClassPath(classpath, normalizeToUpper);
 		
-		int jarCount = elements.length;
+		final int jarCount = elements.length;
 		jarList = new JarLoader[jarCount];
 			
-		for (int i = 0; i < jarCount; i++) {
-			jarList[i] = new JarLoader(this, elements[i], vs);
-		}
-
+        if (jarCount != 0) {
+            // Creating class loaders is a restricted operation
+            // so we need to use a privileged block.
+            AccessController.doPrivileged
+            (new java.security.PrivilegedAction(){
+                
+                public Object run(){    
+    		      for (int i = 0; i < jarCount; i++) {
+    			     jarList[i] = new JarLoader(UpdateLoader.this, elements[i], vs);
+    		      }
+                  return null;
+                }
+            });
+        }
 		if (vs != null) {
 			vs.println(MessageService.getTextMessage(MessageId.CM_CLASS_LOADER_START, classpath));
 		}
@@ -103,7 +114,7 @@
 
 		@exception ClassNotFoundException Class can not be found
 	*/
-	public Class loadClass(String className, boolean resolve) 
+	Class loadClass(String className, boolean resolve) 
 		throws ClassNotFoundException {
 
 
@@ -154,7 +165,7 @@
 		}
 	}
 
-	public InputStream getResourceAsStream(String name) {
+	InputStream getResourceAsStream(String name) {
 
 		InputStream is = (myLoader == null) ?
 			ClassLoader.getSystemResourceAsStream(name) :
@@ -201,7 +212,7 @@
 		}
 	}
 
-	public synchronized void modifyClasspath(String classpath)
+	synchronized void modifyClasspath(String classpath)
 		throws StandardException {
 
 		// lock transaction classloader exclusively
@@ -214,7 +225,7 @@
 	}
 
 
-	public synchronized void modifyJar(boolean reload) throws StandardException {
+	synchronized void modifyJar(boolean reload) throws StandardException {
 
 		// lock transaction classloader exclusively
 		lockClassLoader(ShExQual.EX);
@@ -278,7 +289,7 @@
 		return null;
 	}
 
-	public void close() {
+	void close() {
 
 		for (int i = 0; i < jarList.length; i++) {
 			jarList[i].setInvalid(false);
@@ -297,7 +308,7 @@
 		initDone = true;
 	}
 
-	public int getClassLoaderVersion() {
+	int getClassLoaderVersion() {
 		return version;
 	}