1 package org.codehaus.xfire;
2
3 import java.lang.reflect.InvocationTargetException;
4 import java.lang.reflect.Method;
5 import java.util.HashMap;
6
7
8 /***
9 * <p/>
10 * The XFireFactory class allows you to embed XFire within your apps easily. </p>
11 * <p/>
12 * This class assumes one XFire instance per JVM. To create many XFire instances you must use your own configuration and
13 * instantiation mechanism. </p>
14 * <p/>
15 * If you want to provide your own Factory you must: <ul> <li>Register your factory via
16 * <code>registerFactory</code></li> <li>Implement <code>public static XFireFactory createInstance()</code> </ul> </p>
17 *
18 * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse</a>
19 */
20 public class XFireFactory
21 {
22 private static XFireFactory standalone;
23 private static Class defaultFacClass;
24 private static HashMap factories = new HashMap();
25 private static HashMap factoryClasses = new HashMap();
26
27 private XFire xfire;
28
29 protected XFireFactory()
30 {
31 xfire = new DefaultXFire();
32 }
33
34 protected XFireFactory(XFire xfire)
35 {
36 this.xfire = xfire;
37 }
38
39 protected static XFireFactory createInstance()
40 {
41 return new XFireFactory();
42 }
43
44 public static XFireFactory newInstance()
45 {
46 if (standalone == null)
47 {
48 synchronized (XFireFactory.class)
49 {
50 if (defaultFacClass != null)
51 {
52 standalone = loadFactory(defaultFacClass);
53 }
54 else
55 {
56 standalone = new XFireFactory();
57 }
58 }
59 }
60 return standalone;
61 }
62
63 private static XFireFactory loadFactory(Class clazz)
64 {
65 try
66 {
67 Method m = clazz.getMethod("createInstance", new Class[0]);
68
69 return (XFireFactory) m.invoke(null, new Object[0]);
70 }
71 catch (SecurityException e)
72 {
73 throw new XFireRuntimeException("Couldn't load " + clazz.getName(), e);
74 }
75 catch (NoSuchMethodException e)
76 {
77 throw new XFireRuntimeException("Factory doesn't implement createInstance(): " + clazz.getName(), e);
78 }
79 catch (IllegalArgumentException e)
80 {
81 throw new XFireRuntimeException("Factory doesn't implement createInstance(): " + clazz.getName(), e);
82 }
83 catch (IllegalAccessException e)
84 {
85 throw new XFireRuntimeException("Couldn't load " + clazz.getName(), e);
86 }
87 catch (InvocationTargetException e)
88 {
89 throw new XFireRuntimeException("Couldn't load factory " + clazz.getName(), e);
90 }
91
92 }
93
94 public static XFireFactory newInstance(String selector)
95 {
96 XFireFactory fac = (XFireFactory) factories.get(selector);
97 if (fac == null)
98 {
99 synchronized (XFireFactory.class)
100 {
101 Class clazz = (Class) factoryClasses.get(selector);
102 if (clazz == null)
103 return null;
104
105 fac = loadFactory(clazz);
106 }
107 }
108 return fac;
109 }
110
111 /***
112 * Register an XFireFactory class.
113 *
114 * @param factoryClass
115 * @param def Whether or not this should be the default factory.
116 */
117 public static void registerFactory(Class factoryClass, boolean def)
118 {
119 if (def)
120 defaultFacClass = factoryClass;
121
122 factoryClasses.put(factoryClass.getName(), factoryClass);
123 }
124
125 public XFire getXFire()
126 {
127 return xfire;
128 }
129 }