public void execute( )
{
byte[] buf = new byte[BUFSIZ];
// create an Axis server
AxisServer engine = m_server.getAxisServer( );
// create and initialize a message context
MessageContext msgContext = new MessageContext( engine );
Message requestMsg = null;
// Reusuable, buffered, content length controlled, InputStream
NonBlockingBufferedInputStream is = new NonBlockingBufferedInputStream( );
// buffers for the headers we care about
StringBuffer soapAction = new StringBuffer( );
StringBuffer httpRequest = new StringBuffer( );
StringBuffer fileName = new StringBuffer( );
StringBuffer cookie = new StringBuffer( );
StringBuffer cookie2 = new StringBuffer( );
StringBuffer authInfo = new StringBuffer( );
StringBuffer contentType = new StringBuffer( );
StringBuffer contentLocation = new StringBuffer( );
Message responseMsg = null;
// prepare request (do as much as possible while waiting for the
// next connection). Note the next two statements are commented
// out. Uncomment them if you experience any problems with not
// resetting state between requests:
// msgContext = new MessageContext();
// requestMsg = new Message("", "String");
//msgContext.setProperty("transport", "HTTPTransport");
msgContext.setTransportName( TRANSPORT_NAME );
responseMsg = null;
try
{
// assume the best
byte[] status = OK;
// assume we're not getting WSDL
boolean doWsdl = false;
// cookie for this session, if any
String cooky = null;
String methodName = null;
try
{
// wipe cookies if we're doing sessions
if ( m_server.isSessionUsed( ) )
{
cookie.delete( 0,
cookie.length( ) );
cookie2.delete( 0,
cookie2.length( ) );
}
authInfo.delete( 0,
authInfo.length( ) );
// read headers
is.setInputStream( m_socket.getInputStream( ) );
// parse all headers into hashtable
MimeHeaders requestHeaders = new MimeHeaders( );
int contentLength =
parseHeaders( is, buf, contentType, contentLocation, soapAction, httpRequest, fileName, cookie,
cookie2, authInfo, requestHeaders );
is.setContentLength( contentLength );
int paramIdx = fileName.toString( ).indexOf( '?' );
if ( paramIdx != -1 )
{
// Got params
String params = fileName.substring( paramIdx + 1 );
fileName.setLength( paramIdx );
log.debug( Messages.getMessage( "filename00",
fileName.toString( ) ) );
log.debug( Messages.getMessage( "params00", params ) );
if ( "wsdl".equalsIgnoreCase( params ) )
{
doWsdl = true;
}
if ( params.startsWith( "method=" ) )
{
methodName = params.substring( 7 );
}
}
// Real and relative paths are the same for the
// SimpleAxisServer
msgContext.setProperty( Constants.MC_REALPATH,
fileName.toString( ) );
msgContext.setProperty( Constants.MC_RELATIVE_PATH,
fileName.toString( ) );
msgContext.setProperty( Constants.MC_JWS_CLASSDIR, "jwsClasses" );
msgContext.setProperty( Constants.MC_HOME_DIR, "." );
// !!! Fix string concatenation
String url =
"http://" + getLocalHost( ) + ":" + m_server.getServerSocket( ).getLocalPort( ) + "/"
+ fileName.toString( );
msgContext.setProperty( MessageContext.TRANS_URL, url );
String filePart = fileName.toString( );
if ( filePart.startsWith( "axis/services/" ) )
{
String servicePart = filePart.substring( 14 );
int separator = servicePart.indexOf( '/' );
if ( separator > -1 )
{
msgContext.setProperty( "objectID",
servicePart.substring( separator + 1 ) );
servicePart = servicePart.substring( 0, separator );
}
msgContext.setTargetService( servicePart );
}
if ( authInfo.length( ) > 0 )
{
// Process authentication info
//authInfo = new StringBuffer("dXNlcjE6cGFzczE=");
byte[] decoded = Base64.decode( authInfo.toString( ) );
StringBuffer userBuf = new StringBuffer( );
StringBuffer pwBuf = new StringBuffer( );
StringBuffer authBuf = userBuf;
for ( int i = 0; i < decoded.length; i++ )
{
if ( (char) ( decoded[i] & 0x7f ) == ':' )
{
authBuf = pwBuf;
continue;
}
authBuf.append( (char) ( decoded[i] & 0x7f ) );
}
if ( log.isDebugEnabled( ) )
{
log.debug( Messages.getMessage( "user00",
userBuf.toString( ) ) );
}
msgContext.setUsername( userBuf.toString( ) );
msgContext.setPassword( pwBuf.toString( ) );
}
// if get, then return simpleton document as response
if ( httpRequest.toString( ).equals( "GET" ) )
{
OutputStream out = m_socket.getOutputStream( );
out.write( HTTP );
if ( fileName.length( ) == 0 )
{
out.write( "301 Redirect\nLocation: /axis/\n\n".getBytes( ) );
out.flush( );
return;
}
out.write( status );
if ( methodName != null )
{
String body = "<" + methodName + ">" +
// args +
"</" + methodName + ">";
String msgtxt =
"<SOAP-ENV:Envelope" + " xmlns:SOAP-ENV=\"" + Constants.URI_SOAP12_ENV + "\">"
+ "<SOAP-ENV:Body>" + body + "</SOAP-ENV:Body>" + "</SOAP-ENV:Envelope>";
ByteArrayInputStream istream = new ByteArrayInputStream( msgtxt.getBytes( ) );
requestMsg = new Message( istream );
}
else if ( doWsdl )
{
engine.generateWSDL( msgContext );
Document doc = (Document) msgContext.getProperty( "WSDL" );
if ( doc != null )
{
XMLUtils.normalize( doc.getDocumentElement( ) );
String response = XMLUtils.PrettyDocumentToString( doc );
byte[] respBytes = response.getBytes( );
out.write( XML_MIME_STUFF );
putInt( buf, out, respBytes.length );
out.write( SEPARATOR );
out.write( respBytes );
out.flush( );
return;
}
}
else if ( fileName.equals( "/" ) )
{
StringBuffer sb = new StringBuffer( );
sb.append( "<h2>And now... Some Services</h2>\n" );
Iterator i = engine.getConfig( ).getDeployedServices( );
sb.append( "<ul>\n" );
while ( i.hasNext( ) )
{
ServiceDesc sd = (ServiceDesc) i.next( );
sb.append( "<li>\n" );
sb.append( sd.getName( ) );
sb.append( " <a href=\"services/" );
sb.append( sd.getName( ) );
sb.append( "?wsdl\"><i>(wsdl)</i></a></li>\n" );
ArrayList operations = sd.getOperations( );
if ( !operations.isEmpty( ) )
{
sb.append( "<ul>\n" );
for ( Iterator it = operations.iterator( ); it.hasNext( ); )
{
OperationDesc desc = (OperationDesc) it.next( );
sb.append( "<li>" + desc.getName( ) );
}
sb.append( "</ul>\n" );
}
}
sb.append( "</ul>\n" );
byte[] bytes = sb.toString( ).getBytes( );
out.write( HTML_MIME_STUFF );
putInt( buf, out, bytes.length );
out.write( SEPARATOR );
out.write( bytes );
out.flush( );
return;
}
else
{
String filePath = fileName.toString( );
if ( filePath.startsWith( "/" ) )
{
filePath = filePath.substring( 1 );
}
File realPath = new File( m_docRootDir, filePath );
InputStream in = new BufferedInputStream( new FileInputStream( realPath ) );
//System.out.println( "Serving up " + realPath + " on a silver platter..." );
IoUtils.copy( in, out );
in.close( );
out.flush( );
return;
}
}
else
{
// this may be "" if either SOAPAction: "" or if no SOAPAction at all.
// for now, do not complain if no SOAPAction at all
String soapActionString = soapAction.toString( );
if ( soapActionString != null )
{
msgContext.setUseSOAPAction( true );
msgContext.setSOAPActionURI( soapActionString );
}
requestMsg = new Message( is,
false,
contentType.toString( ),
contentLocation.toString( ) );
}
// Transfer HTTP headers to MIME headers for request message.
MimeHeaders requestMimeHeaders = requestMsg.getMimeHeaders( );
for ( Iterator i = requestHeaders.getAllHeaders( ); i.hasNext( ); )
{
MimeHeader requestHeader = (MimeHeader) i.next( );
requestMimeHeaders.addHeader( requestHeader.getName( ),
requestHeader.getValue( ) );
}
msgContext.setRequestMessage( requestMsg );
// put character encoding of request to message context
// in order to reuse it during the whole process.
String requestEncoding = (String) requestMsg.getProperty( SOAPMessage.CHARACTER_SET_ENCODING );
if ( requestEncoding != null )
{
msgContext.setProperty( SOAPMessage.CHARACTER_SET_ENCODING, requestEncoding );
}
// set up session, if any
if ( m_server.isSessionUsed( ) )
{
// did we get a cookie?
if ( cookie.length( ) > 0 )
{
cooky = cookie.toString( ).trim( );
}
else if ( cookie2.length( ) > 0 )
{
cooky = cookie2.toString( ).trim( );
}
// if cooky is null, cook up a cooky
if ( cooky == null )
{
// fake one up!
// make it be an arbitrarily increasing number
// (no this is not thread safe because ++ isn't atomic)
int i = SimpleAxisServer.sessionIndex++;
cooky = "" + i;
}
msgContext.setSession( m_server.createSession( cooky ) );
}
// invoke the Axis engine
engine.invoke( msgContext );
// Retrieve the response from Axis
responseMsg = msgContext.getResponseMessage( );
if ( responseMsg == null )