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