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);
+ }
+ }
+ }
+ }
+ }