You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@avalon.apache.org by ni...@apache.org on 2004/07/25 20:25:19 UTC
svn commit: rev 23238 - in avalon/trunk/runtime: activation/impl/src/java/org/apache/avalon/activation/impl composition/impl/src/java/org/apache/avalon/composition/model/impl
Author: niclas
Date: Sun Jul 25 11:25:19 2004
New Revision: 23238
Modified:
avalon/trunk/runtime/activation/impl/src/java/org/apache/avalon/activation/impl/DefaultServiceManager.java
avalon/trunk/runtime/activation/impl/src/java/org/apache/avalon/activation/impl/Resources.properties
avalon/trunk/runtime/composition/impl/src/java/org/apache/avalon/composition/model/impl/DefaultComponentModel.java
avalon/trunk/runtime/composition/impl/src/java/org/apache/avalon/composition/model/impl/DefaultContainmentModel.java
Log:
Additional fixes to make 'optional' dependency work.
Modified: avalon/trunk/runtime/activation/impl/src/java/org/apache/avalon/activation/impl/DefaultServiceManager.java
==============================================================================
--- avalon/trunk/runtime/activation/impl/src/java/org/apache/avalon/activation/impl/DefaultServiceManager.java (original)
+++ avalon/trunk/runtime/activation/impl/src/java/org/apache/avalon/activation/impl/DefaultServiceManager.java Sun Jul 25 11:25:19 2004
@@ -94,8 +94,13 @@
for( int i=0; i<dependencies.length; i++ )
{
final DependencyModel dependency = dependencies[i];
- final String key = dependency.getDependency().getKey();
- m_map.put( key, dependency );
+
+ DeploymentModel provider = dependency.getProvider();
+ if( provider != null )
+ {
+ final String key = dependency.getDependency().getKey();
+ m_map.put( key, dependency );
+ }
}
}
@@ -132,7 +137,7 @@
/**
* Retrieve Object by key.
* @param key the role
- * @return the Object
+ * @return the Object or null if the Object doesn't exist
* @throws ServiceException if an error occurs
* @throws NullPointerException if the supplied key is null
*/
@@ -157,11 +162,11 @@
DependencyModel dependency = (DependencyModel) m_map.get( key );
final DeploymentModel provider = dependency.getProvider();
+
if( null == provider )
{
final String error =
- REZ.getString(
- "service.error.null-provider", key );
+ REZ.getString( "service.error.null-provider", key );
throw new IllegalStateException( error );
}
Modified: avalon/trunk/runtime/activation/impl/src/java/org/apache/avalon/activation/impl/Resources.properties
==============================================================================
--- avalon/trunk/runtime/activation/impl/src/java/org/apache/avalon/activation/impl/Resources.properties (original)
+++ avalon/trunk/runtime/activation/impl/src/java/org/apache/avalon/activation/impl/Resources.properties Sun Jul 25 11:25:19 2004
@@ -23,8 +23,8 @@
#
# ServiceManager
# --------------
-
-service.error.null-provider = A valid request was received for a service using the key [{0}] but the supplied dependency model returned a null provider. This is an internal an internal system error reflecting an inconsistent assembly state.
+
+service.error.null-provider = A valid request was received for a service using the key [{0}] but the supplied dependency model returned a null provider. This is an internal system error reflecting an inconsistent assembly state.
#
# DefaultBlock
Modified: avalon/trunk/runtime/composition/impl/src/java/org/apache/avalon/composition/model/impl/DefaultComponentModel.java
==============================================================================
--- avalon/trunk/runtime/composition/impl/src/java/org/apache/avalon/composition/model/impl/DefaultComponentModel.java (original)
+++ avalon/trunk/runtime/composition/impl/src/java/org/apache/avalon/composition/model/impl/DefaultComponentModel.java Sun Jul 25 11:25:19 2004
@@ -1,939 +1,947 @@
-/*
- * Copyright 2004 Apache Software Foundation
- * Licensed 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.avalon.composition.model.impl;
-
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.Properties;
-import java.lang.reflect.Constructor;
-
-import org.apache.avalon.composition.data.DeploymentProfile;
-import org.apache.avalon.composition.data.DependencyDirective;
-import org.apache.avalon.composition.data.StageDirective;
-import org.apache.avalon.composition.data.ContextDirective;
-import org.apache.avalon.composition.data.Mode;
-import org.apache.avalon.composition.info.DeliveryDescriptor;
-import org.apache.avalon.composition.info.StagedDeliveryDescriptor;
-import org.apache.avalon.composition.model.ContextModel;
-import org.apache.avalon.composition.model.DependencyModel;
-import org.apache.avalon.composition.model.ComponentModel;
-import org.apache.avalon.composition.model.DeploymentModel;
-import org.apache.avalon.composition.model.ModelException;
-import org.apache.avalon.composition.model.ModelRuntimeException;
-import org.apache.avalon.composition.model.StageModel;
-import org.apache.avalon.composition.provider.ComponentContext;
-import org.apache.avalon.composition.provider.SecurityModel;
-
-import org.apache.avalon.framework.configuration.Configuration;
-import org.apache.avalon.framework.configuration.DefaultConfiguration;
-import org.apache.avalon.framework.configuration.Configurable;
-import org.apache.avalon.framework.parameters.Parameters;
-import org.apache.avalon.framework.parameters.Parameterizable;
-import org.apache.avalon.framework.logger.Logger;
-
-import org.apache.avalon.meta.info.ContextDescriptor;
-import org.apache.avalon.meta.info.DependencyDescriptor;
-import org.apache.avalon.meta.info.InfoDescriptor;
-import org.apache.avalon.meta.info.ServiceDescriptor;
-import org.apache.avalon.meta.info.ReferenceDescriptor;
-import org.apache.avalon.meta.info.StageDescriptor;
-import org.apache.avalon.meta.info.Type;
-
-import org.apache.avalon.util.i18n.ResourceManager;
-import org.apache.avalon.util.i18n.Resources;
-
-import org.apache.avalon.util.configuration.ConfigurationUtil;
-import org.apache.avalon.util.configuration.CascadingConfiguration;
-
-/**
- * Deployment model defintion.
- *
- * @author <a href="mailto:dev@avalon.apache.org">Avalon Development Team</a>
- * @version $Revision: 1.17 $ $Date: 2004/03/17 10:39:10 $
- */
-public class DefaultComponentModel extends DefaultDeploymentModel
- implements ComponentModel
-{
- //--------------------------------------------------------------
- // static
- //--------------------------------------------------------------
-
- private static final Resources REZ =
- ResourceManager.getPackageResources( DefaultComponentModel.class );
-
- private static final String CONTEXTUALIZABLE =
- "org.apache.avalon.framework.context.Contextualizable";
-
- private static final Configuration EMPTY_CONFIGURATION =
- new DefaultConfiguration(
- "configuration", ComponentModel.class.getName() );
-
- //--------------------------------------------------------------
- // immutable state
- //--------------------------------------------------------------
-
- private final ComponentContext m_context;
-
- private final ContextModel m_contextModel;
-
- private final DependencyModel[] m_dependencies;
-
- private final StageModel[] m_stages;
-
- private final DefaultState m_assembly = new DefaultState();
-
- //--------------------------------------------------------------
- // mutable state
- //--------------------------------------------------------------
-
- private Configuration m_config;
-
- private Parameters m_parameters;
-
- private boolean m_activation;
-
- private int m_collection;
-
- //--------------------------------------------------------------
- // constructor
- //--------------------------------------------------------------
-
- /**
- * Creation of a new deployment model.
- *
- * @param context the deployment context
- */
- public DefaultComponentModel( ComponentContext context, SecurityModel security )
- throws ModelException
- {
- super( context, security );
-
- m_context = context;
-
- m_activation = getDefaultActivationPolicy();
-
- setCollectionPolicy( m_context.getComponentProfile().getCollectionPolicy() );
-
- ClassLoader classLoader = m_context.getClassLoader();
-
- if( isConfigurable() )
- {
- final Configuration defaults =
- m_context.getType().getConfiguration();
- final Configuration explicit =
- m_context.getComponentProfile().getConfiguration();
- final Configuration consolidated =
- consolidateConfigurations( explicit, defaults );
- if( consolidated != null )
- {
- m_config = consolidated;
- }
- else
- {
- m_config = EMPTY_CONFIGURATION;
- }
- }
-
- if( isParameterizable() )
- {
- final Parameters parameters =
- m_context.getComponentProfile().getParameters();
- if( parameters != null )
- {
- m_parameters = parameters;
- }
- else
- {
- m_parameters = Parameters.EMPTY_PARAMETERS;
- }
- }
-
- final ContextDescriptor contextDescriptor =
- m_context.getType().getContext();
- final ContextDirective contextDirective =
- m_context.getComponentProfile().getContext();
- final Logger log = getLogger().getChildLogger( "context" );
- m_contextModel =
- new DefaultContextModel(
- log, contextDescriptor, contextDirective, context );
-
- //
- // create the dependency models for subsequent assembly
- // management
- //
-
- DependencyDescriptor[] dependencies =
- m_context.getType().getDependencies();
- m_dependencies = new DefaultDependencyModel[ dependencies.length ];
-
- for( int i=0; i<dependencies.length; i++ )
- {
- DependencyDescriptor descriptor = dependencies[i];
- DependencyDirective directive =
- context.getComponentProfile().getDependencyDirective( descriptor.getKey() );
- m_dependencies[i] =
- new DefaultDependencyModel(
- context.getLogger().getChildLogger( "deps" ),
- context.getPartitionName(),
- context.getProfile().getName(),
- descriptor,
- directive );
- }
-
- //
- // create the stage models for subsequent assembly
- // management
- //
-
- StageDescriptor[] stages =
- m_context.getType().getStages();
- m_stages = new DefaultStageModel[ stages.length ];
-
- for( int i=0; i<stages.length; i++ )
- {
- StageDescriptor descriptor = stages[i];
- StageDirective directive =
- context.getComponentProfile().getStageDirective( descriptor.getKey() );
- m_stages[i] =
- new DefaultStageModel(
- context.getLogger().getChildLogger( "stages" ),
- context.getPartitionName(), descriptor, directive );
- }
- }
-
- /**
- * Get the default activation policy for the model.
- */
- public boolean getDefaultActivationPolicy()
- {
- final int activation =
- m_context.getComponentProfile().getActivationDirective();
-
- if( activation != DeploymentProfile.DEFAULT )
- {
- return (activation == DeploymentProfile.ENABLED );
- }
- else
- {
- if( m_context.getProfile().getMode() == Mode.EXPLICIT )
- {
- Type type = m_context.getType();
- if( type.getInfo().getLifestyle().equals( InfoDescriptor.TRANSIENT ) )
- {
- return false;
- }
- else
- {
- return true;
- }
- }
- else
- {
- return false;
- }
- }
- }
-
- //--------------------------------------------------------------
- // Commissionable
- //--------------------------------------------------------------
-
- /**
- * Commission the model.
- *
- * @exception Exception if a commissioning error occurs
- */
- public void commission() throws Exception
- {
- if( isAssembled() )
- {
- super.commission();
- }
- else
- {
- final String error =
- "Illegal attempt to commission a non-assembled component model: "
- + this;
- throw new ModelException( error );
- }
- }
-
- //--------------------------------------------------------------
- // Composite
- //--------------------------------------------------------------
-
- /**
- * Returns the assembled state of the model.
- * @return true if this model is assembled
- */
- public boolean isAssembled()
- {
- return ( isContextAssembled()
- && isStageAssembled()
- && isServiceAssembled() );
- }
-
- private boolean isContextAssembled()
- {
- ContextModel model = getContextModel();
- if( model.isEnabled() )
- {
- DeliveryDescriptor delivery =
- getContextModel().getDeliveryDescriptor();
- if( delivery instanceof StagedDeliveryDescriptor )
- {
- return ( null != getContextModel().getProvider() );
- }
- }
- return true;
- }
-
- private boolean isStageAssembled()
- {
- StageModel[] stages = getStageModels();
- for( int i=0; i<stages.length; i++ )
- {
- if( null == stages[i].getProvider() ) return false;
- }
- return true;
- }
-
- private boolean isServiceAssembled()
- {
- DependencyModel[] dependencies = getDependencyModels();
- for( int i=0; i<dependencies.length; i++ )
- {
- if( null == dependencies[i].getProvider() ) return false;
- }
- return true;
- }
-
- /**
- * Return the set of models assigned as providers.
- * @return the providers consumed by the model
- * @exception IllegalStateException if the model is not in an assembled state
- */
- public DeploymentModel[] getProviders()
- {
- if( !isAssembled() )
- {
- final String error =
- "Model is not assembled " + this;
- throw new IllegalStateException( error );
- }
-
- final ArrayList list = new ArrayList();
- if( getContextModel().isEnabled() )
- {
- DeploymentModel provider = getContextModel().getProvider();
- if( provider != null )
- {
- list.add( provider );
- }
- }
-
- StageModel[] stages = getStageModels();
- for( int i=0; i<stages.length; i++ )
- {
- StageModel stage = stages[i];
- list.add( stage.getProvider() );
- }
-
- DependencyModel[] dependencies = getDependencyModels();
- for( int i=0; i<dependencies.length; i++ )
- {
- DependencyModel dependency = dependencies[i];
- list.add( dependency.getProvider() );
- }
-
- return (DeploymentModel[]) list.toArray( new DeploymentModel[0] );
- }
-
- //--------------------------------------------------------------
- // DeploymentModel
- //--------------------------------------------------------------
-
- /**
- * Return the set of services produced by the model.
- *
- * @return the service descriptors
- */
- public ServiceDescriptor[] getServices()
- {
- return m_context.getType().getServices();
- }
-
- /**
- * Return TRUE is this model is capable of supporting a supplied
- * depedendency.
- *
- * @param dependency the dependency descriptor
- * @return true if this model can fulfill the dependency
- */
- public boolean isaCandidate( DependencyDescriptor dependency )
- {
- return isaCandidate( dependency.getReference() );
- }
-
- /**
- * Return TRUE is this model is capable of supporting a supplied
- * stage dependency.
- *
- * @param stage the stage descriptor
- * @return TRUE if this model can fulfill the stage dependency
- */
- public boolean isaCandidate( StageDescriptor stage )
- {
- return m_context.getType().getExtension( stage ) != null;
- }
-
- /**
- * Return TRUE is this model is capable of supporting a supplied
- * service.
- *
- * @param reference the service reference descriptor
- * @return true if this model can fulfill the service
- */
- public boolean isaCandidate( ReferenceDescriptor reference )
- {
- return m_context.getType().getService( reference ) != null;
- }
-
- //--------------------------------------------------------------
- // ComponentModel
- //--------------------------------------------------------------
-
- /**
- * Return the collection policy for the model. If a profile
- * does not declare a collection policy, then the collection
- * policy declared by the underlying component type
- * will be used.
- *
- * @return the collection policy
- * @see InfoDescriptor#WEAK
- * @see InfoDescriptor#SOFT
- * @see InfoDescriptor#HARD
- * @see InfoDescriptor#UNDEFINED
- */
- public int getCollectionPolicy()
- {
- if( m_collection == InfoDescriptor.UNDEFINED )
- {
- return getTypeCollectionPolicy();
- }
- else
- {
- return m_collection;
- }
- }
-
- /**
- * Set the collection policy for the model.
- *
- * @param policy the collection policy
- * @see InfoDescriptor#WEAK
- * @see InfoDescriptor#SOFT
- * @see InfoDescriptor#HARD
- */
- public void setCollectionPolicy( int policy )
- {
- if( policy == InfoDescriptor.UNDEFINED )
- {
- m_collection = InfoDescriptor.UNDEFINED;
- }
- else
- {
- int minimum = getTypeCollectionPolicy();
- if( policy >= minimum )
- {
- m_collection = policy;
- }
- else
- {
- final String warning =
- "Ignoring collection policy override [" + policy
- + "] because the value is higher that type threshhold ["
- + minimum + "].";
- getLogger().warn( warning );
- }
- }
- }
-
- private int getTypeCollectionPolicy()
- {
- return m_context.getType().getInfo().getCollectionPolicy();
- }
-
- /**
- * Return the proxy enabled policy for the model. If the system wide
- * proxy enabled is disabled the operation will return false otherwise the
- * value returned is true unless overriden by the "urn:composition:proxy"
- * attribute.
- *
- * @return the proxy policy
- */
- public boolean getProxyPolicy()
- {
- if( m_context.getSystemContext().isProxyEnabled() )
- {
- if( getType().getInfo().getAttribute( PROXY_KEY, "true" ).equals( "false" ) )
- {
- return false;
- }
- else
- {
- return true;
- }
- }
- else
- {
- return false;
- }
- }
-
- /**
- * Return the activation policy for the model.
- * @return the activaltion policy
- */
- public boolean getActivationPolicy()
- {
- return m_activation;
- }
-
- /**
- * Set the activation policy for the model.
- *
- * @param policy the activaltion policy
- */
- public void setActivationPolicy( boolean policy )
- {
- m_activation = policy;
- }
-
- /**
- * Return the component type descriptor.
- * @return the type descriptor
- */
- public Type getType()
- {
- return m_context.getType();
- }
-
- /**
- * Return the class for the deployable target.
- * @return the class
- */
- public Class getDeploymentClass()
- {
- return m_context.getDeploymentClass();
- }
-
- /**
- * Rest if the component type backing the model is
- * parameterizable.
- *
- * @return TRUE if the compoent type is parameterizable
- * otherwise FALSE
- */
- public boolean isParameterizable()
- {
- return (
- Parameterizable.class.isAssignableFrom( getDeploymentClass() )
- || isaConstructorArg( Parameters.class ) );
- }
-
- /**
- * Set the parameters to the supplied value. The supplied
- * parameters value will replace the existing parameters value.
- *
- * @param parameters the supplied parameters value
- * @exception IllegalStateException if the component type backing the
- * model does not implement the parameteriazable interface
- * @exception NullPointerException if the supplied parameters are null
- */
- public void setParameters( Parameters parameters )
- {
- setParameters( parameters, true );
- }
-
- /**
- * Set the parameters to the supplied value. The supplied
- * parameters value may suppliment or replace the existing
- * parameters value.
- *
- * @param parameters the supplied parameters
- * @param policy if TRUE the supplied parameters replaces the current
- * parameters value otherwise the existing and supplied values
- * are aggregrated
- * @exception IllegalStateException if the component type backing the
- * model does not implement the parameteriazable interface
- * @exception NullPointerException if the supplied parameters are null
- */
- public void setParameters( Parameters parameters, boolean policy )
- throws IllegalStateException
- {
- if( !isParameterizable() )
- {
- final String error =
- REZ.getString(
- "deployment.parameters.irrational",
- getDeploymentClass().getName(),
- this.toString() );
- throw new IllegalStateException( error );
- }
-
- if( parameters == null )
- {
- throw new NullPointerException( "parameters" );
- }
-
- if( policy )
- {
- Properties props = Parameters.toProperties( m_parameters );
- Properties suppliment = Parameters.toProperties( parameters );
- Enumeration list = suppliment.propertyNames();
- while( list.hasMoreElements() )
- {
- String name = (String) list.nextElement();
- String value = suppliment.getProperty( name );
- if( value == null )
- {
- props.remove( name );
- }
- else
- {
- props.setProperty( name, value );
- }
- }
- m_parameters = Parameters.fromProperties( props );
- }
- else
- {
- m_parameters = parameters;
- }
- }
-
- /**
- * Return the parameters to be applied to the component.
- * If the the component type does not implementation the
- * Parameterizable interface, the implementation returns null.
- *
- * @return the assigned parameters
- */
- public Parameters getParameters()
- {
- return m_parameters;
- }
-
- /**
- * Rest if the component type backing the model is
- * configurable.
- *
- * @return TRUE if the component type is configurable
- * otherwise FALSE
- */
- public boolean isConfigurable()
- {
- return (
- Configurable.class.isAssignableFrom( getDeploymentClass() )
- || isaConstructorArg( Configuration.class ) );
- }
-
- /**
- * Set the configuration to the supplied value. The supplied
- * configuration will replace the existing configuration.
- *
- * @param config the supplied configuration
- * @exception IllegalStateException if the component type backing the
- * model does not implement the configurable interface
- * @exception NullPointerException if the supplied configuration is null
- */
- public void setConfiguration( Configuration config )
- throws IllegalStateException, NullPointerException
- {
- setConfiguration( config, true );
- }
-
- /**
- * Set the configuration to the supplied value. The supplied
- * configuration may suppliment or replace the existing configuration.
- *
- * @param config the supplied configuration
- * @param policy if TRUE the supplied configuration replaces the current
- * configuration otherwise the resoved configuration shall be layed above
- * the configuration supplied with the profile which in turn is layer above
- * the type default configuration (if any)
- * @exception IllegalStateException if the component type backing the
- * model does not implement the configurable interface
- * @exception NullPointerException if the supplied configuration is null
- */
- public void setConfiguration( Configuration config, boolean policy )
- throws IllegalStateException, NullPointerException
- {
- if( !isConfigurable() )
- {
- final String error =
- REZ.getString(
- "deployment.configuration.irrational",
- getDeploymentClass().getName(),
- this.toString() );
- throw new IllegalStateException( error );
- }
-
- if( config == null )
- {
- throw new NullPointerException( "config" );
- }
-
- if( policy )
- {
- m_config = consolidateConfigurations( config, m_config );
- }
- else
- {
- m_config = config;
- }
- }
-
- /**
- * Return the configuration to be applied to the component.
- * The implementation returns the current configuration state.
- * If the the component type does not implementation the
- * Configurable interface, the implementation returns null.
- *
- * @return the qualified configuration
- */
- public Configuration getConfiguration()
- {
- return m_config;
- }
-
- /**
- * Return the context model for this deployment model.
- *
- * @return the context model if this model is context dependent, else
- * the return value is null
- */
- public ContextModel getContextModel()
- {
- return m_contextModel;
- }
-
- /**
- * Return the dependency models for this component type.
- *
- * @return the dependency models
- */
- public DependencyModel[] getDependencyModels()
- {
- return m_dependencies;
- }
-
- /**
- * Return a dependency model matching the supplied descriptor. If
- * no model matches the supplied descriptor the implementation
- * will return null.
- *
- * @param dependency the dependency descriptor
- * @return the matching stage model
- */
- public DependencyModel getDependencyModel( DependencyDescriptor dependency )
- {
- DependencyModel[] models = getDependencyModels();
- for( int i=0; i<models.length; i++ )
- {
- DependencyModel model = models[i];
- if( dependency.equals( model.getDependency() ) )
- {
- return model;
- }
- }
- return null;
- }
-
-
- /**
- * Return the stage models for this component type.
- *
- * @return the stage models
- */
- public StageModel[] getStageModels()
- {
- return m_stages;
- }
-
- /**
- * Return a stage model matching the supplied descriptor. If
- * no stage model matches the supplied descriptor the implementation
- * will return null.
- *
- * @param stage the stage descriptor
- * @return the matching stage model
- */
- public StageModel getStageModel( StageDescriptor stage )
- {
- StageModel[] stages = getStageModels();
- for( int i=0; i<stages.length; i++ )
- {
- StageModel model = stages[i];
- if( stage.equals( model.getStage() ) )
- {
- return model;
- }
- }
- return null;
- }
-
-
- /**
- * Return the set of services produced by the model as a array of classes.
- *
- * @return the service classes
- */
- public Class[] getInterfaces()
- {
- //
- // TODO: add a SoftReference to hold the service class array
- // instad of generating each time
- //
-
- ClassLoader classLoader = m_context.getClassLoader();
- ArrayList list = new ArrayList();
- ServiceDescriptor[] services = getServices();
- for( int i=0; i<services.length; i++ )
- {
- final ServiceDescriptor service = services[i];
- final String classname = service.getReference().getClassname();
- list.add( getComponentClass( classLoader, classname ) );
- }
-
- //
- // if the component is an extension then add all implemented
- // interfaces
- //
-
- if( getType().getExtensions().length > 0 )
- {
- Class[] interfaces = getDeploymentClass().getInterfaces();
- for( int i=0; i<interfaces.length; i++ )
- {
- list.add( interfaces[i] );
- }
- }
-
- return (Class[]) list.toArray( new Class[0] );
- }
-
- /**
- * Return the deployment timeout value for the component.
- *
- * @return the default deployment timeout value
- */
- public long getDeploymentTimeout()
- {
- String value =
- m_context.getType().getInfo().getAttribute(
- DEPLOYMENT_TIMEOUT_KEY, null );
- if( null != value )
- {
- try
- {
- return Long.parseLong( value );
- }
- catch( NumberFormatException nfe )
- {
- final String error =
- "Invalid timout parameter ["
- + value
- + "] in component type ["
- + m_context.getType()
- + "].";
- throw new ModelRuntimeException( error, nfe );
- }
- }
- else
- {
- return super.getDeploymentTimeout();
- }
- }
-
- //==============================================================
- // implementation
- //==============================================================
-
- /**
- * Test to determin if the first constructor supports the context
- * base class as a parameter type.
- * @return TRUE or FALSE
- */
- private boolean isaConstructorArg( Class base )
- {
- if( null == base ) return false;
- Class clazz = getDeploymentClass();
- Constructor[] constructors = clazz.getConstructors();
- if( constructors.length == 0 ) return false;
- Constructor constructor = constructors[0];
- Class[] types = constructor.getParameterTypes();
- for( int i=0; i<types.length; i++ )
- {
- if( base.isAssignableFrom( types[i] ) ) return true;
- }
- return false;
- }
-
- private Class getComponentClass( ClassLoader classLoader, String classname )
- {
- if( classLoader == null )
- {
- throw new NullPointerException( "classLoader" );
- }
- if( classname == null )
- {
- throw new NullPointerException( "classname" );
- }
-
- try
- {
- return classLoader.loadClass( classname );
- }
- catch( ClassNotFoundException e )
- {
- return null;
- }
- }
-
- private Configuration consolidateConfigurations(
- final Configuration primary, final Configuration defaults )
- {
- if( primary == null )
- {
- return defaults;
- }
- else
- {
- if( defaults == null )
- {
- return primary;
- }
- else
- {
- return new CascadingConfiguration( primary, defaults );
- }
- }
- }
-}
+/*
+ * Copyright 2004 Apache Software Foundation
+ * Licensed 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.avalon.composition.model.impl;
+
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.Properties;
+import java.lang.reflect.Constructor;
+
+import org.apache.avalon.composition.data.DeploymentProfile;
+import org.apache.avalon.composition.data.DependencyDirective;
+import org.apache.avalon.composition.data.StageDirective;
+import org.apache.avalon.composition.data.ContextDirective;
+import org.apache.avalon.composition.data.Mode;
+import org.apache.avalon.composition.info.DeliveryDescriptor;
+import org.apache.avalon.composition.info.StagedDeliveryDescriptor;
+import org.apache.avalon.composition.model.ContextModel;
+import org.apache.avalon.composition.model.DependencyModel;
+import org.apache.avalon.composition.model.ComponentModel;
+import org.apache.avalon.composition.model.DeploymentModel;
+import org.apache.avalon.composition.model.ModelException;
+import org.apache.avalon.composition.model.ModelRuntimeException;
+import org.apache.avalon.composition.model.StageModel;
+import org.apache.avalon.composition.provider.ComponentContext;
+import org.apache.avalon.composition.provider.SecurityModel;
+
+import org.apache.avalon.framework.configuration.Configuration;
+import org.apache.avalon.framework.configuration.DefaultConfiguration;
+import org.apache.avalon.framework.configuration.Configurable;
+import org.apache.avalon.framework.parameters.Parameters;
+import org.apache.avalon.framework.parameters.Parameterizable;
+import org.apache.avalon.framework.logger.Logger;
+
+import org.apache.avalon.meta.info.ContextDescriptor;
+import org.apache.avalon.meta.info.DependencyDescriptor;
+import org.apache.avalon.meta.info.InfoDescriptor;
+import org.apache.avalon.meta.info.ServiceDescriptor;
+import org.apache.avalon.meta.info.ReferenceDescriptor;
+import org.apache.avalon.meta.info.StageDescriptor;
+import org.apache.avalon.meta.info.Type;
+
+import org.apache.avalon.util.i18n.ResourceManager;
+import org.apache.avalon.util.i18n.Resources;
+
+import org.apache.avalon.util.configuration.ConfigurationUtil;
+import org.apache.avalon.util.configuration.CascadingConfiguration;
+
+/**
+ * Deployment model defintion.
+ *
+ * @author <a href="mailto:dev@avalon.apache.org">Avalon Development Team</a>
+ * @version $Revision: 1.17 $ $Date: 2004/03/17 10:39:10 $
+ */
+public class DefaultComponentModel extends DefaultDeploymentModel
+ implements ComponentModel
+{
+ //--------------------------------------------------------------
+ // static
+ //--------------------------------------------------------------
+
+ private static final Resources REZ =
+ ResourceManager.getPackageResources( DefaultComponentModel.class );
+
+ private static final String CONTEXTUALIZABLE =
+ "org.apache.avalon.framework.context.Contextualizable";
+
+ private static final Configuration EMPTY_CONFIGURATION =
+ new DefaultConfiguration(
+ "configuration", ComponentModel.class.getName() );
+
+ //--------------------------------------------------------------
+ // immutable state
+ //--------------------------------------------------------------
+
+ private final ComponentContext m_context;
+
+ private final ContextModel m_contextModel;
+
+ private final DependencyModel[] m_dependencies;
+
+ private final StageModel[] m_stages;
+
+ private final DefaultState m_assembly = new DefaultState();
+
+ //--------------------------------------------------------------
+ // mutable state
+ //--------------------------------------------------------------
+
+ private Configuration m_config;
+
+ private Parameters m_parameters;
+
+ private boolean m_activation;
+
+ private int m_collection;
+
+ //--------------------------------------------------------------
+ // constructor
+ //--------------------------------------------------------------
+
+ /**
+ * Creation of a new deployment model.
+ *
+ * @param context the deployment context
+ */
+ public DefaultComponentModel( ComponentContext context, SecurityModel security )
+ throws ModelException
+ {
+ super( context, security );
+
+ m_context = context;
+
+ m_activation = getDefaultActivationPolicy();
+
+ setCollectionPolicy( m_context.getComponentProfile().getCollectionPolicy() );
+
+ ClassLoader classLoader = m_context.getClassLoader();
+
+ if( isConfigurable() )
+ {
+ final Configuration defaults =
+ m_context.getType().getConfiguration();
+ final Configuration explicit =
+ m_context.getComponentProfile().getConfiguration();
+ final Configuration consolidated =
+ consolidateConfigurations( explicit, defaults );
+ if( consolidated != null )
+ {
+ m_config = consolidated;
+ }
+ else
+ {
+ m_config = EMPTY_CONFIGURATION;
+ }
+ }
+
+ if( isParameterizable() )
+ {
+ final Parameters parameters =
+ m_context.getComponentProfile().getParameters();
+ if( parameters != null )
+ {
+ m_parameters = parameters;
+ }
+ else
+ {
+ m_parameters = Parameters.EMPTY_PARAMETERS;
+ }
+ }
+
+ final ContextDescriptor contextDescriptor =
+ m_context.getType().getContext();
+ final ContextDirective contextDirective =
+ m_context.getComponentProfile().getContext();
+ final Logger log = getLogger().getChildLogger( "context" );
+ m_contextModel =
+ new DefaultContextModel(
+ log, contextDescriptor, contextDirective, context );
+
+ //
+ // create the dependency models for subsequent assembly
+ // management
+ //
+
+ DependencyDescriptor[] dependencies =
+ m_context.getType().getDependencies();
+ m_dependencies = new DefaultDependencyModel[ dependencies.length ];
+
+ for( int i=0; i<dependencies.length; i++ )
+ {
+ DependencyDescriptor descriptor = dependencies[i];
+ DependencyDirective directive =
+ context.getComponentProfile().getDependencyDirective( descriptor.getKey() );
+ m_dependencies[i] =
+ new DefaultDependencyModel(
+ context.getLogger().getChildLogger( "deps" ),
+ context.getPartitionName(),
+ context.getProfile().getName(),
+ descriptor,
+ directive );
+ }
+
+ //
+ // create the stage models for subsequent assembly
+ // management
+ //
+
+ StageDescriptor[] stages =
+ m_context.getType().getStages();
+ m_stages = new DefaultStageModel[ stages.length ];
+
+ for( int i=0; i<stages.length; i++ )
+ {
+ StageDescriptor descriptor = stages[i];
+ StageDirective directive =
+ context.getComponentProfile().getStageDirective( descriptor.getKey() );
+ m_stages[i] =
+ new DefaultStageModel(
+ context.getLogger().getChildLogger( "stages" ),
+ context.getPartitionName(), descriptor, directive );
+ }
+ }
+
+ /**
+ * Get the default activation policy for the model.
+ */
+ public boolean getDefaultActivationPolicy()
+ {
+ final int activation =
+ m_context.getComponentProfile().getActivationDirective();
+
+ if( activation != DeploymentProfile.DEFAULT )
+ {
+ return (activation == DeploymentProfile.ENABLED );
+ }
+ else
+ {
+ if( m_context.getProfile().getMode() == Mode.EXPLICIT )
+ {
+ Type type = m_context.getType();
+ if( type.getInfo().getLifestyle().equals( InfoDescriptor.TRANSIENT ) )
+ {
+ return false;
+ }
+ else
+ {
+ return true;
+ }
+ }
+ else
+ {
+ return false;
+ }
+ }
+ }
+
+ //--------------------------------------------------------------
+ // Commissionable
+ //--------------------------------------------------------------
+
+ /**
+ * Commission the model.
+ *
+ * @exception Exception if a commissioning error occurs
+ */
+ public void commission() throws Exception
+ {
+ if( isAssembled() )
+ {
+ super.commission();
+ }
+ else
+ {
+ final String error =
+ "Illegal attempt to commission a non-assembled component model: "
+ + this;
+ throw new ModelException( error );
+ }
+ }
+
+ //--------------------------------------------------------------
+ // Composite
+ //--------------------------------------------------------------
+
+ /**
+ * Returns the assembled state of the model.
+ * @return true if this model is assembled
+ */
+ public boolean isAssembled()
+ {
+ return ( isContextAssembled()
+ && isStageAssembled()
+ && isServiceAssembled() );
+ }
+
+ private boolean isContextAssembled()
+ {
+ ContextModel model = getContextModel();
+ if( model.isEnabled() )
+ {
+ DeliveryDescriptor delivery =
+ getContextModel().getDeliveryDescriptor();
+ if( delivery instanceof StagedDeliveryDescriptor )
+ {
+ return ( null != getContextModel().getProvider() );
+ }
+ }
+ return true;
+ }
+
+ private boolean isStageAssembled()
+ {
+ StageModel[] stages = getStageModels();
+ for( int i=0; i<stages.length; i++ )
+ {
+ if( null == stages[i].getProvider() )
+ return false;
+ }
+ return true;
+ }
+
+ private boolean isServiceAssembled()
+ {
+ DependencyModel[] dependencies = getDependencyModels();
+ for( int i=0; i<dependencies.length; i++ )
+ {
+ DependencyModel dep = dependencies[i];
+ if( null == dep.getProvider() &&
+ dep.getDependency().isRequired() )
+ {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Return the set of models assigned as providers.
+ * @return the providers consumed by the model
+ * @exception IllegalStateException if the model is not in an assembled state
+ */
+ public DeploymentModel[] getProviders()
+ {
+ if( !isAssembled() )
+ {
+ final String error =
+ "Model is not assembled " + this;
+ throw new IllegalStateException( error );
+ }
+
+ final ArrayList list = new ArrayList();
+ if( getContextModel().isEnabled() )
+ {
+ DeploymentModel provider = getContextModel().getProvider();
+ if( provider != null )
+ {
+ list.add( provider );
+ }
+ }
+
+ StageModel[] stages = getStageModels();
+ for( int i=0; i<stages.length; i++ )
+ {
+ StageModel stage = stages[i];
+ list.add( stage.getProvider() );
+ }
+
+ DependencyModel[] dependencies = getDependencyModels();
+ for( int i=0; i<dependencies.length; i++ )
+ {
+ DependencyModel dependency = dependencies[i];
+ DeploymentModel provider = dependency.getProvider();
+ if( provider != null )
+ list.add( provider );
+ }
+
+ return (DeploymentModel[]) list.toArray( new DeploymentModel[0] );
+ }
+
+ //--------------------------------------------------------------
+ // DeploymentModel
+ //--------------------------------------------------------------
+
+ /**
+ * Return the set of services produced by the model.
+ *
+ * @return the service descriptors
+ */
+ public ServiceDescriptor[] getServices()
+ {
+ return m_context.getType().getServices();
+ }
+
+ /**
+ * Return TRUE is this model is capable of supporting a supplied
+ * depedendency.
+ *
+ * @param dependency the dependency descriptor
+ * @return true if this model can fulfill the dependency
+ */
+ public boolean isaCandidate( DependencyDescriptor dependency )
+ {
+ return isaCandidate( dependency.getReference() );
+ }
+
+ /**
+ * Return TRUE is this model is capable of supporting a supplied
+ * stage dependency.
+ *
+ * @param stage the stage descriptor
+ * @return TRUE if this model can fulfill the stage dependency
+ */
+ public boolean isaCandidate( StageDescriptor stage )
+ {
+ return m_context.getType().getExtension( stage ) != null;
+ }
+
+ /**
+ * Return TRUE is this model is capable of supporting a supplied
+ * service.
+ *
+ * @param reference the service reference descriptor
+ * @return true if this model can fulfill the service
+ */
+ public boolean isaCandidate( ReferenceDescriptor reference )
+ {
+ return m_context.getType().getService( reference ) != null;
+ }
+
+ //--------------------------------------------------------------
+ // ComponentModel
+ //--------------------------------------------------------------
+
+ /**
+ * Return the collection policy for the model. If a profile
+ * does not declare a collection policy, then the collection
+ * policy declared by the underlying component type
+ * will be used.
+ *
+ * @return the collection policy
+ * @see InfoDescriptor#WEAK
+ * @see InfoDescriptor#SOFT
+ * @see InfoDescriptor#HARD
+ * @see InfoDescriptor#UNDEFINED
+ */
+ public int getCollectionPolicy()
+ {
+ if( m_collection == InfoDescriptor.UNDEFINED )
+ {
+ return getTypeCollectionPolicy();
+ }
+ else
+ {
+ return m_collection;
+ }
+ }
+
+ /**
+ * Set the collection policy for the model.
+ *
+ * @param policy the collection policy
+ * @see InfoDescriptor#WEAK
+ * @see InfoDescriptor#SOFT
+ * @see InfoDescriptor#HARD
+ */
+ public void setCollectionPolicy( int policy )
+ {
+ if( policy == InfoDescriptor.UNDEFINED )
+ {
+ m_collection = InfoDescriptor.UNDEFINED;
+ }
+ else
+ {
+ int minimum = getTypeCollectionPolicy();
+ if( policy >= minimum )
+ {
+ m_collection = policy;
+ }
+ else
+ {
+ final String warning =
+ "Ignoring collection policy override [" + policy
+ + "] because the value is higher that type threshhold ["
+ + minimum + "].";
+ getLogger().warn( warning );
+ }
+ }
+ }
+
+ private int getTypeCollectionPolicy()
+ {
+ return m_context.getType().getInfo().getCollectionPolicy();
+ }
+
+ /**
+ * Return the proxy enabled policy for the model. If the system wide
+ * proxy enabled is disabled the operation will return false otherwise the
+ * value returned is true unless overriden by the "urn:composition:proxy"
+ * attribute.
+ *
+ * @return the proxy policy
+ */
+ public boolean getProxyPolicy()
+ {
+ if( m_context.getSystemContext().isProxyEnabled() )
+ {
+ if( getType().getInfo().getAttribute( PROXY_KEY, "true" ).equals( "false" ) )
+ {
+ return false;
+ }
+ else
+ {
+ return true;
+ }
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ /**
+ * Return the activation policy for the model.
+ * @return the activaltion policy
+ */
+ public boolean getActivationPolicy()
+ {
+ return m_activation;
+ }
+
+ /**
+ * Set the activation policy for the model.
+ *
+ * @param policy the activaltion policy
+ */
+ public void setActivationPolicy( boolean policy )
+ {
+ m_activation = policy;
+ }
+
+ /**
+ * Return the component type descriptor.
+ * @return the type descriptor
+ */
+ public Type getType()
+ {
+ return m_context.getType();
+ }
+
+ /**
+ * Return the class for the deployable target.
+ * @return the class
+ */
+ public Class getDeploymentClass()
+ {
+ return m_context.getDeploymentClass();
+ }
+
+ /**
+ * Rest if the component type backing the model is
+ * parameterizable.
+ *
+ * @return TRUE if the compoent type is parameterizable
+ * otherwise FALSE
+ */
+ public boolean isParameterizable()
+ {
+ return (
+ Parameterizable.class.isAssignableFrom( getDeploymentClass() )
+ || isaConstructorArg( Parameters.class ) );
+ }
+
+ /**
+ * Set the parameters to the supplied value. The supplied
+ * parameters value will replace the existing parameters value.
+ *
+ * @param parameters the supplied parameters value
+ * @exception IllegalStateException if the component type backing the
+ * model does not implement the parameteriazable interface
+ * @exception NullPointerException if the supplied parameters are null
+ */
+ public void setParameters( Parameters parameters )
+ {
+ setParameters( parameters, true );
+ }
+
+ /**
+ * Set the parameters to the supplied value. The supplied
+ * parameters value may suppliment or replace the existing
+ * parameters value.
+ *
+ * @param parameters the supplied parameters
+ * @param policy if TRUE the supplied parameters replaces the current
+ * parameters value otherwise the existing and supplied values
+ * are aggregrated
+ * @exception IllegalStateException if the component type backing the
+ * model does not implement the parameteriazable interface
+ * @exception NullPointerException if the supplied parameters are null
+ */
+ public void setParameters( Parameters parameters, boolean policy )
+ throws IllegalStateException
+ {
+ if( !isParameterizable() )
+ {
+ final String error =
+ REZ.getString(
+ "deployment.parameters.irrational",
+ getDeploymentClass().getName(),
+ this.toString() );
+ throw new IllegalStateException( error );
+ }
+
+ if( parameters == null )
+ {
+ throw new NullPointerException( "parameters" );
+ }
+
+ if( policy )
+ {
+ Properties props = Parameters.toProperties( m_parameters );
+ Properties suppliment = Parameters.toProperties( parameters );
+ Enumeration list = suppliment.propertyNames();
+ while( list.hasMoreElements() )
+ {
+ String name = (String) list.nextElement();
+ String value = suppliment.getProperty( name );
+ if( value == null )
+ {
+ props.remove( name );
+ }
+ else
+ {
+ props.setProperty( name, value );
+ }
+ }
+ m_parameters = Parameters.fromProperties( props );
+ }
+ else
+ {
+ m_parameters = parameters;
+ }
+ }
+
+ /**
+ * Return the parameters to be applied to the component.
+ * If the the component type does not implementation the
+ * Parameterizable interface, the implementation returns null.
+ *
+ * @return the assigned parameters
+ */
+ public Parameters getParameters()
+ {
+ return m_parameters;
+ }
+
+ /**
+ * Rest if the component type backing the model is
+ * configurable.
+ *
+ * @return TRUE if the component type is configurable
+ * otherwise FALSE
+ */
+ public boolean isConfigurable()
+ {
+ return (
+ Configurable.class.isAssignableFrom( getDeploymentClass() )
+ || isaConstructorArg( Configuration.class ) );
+ }
+
+ /**
+ * Set the configuration to the supplied value. The supplied
+ * configuration will replace the existing configuration.
+ *
+ * @param config the supplied configuration
+ * @exception IllegalStateException if the component type backing the
+ * model does not implement the configurable interface
+ * @exception NullPointerException if the supplied configuration is null
+ */
+ public void setConfiguration( Configuration config )
+ throws IllegalStateException, NullPointerException
+ {
+ setConfiguration( config, true );
+ }
+
+ /**
+ * Set the configuration to the supplied value. The supplied
+ * configuration may suppliment or replace the existing configuration.
+ *
+ * @param config the supplied configuration
+ * @param policy if TRUE the supplied configuration replaces the current
+ * configuration otherwise the resoved configuration shall be layed above
+ * the configuration supplied with the profile which in turn is layer above
+ * the type default configuration (if any)
+ * @exception IllegalStateException if the component type backing the
+ * model does not implement the configurable interface
+ * @exception NullPointerException if the supplied configuration is null
+ */
+ public void setConfiguration( Configuration config, boolean policy )
+ throws IllegalStateException, NullPointerException
+ {
+ if( !isConfigurable() )
+ {
+ final String error =
+ REZ.getString(
+ "deployment.configuration.irrational",
+ getDeploymentClass().getName(),
+ this.toString() );
+ throw new IllegalStateException( error );
+ }
+
+ if( config == null )
+ {
+ throw new NullPointerException( "config" );
+ }
+
+ if( policy )
+ {
+ m_config = consolidateConfigurations( config, m_config );
+ }
+ else
+ {
+ m_config = config;
+ }
+ }
+
+ /**
+ * Return the configuration to be applied to the component.
+ * The implementation returns the current configuration state.
+ * If the the component type does not implementation the
+ * Configurable interface, the implementation returns null.
+ *
+ * @return the qualified configuration
+ */
+ public Configuration getConfiguration()
+ {
+ return m_config;
+ }
+
+ /**
+ * Return the context model for this deployment model.
+ *
+ * @return the context model if this model is context dependent, else
+ * the return value is null
+ */
+ public ContextModel getContextModel()
+ {
+ return m_contextModel;
+ }
+
+ /**
+ * Return the dependency models for this component type.
+ *
+ * @return the dependency models
+ */
+ public DependencyModel[] getDependencyModels()
+ {
+ return m_dependencies;
+ }
+
+ /**
+ * Return a dependency model matching the supplied descriptor. If
+ * no model matches the supplied descriptor the implementation
+ * will return null.
+ *
+ * @param dependency the dependency descriptor
+ * @return the matching stage model
+ */
+ public DependencyModel getDependencyModel( DependencyDescriptor dependency )
+ {
+ DependencyModel[] models = getDependencyModels();
+ for( int i=0; i<models.length; i++ )
+ {
+ DependencyModel model = models[i];
+ if( dependency.equals( model.getDependency() ) )
+ {
+ return model;
+ }
+ }
+ return null;
+ }
+
+
+ /**
+ * Return the stage models for this component type.
+ *
+ * @return the stage models
+ */
+ public StageModel[] getStageModels()
+ {
+ return m_stages;
+ }
+
+ /**
+ * Return a stage model matching the supplied descriptor. If
+ * no stage model matches the supplied descriptor the implementation
+ * will return null.
+ *
+ * @param stage the stage descriptor
+ * @return the matching stage model
+ */
+ public StageModel getStageModel( StageDescriptor stage )
+ {
+ StageModel[] stages = getStageModels();
+ for( int i=0; i<stages.length; i++ )
+ {
+ StageModel model = stages[i];
+ if( stage.equals( model.getStage() ) )
+ {
+ return model;
+ }
+ }
+ return null;
+ }
+
+
+ /**
+ * Return the set of services produced by the model as a array of classes.
+ *
+ * @return the service classes
+ */
+ public Class[] getInterfaces()
+ {
+ //
+ // TODO: add a SoftReference to hold the service class array
+ // instad of generating each time
+ //
+
+ ClassLoader classLoader = m_context.getClassLoader();
+ ArrayList list = new ArrayList();
+ ServiceDescriptor[] services = getServices();
+ for( int i=0; i<services.length; i++ )
+ {
+ final ServiceDescriptor service = services[i];
+ final String classname = service.getReference().getClassname();
+ list.add( getComponentClass( classLoader, classname ) );
+ }
+
+ //
+ // if the component is an extension then add all implemented
+ // interfaces
+ //
+
+ if( getType().getExtensions().length > 0 )
+ {
+ Class[] interfaces = getDeploymentClass().getInterfaces();
+ for( int i=0; i<interfaces.length; i++ )
+ {
+ list.add( interfaces[i] );
+ }
+ }
+
+ return (Class[]) list.toArray( new Class[0] );
+ }
+
+ /**
+ * Return the deployment timeout value for the component.
+ *
+ * @return the default deployment timeout value
+ */
+ public long getDeploymentTimeout()
+ {
+ String value =
+ m_context.getType().getInfo().getAttribute(
+ DEPLOYMENT_TIMEOUT_KEY, null );
+ if( null != value )
+ {
+ try
+ {
+ return Long.parseLong( value );
+ }
+ catch( NumberFormatException nfe )
+ {
+ final String error =
+ "Invalid timout parameter ["
+ + value
+ + "] in component type ["
+ + m_context.getType()
+ + "].";
+ throw new ModelRuntimeException( error, nfe );
+ }
+ }
+ else
+ {
+ return super.getDeploymentTimeout();
+ }
+ }
+
+ //==============================================================
+ // implementation
+ //==============================================================
+
+ /**
+ * Test to determin if the first constructor supports the context
+ * base class as a parameter type.
+ * @return TRUE or FALSE
+ */
+ private boolean isaConstructorArg( Class base )
+ {
+ if( null == base ) return false;
+ Class clazz = getDeploymentClass();
+ Constructor[] constructors = clazz.getConstructors();
+ if( constructors.length == 0 ) return false;
+ Constructor constructor = constructors[0];
+ Class[] types = constructor.getParameterTypes();
+ for( int i=0; i<types.length; i++ )
+ {
+ if( base.isAssignableFrom( types[i] ) ) return true;
+ }
+ return false;
+ }
+
+ private Class getComponentClass( ClassLoader classLoader, String classname )
+ {
+ if( classLoader == null )
+ {
+ throw new NullPointerException( "classLoader" );
+ }
+ if( classname == null )
+ {
+ throw new NullPointerException( "classname" );
+ }
+
+ try
+ {
+ return classLoader.loadClass( classname );
+ }
+ catch( ClassNotFoundException e )
+ {
+ return null;
+ }
+ }
+
+ private Configuration consolidateConfigurations(
+ final Configuration primary, final Configuration defaults )
+ {
+ if( primary == null )
+ {
+ return defaults;
+ }
+ else
+ {
+ if( defaults == null )
+ {
+ return primary;
+ }
+ else
+ {
+ return new CascadingConfiguration( primary, defaults );
+ }
+ }
+ }
+}
Modified: avalon/trunk/runtime/composition/impl/src/java/org/apache/avalon/composition/model/impl/DefaultContainmentModel.java
==============================================================================
--- avalon/trunk/runtime/composition/impl/src/java/org/apache/avalon/composition/model/impl/DefaultContainmentModel.java (original)
+++ avalon/trunk/runtime/composition/impl/src/java/org/apache/avalon/composition/model/impl/DefaultContainmentModel.java Sun Jul 25 11:25:19 2004
@@ -46,7 +46,7 @@
import org.apache.avalon.composition.model.ClassLoaderModel;
import org.apache.avalon.composition.model.ContainmentModel;
import org.apache.avalon.composition.model.DependencyGraph;
-import org.apache.avalon.composition.model.DuplicateNameException;
+import org.apache.avalon.composition.model.DuplicateNameException;
import org.apache.avalon.composition.model.ComponentModel;
import org.apache.avalon.composition.model.DeploymentModel;
import org.apache.avalon.composition.model.ModelException;
@@ -135,8 +135,8 @@
private final DefaultState m_commissioned = new DefaultState();
- private final DefaultState m_dirty = new DefaultState();
-
+ private final DefaultState m_dirty = new DefaultState();
+
//--------------------------------------------------------------
// state
//--------------------------------------------------------------
@@ -412,7 +412,7 @@
DeploymentModel model = models[i];
helper.assembleModel( model, subjects );
}
- m_assembly.setEnabled( true );
+ m_assembly.setEnabled( true );
m_dirty.setEnabled( false );
}
}
@@ -835,18 +835,18 @@
String name, DeploymentModel model ) throws DuplicateNameException
{
if( model.equals( this ) )
- return model;
-
- m_dirty.setEnabled( true );
- ModelRepository repository = m_context.getModelRepository();
+ return model;
+
+ m_dirty.setEnabled( true );
+ ModelRepository repository = m_context.getModelRepository();
synchronized( repository )
{
repository.addModel( name, model );
m_context.getDependencyGraph().add( model );
CompositionEvent event = new CompositionEvent( this, model );
fireModelAddedEvent( event );
- return model;
- }
+ return model;
+ }
}
private void fireModelAddedEvent( CompositionEvent event )
---------------------------------------------------------------------
To unsubscribe, e-mail: cvs-unsubscribe@avalon.apache.org
For additional commands, e-mail: cvs-help@avalon.apache.org