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 }