View Javadoc

    1   package org.codehaus.xfire.loom;
    2
    3   import java.util.HashMap;
    4   import java.util.Iterator;
    5   import java.util.Map;
    6
    7   import org.apache.avalon.framework.configuration.Configurable;
    8   import org.apache.avalon.framework.configuration.Configuration;
    9   import org.apache.avalon.framework.configuration.ConfigurationException;
    10  import org.apache.avalon.framework.logger.AbstractLogEnabled;
    11  import org.apache.avalon.phoenix.ApplicationEvent;
    12  import org.apache.avalon.phoenix.ApplicationListener;
    13  import org.apache.avalon.phoenix.BlockEvent;
    14  import org.apache.avalon.phoenix.metainfo.BlockInfo;
    15  import org.apache.avalon.phoenix.metainfo.ServiceDescriptor;
    16
    17  /***
    18   * @author <a href="mailto:peter.royal@pobox.com">peter royal</a>
    19   */
    20  public class XFireBlockDeployerApplicationListener extends AbstractLogEnabled
    21      implements ApplicationListener, Configurable
    22  {
    23      private ServiceDeployer m_deployer;
    24      private Map m_services;
    25
    26      public void configure( final Configuration configuration ) throws ConfigurationException
    27      {
    28          final Configuration[] kids = configuration.getChildren( "service" );
    29
    30          m_services = new HashMap( kids.length );
    31
    32          for( int i = 0; i < kids.length; i++ )
    33          {
    34              m_services.put( kids[i].getValue(), null );
    35          }
    36      }
    37
    38      public void applicationFailure( final Exception e )
    39      {
    40      }
    41
    42      public void applicationStarted()
    43      {
    44          if( null == m_deployer )
    45          {
    46              throw new IllegalStateException( "Must provide a " + ServiceDeployer.class.getName() );
    47          }
    48
    49          final Iterator i = m_services.entrySet().iterator();
    50
    51          while( i.hasNext() )
    52          {
    53              final Map.Entry entry = (Map.Entry)i.next();
    54
    55              if( null == entry.getValue() )
    56              {
    57                  throw new IllegalStateException( "Unable to deploy configured service: " + entry.getKey() );
    58              }
    59
    60              if( getLogger().isDebugEnabled() ) getLogger().debug( "Deploying '" + entry.getKey() + "'" );
    61
    62              try
    63              {
    64                  m_deployer.deploy( (String)entry.getKey(), entry.getValue() );
    65              }
    66              catch( Exception e )
    67              {
    68                  throw new RuntimeException( "Unable to deploy '" + entry.getKey() + "'", e );
    69              }
    70          }
    71      }
    72
    73      public void applicationStarting( final ApplicationEvent event ) throws Exception
    74      {
    75      }
    76
    77      public void applicationStopped()
    78      {
    79      }
    80
    81      public void applicationStopping()
    82      {
    83          final Iterator i = m_services.keySet().iterator();
    84
    85          while( i.hasNext() )
    86          {
    87              final String service = (String)i.next();
    88
    89              if( getLogger().isDebugEnabled() ) getLogger().debug( "Undeploying '" + service + "'" );
    90
    91              m_deployer.undeploy( service );
    92          }
    93      }
    94
    95      public void blockAdded( final BlockEvent event )
    96      {
    97          if( isServiceDeployer( event.getBlockInfo() ) )
    98          {
    99              if( null == m_deployer )
    100             {
    101                 if( getLogger().isDebugEnabled() )
    102                     getLogger().debug( "Using '" + event.getName() + "' as ServiceDeployer" );
    103
    104                 m_deployer = (ServiceDeployer)event.getObject();
    105             }
    106             else
    107             {
    108                 throw new RuntimeException( "Duplicate ServiceDeployer found: " + event.getName() );
    109             }
    110         }
    111         else if( m_services.containsKey( event.getName() ) )
    112         {
    113             if( getLogger().isDebugEnabled() )
    114                 getLogger().debug( "Marking '" + event.getName() + "' for XFire deploment" );
    115
    116             m_services.put( event.getName(), event.getObject() );
    117         }
    118     }
    119
    120     private boolean isServiceDeployer( final BlockInfo blockInfo )
    121     {
    122         final ServiceDescriptor[] services = blockInfo.getServices();
    123
    124         for( int i = 0; i < services.length; i++ )
    125         {
    126             if( ServiceDeployer.class.getName().equals( services[i].getName() ) )
    127             {
    128                 return true;
    129             }
    130         }
    131
    132         return false;
    133     }
    134
    135     public void blockRemoved( final BlockEvent event )
    136     {
    137     }
    138 }