View Javadoc
1   package org.apache.turbine.services.avaloncomponent;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *   http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  
22  import java.io.File;
23  import java.io.IOException;
24  
25  import org.apache.avalon.framework.activity.Disposable;
26  import org.apache.avalon.framework.activity.Initializable;
27  import org.apache.avalon.framework.logger.CommonsLogger;
28  import org.apache.avalon.framework.logger.Logger;
29  import org.apache.avalon.framework.service.ServiceException;
30  import org.apache.commons.configuration.Configuration;
31  import org.apache.commons.logging.Log;
32  import org.apache.commons.logging.LogFactory;
33  import org.apache.fulcrum.yaafi.framework.container.ServiceContainer;
34  import org.apache.fulcrum.yaafi.framework.factory.ServiceContainerConfiguration;
35  import org.apache.fulcrum.yaafi.framework.factory.ServiceContainerFactory;
36  import org.apache.turbine.Turbine;
37  import org.apache.turbine.services.InitializationException;
38  import org.apache.turbine.services.InstantiationException;
39  import org.apache.turbine.services.TurbineBaseService;
40  
41  /**
42   * An implementation of Turbine service initializing the YAAFI container
43   *
44   * @author <a href="mailto:siegfried.goeschl@it20one.at">Siegfried Goeschl</a>
45   */
46  public class TurbineYaafiComponentService
47          extends TurbineBaseService
48          implements AvalonComponentService, Initializable, Disposable
49  {
50      /** the logger to be used */
51      private static Log log = LogFactory.getLog(AVALON_LOG_CATEGORY);
52  
53      /** property to lookup the container configuration file */
54      public static final String CONTAINER_CONFIGURATION_KEY = "containerConfiguration";
55  
56      /** the default value for the container configuration file */
57      public static final String CONTAINER_CONFIGURATION_VALUE = "/WEB-INF/conf/containerConfiguration.xml";
58  
59      /** property to lookup the properties file */
60      public static final String COMPONENT_PARAMETERS_KEY = "parameters";
61  
62      /** the default value for the parameter file */
63      public static final String COMPONENT_PARAMETERS_VALUE = "/WEB-INF/conf/parameters.properties";
64  
65      /** YAFFI container */
66      private ServiceContainer container;
67  
68      /**
69       * Load all configured components and initialize them. This is a zero parameter variant which
70       * queries the Turbine Servlet for its config.
71       *
72       * @throws InitializationException Something went wrong in the init stage
73       */
74      @Override
75      public void init() throws InitializationException
76      {
77          try
78          {
79              log.info( "Initializing TurbineYaafiComponentService ..." );
80              initialize();
81              setInit(true);
82          }
83          catch (Exception e)
84          {
85              log.error("Exception caught initialising service: ", e);
86              throw new InitializationException("Initializing TurbineYaafiComponentService failed", e);
87          }
88      }
89  
90      /**
91       * Shuts the Component Service down, calls dispose on the components that implement this
92       * interface
93       *
94       */
95      @Override
96      public void shutdown()
97      {
98          log.info( "Disposing TurbineYaafiComponentService ..." );
99          dispose();
100         setInit(false);
101     }
102 
103     // -------------------------------------------------------------
104     // Avalon lifecycle interfaces
105     // -------------------------------------------------------------
106 
107     /**
108      * Initializes the container
109      *
110      * @throws Exception generic exception
111      */
112     @Override
113     public void initialize() throws Exception
114     {
115         // get the configuration from the baseclass
116 
117         Configuration conf = this.getConfiguration();
118 
119         // determine the home directory
120         String homePath = Turbine.getRealPath("/");
121         if (homePath == null)
122         {
123             homePath = Turbine.getApplicationRoot();
124         }
125         File home = new File(homePath);
126         log.info("Using the following home : " + home.getAbsolutePath());
127 
128         // create the configuration for YAAFI
129         ServiceContainerConfiguration config =
130             this.createServiceContainerConfiguration(conf, home);
131 
132         // initialize the container
133         try
134         {
135             this.container = ServiceContainerFactory.create(
136                 config
137                 );
138         }
139         catch (Exception e)
140         {
141             String msg = "Initializing YAAFI failed";
142             log.error(msg,e);
143             throw e;
144         }
145     }
146 
147     /**
148      * Disposes of the container and releases resources
149      */
150     @Override
151     public void dispose()
152     {
153         if (this.container != null)
154         {
155             this.container.dispose();
156             this.container = null;
157         }
158     }
159 
160     /**
161      * Returns an instance of the named component
162      *
163      * @param roleName Name of the role the component fills.
164      * @return an instance of the named component
165      */
166     @Override
167     public Object lookup(String roleName) throws ServiceException
168     {
169         return this.container.lookup(roleName);
170     }
171 
172     /**
173      * Releases the component.
174      *
175      * @param component the component to release
176      */
177     @Override
178     public void release(Object component)
179     {
180         this.container.release( component );
181     }
182 
183     /**
184      * @see org.apache.avalon.framework.service.ServiceManager#hasService(java.lang.String)
185      */
186     @Override
187     public boolean hasService(String roleName)
188     {
189         return this.container.hasService(roleName);
190     }
191 
192     /**
193      * Create a ServiceContainerConfiguration based on the Turbine configuration
194      *
195      * @param conf the Turbine configuration
196      * @param applicationRoot the application root directory
197      *
198      * @return the YAAFI configuration
199      * @throws IOException creating the YAAFI configuration failed
200      */
201     protected ServiceContainerConfiguration createServiceContainerConfiguration( Configuration conf, File applicationRoot )
202         throws IOException
203     {
204         ServiceContainerConfiguration result = new ServiceContainerConfiguration();
205 
206         result.setApplicationRootDir(applicationRoot.getAbsolutePath());
207         result.setLogger( this.createAvalonLogger() );
208 
209         // are we using a "containerConfiguration.xml" ?!
210 
211         if( conf.containsKey(CONTAINER_CONFIGURATION_KEY) )
212         {
213             // determine the container configuration file
214 
215             String containerConfiguration = conf.getString(
216                 CONTAINER_CONFIGURATION_KEY
217                 );
218 
219             result.loadContainerConfiguration(containerConfiguration);
220         }
221         else if( conf.containsKey(COMPONENT_ROLE_KEY) )
222         {
223             // determine the location of the role configuraton file
224 
225             String roleConfigurationFileName = conf.getString(
226                 COMPONENT_ROLE_KEY,
227                 COMPONENT_ROLE_VALUE
228                 );
229 
230             // determine the location of component configuration file
231 
232             String componentConfigurationFileName = conf.getString(
233                 COMPONENT_CONFIG_KEY,
234                 COMPONENT_CONFIG_VALUE
235                 );
236 
237             // determine the location of parameters file
238 
239             String parametersFileName = conf.getString(
240                 COMPONENT_PARAMETERS_KEY,
241                 COMPONENT_PARAMETERS_VALUE
242                 );
243 
244             result.setComponentRolesLocation( roleConfigurationFileName );
245             result.setComponentConfigurationLocation( componentConfigurationFileName );
246             result.setParametersLocation( parametersFileName );
247         }
248         else
249         {
250             // determine the container configuration file
251 
252             String containerConfiguration = conf.getString(
253                 CONTAINER_CONFIGURATION_KEY,
254                 CONTAINER_CONFIGURATION_VALUE
255                 );
256 
257             result.loadContainerConfiguration(containerConfiguration);
258         }
259 
260         return result;
261     }
262 
263     /**
264      * Create the Avalon logger to be passed to YAAFI
265      * @return an Avalon Logger
266      */
267     protected Logger createAvalonLogger()
268     {
269         Logger result = new CommonsLogger(log, AVALON_LOG_CATEGORY);
270         return result;
271     }
272 
273     // -------------------------------------------------------------
274     // TurbineServiceProvider
275     // -------------------------------------------------------------
276 
277     /**
278      * @see org.apache.turbine.services.TurbineServiceProvider#exists(java.lang.String)
279      */
280     @Override
281     public boolean exists(String roleName)
282     {
283         return this.hasService(roleName);
284     }
285 
286     /**
287      * @see org.apache.turbine.services.TurbineServiceProvider#get(java.lang.String)
288      */
289     @Override
290     public Object get(String roleName) throws InstantiationException
291     {
292         try
293         {
294             return this.lookup(roleName);
295         }
296         catch (ServiceException e)
297         {
298             String msg = "Unable to get the following service : " + roleName;
299             log.error(msg);
300             throw new InstantiationException(msg);
301         }
302         catch (Throwable t)
303         {
304             String msg = "Unable to get the following service : " + roleName;
305             log.error(msg,t);
306             throw new InstantiationException(msg,t);
307         }
308     }
309 }