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 }