mcconnell 2002/07/13 08:35:25
Modified: assembly/demo/src/java/org/apache/excalibur/playground
ComplexComponent.java
assembly/src/etc kernel.xml
assembly/src/java/org/apache/excalibur/merlin/container
DefaultContainer.java ProfileRegistry.java
assembly/src/java/org/apache/excalibur/merlin/model
ComponentProfile.java ContainerDescriptor.java
Profile.java
assembly/src/java/org/apache/excalibur/merlin/model/builder
XMLProfileCreator.java
Log:
added support for the declaration of disabled/enabled components in an assembly
Revision Changes Path
1.6 +1 -1
jakarta-avalon-excalibur/assembly/demo/src/java/org/apache/excalibur/playground/ComplexComponent.java
Index: ComplexComponent.java
===================================================================
RCS file:
/home/cvs/jakarta-avalon-excalibur/assembly/demo/src/java/org/apache/excalibur/playground/ComplexComponent.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- ComplexComponent.java 13 Jul 2002 00:09:44 -0000 1.5
+++ ComplexComponent.java 13 Jul 2002 15:35:25 -0000 1.6
@@ -103,7 +103,7 @@
{
try
{
- Thread.currentThread().sleep( 1000 );
+ Thread.currentThread().sleep( 100 );
}
catch( Throwable e )
{
1.10 +4 -3 jakarta-avalon-excalibur/assembly/src/etc/kernel.xml
Index: kernel.xml
===================================================================
RCS file: /home/cvs/jakarta-avalon-excalibur/assembly/src/etc/kernel.xml,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- kernel.xml 12 Jul 2002 15:16:37 -0000 1.9
+++ kernel.xml 13 Jul 2002 15:35:25 -0000 1.10
@@ -158,10 +158,11 @@
<!--
including the next entry demonstrates the resolution of a dependency via a
profile
- resolved from a parent container. SimpleComponent needs BasicService with is
availble
- from either TerminalComponent or BasicComponent.
+ resolved from a parent container. SimpleComponent needs BasicService with is
available
+ from either TerminalComponent or BasicComponent implicitly created in the
parent
+ container path (due to a depenency declared by ComplexComponent).
-->
- <component name="simple2"
class="org.apache.excalibur.playground.SimpleComponent"/>
+ <component name="simple2"
class="org.apache.excalibur.playground.SimpleComponent" enabled="true"/>
</container>
<container name="empty"/>
1.6 +17 -4
jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/container/DefaultContainer.java
Index: DefaultContainer.java
===================================================================
RCS file:
/home/cvs/jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/container/DefaultContainer.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- DefaultContainer.java 13 Jul 2002 13:39:00 -0000 1.5
+++ DefaultContainer.java 13 Jul 2002 15:35:25 -0000 1.6
@@ -70,6 +70,7 @@
import org.apache.excalibur.merlin.model.CategoryDescriptor;
import org.apache.excalibur.merlin.model.verifier.AssemblyVerifier;
import org.apache.excalibur.merlin.model.verifier.MetaDataVerifier;
+import org.apache.excalibur.merlin.model.builder.ProfileBuilder;
import org.apache.excalibur.merlin.kernel.ContainerClassLoader;
import org.apache.excalibur.merlin.kernel.DefaultLoggerManager;
import org.apache.excalibur.merlin.Verifiable;
@@ -164,6 +165,9 @@
private Hashtable m_profileToObjectMap = new Hashtable();
+ private ProfileBuilder m_builder = new ProfileBuilder();
+
+
//=======================================================================
// Contextualizable
//=======================================================================
@@ -221,21 +225,30 @@
//
getLogger().debug("explicit profile registration");
- ComponentProfile[] children = m_descriptor.getComponents();
+ ComponentProfile[] children = m_descriptor.getComponents( Profile.EXPLICIT,
true );
for( int i=0; i<children.length; i++ )
{
m_profiles.register( children[i] );
}
//
- // packaged and implict profile registration
+ // add packaged and implict profile registration
//
getLogger().debug("packaged and implicit profile registration");
Type[] types = m_classloader.getTypes();
for( int i=0; i<types.length; i++ )
{
- m_profiles.register( types[i] );
+ Profile[] profiles = m_builder.build( types[i], m_classloader );
+ for( int j=0; j<profiles.length; j++ )
+ {
+ Profile profile = profiles[j];
+ if( profile instanceof ComponentProfile )
+ {
+ m_descriptor.addComponent( (ComponentProfile) profile );
+ m_profiles.register( profile );
+ }
+ }
}
try
1.6 +32 -23
jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/container/ProfileRegistry.java
Index: ProfileRegistry.java
===================================================================
RCS file:
/home/cvs/jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/container/ProfileRegistry.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- ProfileRegistry.java 13 Jul 2002 13:39:00 -0000 1.5
+++ ProfileRegistry.java 13 Jul 2002 15:35:25 -0000 1.6
@@ -114,7 +114,7 @@
public Profile[] getProviders( ServiceDesignator designator )
{
ArrayList list = new ArrayList();
- ComponentProfile[] local = m_descriptor.getComponents();
+ ComponentProfile[] local = m_descriptor.getComponents( true );
for( int i=0; i<local.length; i++ )
{
Profile profile = local[i];
@@ -133,8 +133,9 @@
/**
* Register a potential supplier component type. The implementation will
- * create a component type instance for the entry if not already known and
- * return the existing or new instance to the invoking client.
+ * create a component profile instance for the type if not already known and
+ * return the existing or new instance to the invoking client based on packaged
+ * profiles associated with the type.
*
* @param classname the component class name
* @return the component type
@@ -145,17 +146,35 @@
for( int i=0; i<profiles.length; i++ )
{
Profile profile = profiles[i];
+
register( profile );
}
return profiles;
}
/**
+ * Register the type resulting in the cross-referencing of the type with the set
of
+ * service tables that the type is is capable of supporting.
+ */
+ public Profile register( Profile profile )
+ {
+ String name = profile.getName();
+ m_profiles.put( name, profile );
+ getLogger().debug( "" + profile );
+ ServiceDescriptor[] services = profile.getType().getServices();
+ for( int i=0; i<services.length; i++ )
+ {
+ register( services[i].getService(), profile );
+ }
+ return profile;
+ }
+
+ /**
* For all of the explicity declared profiles, initiate dependency correlation.
*/
public void assembleProfiles() throws Exception
{
- Profile[] profiles = m_descriptor.getComponents();
+ Profile[] profiles = m_descriptor.getComponents( Profile.EXPLICIT, true );
for( int i=0; i<profiles.length; i++ )
{
Profile profile = profiles[i];
@@ -200,28 +219,12 @@
return (Profile) m_profiles.get( name );
}
- /**
- * Register the type resulting in the cross-referencing of the type with the set
of
- * service tables that the type is is capable of supporting.
- */
- public Profile register( Profile profile )
- {
- String name = profile.getName();
- m_profiles.put( name, profile );
- getLogger().debug( "" + profile );
- ServiceDescriptor[] services = profile.getType().getServices();
- for( int i=0; i<services.length; i++ )
- {
- register( services[i].getService(), profile );
- }
- return profile;
- }
-
private void assemble( Profile profile, List visited, String pad ) throws
Exception
{
getLogger().debug( pad + "assemble: " + profile );
String pad2 = pad + " ";
visited.add( profile );
+ String warning = null;
DependencyDescriptor[] dependencies = profile.getType().getDependencies();
for( int i=0; i<dependencies.length; i++ )
{
@@ -233,7 +236,13 @@
Profile[] facilities = getFacilities( dependency.getService() );
Profile provider = selectProfile( dependency, facilities,
candidates );
if( provider == null )
- throw new UnresolvedProviderException("no available provider",
dependency );
+ {
+ profile.setEnabled( false );
+ warning = "Disabling profile '" + profile.getName()
+ + "' due to non-resolution of a provider for the role '"
+ + role + "'.";
+ throw new UnresolvedProviderException( warning, dependency );
+ }
profile.addProvider( provider, role );
if( isLocalProfile( provider ) )
{
1.2 +3 -2
jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/model/ComponentProfile.java
Index: ComponentProfile.java
===================================================================
RCS file:
/home/cvs/jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/model/ComponentProfile.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- ComponentProfile.java 12 Jul 2002 16:30:38 -0000 1.1
+++ ComponentProfile.java 13 Jul 2002 15:35:25 -0000 1.2
@@ -38,9 +38,10 @@
final Context context,
final CategoryDescriptor loggers,
final Type type,
+ final boolean enabled,
final int mode )
{
- super( name, parameters, configuration, context, loggers, type, mode );
+ super( name, parameters, configuration, context, loggers, type, enabled,
mode );
}
}
1.4 +58 -1
jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/model/ContainerDescriptor.java
Index: ContainerDescriptor.java
===================================================================
RCS file:
/home/cvs/jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/model/ContainerDescriptor.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- ContainerDescriptor.java 13 Jul 2002 13:39:00 -0000 1.3
+++ ContainerDescriptor.java 13 Jul 2002 15:35:25 -0000 1.4
@@ -132,6 +132,63 @@
}
/**
+ * Return the set of enabled or disable components based on the supplied
criteria.
+ * @param enabled TRUE to select enabled components, FALSE returs disabled
components
+ * @return the descriptors matching the supplied enabled status
+ */
+ public ComponentProfile[] getComponents( boolean enabled )
+ {
+ ArrayList list = new ArrayList();
+ ComponentProfile[] components = getComponents();
+ for( int i=0; i<components.length; i++ )
+ {
+ ComponentProfile component = components[i];
+ if( component.isEnabled() == enabled )
+ list.add( component );
+ }
+ return (ComponentProfile[] ) list.toArray( new ComponentProfile[0] );
+ }
+
+ /**
+ * Return the set of component descriptors contained within this container
matching
+ * the supplied mode.
+ * @param mode one of enumerated value {@link Profile#IMPLICIT}, {@link
Profile#PACKAGED},
+ * or {@link Profile#EXPLICIT}
+ * @param enabled TRUE to select enabled components, FALSE returs disabled
compoents
+ * @return the descriptors matching the supplied creation mode
+ */
+ public ComponentProfile[] getComponents( int mode, boolean enabled )
+ {
+ ArrayList list = new ArrayList();
+ ComponentProfile[] components = getComponents( enabled );
+ return selectComponentsByMode( components, mode );
+ }
+
+ /**
+ * Return the set of component descriptors contained within this container
matching
+ * the supplied mode.
+ * @param mode one of enumerated value {@link Profile#IMPLICIT}, {@link
Profile#PACKAGED},
+ * or {@link Profile#EXPLICIT},
+ * @return the descriptors matching the supplied creation mode
+ */
+ public ComponentProfile[] getComponents( int mode )
+ {
+ return selectComponentsByMode( getComponents(), mode );
+ }
+
+ private ComponentProfile[] selectComponentsByMode( ComponentProfile[]
components, int mode )
+ {
+ ArrayList list = new ArrayList();
+ for( int i=0; i<components.length; i++ )
+ {
+ ComponentProfile component = components[i];
+ if( component.getMode() == mode )
+ list.add( component );
+ }
+ return (ComponentProfile[] ) list.toArray( new ComponentProfile[0] );
+ }
+
+ /**
* Add a container profile to this container.
*
* @parent the container to add
1.4 +29 -1
jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/model/Profile.java
Index: Profile.java
===================================================================
RCS file:
/home/cvs/jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/model/Profile.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- Profile.java 13 Jul 2002 00:09:45 -0000 1.3
+++ Profile.java 13 Jul 2002 15:35:25 -0000 1.4
@@ -82,6 +82,11 @@
*/
private final int m_mode;
+ /**
+ * The enabled status of the profile. Normally a profile is enabled however, a
+ * failure to assemble will result in the disabling of the profile.
+ */
+ private boolean m_enabled = true;
/**
* Create a Profile instance.
@@ -96,6 +101,7 @@
final Context context,
final CategoryDescriptor loggers,
final Type type,
+ final boolean enabled,
final int mode )
{
if( null == name )
@@ -117,7 +123,29 @@
m_type = type;
m_context = context;
m_loggers = loggers;
+ m_enabled = enabled;
m_mode = mode;
+ }
+
+ /**
+ * Test is this profile is enabled. A profile is enabled unless explicitly
disabled by an
+ * assembly directive, or implicity disabled as a result of an assembly failure.
+ *
+ * @return TRUE if the profile is enabled.
+ * @see #isAvailable()
+ */
+ public boolean isEnabled()
+ {
+ return m_enabled;
+ }
+
+ /**
+ * Set the enabled status of the profile to the supplied value.
+ * @param value the enabled status - TRUE or FALSE
+ */
+ public void setEnabled( boolean value )
+ {
+ m_enabled = value;
}
/**
1.3 +4 -3
jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/model/builder/XMLProfileCreator.java
Index: XMLProfileCreator.java
===================================================================
RCS file:
/home/cvs/jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/model/builder/XMLProfileCreator.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- XMLProfileCreator.java 12 Jul 2002 19:09:27 -0000 1.2
+++ XMLProfileCreator.java 13 Jul 2002 15:35:25 -0000 1.3
@@ -84,7 +84,7 @@
type.getInfo().getName(), null, null );
return new Profile[]{
- new ComponentProfile( null, null, null, null, loggers, type,
Profile.IMPLICIT ) };
+ new ComponentProfile( null, null, null, null, loggers, type, true,
Profile.IMPLICIT ) };
}
for( int i=0; i<profiles.length; i++ )
{
@@ -106,13 +106,14 @@
{
name = profile.getAttribute("name");
}
+ boolean enabled = profile.getAttributeAsBoolean( "enabled", true );
Parameters params = Parameters.fromConfiguration(
profile.getChild("parameters") );
Configuration config = profile.getChild("configuration");
Configuration loggersConfig = profile.getChild("loggers");
CategoryDescriptor loggers = createCategoryDescriptor( loggersConfig, name
);
Context context = ContextFactory.createContextFromConfiguration(
null, profile.getChild("context") );
- return new ComponentProfile( name, params, config, context, loggers, type,
mode );
+ return new ComponentProfile( name, params, config, context, loggers, type,
enabled, mode );
}
public CategoryDescriptor createCategoryDescriptor( Configuration config,
String fallback )
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>