1 package org.codehaus.xfire.plexus.config;
2
3 import java.io.File;
4 import java.io.FileNotFoundException;
5 import java.io.FileReader;
6 import java.io.InputStream;
7 import java.io.InputStreamReader;
8 import java.io.Reader;
9
10 import org.codehaus.plexus.configuration.PlexusConfiguration;
11 import org.codehaus.plexus.configuration.PlexusConfigurationException;
12 import org.codehaus.plexus.configuration.xml.XmlPlexusConfiguration;
13 import org.codehaus.plexus.personality.plexus.lifecycle.phase.Configurable;
14 import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable;
15 import org.codehaus.plexus.util.xml.Xpp3DomBuilder;
16 import org.codehaus.xfire.plexus.PlexusXFireComponent;
17 import org.codehaus.xfire.service.Service;
18
19 /***
20 * Loads in XFire components from the XFire configuration file.
21 *
22 * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse</a>
23 */
24 public class DefaultConfigurationService
25 extends PlexusXFireComponent
26 implements Initializable, ConfigurationService, Configurable
27 {
28 private Configurator configurator;
29
30 private PlexusConfiguration services;
31
32 public void initialize() throws Exception
33 {
34 try
35 {
36 createServices(services);
37
38 Reader reader = findConfigurationReader();
39
40 if ( reader == null )
41 {
42 return;
43 }
44
45 PlexusConfiguration configuration = new XmlPlexusConfiguration( Xpp3DomBuilder.build(reader) );
46
47 createServices( configuration.getChild("services") );
48 }
49 catch( Exception e )
50 {
51 getLogger().error("Could not start the configuration service.", e);
52 throw e;
53 }
54 }
55
56 private void createServices(PlexusConfiguration child)
57 throws Exception
58 {
59 PlexusConfiguration[] service = child.getChildren("service");
60
61 for ( int i = 0; i < service.length; i++ )
62 {
63 createService( service[i] );
64 }
65 }
66
67 private void createService(PlexusConfiguration c)
68 throws Exception
69 {
70 Service service = configurator.createService(c);
71 }
72
73 protected Reader findConfigurationReader() throws FileNotFoundException
74 {
75 String configFileName = System.getProperty("xfire.config");
76
77 Reader reader = null;
78
79 if ( configFileName == null )
80 {
81 getLogger().info("No configuration file specified. Looking for xfire.xml in the current directory.");
82 configFileName = "xfire.xml";
83 }
84
85 File file = new File( configFileName );
86
87 if ( file.exists() )
88 {
89 getLogger().info("Found configuration file " + file.getAbsolutePath());
90 reader = new FileReader( file );
91 }
92 else
93 {
94 getLogger().info("Could not find configuration file " + file.getAbsolutePath() +
95 ". Looking in the classpath.");
96
97 InputStream is = getClass().getResourceAsStream(configFileName);
98
99 if ( is == null )
100 {
101 getLogger().info("Could not find configuration file " + configFileName +
102 " on classpath. Looking for META-INF/xfire/xfire.xml " +
103 "on the classpath");
104
105 is = getClass().getResourceAsStream("META-INF/xfire/xfire.xml");
106
107 if ( is == null )
108 {
109 getLogger().info("No configuration found.");
110 return null;
111 }
112 }
113
114 reader = new InputStreamReader( is );
115 }
116
117 return reader;
118 }
119
120 /***
121 * @param arg0
122 * @throws PlexusConfigurationException
123 */
124 public void configure(PlexusConfiguration config)
125 throws PlexusConfigurationException
126 {
127 services = config.getChild("services");
128 }
129 }