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