cziegeler 2004/04/05 05:05:38 Modified: fortress/container-impl/src/java/org/apache/avalon/fortress/util ContextManager.java fortress/container-impl/src/java/org/apache/avalon/fortress/impl DefaultECMContainer.java Added: fortress/container-impl/src/java/org/apache/avalon/fortress/impl/role ECMMetaInfoManager.java Log: First implementation for selectors Revision Changes Path 1.55 +6 -2 avalon-excalibur/fortress/container-impl/src/java/org/apache/avalon/fortress/util/ContextManager.java Index: ContextManager.java =================================================================== RCS file: /home/cvs/avalon-excalibur/fortress/container-impl/src/java/org/apache/avalon/fortress/util/ContextManager.java,v retrieving revision 1.54 retrieving revision 1.55 diff -u -r1.54 -r1.55 --- ContextManager.java 5 Apr 2004 11:07:08 -0000 1.54 +++ ContextManager.java 5 Apr 2004 12:05:38 -0000 1.55 @@ -22,6 +22,7 @@ import org.apache.avalon.fortress.MetaInfoManager; import org.apache.avalon.fortress.RoleManager; import org.apache.avalon.fortress.impl.role.ConfigurableRoleManager; +import org.apache.avalon.fortress.impl.role.ECMMetaInfoManager; import org.apache.avalon.fortress.impl.role.ECMRoleManager; import org.apache.avalon.fortress.impl.role.FortressRoleManager; import org.apache.avalon.fortress.impl.role.Role2MetaInfoManager; @@ -670,7 +671,10 @@ // if we use the ecm role manager then we don't wrap it inside a service meta manager! if ( roleManager instanceof ECMRoleManager ) { - mim = new Role2MetaInfoManager( roleManager ); + final ECMMetaInfoManager metaManager = + new ECMMetaInfoManager( new Role2MetaInfoManager( roleManager ), classLoader ); + metaManager.enableLogging( m_loggerManager.getLoggerForCategory( "system.meta" ) ); + mim = metaManager; } else { 1.5 +128 -60 avalon-excalibur/fortress/container-impl/src/java/org/apache/avalon/fortress/impl/DefaultECMContainer.java Index: DefaultECMContainer.java =================================================================== RCS file: /home/cvs/avalon-excalibur/fortress/container-impl/src/java/org/apache/avalon/fortress/impl/DefaultECMContainer.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- DefaultECMContainer.java 5 Apr 2004 11:07:09 -0000 1.4 +++ DefaultECMContainer.java 5 Apr 2004 12:05:38 -0000 1.5 @@ -25,6 +25,7 @@ import org.apache.avalon.fortress.impl.handler.ComponentHandler; import org.apache.avalon.fortress.impl.handler.LEAwareComponentHandler; import org.apache.avalon.fortress.impl.lookup.FortressServiceSelector; +import org.apache.avalon.fortress.impl.role.ECMMetaInfoManager; import org.apache.avalon.framework.configuration.Configuration; import org.apache.avalon.framework.configuration.ConfigurationException; import org.apache.avalon.framework.container.ContainerUtil; @@ -133,74 +134,42 @@ for ( int i = 0; i < elements.length; i++ ) { final Configuration element = elements[i]; - String hint = element.getAttribute( "id", null ); - if ( null == hint ) { - // Fortress requires a hint, so we just give it one :) - hint = element.getLocation(); - } - final String className = getClassname( element ); - - final int activation = ComponentHandlerMetaData.ACTIVATION_BACKGROUND; - final ComponentHandlerMetaData metaData = - new ComponentHandlerMetaData( hint, className, element, activation ); // figure out Role String role = getRole( element ); - final int pos = role.indexOf('/'); - if ( pos != -1 ) { - hint = role.substring(pos+1); - role = role.substring(0, pos); + if ( role.endsWith("Selector") ) + { + processSelector(role.substring(0, role.length()-8), element ); } - try + else { - final MetaInfoEntry metaEntry = m_metaManager.getMetaInfoForClassname( className ); - if ( null == metaEntry ) + + // get the implementation + final String className = getClassname( element ); + + final int pos = role.indexOf('/'); + final String hint; + if ( pos != -1 ) { - final String message = "No role defined for " + className; - throw new IllegalArgumentException( message ); - } - - if ( DEFAULT_ENTRY.equals( metaData.getName() ) || - SELECTOR_ENTRY.equals( metaData.getName() ) ) + hint = role.substring(pos+1); + role = role.substring(0, pos); + } + else { - throw new IllegalArgumentException( "Using a reserved id name" + metaData.getName() ); + hint = null; } - - // create a handler for the combo of Role+MetaData - final ComponentHandler handler = - getComponentHandler( className, - getComponentHandlerClassName( className, element), - metaData ); - - // put the role into our role mapper. If the role doesn't exist - // yet, just stuff it in as DEFAULT_ENTRY. If it does, we create a - // ServiceSelector and put that in as SELECTOR_ENTRY. - Map hintMap = (Map) m_mapper.get( role ); - - // Initialize the hintMap if it doesn't exist yet. - if ( null == hintMap ) + + final String shortName; + if ( "component".equals( element.getName() )) { - hintMap = createHintMap(); - hintMap.put( DEFAULT_ENTRY, handler ); - hintMap.put( SELECTOR_ENTRY, - new FortressServiceSelector( this, role ) ); - m_mapper.put( role, hintMap ); + shortName = null; } - - hintMap.put( hint, handler ); - - if ( element.getAttributeAsBoolean( "default", false ) ) + else { - hintMap.put( DEFAULT_ENTRY, handler ); + shortName = element.getName(); } - } - catch ( ConfigurationException ce ) - { - throw ce; - } - catch ( Exception e ) - { - throw new ConfigurationException( "Could not add component", e ); + + this.addComponent(role, hint, shortName, className, element ); } if ( getLogger().isDebugEnabled() ) @@ -293,10 +262,10 @@ return handler; } - protected Class getComponentHandlerClassName(final String defaultClassName, Configuration config ) + protected Class getComponentHandlerClass(final String defaultClassName, final String shortName ) throws Exception { - if ( "component".equals( config.getName() ) ) + if ( shortName == null ) { String handlerClassName = null; @@ -334,12 +303,12 @@ } else { - final MetaInfoEntry roleEntry = m_metaManager.getMetaInfoForShortName( config.getName() ); + final MetaInfoEntry roleEntry = m_metaManager.getMetaInfoForShortName( shortName ); if ( null == roleEntry ) { final String message = "No class found matching configuration name " + - "[name: " + config.getName() + ", location: " + config.getLocation() + "]"; + "[name: " + shortName + "]"; throw new ConfigurationException( message ); } @@ -347,4 +316,103 @@ } } + protected void processSelector(String role, Configuration config) + throws ConfigurationException + { + final Configuration[] children = config.getChildren(); + if ( children != null ) + { + for(int i=0; i<children.length; i++) + { + final Configuration element = children[i]; + final String hint = element.getAttribute("name"); + final String className = element.getAttribute("class"); + + if ( m_metaManager instanceof ECMMetaInfoManager ) + { + try + { + ((ECMMetaInfoManager)m_metaManager).addSelectorComponent(role, hint, className, getComponentHandlerClass(className, null).getName()); + } + catch (ConfigurationException ce ) + { + throw ce; + } + catch (Exception e) + { + throw new ConfigurationException("Unable to add selector component.", e); + } + } + addComponent(role, hint, null, className, element ); + } + } + } + + protected void addComponent(final String role, + String hint, + String shortName, + final String className, + final Configuration element) + throws ConfigurationException + { + final int activation = ComponentHandlerMetaData.ACTIVATION_BACKGROUND; + + // Fortress requires a hint, so we just give it one :) (if missing) + final String metaDataHint = element.getAttribute( "id", element.getLocation() ); + + if ( hint == null ) + { + hint = metaDataHint; + } + + final ComponentHandlerMetaData metaData = + new ComponentHandlerMetaData( metaDataHint, className, element, activation ); + + try + { + + if ( DEFAULT_ENTRY.equals( metaData.getName() ) || + SELECTOR_ENTRY.equals( metaData.getName() ) ) + { + throw new IllegalArgumentException( "Using a reserved id name" + metaData.getName() ); + } + + // create a handler for the combo of Role+MetaData + final ComponentHandler handler = + getComponentHandler( className, + getComponentHandlerClass( className, shortName), + metaData ); + + // put the role into our role mapper. If the role doesn't exist + // yet, just stuff it in as DEFAULT_ENTRY. If it does, we create a + // ServiceSelector and put that in as SELECTOR_ENTRY. + Map hintMap = (Map) m_mapper.get( role ); + + // Initialize the hintMap if it doesn't exist yet. + if ( null == hintMap ) + { + hintMap = createHintMap(); + hintMap.put( DEFAULT_ENTRY, handler ); + hintMap.put( SELECTOR_ENTRY, + new FortressServiceSelector( this, role ) ); + m_mapper.put( role, hintMap ); + } + + hintMap.put( hint, handler ); + + if ( element.getAttributeAsBoolean( "default", false ) ) + { + hintMap.put( DEFAULT_ENTRY, handler ); + } + } + catch ( ConfigurationException ce ) + { + throw ce; + } + catch ( Exception e ) + { + throw new ConfigurationException( "Could not add component", e ); + } + } + } 1.1 avalon-excalibur/fortress/container-impl/src/java/org/apache/avalon/fortress/impl/role/ECMMetaInfoManager.java Index: ECMMetaInfoManager.java =================================================================== /* * Copyright 2003-2004 The 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.fortress.impl.role; import java.util.ArrayList; import java.util.Properties; import org.apache.avalon.fortress.MetaInfoEntry; import org.apache.avalon.fortress.MetaInfoManager; /** * ECMMetaInfoManager * * @author <a href="mailto:dev@avalon.apache.org">Avalon Development Team</a> * @version CVS Revision: 1.1 $ */ public final class ECMMetaInfoManager extends AbstractMetaInfoManager { /** * Create a ECMMetaInfoManager. */ public ECMMetaInfoManager() { super( (MetaInfoManager) null ); } /** * Create a ServiceMetaManager with a parent. * * @param parent */ public ECMMetaInfoManager( final MetaInfoManager parent ) { super( parent ); } /** * Create a ECMMetaInfoManager with the supplied classloader and * parent Rr. * * @param parent * @param loader */ public ECMMetaInfoManager( final MetaInfoManager parent, final ClassLoader loader ) { super( parent, loader ); } /** * Add a component defined inside a selector */ public final void addSelectorComponent( final String role, final String hint, final String className, final String handlerClassName ) { Properties props = new Properties(); final String lifestyle; if (MetaInfoEntry.THREADSAFE_HANDLER.equals(handlerClassName) ) { lifestyle = "singleton"; } else if ( MetaInfoEntry.PER_THREAD_HANDLER.equals(handlerClassName) ) { lifestyle = "thread"; } else if ( MetaInfoEntry.POOLABLE_HANDLER.equals(handlerClassName) ) { lifestyle = "pooled"; } else { lifestyle = "transient"; } props.setProperty("x-avalon.lifestyle", lifestyle); props.setProperty("x-avalon.name", role + '/' + hint); super.addComponent(role, className, props, new ArrayList()); } }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]