1 package org.codehaus.xfire.plexus;
2
3 import java.io.File;
4 import java.net.MalformedURLException;
5 import java.net.URL;
6 import java.util.Properties;
7 import org.codehaus.plexus.embed.Embedder;
8 import org.codehaus.xfire.XFire;
9 import org.codehaus.xfire.service.ServiceRegistry;
10 import org.codehaus.xfire.transport.TransportManager;
11
12 /***
13 * <p>
14 * The StandaloneXFire class allows you to embed XFire any which way
15 * within your apps. Grab an instance of the <code>StandaloneXFire</code>
16 * instance via <code>getInstance()</code> then access such components
17 * as the ServiceRegistry or TransportService.
18 * </p>
19 * <p>
20 * This class assumes one XFire instance per JVM. To create many XFire instances
21 * you must use Plexus directly.
22 * </p>
23 * <p>
24 * To use a non-standard plexus configuration for XFire, set the
25 * "xfire.plexusConfig" system property to the location of the configuration
26 * file. This can be in the classpath or in the filesystem.
27 * </p>
28 * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse</a>
29 */
30 public class StandaloneXFire
31 {
32 private static StandaloneXFire standalone;
33
34 protected Embedder embed;
35
36 private StandaloneXFire()
37 throws Exception
38 {
39 URL resource = getPlexusConfiguration();
40
41 embed = new Embedder();
42
43 embed.setConfiguration( resource );
44
45 Properties contextProperties = new Properties();
46
47 embed.setProperties(contextProperties);
48
49 embed.start();
50 }
51
52 /***
53 * @return
54 */
55 private URL getPlexusConfiguration()
56 {
57 URL resource = null;
58
59 String configFileName = System.getProperty("xfire.plexusConfig");
60
61 if ( configFileName != null )
62 {
63 File file = new File(configFileName);
64 if ( file.exists() )
65 {
66 try
67 {
68 resource = file.toURL();
69 }
70 catch (MalformedURLException e)
71 {
72 throw new RuntimeException("Couldn't get plexus configuration.", e);
73 }
74 }
75 else
76 {
77 resource = getClass().getResource(configFileName);
78 }
79 }
80
81 if ( resource == null )
82 {
83 resource = getClass().getResource("/org/codehaus/xfire/plexus/StandaloneXFire.xml");
84 }
85
86 return resource;
87 }
88
89 public static StandaloneXFire getInstance()
90 throws Exception
91 {
92 if (standalone == null)
93 {
94 synchronized (StandaloneXFire.class)
95 {
96 standalone = new StandaloneXFire();
97 }
98 }
99 return standalone;
100 }
101
102 public ServiceRegistry getServiceRegistry() throws Exception
103 {
104 return (ServiceRegistry) embed.lookup( ServiceRegistry.ROLE );
105 }
106
107 public XFire getXFire() throws Exception
108 {
109 return (XFire) embed.lookup( XFire.ROLE );
110 }
111
112 public TransportManager getTransportService() throws Exception
113 {
114 return (TransportManager) embed.lookup( TransportManager.ROLE );
115 }
116
117 protected void finalize() throws Throwable
118 {
119 embed.stop();
120
121 super.finalize();
122 }
123 }