View Javadoc

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   import java.util.Hashtable;
10  import java.util.Iterator;
11  import java.util.List;
12  import org.codehaus.plexus.PlexusConstants;
13  import org.codehaus.plexus.PlexusContainer;
14  import org.codehaus.plexus.configuration.PlexusConfiguration;
15  import org.codehaus.plexus.configuration.xml.xstream.PlexusTools;
16  import org.codehaus.plexus.context.Context;
17  import org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable;
18  import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable;
19  import org.codehaus.xfire.plexus.PlexusXFireComponent;
20  import org.codehaus.xfire.service.Service;
21  
22  /***
23   * Loads in XFire components from the XFire configuration file.
24   * 
25   * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse</a>
26   */
27  public class DefaultConfigurationService
28      extends PlexusXFireComponent
29      implements Initializable, Contextualizable, ConfigurationService
30  { 
31      private PlexusContainer container;
32      
33      private Hashtable configurators = new Hashtable();
34      
35  	public void initialize() throws Exception
36  	{
37          List confs = getServiceLocator().lookupList(Configurator.ROLE);
38          
39          for ( Iterator itr = confs.iterator(); itr.hasNext(); )
40          {
41              Configurator conf = (Configurator) itr.next();
42              
43              register( conf );
44          }
45          
46          Reader reader = findConfigurationReader();
47               
48          if ( reader == null )
49          {
50             return;
51          }             
52         
53          PlexusConfiguration configuration = PlexusTools.buildConfiguration( reader );
54          createServices( configuration.getChild("services") );
55  	}
56      
57  	private void createServices(PlexusConfiguration child) 
58          throws Exception
59      {
60          PlexusConfiguration[] service = child.getChildren("service");
61          
62          for ( int i = 0; i < service.length; i++ )
63          {
64              createService( service[i] );
65          }
66      }
67      
68      private void createService(PlexusConfiguration c) 
69          throws Exception
70      {
71          String type = c.getChild("type").getValue("simple");
72          
73          if ( type == null )
74          {
75              getLogger().error("Service " + c.getAttribute("name") 
76                      + " has no type.");
77              return;
78          }
79          
80          getLogger().info("Creating service " + c.getChild("name").getValue() + " with type " + type);
81          Configurator builder = 
82              (Configurator) getServiceLocator().lookup( Configurator.ROLE, type );
83          
84          if ( builder == null )
85          {
86              getLogger().error("Creating service " + c.getChild("name").getValue() + " with type " + type
87                      + ". Service " + c.getAttribute("name") + " not created.");
88              return;
89          }
90          else
91          {
92              Service service = builder.createService(c);
93          }
94      }
95  
96  	protected Reader findConfigurationReader() throws FileNotFoundException
97  	{
98  		String configFileName = System.getProperty("xfire.config");
99          
100         Reader reader = null;
101         
102         if ( configFileName == null )
103         {
104             getLogger().info("No configuration file specified.");
105             configFileName = "xfire.xml";
106         }
107 
108         File file = new File( configFileName );
109         
110         if ( file.exists() )
111         {
112             getLogger().info("Found configuration file " + file.getAbsolutePath());
113         	reader = new FileReader( file );
114         }
115         else
116         {
117             getLogger().info("Could not find configuration file " + file.getAbsolutePath());
118             getLogger().info("Looking in the classpath.");
119         
120             InputStream is = getClass().getResourceAsStream(configFileName);
121             
122             if ( is == null )
123             {
124                 is = getClass().getResourceAsStream("META-INF/xfire/xfire.xml");
125                 
126                 if ( is == null )
127                     return null;
128             }
129             
130             reader = new InputStreamReader( is );
131         }
132         
133 		return reader;
134 	}
135 
136 	/***
137 	 * @see org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable#contextualize(org.codehaus.plexus.context.Context)
138 	 */
139 	public void contextualize(Context context) throws Exception
140 	{
141 		container = (PlexusContainer) context.get( PlexusConstants.PLEXUS_KEY );
142 	}
143 
144     /***
145      * @see org.codehaus.xfire.plexus.config.ConfigurationService#register(org.codehaus.xfire.plexus.config.ServiceConfigurator)
146      */
147     public void register( Configurator configurator )
148     {
149         configurators.put( configurator.getServiceType(),
150                            configurator );
151     }
152 }