001 package org.apache.turbine.services.avaloncomponent;
002
003 /*
004 * Licensed to the Apache Software Foundation (ASF) under one
005 * or more contributor license agreements. See the NOTICE file
006 * distributed with this work for additional information
007 * regarding copyright ownership. The ASF licenses this file
008 * to you under the Apache License, Version 2.0 (the
009 * "License"); you may not use this file except in compliance
010 * with the License. You may obtain a copy of the License at
011 *
012 * http://www.apache.org/licenses/LICENSE-2.0
013 *
014 * Unless required by applicable law or agreed to in writing,
015 * software distributed under the License is distributed on an
016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017 * KIND, either express or implied. See the License for the
018 * specific language governing permissions and limitations
019 * under the License.
020 */
021
022 import java.io.IOException;
023
024 import org.apache.avalon.framework.activity.Disposable;
025 import org.apache.avalon.framework.activity.Initializable;
026 import org.apache.avalon.framework.logger.CommonsLogger;
027 import org.apache.avalon.framework.logger.Logger;
028 import org.apache.avalon.framework.service.ServiceException;
029 import org.apache.commons.configuration.Configuration;
030 import org.apache.commons.logging.Log;
031 import org.apache.commons.logging.LogFactory;
032 import org.apache.fulcrum.yaafi.framework.container.ServiceContainer;
033 import org.apache.fulcrum.yaafi.framework.factory.ServiceContainerConfiguration;
034 import org.apache.fulcrum.yaafi.framework.factory.ServiceContainerFactory;
035 import org.apache.turbine.Turbine;
036 import org.apache.turbine.services.InitializationException;
037 import org.apache.turbine.services.InstantiationException;
038 import org.apache.turbine.services.TurbineBaseService;
039
040 /**
041 * An implementation of Turbine service initializing the YAAFI container
042 *
043 * @author <a href="mailto:siegfried.goescfl@it20one.at">Siegfried Goeschl</a>
044 */
045 public class TurbineYaafiComponentService
046 extends TurbineBaseService
047 implements AvalonComponentService, Initializable, Disposable
048 {
049 /** the logger to be used */
050 private static Log log = LogFactory.getLog(AVALON_LOG_CATEGORY);
051
052 /** property to lookup the container configuration file */
053 public static final String CONTAINER_CONFIGURATION_KEY = "containerConfiguration";
054
055 /** the default value for the container configuration file */
056 public static final String CONTAINER_CONFIGURATION_VALUE = "/WEB-INF/conf/containerConfiguration.xml";
057
058 /** property to lookup the properties file */
059 public static final String COMPONENT_PARAMETERS_KEY = "parameters";
060
061 /** the default value for the parameter file */
062 public static final String COMPONENT_PARAMETERS_VALUE = "/WEB-INF/conf/parameters.properties";
063
064 /** YAFFI container */
065 private ServiceContainer container;
066
067 // -------------------------------------------------------------
068 // Service initialization
069 // -------------------------------------------------------------
070
071 public TurbineYaafiComponentService()
072 {
073 // nothing to do
074 }
075
076 /**
077 * Load all configured components and initialize them. This is a zero parameter variant which
078 * queries the Turbine Servlet for its config.
079 *
080 * @throws InitializationException Something went wrong in the init stage
081 */
082 public void init() throws InitializationException
083 {
084 try
085 {
086 log.info( "Initializing TurbineYaafiComponentService ..." );
087 initialize();
088 setInit(true);
089 }
090 catch (Exception e)
091 {
092 log.error("Exception caught initialising service: ", e);
093 throw new InitializationException("Initializing TurbineYaafiComponentService failed", e);
094 }
095 }
096
097 /**
098 * Shuts the Component Service down, calls dispose on the components that implement this
099 * interface
100 *
101 */
102 public void shutdown()
103 {
104 log.info( "Disposing TurbineYaafiComponentService ..." );
105 dispose();
106 setInit(false);
107 }
108
109 // -------------------------------------------------------------
110 // Avalon lifecycle interfaces
111 // -------------------------------------------------------------
112
113 /**
114 * Initializes the container
115 *
116 * @throws Exception generic exception
117 */
118 public void initialize() throws Exception
119 {
120 // get the configuration from the baseclass
121
122 Configuration conf = this.getConfiguration();
123
124 // determine the home directory
125
126 String homePath = Turbine.getRealPath("/");
127 log.info( "Using the following home : " + homePath );
128
129 // create the configuration for YAAFI
130
131 ServiceContainerConfiguration config =
132 this.createServiceContainerConfiguration(conf);
133
134 config.setLogger( this.createAvalonLogger() );
135 config.setApplicationRootDir( homePath );
136
137 // initialize the container
138
139 try
140 {
141 this.container = ServiceContainerFactory.create(
142 config
143 );
144 }
145 catch (Exception e)
146 {
147 String msg = "Initializing YAAFI failed";
148 log.error(msg,e);
149 throw e;
150 }
151 }
152
153 /**
154 * Disposes of the container and releases resources
155 */
156 public void dispose()
157 {
158 if (this.container != null)
159 {
160 this.container.dispose();
161 this.container = null;
162 }
163 }
164
165 /**
166 * Returns an instance of the named component
167 *
168 * @param roleName Name of the role the component fills.
169 * @return an instance of the named component
170 * @throws Exception generic exception
171 */
172 public Object lookup(String roleName) throws ServiceException
173 {
174 return this.container.lookup(roleName);
175 }
176
177 /**
178 * Releases the component.
179 *
180 * @param component the component to release
181 */
182 public void release(Object component)
183 {
184 this.container.release( component );
185 }
186
187 /**
188 * @see org.apache.avalon.framework.service.ServiceManager#hasService(java.lang.String)
189 */
190 public boolean hasService(String roleName)
191 {
192 return this.container.hasService(roleName);
193 }
194
195 /**
196 * Create a ServiceContainerConfiguration based on the Turbine configuration
197 *
198 * @param conf the Turbine configuration
199 * @return the YAAFI configuration
200 * @throws IOException creating the YAAFI configuration failed
201 */
202 protected ServiceContainerConfiguration createServiceContainerConfiguration( Configuration conf )
203 throws IOException
204 {
205 ServiceContainerConfiguration result = new ServiceContainerConfiguration();
206
207 // are we using a "containerConfiguration.xml" ?!
208
209 if( conf.containsKey(CONTAINER_CONFIGURATION_KEY) )
210 {
211 // determine the container configuration file
212
213 String containerConfiguration = conf.getString(
214 CONTAINER_CONFIGURATION_KEY
215 );
216
217 result.loadContainerConfiguration(containerConfiguration);
218 }
219 else if( conf.containsKey(COMPONENT_ROLE_KEY) )
220 {
221 // determine the location of the role configuraton file
222
223 String roleConfigurationFileName = conf.getString(
224 COMPONENT_ROLE_KEY,
225 COMPONENT_ROLE_VALUE
226 );
227
228 // determine the location of component configuration file
229
230 String componentConfigurationFileName = conf.getString(
231 COMPONENT_CONFIG_KEY,
232 COMPONENT_CONFIG_VALUE
233 );
234
235 // determine the location of parameters file
236
237 String parametersFileName = conf.getString(
238 COMPONENT_PARAMETERS_KEY,
239 COMPONENT_PARAMETERS_VALUE
240 );
241
242 result.setComponentRolesLocation( roleConfigurationFileName );
243 result.setComponentConfigurationLocation( componentConfigurationFileName );
244 result.setParametersLocation( parametersFileName );
245 }
246 else
247 {
248 // determine the container configuration file
249
250 String containerConfiguration = conf.getString(
251 CONTAINER_CONFIGURATION_KEY,
252 CONTAINER_CONFIGURATION_VALUE
253 );
254
255 result.loadContainerConfiguration(containerConfiguration);
256 }
257
258 return result;
259 }
260
261 /**
262 * Create the Avalon logger to be passed to YAAFI
263 * @return an Avalon Logger
264 */
265 protected Logger createAvalonLogger()
266 {
267 Logger result = new CommonsLogger(log, AVALON_LOG_CATEGORY);
268 return result;
269 }
270
271 // -------------------------------------------------------------
272 // TurbineServiceProvider
273 // -------------------------------------------------------------
274
275 /**
276 * @see org.apache.turbine.services.TurbineServiceProvider#exists(java.lang.String)
277 */
278 public boolean exists(String roleName)
279 {
280 return this.hasService(roleName);
281 }
282
283 /**
284 * @see org.apache.turbine.services.TurbineServiceProvider#get(java.lang.String)
285 */
286 public Object get(String roleName) throws InstantiationException
287 {
288 try
289 {
290 return this.lookup(roleName);
291 }
292 catch (ServiceException e)
293 {
294 String msg = "Unable to get the following service : " + roleName;
295 log.error(msg);
296 throw new InstantiationException(msg);
297 }
298 catch (Throwable t)
299 {
300 String msg = "Unable to get the following service : " + roleName;
301 log.error(msg,t);
302 throw new InstantiationException(msg,t);
303 }
304 }
305 }