bug 374446: Fixed "java.lang.IllegalStateException: InitialContextFactoryBuilder already set" thrown when restarting gemini-naming bundle.
diff --git a/framework/src/main/java/org/eclipse/gemini/naming/Activator.java b/framework/src/main/java/org/eclipse/gemini/naming/Activator.java
index c5335e3..357f100 100644
--- a/framework/src/main/java/org/eclipse/gemini/naming/Activator.java
+++ b/framework/src/main/java/org/eclipse/gemini/naming/Activator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************

- * Copyright (c) 2010 Oracle.

+ * Copyright (c) 2010, 2012 Oracle.

  * All rights reserved. This program and the accompanying materials

  * are made available under the terms of the Eclipse Public License v1.0

  * and Apache License v2.0 which accompanies this distribution. 

@@ -15,6 +15,7 @@
 

 package org.eclipse.gemini.naming;

 

+import java.lang.reflect.Field;

 import java.util.Hashtable;

 import java.util.Iterator;

 import java.util.LinkedList;

@@ -26,6 +27,7 @@
 import javax.naming.spi.InitialContextFactoryBuilder;

 import javax.naming.spi.NamingManager;

 import javax.naming.spi.ObjectFactory;

+import javax.naming.spi.ObjectFactoryBuilder;

 

 import org.osgi.framework.BundleActivator;

 import org.osgi.framework.BundleContext;

@@ -114,6 +116,8 @@
 				(ServiceRegistration)iterator.next();

 			serviceRegistration.unregister();

 		}

+		

+		unregisterSingletons();

 	}

 

 

@@ -175,6 +179,33 @@
 			throw namingException;

 		}

 	}

+		

+	/**

+	 * Unregisters the InitialContextFactoryBuilder static singleton

+	 * and the ObjectFactoryBuilder static singleton.

+	 */

+	private static void unregisterSingletons() {

+		Field[] fields = NamingManager.class.getDeclaredFields();

+		if (fields != null && fields.length > 0) {

+			for (Field field: fields) {

+				if (InitialContextFactoryBuilder.class.equals(field.getType()) 

+						|| ObjectFactoryBuilder.class.equals(field.getType())){

+					field.setAccessible(true);

+					try {

+						field.set(null, null);

+					} catch (IllegalArgumentException e) {

+						logger.log(Level.SEVERE,

+								   "Unable to reset NamingManager static singleton " + field.getType(),

+								   e);

+					} catch (IllegalAccessException e) {

+						logger.log(Level.SEVERE,

+								   "Unable to reset NamingManager static singleton " + field.getType(),

+								   e);

+					}

+				}

+			}

+		}

+	}