donaldp 01/04/14 22:40:53 Modified: src/java/org/apache/phoenix/engine DefaultServerApplication.java src/java/org/apache/phoenix/engine/blocks BlockDAG.java BlockEntry.java src/java/org/apache/phoenix/engine/phases ShutdownPhase.java StartupPhase.java Removed: src/java/org/apache/phoenix/engine/facilities ComponentBuilder.java DefaultComponentBuilder.java SarBlockFactory.java Log: Removed need for separate COmponentBuilder facility. StartupPhase now directly implements functionality. Revision Changes Path 1.12 +8 -59 jakarta-avalon-phoenix/src/java/org/apache/phoenix/engine/DefaultServerApplication.java Index: DefaultServerApplication.java =================================================================== RCS file: /home/cvs/jakarta-avalon-phoenix/src/java/org/apache/phoenix/engine/DefaultServerApplication.java,v retrieving revision 1.11 retrieving revision 1.12 diff -u -r1.11 -r1.12 --- DefaultServerApplication.java 2001/04/15 02:32:12 1.11 +++ DefaultServerApplication.java 2001/04/15 05:40:52 1.12 @@ -25,7 +25,6 @@ import org.apache.avalon.camelot.ContainerException; import org.apache.avalon.camelot.Entry; import org.apache.avalon.camelot.Factory; -import org.apache.phoenix.engine.facilities.ComponentBuilder; import org.apache.phoenix.engine.facilities.ComponentManagerBuilder; import org.apache.phoenix.engine.facilities.ConfigurationRepository; import org.apache.phoenix.engine.facilities.LoggerBuilder; @@ -36,7 +35,6 @@ import org.apache.phoenix.engine.blocks.BlockDAG; import org.apache.phoenix.engine.blocks.BlockEntry; import org.apache.phoenix.engine.blocks.RoleEntry; -import org.apache.phoenix.engine.facilities.DefaultComponentBuilder; import org.apache.phoenix.engine.facilities.DefaultComponentManagerBuilder; import org.apache.phoenix.engine.facilities.DefaultConfigurationRepository; import org.apache.phoenix.engine.facilities.DefaultLogManager; @@ -48,7 +46,6 @@ import org.apache.phoenix.engine.phases.StartupPhase; import org.apache.phoenix.engine.blocks.BlockVisitor; import org.apache.phoenix.metainfo.DependencyDescriptor; -import org.apache.avalon.util.Enum; /** * This is the basic container of blocks. A server application @@ -62,24 +59,10 @@ extends AbstractContainer implements Application, Configurable, Contextualizable { - - protected final static Traversal FORWARD = new Traversal( "FORWARD" ); - protected final static Traversal REVERSE = new Traversal( "REVERSE" ); - protected final static Traversal LINEAR = new Traversal( "LINEAR" ); - - protected final static class Traversal - extends Enum - { - protected Traversal( final String name ) - { - super( name ); - } - } - protected final static class PhaseEntry { - protected Traversal m_traversal; - protected BlockVisitor m_visitor; + protected BlockDAG.Traversal m_traversal; + protected BlockVisitor m_visitor; } protected HashMap m_phases = new HashMap(); @@ -96,7 +79,6 @@ protected SarClassLoader m_classLoader; //these are the facilities (internal components) of ServerApplication - protected ComponentBuilder m_componentBuilder; protected LoggerBuilder m_loggerBuilder; protected ComponentManagerBuilder m_componentManagerBuilder; protected ConfigurationRepository m_configurationRepository; @@ -140,12 +122,12 @@ { PhaseEntry entry = new PhaseEntry(); entry.m_visitor = new StartupPhase(); - entry.m_traversal = FORWARD; + entry.m_traversal = BlockDAG.FORWARD; m_phases.put( "startup", entry ); entry = new PhaseEntry(); entry.m_visitor = new ShutdownPhase(); - entry.m_traversal = REVERSE; + entry.m_traversal = BlockDAG.REVERSE; m_phases.put( "shutdown", entry ); } @@ -168,7 +150,7 @@ { getLogger().info( "Number of blocks to load: " + m_entries.size() ); final PhaseEntry entry = (PhaseEntry)m_phases.get( "startup" ); - runPhase( entry.m_visitor, entry.m_traversal ); + runPhase( entry ); } catch( final ApplicationException ae ) { @@ -188,7 +170,7 @@ getLogger().info( "Number of blocks to unload: " + m_entries.size() ); final PhaseEntry entry = (PhaseEntry)m_phases.get( "shutdown" ); - runPhase( entry.m_visitor, entry.m_traversal ); + runPhase( entry ); m_entries.clear(); } @@ -208,7 +190,6 @@ m_componentManagerBuilder = new DefaultComponentManagerBuilder(); m_configurationRepository = new DefaultConfigurationRepository(); m_loggerBuilder = new DefaultLoggerBuilder(); - m_componentBuilder = new DefaultComponentBuilder(); m_classLoader = new SarClassLoader(); m_threadManager = new DefaultThreadManager(); @@ -236,7 +217,6 @@ setupComponent( m_classLoader ); - setupComponent( m_componentBuilder ); setupComponent( m_loggerBuilder ); setupComponent( m_componentManagerBuilder ); setupComponent( m_configurationRepository ); @@ -278,39 +258,10 @@ } } - protected void runPhase( final BlockVisitor visitor, final Traversal traversal ) + protected void runPhase( final PhaseEntry phase ) throws Exception { - if( FORWARD == traversal ) - { - final Iterator entries = list(); - while( entries.hasNext() ) - { - final String name = (String)entries.next(); - m_dag.walkGraph( name, visitor ); - } - } - else if( REVERSE == traversal ) - { - //TODO: - final Iterator entries = list(); - while( entries.hasNext() ) - { - final String name = (String)entries.next(); - //m_dag.reverseWalkGraph( name, visitor ); - } - } - else - { - //TODO: Does this make sense ???? - final Iterator entries = list(); - while( entries.hasNext() ) - { - final String name = (String)entries.next(); - final BlockEntry entry = (BlockEntry)getEntry( name ); - visitor.visitBlock( name, entry ); - } - } + m_dag.walkGraph( phase.m_visitor, phase.m_traversal ); } /** @@ -389,8 +340,6 @@ componentManager.put( "NOT_DONE_YET", m_logManager ); componentManager.put( "org.apache.avalon.util.thread.ThreadManager", m_threadManager ); componentManager.put( "org.apache.phoenix.engine.facilities.LoggerBuilder", m_loggerBuilder ); - componentManager.put( "org.apache.phoenix.engine.facilities.ComponentBuilder", - m_componentBuilder ); componentManager.put( "org.apache.phoenix.engine.facilities.ComponentManagerBuilder", m_componentManagerBuilder ); componentManager.put( "org.apache.phoenix.engine.facilities.ConfigurationRepository", 1.8 +50 -24 jakarta-avalon-phoenix/src/java/org/apache/phoenix/engine/blocks/BlockDAG.java Index: BlockDAG.java =================================================================== RCS file: /home/cvs/jakarta-avalon-phoenix/src/java/org/apache/phoenix/engine/blocks/BlockDAG.java,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- BlockDAG.java 2001/04/14 05:51:38 1.7 +++ BlockDAG.java 2001/04/15 05:40:52 1.8 @@ -7,6 +7,7 @@ */ package org.apache.phoenix.engine.blocks; +import java.util.ArrayList; import java.util.Iterator; import org.apache.avalon.AbstractLoggable; import org.apache.avalon.ComponentManager; @@ -17,6 +18,7 @@ import org.apache.phoenix.Block; import org.apache.phoenix.metainfo.DependencyDescriptor; import org.apache.phoenix.metainfo.ServiceDescriptor; +import org.apache.avalon.util.Enum; /** * This is the dependency graph for blocks. @@ -27,31 +29,47 @@ extends AbstractLoggable implements Composer { - protected Container m_container; + public final static Traversal FORWARD = new Traversal( "FORWARD" ); + public final static Traversal REVERSE = new Traversal( "REVERSE" ); + public final static Traversal LINEAR = new Traversal( "LINEAR" ); + public final static class Traversal + extends Enum + { + private Traversal( final String name ) + { + super( name ); + } + } + + private Container m_container; + public void compose( final ComponentManager componentManager ) throws ComponentManagerException { m_container = (Container)componentManager.lookup( "org.apache.avalon.camelot.Container" ); } - public void walkGraph( final String root, final BlockVisitor visitor ) + public void walkGraph( final BlockVisitor visitor, final Traversal traversal ) throws Exception { - visitBlock( root, getBlockEntry( root ), visitor, true ); - } + //temporary storage to record those + //that are already traversed + final ArrayList completed = new ArrayList(); - public void reverseWalkGraph( final String root, final BlockVisitor visitor ) - throws Exception - { - visitBlock( root, getBlockEntry( root ), visitor, false ); + final Iterator entries = m_container.list(); + while( entries.hasNext() ) + { + final String name = (String)entries.next(); + final BlockEntry entry = getBlockEntry( name ); + visitBlock( name, entry, visitor, traversal, completed ); + } } - protected BlockEntry getBlockEntry( final String name ) + private BlockEntry getBlockEntry( final String name ) throws Exception { return (BlockEntry)m_container.getEntry( name ); - //catch( final ContainerException ce ) } /** @@ -60,9 +78,10 @@ * @param name name of BlockEntry * @param entry the BlockEntry */ - protected void visitDependencies( final String name, - final BlockEntry entry, - final BlockVisitor visitor ) + private void visitDependencies( final String name, + final BlockEntry entry, + final BlockVisitor visitor, + final ArrayList completed ) throws Exception { getLogger().debug( "Traversing dependencies for " + name ); @@ -81,7 +100,7 @@ final RoleEntry roleEntry = entry.getRoleEntry( role ); final String dependencyName = roleEntry.getName(); final BlockEntry dependency = getBlockEntry( dependencyName ); - visitBlock( dependencyName, dependency, visitor, true ); + visitBlock( dependencyName, dependency, visitor, FORWARD, completed ); } } @@ -92,7 +111,9 @@ * @param name name of BlockEntry * @param entry the BlockEntry */ - protected void visitReverseDependencies( final String name, final BlockVisitor visitor ) + private void visitReverseDependencies( final String name, + final BlockVisitor visitor, + final ArrayList completed ) throws Exception { getLogger().debug( "Traversing reverse dependencies for " + name ); @@ -114,25 +135,30 @@ " as it depends on " + depends ); //finally try to traverse block - visitBlock( blockName, entry, visitor, false ); + visitBlock( blockName, entry, visitor, REVERSE, completed ); } } } } - protected void visitBlock( final String name, - final BlockEntry entry, - final BlockVisitor visitor, - final boolean forward ) + private void visitBlock( final String name, + final BlockEntry entry, + final BlockVisitor visitor, + final Traversal traversal, + final ArrayList completed ) throws Exception { - if( forward ) + //If already visited this block then bug out early + if( completed.contains( name ) ) return; + completed.add( name ); + + if( FORWARD == traversal ) { - visitDependencies( name, entry, visitor ); + visitDependencies( name, entry, visitor, completed ); } - else + else if( REVERSE == traversal ) { - visitReverseDependencies( name, visitor ); + visitReverseDependencies( name, visitor, completed ); } visitor.visitBlock( name, entry ); 1.5 +0 -11 jakarta-avalon-phoenix/src/java/org/apache/phoenix/engine/blocks/BlockEntry.java Index: BlockEntry.java =================================================================== RCS file: /home/cvs/jakarta-avalon-phoenix/src/java/org/apache/phoenix/engine/blocks/BlockEntry.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- BlockEntry.java 2001/04/15 02:32:13 1.4 +++ BlockEntry.java 2001/04/15 05:40:52 1.5 @@ -74,15 +74,4 @@ { m_configuration = configuration; } -/* - public Block getBlock() - { - return (Block)getInstance(); - } - - public void setBlock( final Block block ) - { - setInstance( block ); - } -*/ } 1.3 +2 -1 jakarta-avalon-phoenix/src/java/org/apache/phoenix/engine/phases/ShutdownPhase.java Index: ShutdownPhase.java =================================================================== RCS file: /home/cvs/jakarta-avalon-phoenix/src/java/org/apache/phoenix/engine/phases/ShutdownPhase.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- ShutdownPhase.java 2001/04/15 02:32:13 1.2 +++ ShutdownPhase.java 2001/04/15 05:40:53 1.3 @@ -17,6 +17,7 @@ import org.apache.avalon.util.thread.ThreadContext; import org.apache.avalon.util.thread.ThreadManager; import org.apache.phoenix.engine.blocks.BlockEntry; +import org.apache.phoenix.engine.blocks.BlockVisitor; /** * @@ -24,7 +25,7 @@ */ public class ShutdownPhase extends AbstractLoggable - implements Phase, Composer + implements BlockVisitor, Composer { private ClassLoader m_classLoader; private ThreadManager m_threadManager; 1.3 +55 -8 jakarta-avalon-phoenix/src/java/org/apache/phoenix/engine/phases/StartupPhase.java Index: StartupPhase.java =================================================================== RCS file: /home/cvs/jakarta-avalon-phoenix/src/java/org/apache/phoenix/engine/phases/StartupPhase.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- StartupPhase.java 2001/04/15 02:32:13 1.2 +++ StartupPhase.java 2001/04/15 05:40:53 1.3 @@ -19,20 +19,23 @@ import org.apache.avalon.Loggable; import org.apache.avalon.Startable; import org.apache.avalon.atlantis.ApplicationException; +import org.apache.avalon.camelot.Factory; +import org.apache.avalon.camelot.SimpleFactory; import org.apache.avalon.configuration.Configurable; import org.apache.avalon.configuration.Configuration; import org.apache.avalon.util.thread.ThreadContext; import org.apache.avalon.util.thread.ThreadManager; +import org.apache.phoenix.Block; import org.apache.phoenix.BlockContext; import org.apache.phoenix.engine.SarContextResources; import org.apache.phoenix.engine.blocks.BlockEntry; import org.apache.phoenix.engine.blocks.BlockVisitor; import org.apache.phoenix.engine.blocks.DefaultBlockContext; -import org.apache.phoenix.engine.facilities.ComponentBuilder; import org.apache.phoenix.engine.facilities.ComponentManagerBuilder; import org.apache.phoenix.engine.facilities.ConfigurationRepository; -import org.apache.phoenix.engine.facilities.ContextBuilder; import org.apache.phoenix.engine.facilities.LoggerBuilder; +import org.apache.phoenix.metainfo.BlockUtil; +import org.apache.phoenix.metainfo.ServiceDescriptor; /** * @@ -43,12 +46,14 @@ implements BlockVisitor, Contextualizable, Composer { private ClassLoader m_classLoader; - private ComponentBuilder m_componentBuilder; private LoggerBuilder m_loggerBuilder; private ComponentManagerBuilder m_componentManagerBuilder; private ConfigurationRepository m_repository; private ThreadManager m_threadManager; + ///Factory used to build instance of Block + private Factory m_factory; + ///base context used to setup hosted blocks private DefaultContext m_baseBlockContext; @@ -69,12 +74,11 @@ { m_classLoader = (ClassLoader)componentManager.lookup( "java.lang.ClassLoader" ); + m_factory = new SimpleFactory( m_classLoader ); + m_threadManager = (ThreadManager)componentManager. lookup( "org.apache.avalon.util.thread.ThreadManager" ); - m_componentBuilder = (ComponentBuilder)componentManager. - lookup( "org.apache.phoenix.engine.facilities.ComponentBuilder" ); - m_loggerBuilder = (LoggerBuilder)componentManager. lookup( "org.apache.phoenix.engine.facilities.LoggerBuilder" ); @@ -110,7 +114,7 @@ { //Creation stage getLogger().debug( "Pre-Creation Stage" ); - final Object object = m_componentBuilder.createComponent( name, entry ); + final Object object = createBlock( name, entry ); entry.setInstance( object ); getLogger().debug( "Creation successful." ); @@ -174,8 +178,51 @@ throw new ApplicationException( "Failed to load block " + name, e ); } } + + private Object createBlock( final String name, final BlockEntry entry ) + throws Exception + { + getLogger().info( "Creating block " + name ); + + final Block block = (Block)m_factory.create( entry.getLocator(), Block.class ); + + getLogger().debug( "Created block" ); + + verifyBlockServices( name, entry, block ); + + getLogger().debug( "Verified block services" ); + + return block; + } + + /** + * Verify that all the services that a block + * declares it provides are actually provided. + * + * @param name the name of block + * @param blockEntry the blockEntry + * @param block the Block + * @exception ApplicationException if verification fails + */ + private void verifyBlockServices( final String name, + final BlockEntry entry, + final Block block ) + throws ApplicationException + { + final ServiceDescriptor[] services = entry.getBlockInfo().getServices(); + for( int i = 0; i < services.length; i++ ) + { + if( false == BlockUtil.implementsService( block, services[ i ] ) ) + { + final String message = "Block " + name + " fails to implement " + + "advertised service " + services[ i ]; + getLogger().warn( message ); + throw new ApplicationException( message ); + } + } + } - protected Context createContext( final String name ) + private Context createContext( final String name ) { final DefaultBlockContext context = new DefaultBlockContext( getLogger(), m_threadManager, m_baseBlockContext ); --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]