blob: b5258c7de8ca948e3e382df6fbe891964f44acc3 [file] [log] [blame]
package org.apache.fulcrum.yaafi.framework.component;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import org.apache.avalon.framework.activity.Disposable;
import org.apache.avalon.framework.activity.Executable;
import org.apache.avalon.framework.activity.Initializable;
import org.apache.avalon.framework.activity.Startable;
import org.apache.avalon.framework.activity.Suspendable;
import org.apache.avalon.framework.configuration.Configurable;
import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.configuration.ConfigurationException;
import org.apache.avalon.framework.configuration.Reconfigurable;
import org.apache.avalon.framework.context.Context;
import org.apache.avalon.framework.context.ContextException;
import org.apache.avalon.framework.context.Contextualizable;
import org.apache.avalon.framework.logger.LogEnabled;
import org.apache.avalon.framework.logger.Logger;
import org.apache.avalon.framework.parameters.ParameterException;
import org.apache.avalon.framework.parameters.Parameterizable;
import org.apache.avalon.framework.parameters.Parameters;
import org.apache.avalon.framework.service.ServiceException;
import org.apache.avalon.framework.service.ServiceManager;
import org.apache.avalon.framework.service.Serviceable;
import org.apache.fulcrum.yaafi.framework.interceptor.AvalonInterceptorFactory;
import org.apache.fulcrum.yaafi.framework.interceptor.AvalonInterceptorService;
import org.apache.fulcrum.yaafi.framework.role.RoleEntry;
import org.apache.fulcrum.yaafi.framework.util.Validate;
/**
* This class implements a service component singleton with
* an arbitrary lifecycle.
*
* @author <a href="mailto:siegfried.goeschl@it20one.at">Siegfried Goeschl</a>
*/
public class AvalonServiceComponentImpl
extends ServiceComponentImpl
{
/**
* Constructor to parse the configuration.
*
* @param roleEntry The information extracted from the role configuration file
* @param parentLogger the logger of the service container
* @param logger The logger for the service instance
*/
public AvalonServiceComponentImpl(
RoleEntry roleEntry, Logger parentLogger, Logger logger)
{
super( roleEntry, parentLogger, logger );
}
/////////////////////////////////////////////////////////////////////////
// Service Component Lifecycle Implementation
/////////////////////////////////////////////////////////////////////////
/**
* @see org.apache.fulcrum.yaafi.framework.component.ServiceComponent#incarnate()
*/
protected void incarnateInstance() throws Exception
{
this.getParentLogger().debug( "Incarnating the service " + this.getShorthand() );
if( this.getLogger() != null )
{
this.enableLogging( this.getLogger() );
}
if( this.getContext() != null )
{
this.contextualize( this.getContext() );
}
if( this.getServiceManager() != null )
{
this.service( this.getServiceManager() );
}
if( this.getConfiguration() != null )
{
this.configure( this.getConfiguration() );
}
if( this.getParamaters() != null )
{
this.parameterize( this.getParamaters() );
}
this.initialize();
this.execute();
this.start();
// create a dynamic proxy only if
//
// +) interceptors are enabled
// +) the instance is not an AvalonServiceInterceptor
boolean isInterceptor = AvalonInterceptorService.class.isAssignableFrom(
this.getImplementationClazz()
);
if( (this.getRoleEntry().hasDynamicProxy()) && (isInterceptor == false ) )
{
if( this.getParentLogger().isDebugEnabled() )
{
this.getParentLogger().debug( "Creating a dynamic proxy for " + this.getShorthand() );
}
Object proxyInstance = AvalonInterceptorFactory.create(
this.getName(),
this.getShorthand(),
this.getServiceManager(),
this.getRoleEntry().getInterceptorList(),
this.getRawInstance(false)
);
this.setProxyInstance(proxyInstance);
}
else
{
this.getRoleEntry().setHasDynamicProxy(false);
}
}
/**
* @see org.apache.fulcrum.yaafi.framework.component.ServiceComponent#reconfigure()
*/
public void reconfigure() throws Exception
{
Throwable lastThrowable = null;
this.getParentLogger().debug( "Reconfiguring " + this.getShorthand() );
try
{
this.suspend();
}
catch (Throwable t)
{
String msg = "Suspending the following service failed : " + this.getShorthand();
this.getParentLogger().error( msg, t );
lastThrowable = t;
}
try
{
if( this.getConfiguration() != null )
{
this.reconfigure( this.getConfiguration() );
}
}
catch (Throwable t)
{
String msg = "Reconfiguring the following service failed : " + this.getShorthand();
this.getParentLogger().error( msg, t );
lastThrowable = t;
}
try
{
this.resume();
}
catch (Throwable t)
{
String msg = "Resuming the following service failed : " + this.getShorthand();
this.getParentLogger().error( msg, t );
lastThrowable = t;
}
if( lastThrowable != null )
{
if( lastThrowable instanceof Exception )
{
throw (Exception) lastThrowable;
}
else
{
throw new RuntimeException( lastThrowable.getMessage() );
}
}
}
/**
* Stop and dispose the service implementation.
*
* @see org.apache.fulcrum.yaafi.framework.component.ServiceComponent#decommision()
*/
public void decommision() throws Exception
{
this.getParentLogger().debug( "Decommisioning the service " + this.getShorthand() );
try
{
this.stop();
}
catch (Throwable e)
{
String msg = "Stopping the following service failed : " + this.getShorthand();
this.getParentLogger().error( msg, e );
}
try
{
Object rawInstance = this.getRawInstance(false);
// dispose the service implementation class
if( rawInstance instanceof Disposable )
{
try
{
this.getParentLogger().debug( "Disposable.dispose() for " + this.getShorthand() );
((Disposable) rawInstance).dispose();
}
catch (Exception e)
{
String msg = "Disposing the following service failed : " + this.getShorthand();
this.getParentLogger().error(msg,e);
throw new RuntimeException(msg);
}
}
}
catch (Throwable e)
{
String msg = "Disposing the following service failed : " + this.getShorthand();
this.getParentLogger().error( msg, e );
}
super.decommision();
}
/////////////////////////////////////////////////////////////////////////
// Avalon Lifecycle Implementation
/////////////////////////////////////////////////////////////////////////
/**
* @see org.apache.avalon.framework.logger.LogEnabled#enableLogging(org.apache.avalon.framework.logger.Logger)
* @param logger logger to enable
*/
public void enableLogging(Logger logger)
{
Object rawInstance = this.getRawInstance(false);
if( rawInstance instanceof LogEnabled )
{
try
{
this.getParentLogger().debug( "LogEnabled.enableLogging() for " + this.getShorthand() );
((LogEnabled) rawInstance).enableLogging(logger);
}
catch (Throwable t)
{
String msg = "LogEnable the following service failed : " + this.getShorthand();
this.getParentLogger().error(msg,t);
throw new RuntimeException(msg);
}
}
}
/**
* @see org.apache.avalon.framework.context.Contextualizable#contextualize(org.apache.avalon.framework.context.Context)
* @param context the context to add to this service
* @throws ContextException
*/
public void contextualize(Context context) throws ContextException
{
Object rawInstance = this.getRawInstance(false);
if( rawInstance instanceof Contextualizable )
{
try
{
this.getParentLogger().debug( "Contextualizable.contextualize() for " + this.getShorthand() );
((Contextualizable) rawInstance).contextualize(context);
}
catch (ContextException e)
{
String msg = "Contextualizing the following service failed : " + this.getShorthand();
this.getParentLogger().error(msg,e);
throw e;
}
catch (Throwable t)
{
String msg = "Contextualizing the following service failed : " + this.getShorthand();
this.getParentLogger().error(msg,t);
throw new ContextException(msg,t);
}
}
}
/**
* @see org.apache.avalon.framework.service.Serviceable#service(org.apache.avalon.framework.service.ServiceManager)
* @param serviceManager instance of the service manager to work with
* @throws ServiceException throws exception if service failed for any reason
*/
public void service(ServiceManager serviceManager) throws ServiceException
{
Object rawInstance = this.getRawInstance(false);
if( rawInstance instanceof Serviceable )
{
try
{
this.getParentLogger().debug( "Serviceable.service() for " + this.getShorthand() );
((Serviceable) rawInstance).service(serviceManager);
}
catch (ServiceException e)
{
String msg = "Servicing the following service failed : " + this.getShorthand();
this.getParentLogger().error(msg,e);
throw e;
}
catch (Throwable t)
{
String msg = "Servicing the following service failed : " + this.getShorthand();
this.getParentLogger().error(msg,t);
throw new ServiceException(this.getShorthand(),msg,t);
}
}
}
/**
* @see org.apache.avalon.framework.configuration.Configurable#configure(org.apache.avalon.framework.configuration.Configuration)
*/
public void configure(Configuration configuration) throws ConfigurationException
{
Object rawInstance = this.getRawInstance(false);
if( rawInstance instanceof Configurable )
{
try
{
this.getParentLogger().debug( "Configurable.configure() for " + this.getShorthand() );
((Configurable) rawInstance).configure(configuration);
}
catch (ConfigurationException e)
{
String msg = "Configuring the following service failed : " + this.getShorthand();
this.getParentLogger().error(msg,e);
throw e;
}
catch (Throwable t)
{
String msg = "Configuring the following service failed : " + this.getShorthand();
this.getParentLogger().error(msg,t);
throw new ConfigurationException(msg,t);
}
}
}
/**
* @see org.apache.avalon.framework.parameters.Parameterizable#parameterize(org.apache.avalon.framework.parameters.Parameters)
* @param parameters
* @throws ParameterException
*/
public void parameterize(Parameters parameters) throws ParameterException
{
Object rawInstance = this.getRawInstance(false);
if( rawInstance instanceof Parameterizable )
{
try
{
this.getParentLogger().debug( "Parameterizable.parametrize() for " + this.getShorthand() );
((Parameterizable) rawInstance).parameterize(parameters);
}
catch (ParameterException e)
{
String msg = "Parameterizing the following service failed : " + this.getShorthand();
this.getParentLogger().error(msg,e);
throw e;
}
catch (Throwable t)
{
String msg = "Parameterizing the following service failed : " + this.getShorthand();
this.getParentLogger().error(msg,t);
throw new ParameterException(msg,t);
}
}
}
/**
* @see org.apache.avalon.framework.activity.Initializable#initialize()
*/
public void initialize() throws Exception
{
Object rawInstance = this.getRawInstance(false);
if( rawInstance instanceof Initializable )
{
try
{
this.getParentLogger().debug( "Initializable.initialize() for " + this.getShorthand() );
((Initializable) rawInstance).initialize();
}
catch (Exception e)
{
String msg = "Initializing the following service failed : " + this.getShorthand();
this.getParentLogger().error(msg,e);
throw e;
}
catch (Throwable t)
{
String msg = "Initializing the following service failed : " + this.getShorthand();
this.getParentLogger().error(msg,t);
throw new RuntimeException(msg);
}
}
}
/**
* @see org.apache.avalon.framework.activity.Executable#execute()
*/
public void execute() throws Exception
{
Object rawInstance = this.getRawInstance(false);
if( rawInstance instanceof Executable )
{
try
{
this.getParentLogger().debug( "Executable.execute() for " + this.getShorthand() );
((Executable) rawInstance).execute();
}
catch (Exception e)
{
String msg = "Executing the following service failed : " + this.getShorthand();
this.getParentLogger().error(msg,e);
throw e;
}
catch (Throwable t)
{
String msg = "Executing the following service failed : " + this.getShorthand();
this.getParentLogger().error(msg,t);
throw new RuntimeException(msg);
}
}
}
/**
* @see org.apache.avalon.framework.activity.Startable#start()
*/
public void start() throws Exception
{
Object rawInstance = this.getRawInstance(false);
if( rawInstance instanceof Startable )
{
try
{
this.getParentLogger().debug( "Startable.start() for " + this.getShorthand() );
((Startable) rawInstance).start();
}
catch (Exception e)
{
String msg = "Starting the following service failed : " + this.getShorthand();
this.getParentLogger().error(msg,e);
throw e;
}
catch (Throwable t)
{
String msg = "Starting the following service failed : " + this.getShorthand();
this.getParentLogger().error(msg,t);
throw new RuntimeException(msg);
}
}
}
/**
* @see org.apache.avalon.framework.activity.Startable#stop()
*/
public void stop() throws Exception
{
Object rawInstance = this.getRawInstance(false);
if( rawInstance instanceof Startable )
{
try
{
this.getParentLogger().debug( "Startable.stop() for " + this.getShorthand() );
((Startable) rawInstance).stop();
}
catch (Exception e)
{
String msg = "Stopping the following service failed : " + this.getShorthand();
this.getParentLogger().error(msg,e);
throw e;
}
catch (Throwable t)
{
String msg = "Stopping the following service failed : " + this.getShorthand();
this.getParentLogger().error(msg,t);
throw new RuntimeException(msg);
}
}
}
/**
* @see org.apache.avalon.framework.activity.Suspendable#resume()
*/
public void resume()
{
Object rawInstance = this.getRawInstance(false);
if( rawInstance instanceof Suspendable )
{
try
{
this.getParentLogger().debug( "Suspendable.resume() for " + this.getShorthand() );
((Suspendable) rawInstance).resume();
}
catch (Throwable t)
{
String msg = "Resuming the following service failed : " + this.getShorthand();
this.getParentLogger().error(msg,t);
throw new RuntimeException(msg);
}
}
}
/**
* @see org.apache.avalon.framework.activity.Suspendable#suspend()
*/
public void suspend()
{
Object rawInstance = this.getRawInstance(false);
if( rawInstance instanceof Suspendable )
{
try
{
this.getParentLogger().debug( "Suspendable.suspend() for " + this.getShorthand() );
((Suspendable) rawInstance).suspend();
}
catch (Throwable t)
{
String msg = "Suspending the following service failed : " + this.getShorthand();
this.getParentLogger().error(msg,t);
throw new RuntimeException(msg);
}
}
}
/**
* @see org.apache.avalon.framework.configuration.Reconfigurable#reconfigure(org.apache.avalon.framework.configuration.Configuration)
* @param configuration
* @throws ConfigurationException
*/
public void reconfigure(Configuration configuration) throws ConfigurationException
{
Validate.notNull( configuration, "configuration" );
Object rawInstance = this.getRawInstance(false);
if( rawInstance instanceof Reconfigurable )
{
try
{
this.getParentLogger().debug( "Reconfigurable.reconfigure() for " + this.getShorthand() );
((Reconfigurable) rawInstance).reconfigure(configuration);
}
catch (Throwable t)
{
String msg = "Reconfiguring the following service failed : " + this.getShorthand();
this.getParentLogger().error(msg,t);
throw new RuntimeException(msg);
}
}
}
}