Author: bimargulies
Date: Sat Nov 20 23:30:59 2010
New Revision: 1037355
URL: http://svn.apache.org/viewvc?rev=1037355&view=rev
Log:
Add javadoc to the BusFactory, particularly to reflect CXF-3142.
Modified:
cxf/trunk/api/src/main/java/org/apache/cxf/BusFactory.java
Modified: cxf/trunk/api/src/main/java/org/apache/cxf/BusFactory.java
URL:
http://svn.apache.org/viewvc/cxf/trunk/api/src/main/java/org/apache/cxf/BusFactory.java?rev=1037355&r1=1037354&r2=1037355&view=diff
==============================================================================
--- cxf/trunk/api/src/main/java/org/apache/cxf/BusFactory.java (original)
+++ cxf/trunk/api/src/main/java/org/apache/cxf/BusFactory.java Sat Nov 20
23:30:59 2010
@@ -32,8 +32,42 @@ import java.util.logging.Logger;
import org.apache.cxf.common.classloader.ClassLoaderUtils;
import org.apache.cxf.common.logging.LogUtils;
+/**
+ * Factory to create CXF Bus objects.
+ * <p>CXF includes a large number of components that provide services, such
+ * as WSDL parsing, and message processing. To avoid creating these objects
over and over, and to
+ * allow them to be shared easily, they are associated with a data structure
called a bus.
+ * </p>
+ * <p>
+ * You don't ever have to explicitly create or manipulate bus objects. If you
simply use the CXF
+ * or JAX-WS APIs to create clients or servers, CXF will create an default bus
for you. You would create a bus
+ * explicitly if you need to customize components on the bus or maintain
several independent buses
+ * with independent configurations.
+ * </p>
+ * <p>
+ * This class maintains the default bus for the entire process and a set of
thread-default buses. All CXF
+ * components that reference the bus, which is to say all CXF components, will
obtain a default bus from this
+ * class if you do not set a specific bus.
+ * </p>
+ * <p>
+ * If you create a bus when there is no default bus in effect, that bus will
become the default bus.
+ * </p>
+ * <p>
+ * This class holds <strong>weak</strong> references to the global default bus
and the per-thread default
+ * busses. Thus, if you create and customize a bus, you must retain a
reference to it if you want it to be
+ * protected from garbage collection. If you do not, you might experience the
following unexpected chain of
+ * events, especially in a client:
+ * <ol>
+ * <li>Create a bus and customize it. Fail to hold a reference.</li>
+ * <li>Release all references to CXF objects.</li>
+ * <li>GC collects the Bus.</li>
+ * <li>Create a new CXF object.</li>
+ * <li>Implicitly create a new, default, bus.</li>
+ * </ol>
+ * </p>
+ */
public abstract class BusFactory {
-
+
public static final String BUS_FACTORY_PROPERTY_NAME =
"org.apache.cxf.bus.factory";
public static final String DEFAULT_BUS_FACTORY =
"org.apache.cxf.bus.CXFBusFactory";
@@ -41,18 +75,15 @@ public abstract class BusFactory {
protected static Map<Thread, Bus> threadBusses = new WeakHashMap<Thread,
Bus>();
private static final Logger LOG = LogUtils.getL7dLogger(BusFactory.class,
"APIMessages");
-
- /**
- * Creates a new bus.
- * While concrete <code>BusFactory</code> may offer differently
- * parameterized methods for creating a bus, all factories support
- * this no-arg factory method.
- *
+ /**
+ * Creates a new bus. While concrete <code>BusFactory</code> may offer
differently parameterized methods
+ * for creating a bus, all factories support this no-arg factory method.
+ *
* @return the newly created bus.
*/
public abstract Bus createBus();
-
+
/**
* Returns the default bus, creating it if necessary.
*
@@ -61,15 +92,15 @@ public abstract class BusFactory {
public static synchronized Bus getDefaultBus() {
return getDefaultBus(true);
}
-
+
/**
* Returns the default bus
+ *
* @param createIfNeeded Set to true to create a default bus if one
doesn't exist
* @return the default bus.
*/
public static synchronized Bus getDefaultBus(boolean createIfNeeded) {
- if ((defaultBus == null || defaultBus.get() == null)
- && createIfNeeded) {
+ if ((defaultBus == null || defaultBus.get() == null) &&
createIfNeeded) {
defaultBus = new WeakReference<Bus>(newInstance().createBus());
}
if (defaultBus == null) {
@@ -79,9 +110,10 @@ public abstract class BusFactory {
return defaultBus.get();
}
}
-
+
/**
* Sets the default bus.
+ *
* @param bus the default bus.
*/
public static synchronized void setDefaultBus(Bus bus) {
@@ -92,10 +124,10 @@ public abstract class BusFactory {
}
setThreadDefaultBus(bus);
}
-
-
+
/**
* Sets the default bus for the thread.
+ *
* @param bus the default bus.
*/
public static void setThreadDefaultBus(Bus bus) {
@@ -103,16 +135,19 @@ public abstract class BusFactory {
threadBusses.put(Thread.currentThread(), bus);
}
}
-
+
/**
* Gets the default bus for the thread.
+ *
* @return the default bus.
*/
public static Bus getThreadDefaultBus() {
return getThreadDefaultBus(true);
}
+
/**
* Gets the default bus for the thread, creating if needed
+ *
* @param createIfNeeded Set to true to create a default bus if one
doesn't exist
* @return the default bus.
*/
@@ -135,17 +170,15 @@ public abstract class BusFactory {
/**
* Removes a bus from being a thread default bus for any thread.
* <p>
- * This is tipically done when a bus has ended its lifecycle (i.e.: a call
- * to {...@link Bus#shutdown(boolean)} was invoked) and it wants to remove
any
- * reference to itself for any thread.
+ * This is tipically done when a bus has ended its lifecycle (i.e.: a call
to
+ * {...@link Bus#shutdown(boolean)} was invoked) and it wants to remove
any reference to itself for any
+ * thread.
*
- * @param bus
- * the bus to remove
+ * @param bus the bus to remove
*/
public static void clearDefaultBusForAnyThread(final Bus bus) {
synchronized (threadBusses) {
- for (final Iterator<Bus> iterator =
threadBusses.values().iterator();
- iterator.hasNext();) {
+ for (final Iterator<Bus> iterator =
threadBusses.values().iterator(); iterator.hasNext();) {
if (bus == null || bus.equals(iterator.next())) {
iterator.remove();
}
@@ -155,6 +188,7 @@ public abstract class BusFactory {
/**
* Sets the default bus if a default bus is not already set.
+ *
* @param bus the default bus.
* @return true if the bus was not set and is now set
*/
@@ -164,21 +198,18 @@ public abstract class BusFactory {
threadBusses.put(Thread.currentThread(), bus);
}
}
- // The default bus may have gc-ed itself out of existence, in which
case we
+ // The default bus may have gc-ed itself out of existence, in which
case we
// take over for it.
if (defaultBus == null || defaultBus.get() == null) {
- defaultBus = new WeakReference<Bus>(bus);
+ defaultBus = new WeakReference<Bus>(bus);
return true;
- }
+ }
return false;
}
/**
- * Create a new BusFactory
- *
- * The class of the BusFactory is determined by looking for the system
propery:
- * org.apache.cxf.bus.factory
- * or by searching the classpath for:
+ * Create a new BusFactory The class of the BusFactory is determined by
looking for the system propery:
+ * org.apache.cxf.bus.factory or by searching the classpath for:
* META-INF/services/org.apache.cxf.bus.factory
*
* @return a new BusFactory to be used to create Bus objects
@@ -186,11 +217,11 @@ public abstract class BusFactory {
public static BusFactory newInstance() {
return newInstance(null);
}
-
+
/**
* Create a new BusFactory
- * @param className The class of the BusFactory to create. If null, uses
the
- * default search algorithm.
+ *
+ * @param className The class of the BusFactory to create. If null, uses
the default search algorithm.
* @return a new BusFactory to be used to create Bus objects
*/
public static BusFactory newInstance(String className) {
@@ -199,17 +230,17 @@ public abstract class BusFactory {
ClassLoader loader =
Thread.currentThread().getContextClassLoader();
className = getBusFactoryClass(loader);
if (className == null && loader !=
BusFactory.class.getClassLoader()) {
- className =
getBusFactoryClass(BusFactory.class.getClassLoader());
+ className =
getBusFactoryClass(BusFactory.class.getClassLoader());
}
}
if (className == null) {
className = BusFactory.DEFAULT_BUS_FACTORY;
}
-
+
Class<? extends BusFactory> busFactoryClass;
try {
- busFactoryClass =
- ClassLoaderUtils.loadClass(className,
BusFactory.class).asSubclass(BusFactory.class);
+ busFactoryClass = ClassLoaderUtils.loadClass(className,
BusFactory.class)
+ .asSubclass(BusFactory.class);
instance = busFactoryClass.newInstance();
} catch (Exception ex) {
LogUtils.log(LOG, Level.SEVERE, "BUS_FACTORY_INSTANTIATION_EXC",
ex);
@@ -220,47 +251,46 @@ public abstract class BusFactory {
protected void initializeBus(Bus bus) {
}
-
+
private static String getBusFactoryClass(ClassLoader classLoader) {
-
+
String busFactoryClass = null;
String busFactoryCondition = null;
-
+
// next check system properties
busFactoryClass =
System.getProperty(BusFactory.BUS_FACTORY_PROPERTY_NAME);
if (isValidBusFactoryClass(busFactoryClass)) {
return busFactoryClass;
}
-
+
try {
// next, check for the services stuff in the jar file
String serviceId = "META-INF/services/" +
BusFactory.BUS_FACTORY_PROPERTY_NAME;
InputStream is = null;
-
+
if (classLoader == null) {
classLoader = Thread.currentThread().getContextClassLoader();
}
-
+
if (classLoader == null) {
is = ClassLoader.getSystemResourceAsStream(serviceId);
} else {
- is = classLoader.getResourceAsStream(serviceId);
+ is = classLoader.getResourceAsStream(serviceId);
}
if (is == null) {
serviceId = "META-INF/cxf/" +
BusFactory.BUS_FACTORY_PROPERTY_NAME;
-
+
if (classLoader == null) {
classLoader =
Thread.currentThread().getContextClassLoader();
}
-
+
if (classLoader == null) {
is = ClassLoader.getSystemResourceAsStream(serviceId);
} else {
- is = classLoader.getResourceAsStream(serviceId);
+ is = classLoader.getResourceAsStream(serviceId);
}
}
-
-
+
if (is != null) {
BufferedReader rd = new BufferedReader(new
InputStreamReader(is, "UTF-8"));
busFactoryClass = rd.readLine();
@@ -269,7 +299,7 @@ public abstract class BusFactory {
}
if (isValidBusFactoryClass(busFactoryClass)) {
if (busFactoryCondition != null) {
- try {
+ try {
classLoader.loadClass(busFactoryCondition);
return busFactoryClass;
} catch (ClassNotFoundException e) {
@@ -283,13 +313,12 @@ public abstract class BusFactory {
} catch (Exception ex) {
LogUtils.log(LOG, Level.SEVERE,
"FAILED_TO_DETERMINE_BUS_FACTORY_EXC", ex);
- }
+ }
return busFactoryClass;
}
-
- private static boolean isValidBusFactoryClass(String busFactoryClassName)
{
+
+ private static boolean isValidBusFactoryClass(String busFactoryClassName) {
return busFactoryClassName != null && !"".equals(busFactoryClassName);
}
-
+
}
-
\ No newline at end of file