bloritsch 2003/02/04 11:39:37 Modified: fortress/src/java/org/apache/avalon/fortress/impl AbstractContainer.java fortress/src/java/org/apache/avalon/fortress/impl/lookup FortressServiceManager.java fortress/src/test/org/apache/avalon/fortress/test/data test1.xconf Log: fix some errors in component lookup contracts that I expected to be there Revision Changes Path 1.6 +15 -19 jakarta-avalon-excalibur/fortress/src/java/org/apache/avalon/fortress/impl/AbstractContainer.java Index: AbstractContainer.java =================================================================== RCS file: /home/cvs/jakarta-avalon-excalibur/fortress/src/java/org/apache/avalon/fortress/impl/AbstractContainer.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- AbstractContainer.java 30 Jan 2003 17:37:12 -0000 1.5 +++ AbstractContainer.java 4 Feb 2003 19:39:36 -0000 1.6 @@ -100,9 +100,9 @@ implements Contextualizable, Serviceable, Initializable, Disposable, Container { /** The hint map's entry to get the default component type */ - protected static final String DEFAULT_ENTRY = "*"; + public static final String DEFAULT_ENTRY = "*"; /** The component map's entry to get a ServiceSelector */ - protected static final String SELECTOR_ENTRY = "$"; + public static final String SELECTOR_ENTRY = "$"; /** contains the impl's context passed in through contextualize() */ protected Context m_context; @@ -280,29 +280,25 @@ { Map hintMap = (StaticBucketMap)m_mapper.get( role ); - - if( null == hintMap ) // never heard of this role before. + // Initialize the hintMap if it doesn't exist yet. + if( null == hintMap ) { hintMap = new StaticBucketMap(); hintMap.put( DEFAULT_ENTRY, handler ); m_mapper.put( role, hintMap ); } - else // know it already. add something to the hintmap + + hintMap.put( metaData.getName(), handler ); + + if( (! hintMap.containsKey( SELECTOR_ENTRY )) && (hintMap.size() > 1) ) { - hintMap.put( metaData.getName(), handler ); + hintMap.put( SELECTOR_ENTRY, + new FortressServiceSelector( this, role ) ); + } - if( hintMap.containsKey( DEFAULT_ENTRY ) ) - { - if( !hintMap.containsKey( SELECTOR_ENTRY ) ) - { - hintMap.put( SELECTOR_ENTRY, - new FortressServiceSelector( this, role ) ); - } - } - else - { - hintMap.put( DEFAULT_ENTRY, handler ); - } + if ( metaData.getConfiguration().getAttributeAsBoolean( "default", false ) ) + { + hintMap.put( DEFAULT_ENTRY, handler ); } } } 1.2 +46 -11 jakarta-avalon-excalibur/fortress/src/java/org/apache/avalon/fortress/impl/lookup/FortressServiceManager.java Index: FortressServiceManager.java =================================================================== RCS file: /home/cvs/jakarta-avalon-excalibur/fortress/src/java/org/apache/avalon/fortress/impl/lookup/FortressServiceManager.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- FortressServiceManager.java 27 Jan 2003 16:55:42 -0000 1.1 +++ FortressServiceManager.java 4 Feb 2003 19:39:36 -0000 1.2 @@ -58,6 +58,7 @@ import org.apache.commons.collections.StaticBucketMap; import org.apache.avalon.fortress.Container; import org.apache.avalon.fortress.impl.handler.ComponentHandler; +import org.apache.avalon.fortress.impl.AbstractContainer; /** * This is the Default ServiceManager for the Container. It provides @@ -99,15 +100,17 @@ m_used = new StaticBucketMap(); } - public Object lookup( final String key ) + public Object lookup( final String role ) throws ServiceException { - if( !m_container.has( key, null ) ) + Lookup lookup = parseRole(role); + + if( !m_container.has( lookup.role, lookup.hint ) ) { - return m_parent.lookup( key ); + return m_parent.lookup( role ); } - final Object result = m_container.get( key, null ); + final Object result = m_container.get( lookup.role, lookup.hint ); if( result instanceof ServiceSelector ) { return result; @@ -115,13 +118,13 @@ if( result instanceof ComponentSelector ) { - return new WrapperServiceSelector( key, (ComponentSelector)result ); + return new WrapperServiceSelector( lookup.role, (ComponentSelector)result ); } if( !( result instanceof ComponentHandler ) ) { final String message = "Invalid entry in component manager"; - throw new ServiceException( key, message ); + throw new ServiceException( role, message ); } try @@ -139,19 +142,21 @@ { final String message = "Could not return a reference to the Component"; - throw new ServiceException( key, message, e ); + throw new ServiceException( role, message, e ); } } - public boolean hasService( final String key ) + public boolean hasService( final String role ) { - if( m_container.has( key, null ) ) + Lookup lookup = parseRole( role ); + + if( m_container.has( lookup.role, lookup.hint ) ) { return true; } else { - return null != m_parent ? m_parent.hasService( key ) : false; + return null != m_parent ? m_parent.hasService( role ) : false; } } @@ -181,5 +186,35 @@ { handler.put( component ); } + } + + private Lookup parseRole( String role ) + { + Lookup lookup = new Lookup(); + lookup.role = role; + lookup.hint = AbstractContainer.DEFAULT_ENTRY; + + if ( role.endsWith("Selector") ) + { + lookup.role = role.substring(0, role.length() - "Selector".length()); + lookup.hint = AbstractContainer.SELECTOR_ENTRY; + } + + int index = role.lastIndexOf("/"); + + // needs to be further than the first character + if ( index > 0 ) + { + lookup.role = role.substring(0, index); + lookup.hint = role.substring(index + 1); + } + + return lookup; + } + + private final static class Lookup + { + public String role; + public String hint; } } 1.2 +4 -8 jakarta-avalon-excalibur/fortress/src/test/org/apache/avalon/fortress/test/data/test1.xconf Index: test1.xconf =================================================================== RCS file: /home/cvs/jakarta-avalon-excalibur/fortress/src/test/org/apache/avalon/fortress/test/data/test1.xconf,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- test1.xconf 27 Jan 2003 17:04:48 -0000 1.1 +++ test1.xconf 4 Feb 2003 19:39:37 -0000 1.2 @@ -1,19 +1,15 @@ <test> - <component id="component1" - class="org.apache.avalon.fortress.test.data.Component1" + <component1 id="component1" logger="component1" activation="startup"/> - <component id="component2" - class="org.apache.avalon.fortress.test.data.Component2" + <component2 id="component2" logger="component2" pool-min="2" activation="startup"/> - <component id="component3" - class="org.apache.avalon.fortress.test.data.Component3" + <component3 id="component3" logger="component3" activation="startup"/> - <component id="component4" - class="org.apache.avalon.fortress.test.data.Component4" + <component4 id="component4" logger="component4" activation="startup"/> </test>
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]