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 }