View Javadoc

1   package org.codehaus.xfire;
2   
3   import java.io.IOException;
4   import java.io.InputStream;
5   import java.io.OutputStream;
6   import javax.wsdl.WSDLException;
7   import javax.xml.stream.XMLInputFactory;
8   import javax.xml.stream.XMLStreamException;
9   import javax.xml.stream.XMLStreamReader;
10  import org.codehaus.xfire.handler.Handler;
11  import org.codehaus.xfire.service.DefaultServiceRegistry;
12  import org.codehaus.xfire.service.Service;
13  import org.codehaus.xfire.service.ServiceRegistry;
14  import org.codehaus.xfire.transport.DefaultTransportManager;
15  import org.codehaus.xfire.transport.TransportManager;
16  import org.codehaus.xfire.wsdl.WSDL;
17  
18  /*** 
19   * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse</a>
20   * @since Feb 13, 2004
21   */
22  public class DefaultXFire
23      extends AbstractXFireComponent
24      implements XFire
25  {
26      private ServiceRegistry registry;
27  
28      private TransportManager transportManager;
29      
30      public DefaultXFire()
31      {
32          registry = new DefaultServiceRegistry();
33          transportManager = new DefaultTransportManager();
34      }
35      
36      public DefaultXFire(ServiceRegistry registry, 
37                          TransportManager transportManager)
38      {
39          this.registry = registry;
40          this.transportManager = transportManager;
41      }
42      
43      /***
44       * @see org.codehaus.xfire.XFire#invoke(java.lang.String, javax.xml.stream.XMLStreamReader, javax.xml.stream.XMLStreamWriter, org.codehaus.xfire.transport.Invocation)
45       */
46      public void invoke( XMLStreamReader reader, 
47                          MessageContext context )
48      {
49          Handler handler = null;
50          try
51          {
52              Service service = findService( context.getServiceName() );
53              context.setService(service);
54              
55              if ( service == null )
56              {
57                  throw new XFireRuntimeException("No such service.");
58              }
59              
60              handler = service.getServiceHandler();
61              
62              handler.invoke( context, reader );
63          }
64          catch (Exception e)
65          {
66              if ( e instanceof XFireRuntimeException )
67              {
68                  throw (XFireRuntimeException) e;
69              }
70              else if ( handler != null )
71              {
72                  handler.handleFault( e, context );
73              }
74              else
75              {
76                  throw new XFireRuntimeException("Couldn't process message.", e);
77              }
78          }
79      }
80  
81      /***
82       * @param context
83       * @return
84       * @throws ComponentLookupException
85       */
86      protected Service findService( String serviceName ) 
87      {
88          return getServiceRegistry().getService( serviceName );
89      }
90  
91      /***
92       * @see org.codehaus.xfire.XFire#invoke(java.lang.String, java.io.InputStream, javax.xml.stream.XMLStreamWriter, org.codehaus.xfire.transport.Invocation)
93       */
94      public void invoke( InputStream stream, 
95                          MessageContext context )
96      {
97          XMLInputFactory factory = XMLInputFactory.newInstance();
98          
99          try
100         {
101             invoke( factory.createXMLStreamReader(stream),
102                     context );
103         }
104         catch (XMLStreamException e)
105         {
106             throw new XFireRuntimeException("Couldn't parse stream.", e);
107         }
108     }    
109 
110     /***
111      * @see org.codehaus.xfire.XFire#generateWSDL(java.lang.String)
112      */
113     public void generateWSDL(String serviceName, OutputStream out)
114     {
115         try
116         {
117             WSDL wsdl = getWSDL(serviceName);
118             
119             wsdl.write( out );
120         } 
121         catch (WSDLException e)
122         {
123             throw new XFireRuntimeException( "Couldn't generate WSDL.", e );
124         }
125         catch (IOException e)
126         {
127             throw new XFireRuntimeException( "Couldn't generate WSDL.", e );
128         }
129     }
130     
131     /***
132 	 * @param serviceName
133 	 * @return
134 	 * @throws ServiceException
135 	 * @throws WSDLException
136 	 */
137 	private WSDL getWSDL(String serviceName) 
138         throws WSDLException
139 	{
140 		Service service = findService( serviceName );
141 		
142 		WSDL wsdl = service.getWSDL();
143 		return wsdl;
144 	}
145 
146     public ServiceRegistry getServiceRegistry()
147     {
148         return registry;
149     }
150     
151     public TransportManager getTransportManager()
152     {
153         return transportManager;
154     }
155 }