blob: cd244761c0ced44a109759f1c3564a268ecb9b21 [file] [log] [blame]
/*
* 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.
*/
package org.apache.cocoon.components;
import org.apache.avalon.framework.activity.Disposable;
import org.apache.avalon.framework.activity.Initializable;
import org.apache.avalon.framework.activity.Startable;
import org.apache.avalon.framework.component.ComponentManager;
import org.apache.avalon.framework.component.Composable;
import org.apache.avalon.framework.configuration.Configurable;
import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.context.Context;
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.Parameterizable;
import org.apache.avalon.framework.parameters.Parameters;
import org.apache.avalon.framework.service.ServiceManager;
import org.apache.avalon.framework.service.Serviceable;
import org.apache.avalon.excalibur.component.RoleManageable;
import org.apache.avalon.excalibur.component.RoleManager;
/**
* Utility class for setting up Avalon components. Similar to Excalibur's
* <code>DefaultComponentFactory</code>, but on existing objects.
* <p>
*
* @author <a href="mailto:sylvain@apache.org">Sylvain Wallez</a>
* @version CVS $Id$
*/
public class LifecycleHelper {
/** The Logger for the component
*/
final private Logger logger;
/** The Context for the component
*/
final private Context context;
/** The component manager for this component.
*/
final private ComponentManager componentManager;
/** The service manager for this component.
*/
final private ServiceManager serviceManager;
/** The configuration for this component.
*/
final private Configuration configuration;
/** The RoleManager for child ComponentSelectors
*/
final private RoleManager roles;
/**
* Construct a new <code>LifecycleHelper</code> that can be used repeatedly to
* setup several components.
* <p>
* <b>Note</b> : if a parameter is <code>null</code>,
* the corresponding method isn't called (e.g. if <code>configuration</code> is
* <code>null</code>, <code>configure()</code> isn't called).
*
* @param logger the <code>Logger</code> to pass to <code>LogEnabled</code>s, unless there is
* a <code>LogKitManager</code> and the configuration specifies a logger name.
* @param context the <code>Context</code> to pass to <code>Contexutalizable</code>s.
* @param componentManager the component manager to pass to <code>Composable</code>s.
* @param roles the <code>RoleManager</code> to pass to <code>DefaultComponentSelector</code>s.
* @param configuration the <code>Configuration</code> object to pass to new instances.
* @deprecated ComponentManager and RoleManager are deprecated
*/
public LifecycleHelper(final Logger logger,
final Context context,
final ComponentManager componentManager,
final RoleManager roles,
final Configuration configuration) {
this(logger, context, null, componentManager, roles, configuration);
}
/**
* Construct a new <code>LifecycleHelper</code> that can be used repeatedly to
* setup several components.
* <p>
* <b>Note</b> : if a parameter is <code>null</code>,
* the corresponding method isn't called (e.g. if <code>configuration</code> is
* <code>null</code>, <code>configure()</code> isn't called).
*
* @param logger the <code>Logger</code> to pass to <code>LogEnabled</code>s, unless there is
* a <code>LogKitManager</code> and the configuration specifies a logger name.
* @param context the <code>Context</code> to pass to <code>Contexutalizable</code>s.
* @param serviceManager the service manager to pass to <code>Serviceable</code>s.
* @param roles the <code>RoleManager</code> to pass to <code>DefaultComponentSelector</code>s.
* @param configuration the <code>Configuration</code> object to pass to new instances.
* @deprecated RoleManager is deprecated
*/
public LifecycleHelper(final Logger logger,
final Context context,
final ServiceManager serviceManager,
final RoleManager roles,
final Configuration configuration) {
this(logger, context, serviceManager, null, roles, configuration);
}
/**
* Construct a new <code>LifecycleHelper</code> that can be used repeatedly to
* setup several components.
* <p>
* <b>Note</b> : if a parameter is <code>null</code>,
* the corresponding method isn't called (e.g. if <code>configuration</code> is
* <code>null</code>, <code>configure()</code> isn't called).
*
* @param logger the <code>Logger</code> to pass to <code>LogEnabled</code>s, unless there is
* a <code>LogKitManager</code> and the configuration specifies a logger name.
* @param context the <code>Context</code> to pass to <code>Contexutalizable</code>s.
* @param serviceManager the service manager to pass to <code>Serviceable</code>s.
* @param configuration the <code>Configuration</code> object to pass to new instances.
*/
public LifecycleHelper(final Logger logger,
final Context context,
final ServiceManager serviceManager,
final Configuration configuration) {
this(logger, context, serviceManager, null, null, configuration);
}
/**
* Construct a new <code>LifecycleHelper</code> that can be used repeatedly to
* setup several components.
* <p>
* <b>Note</b> : if a parameter is <code>null</code>,
* the corresponding method isn't called (e.g. if <code>configuration</code> is
* <code>null</code>, <code>configure()</code> isn't called).
*
* @param logger the <code>Logger</code> to pass to <code>LogEnabled</code>s, unless there is
* a <code>LogKitManager</code> and the configuration specifies a logger name.
* @param context the <code>Context</code> to pass to <code>Contexutalizable</code>s.
* @param serviceManager the service manager to pass to <code>Serviceable</code>s.
* @param componentManager the component manager to pass to <code>Composable</code>s.
* @param roles the <code>RoleManager</code> to pass to <code>DefaultComponentSelector</code>s.
* @param configuration the <code>Configuration</code> object to pass to new instances.
* @deprecated ComponentManager and RoleManager are deprecated
*/
public LifecycleHelper(final Logger logger,
final Context context,
final ServiceManager serviceManager,
final ComponentManager componentManager,
final RoleManager roles,
final Configuration configuration) {
this.logger = logger;
this.context = context;
this.serviceManager = serviceManager;
this.componentManager = componentManager;
this.roles = roles;
this.configuration = configuration;
}
/**
* Setup a component, including initialization and start.
*
* @param component the component to setup.
* @return the component passed in, to allow function chaining.
* @throws Exception if something went wrong.
*/
public Object setupComponent(Object component) throws Exception {
return setupComponent(component, true);
}
/**
* Setup a component, and optionnaly initializes (if it's <code>Initializable</code>)
* and starts it (if it's <code>Startable</code>).
*
* @param component the component to setup.
* @param initializeAndStart if true, <code>intialize()</code> and <code>start()</code>
* will be called.
* @return the component passed in, to allow function chaining.
* @throws Exception if something went wrong.
*/
public Object setupComponent(Object component, boolean initializeAndStart)
throws Exception {
return setupComponent(
component,
this.logger,
this.context,
this.serviceManager,
this.componentManager,
this.roles,
this.configuration,
initializeAndStart);
}
/**
* Static equivalent to {@link #setupComponent(Object)}, to be used when there's only one
* component to setup.
* @deprecated ComponentManager and RoleManager are deprecated
*/
public static Object setupComponent(final Object component,
final Logger logger,
final Context context,
final ComponentManager componentManager,
final RoleManager roles,
final Configuration configuration)
throws Exception {
return setupComponent(
component,
logger,
context,
componentManager,
roles,
configuration,
true);
}
/**
* Alternative setupComponent method that takes a ServiceManager instead of a ComponentManger.
* @deprecated RoleManager is deprecated
*/
public static Object setupComponent(final Object component,
final Logger logger,
final Context context,
final ServiceManager serviceManager,
final RoleManager roles,
final Configuration configuration)
throws Exception {
return setupComponent(
component,
logger,
context,
serviceManager,
roles,
configuration,
true);
}
/**
* Alternative setupComponent method that takes a ServiceManager instead of a ComponentManger.
*/
public static Object setupComponent(final Object component,
final Logger logger,
final Context context,
final ServiceManager serviceManager,
final Configuration configuration)
throws Exception {
return setupComponent(
component,
logger,
context,
serviceManager,
null,
configuration,
true);
}
/**
* Static equivalent to {@link #setupComponent(Object, boolean)}, to be used when there's only one
* component to setup.
* @deprecated ComponentManager and RoleManager are deprecated
*/
public static Object setupComponent(final Object component,
final Logger logger,
final Context context,
final ComponentManager componentManager,
final RoleManager roles,
final Configuration configuration,
final boolean initializeAndStart)
throws Exception {
return setupComponent(
component,
logger,
context,
null,
componentManager,
roles,
configuration,
initializeAndStart);
}
/**
* Alternative setupComponent method that takes a ServiceManager instead of a ComponentManger.
* @deprecated RoleManager is deprecated
*/
public static Object setupComponent(final Object component,
final Logger logger,
final Context context,
final ServiceManager serviceManager,
final RoleManager roles,
final Configuration configuration,
final boolean initializeAndStart)
throws Exception {
return setupComponent(
component,
logger,
context,
serviceManager,
null,
roles,
configuration,
initializeAndStart);
}
/**
* Alternative setupComponent method that takes a ServiceManager instead of a ComponentManger.
*/
public static Object setupComponent(final Object component,
final Logger logger,
final Context context,
final ServiceManager serviceManager,
final Configuration configuration,
final boolean initializeAndStart)
throws Exception {
return setupComponent(
component,
logger,
context,
serviceManager,
null,
null,
configuration,
initializeAndStart);
}
/**
* Static equivalent to {@link #setupComponent(Object, boolean)}, to be used when there's only one
* component to setup.
* @deprecated ComponentManager and RoleManager are deprecated
*/
public static Object setupComponent(final Object component,
final Logger logger,
final Context context,
final ServiceManager serviceManager,
final ComponentManager componentManager,
final RoleManager roles,
final Configuration configuration,
final boolean initializeAndStart)
throws Exception {
if (component instanceof LogEnabled) {
((LogEnabled) component).enableLogging(logger);
}
if (null != context && component instanceof Contextualizable) {
((Contextualizable) component).contextualize(context);
}
if (null != componentManager && component instanceof Composable) {
((Composable) component).compose(componentManager);
}
if (null != serviceManager && component instanceof Serviceable) {
((Serviceable) component).service(serviceManager);
}
if (null != roles && component instanceof RoleManageable) {
((RoleManageable) component).setRoleManager(roles);
}
if (null != configuration && component instanceof Configurable) {
((Configurable) component).configure(configuration);
}
if (null != configuration && component instanceof Parameterizable) {
((Parameterizable) component).parameterize(
Parameters.fromConfiguration(configuration));
}
if (initializeAndStart && component instanceof Initializable) {
((Initializable) component).initialize();
}
if (initializeAndStart && component instanceof Startable) {
((Startable) component).start();
}
return component;
}
/**
* Decomission a component, by stopping (if it's <code>Startable</code>) and
* disposing (if it's <code>Disposable</code>) a component.
*/
public static final void decommission(final Object component)
throws Exception {
if (component instanceof Startable) {
((Startable) component).stop();
}
dispose(component);
}
/**
* Dispose a component if it's <code>Disposable</code>. Otherwhise, do nothing.
*/
public static final void dispose(final Object component) {
if (component instanceof Disposable) {
((Disposable) component).dispose();
}
}
}