[xgws-dev] CVS Update: codes/xsul/java/tests/xsul/async_msg

Aleksander Andrzej Slominski xgws-dev_at_extreme.indiana.edu
Tue Jun 6 16:18:01 2006


aslom       06/06/06 16:17:24

  Modified:    xsul/java/doc changes.html
               xsul/java/modules/common/xsul XsulVersion.java
               xsul/java/modules/lead/xsul/lead lead-context.xsd
                        lead-context.xsdconfig
               xsul/java/modules/monitoring/xsul/monitoring
                        XsulMonitoringStats.java XsulMonitoringUtil.java
               xsul/java/modules/xservo_soap_http/xsul/xservo_soap_http
                        HttpBasedServices.java
               xsul/java/tests/xsul/async_msg EchoAsyncService.java
  Log:
  added ability to customize name and version of service displayed in default GET location, add list of service names and link to their WSDL files
  
  Revision  Changes    Path
  1.54      +16 -4     codes/xsul/java/doc/changes.html
  
  Index: changes.html
  ===================================================================
  RCS file: /l/extreme/cvs/codes/xsul/java/doc/changes.html,v
  retrieving revision 1.53
  retrieving revision 1.54
  diff -u -b -t -w -r1.53 -r1.54
  --- changes.html	6 Jun 2006 19:08:49 -0000	1.53
  +++ changes.html	6 Jun 2006 20:17:23 -0000	1.54
  @@ -4,24 +4,36 @@
   <head>
   <link rel="shortcut icon" type="image/vnd.microsoft.icon" href="favicon.ico" />
   <link rel="icon" type="image/vnd.microsoft.icon" href="favicon.ico" />
  -<title>XSUL Changes
  +<title>XSUL2 Changes
   </title>
   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
   <meta name="author" content="Aleksander Slominski [http://www.extreme.indiana.edu/~aslom]">
   </head>
   <body bgcolor="white">
   
  -<h1>Changes to XSUL</h1>
  +<h1>Changes to XSUL2</h1>
   
   
  -<h3>2006-06- (XSUL_2_5_xxx)</h3>
  +<h3>2006-06- (XSUL_2_6_xxx)</h3>
   
   <ul>
   
   <li>2006-06-06 (2.6.4):
  +added ability to set service name and version displayed when using browser to access service endpoint:
  +use <code>HttpBasedServices.setServerName()</code>;
  +for example
  +<code>httpServices.setServerName("MyServerName/1.0.1")</code>
  +and handy way to maintan version for services in sync with XSUL:
  +<code>httpServices.setServerName("MyServerName/"+XsulVersion.getImplementationVersion())</code>.
  +</li>
   
  +<li>XHTML page for started XSUL service will give list of services and their WSDLs
   </li>
   
  +<li>
  +added utility method to get locaiton of WSDL for a service hosted by XWSIF servo:
  +<code>String HttpBasedServices.getServiceWsdl(String serviceName)</code>
  +</li>
   
   <li>2006-06-05 (2.6.3):
   fixed problem with too "sticky" headers,
  @@ -419,7 +431,7 @@
   </td>
   <td align="right" width="25%">
   <font size="-2"><i>
  -Last modified: $Id: changes.html,v 1.53 2006/06/06 19:08:49 aslom Exp $
  +Last modified: $Id: changes.html,v 1.54 2006/06/06 20:17:23 aslom Exp $
   </i></font>
   
   </td>
  
  
  
  1.81      +4 -4      codes/xsul/java/modules/common/xsul/XsulVersion.java
  
  Index: XsulVersion.java
  ===================================================================
  RCS file: /l/extreme/cvs/codes/xsul/java/modules/common/xsul/XsulVersion.java,v
  retrieving revision 1.80
  retrieving revision 1.81
  diff -u -b -t -w -r1.80 -r1.81
  --- XsulVersion.java	5 Jun 2006 20:13:48 -0000	1.80
  +++ XsulVersion.java	6 Jun 2006 20:17:23 -0000	1.81
  @@ -1,18 +1,18 @@
   /* -*- mode: Java; c-basic-offset: 4; indent-tabs-mode: nil; -*-  //------100-columns-wide------>|*/
   /* Copyright (c) 2002-2006 Extreme! Lab, Indiana University. All rights reserved.
    * This software is open source. See the bottom of this file for the licence.
  - * $Id: XsulVersion.java,v 1.80 2006/06/05 20:13:48 aslom Exp $ */
  + * $Id: XsulVersion.java,v 1.81 2006/06/06 20:17:23 aslom Exp $ */
   package xsul;
   
   /**
    * One place to put version number.
    *
  - * @version $Revision: 1.80 $
  + * @version $Revision: 1.81 $
    * @author <a href="http://www.extreme.indiana.edu/~aslom/">Aleksander Slominski</a>
    */
   public class XsulVersion {
  -    public final static String SPEC_VERSION = "2.6.3";
  -    private final static String BUILD = "_dev"; //"_f2"; //"_SPECIAL_EDITION";//"_b4";
  +    public final static String SPEC_VERSION = "2.6.4";
  +    private final static String BUILD = ""; //"_dev"; //"_f2"; //"_SPECIAL_EDITION";//"_b4";
   
       private final static String PROJECT_NAME = "XSUL";
       public  final static String IMPL_VERSION = SPEC_VERSION+BUILD;
  
  
  
  1.3       +0 -1      codes/xsul/java/modules/lead/xsul/lead/lead-context.xsd
  
  Index: lead-context.xsd
  ===================================================================
  RCS file: /l/extreme/cvs/codes/xsul/java/modules/lead/xsul/lead/lead-context.xsd,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -b -t -w -r1.2 -r1.3
  --- lead-context.xsd	31 May 2006 22:16:33 -0000	1.2
  +++ lead-context.xsd	6 Jun 2006 20:17:23 -0000	1.3
  @@ -86,7 +86,6 @@
             <element minOccurs="0" maxOccurs="1" ref="lead:service-instance-id"/>
             <element minOccurs="0" maxOccurs="1" ref="lead:gfac-url"/>
             <element minOccurs="0" maxOccurs="1" ref="lead:resource-catalog-url"/>
  -          <element minOccurs="0" maxOccurs="1" ref="lead:properties-file-url"/>
             <element minOccurs="0" maxOccurs="1" ref="lead:event-sink-epr"/>
             <!-- this is required element to make open content model works!!!! -->
             <!-- for description see: -->
  
  
  
  1.2       +1 -0      codes/xsul/java/modules/lead/xsul/lead/lead-context.xsdconfig
  
  Index: lead-context.xsdconfig
  ===================================================================
  RCS file: /l/extreme/cvs/codes/xsul/java/modules/lead/xsul/lead/lead-context.xsdconfig,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -b -t -w -r1.1 -r1.2
  --- lead-context.xsdconfig	31 May 2006 07:21:31 -0000	1.1
  +++ lead-context.xsdconfig	6 Jun 2006 20:17:23 -0000	1.2
  @@ -11,3 +11,4 @@
       </xb:namespace>
       
   </xb:config>
  +
  
  
  
  1.5       +14 -6     codes/xsul/java/modules/monitoring/xsul/monitoring/XsulMonitoringStats.java
  
  Index: XsulMonitoringStats.java
  ===================================================================
  RCS file: /l/extreme/cvs/codes/xsul/java/modules/monitoring/xsul/monitoring/XsulMonitoringStats.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -b -t -w -r1.4 -r1.5
  --- XsulMonitoringStats.java	12 Apr 2006 21:07:15 -0000	1.4
  +++ XsulMonitoringStats.java	6 Jun 2006 20:17:23 -0000	1.5
  @@ -4,7 +4,7 @@
    *
    * This software is open source. See the bottom of this file for the licence.
    *
  - * $Id: XsulMonitoringStats.java,v 1.4 2006/04/12 21:07:15 aslom Exp $
  + * $Id: XsulMonitoringStats.java,v 1.5 2006/06/06 20:17:23 aslom Exp $
    */
   package xsul.monitoring;
   
  @@ -28,16 +28,17 @@
       public final static String STARTTIME_SECONDS = "starttime-seconds";
       public final static String XML_REQUESTS_PER_SECOND = "xml-requests-per-second";
       public final static String CONNECTIONS_COUNT = "connections-count";
  -    public final static String IMPL_VERSION = "impl-version";
  +    public final static String SERVER_VERSION = "server-version";
  +    public final static String XSUL_IMPL_VERSION = "impl-version";
   
  -    private String serviceName;
  +    private String serverName;
       private long startTimeMs;
       private long requestXmlMsgsCount;
   
       protected XsulMonitoringStats(String serviceName, long startTimeInMs,
                                     long requestXmlMsgCount, long numberOfConnections) {
           super(builder.newFragment(MONITORING_NS, "service-statistics"));
  -        this.serviceName = serviceName;
  +        this.serverName = serviceName;
           this.startTimeMs = startTimeInMs;
           this.requestXmlMsgsCount = requestXmlMsgCount;
           XmlElement serviceNameEl = addElement(SERVICE_NAME);
  @@ -50,8 +51,15 @@
           numberOfConnectionsEl.addChild(""+numberOfConnections);
       }
       
  -    public String getServiceName() {
  -        return serviceName;
  +    /**
  +     * @deprecated
  +     */
  +    public String getSericeName() {
  +        return getServerName();
  +    }
  +    
  +    public String getServerName() {
  +        return serverName;
       }
       
       public long getStarTimeInMs() {
  
  
  
  1.10      +28 -19    codes/xsul/java/modules/monitoring/xsul/monitoring/XsulMonitoringUtil.java
  
  Index: XsulMonitoringUtil.java
  ===================================================================
  RCS file: /l/extreme/cvs/codes/xsul/java/modules/monitoring/xsul/monitoring/XsulMonitoringUtil.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -b -t -w -r1.9 -r1.10
  --- XsulMonitoringUtil.java	5 Jun 2006 20:13:48 -0000	1.9
  +++ XsulMonitoringUtil.java	6 Jun 2006 20:17:23 -0000	1.10
  @@ -4,7 +4,7 @@
    *
    * This software is open source. See the bottom of this file for the licence.
    *
  - * $Id: XsulMonitoringUtil.java,v 1.9 2006/06/05 20:13:48 aslom Exp $
  + * $Id: XsulMonitoringUtil.java,v 1.10 2006/06/06 20:17:23 aslom Exp $
    */
   package xsul.monitoring;
   
  @@ -63,9 +63,9 @@
       }
       
       //<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  -    public static XsulMonitoringStats createStats(String serviceName, long startTime,
  +    public static XsulMonitoringStats createStats(String serverName, long startTime,
                                                     long requestXmlMsgCount, long numberOfConnections) {
  -        return new XsulMonitoringStats(serviceName, startTime, requestXmlMsgCount, numberOfConnections);
  +        return new XsulMonitoringStats(serverName, startTime, requestXmlMsgCount, numberOfConnections);
       }
       
       
  @@ -76,40 +76,41 @@
           return outgoingDoc;
       }
       
  -    public static XmlElement createXhtmlStats(XsulMonitoringStats s) {
  +    public static XmlElement createXhtmlStats(XsulMonitoringStats stats) {
           final XmlNamespace H = XmlConstants.XHTML_NS;
           XmlElement html = builder.newFragment(H, "html");
           html.declareNamespace(H);
           XmlElement head = html.addElement(H, "head");
           XmlElement titleEl = head.addElement(H, "title");
  -        String version = " ("+XsulVersion.getUserAgent()+")";
  -        String title = s.getServiceName()+" Monitoring Stats "+version;
  -        titleEl.addChild(title);
  +        //String version = " ("+XsulVersion.getUserAgent()+")";
  +        //String title = s.getServerName()+" Monitoring Stats "+version;
  +        titleEl.addChild(stats.getServerName());
  +        String pageHeader = "Monitoring stats for "+stats.getServerName();
           XmlElement body = html.addElement(H, "body");
           XmlElement h1 = body.addElement(H, "h1");
  -        h1.addChild(title);
  +        h1.addChild(pageHeader);
           XmlElement div = body.addElement(H, "div");
           div.addAttribute(null, "class", "statistics");
           //defensive programming to avoid divide-per-zero when calculating uptime: starTime-1
  -        double uptimeInSeconds = (System.currentTimeMillis() - s.getStarTimeInMs() - 1) / 1000.0;
  -        if (s.getRequestXmlMsgsCount() > 0) {
  +        double uptimeInSeconds = (System.currentTimeMillis() - stats.getStarTimeInMs() - 1) / 1000.0;
  +        if (stats.getRequestXmlMsgsCount() > 0) {
               XmlElement p = div.addElement(H, "p");
               p.addChild("Number of XML requests: ");
               XmlElement spanMsgs = p.addElement(H, "span");
               spanMsgs.addAttribute(null, "class", XsulMonitoringStats.XML_REQUESTS_COUNT);
  -            spanMsgs.addChild(""+s.getRequestXmlMsgsCount());
  +            spanMsgs.addChild(""+stats.getRequestXmlMsgsCount());
               p.addChild(" ");
           }
  -        if (s.getConnectionsCount() > 0) {
  +        if (stats.getConnectionsCount() > 0) {
               XmlElement p = div.addElement(H, "p");
               p.addChild("Total number of connections: ");
               XmlElement spanMsgs = p.addElement(H, "span");
               spanMsgs.addAttribute(null, "class", XsulMonitoringStats.CONNECTIONS_COUNT);
  -            spanMsgs.addChild(""+s.getConnectionsCount());
  +            spanMsgs.addChild(""+stats.getConnectionsCount());
               p.addChild(" ");
           }
  -        if (s.getRequestXmlMsgsCount() > 0) {
  -            double avgPerSecond = s.getRequestXmlMsgsCount() / uptimeInSeconds;
  +        if (stats.getRequestXmlMsgsCount() > 0) {
  +            double avgPerSecond = stats.getRequestXmlMsgsCount() / uptimeInSeconds;
               if(avgPerSecond > 1.0) {
                   XmlElement p = div.addElement(H, "p");
                   p.addChild("average: ");
  @@ -127,21 +128,29 @@
                   p.addChild(" [seconds]");
               }
               XmlElement p = div.addElement(H, "p");
  -            p.addChild("Service started: "+new Date(s.getStarTimeInMs()) );
  +            p.addChild("Service started: "+new Date(stats.getStarTimeInMs()) );
           }
           {
               XmlElement p = div.addElement(H, "p");
               p.addChild("Start time: ");
               XmlElement spanStartTime = p.addElement(H, "span");
  -            spanStartTime.addChild(""+s.getStarTimeInMs());
  +            spanStartTime.addChild(""+stats.getStarTimeInMs());
               spanStartTime.addAttribute(null, "class", XsulMonitoringStats.STARTTIME_SECONDS);
               p.addChild(" [milliseconds] since UNIX epoch.");
           }
           {
               XmlElement p = div.addElement(H, "p");
  -            p.addChild("Version: ");
  +            p.addChild("Service name/version: ");
               XmlElement spanVersion = p.addElement(H, "span");
  -            spanVersion.addAttribute(null, "class", XsulMonitoringStats.IMPL_VERSION);
  +            spanVersion.addAttribute(null, "class", XsulMonitoringStats.SERVER_VERSION);
  +            spanVersion.addChild("" + stats.getServerName());
  +        }
  +
  +        {
  +            XmlElement p = div.addElement(H, "p");
  +            p.addChild("XSUL Version: ");
  +            XmlElement spanVersion = p.addElement(H, "span");
  +            spanVersion.addAttribute(null, "class", XsulMonitoringStats.XSUL_IMPL_VERSION);
               spanVersion.addChild("" + XsulVersion.getImplementationVersion());
           }
           
  
  
  
  1.20      +153 -124  codes/xsul/java/modules/xservo_soap_http/xsul/xservo_soap_http/HttpBasedServices.java
  
  Index: HttpBasedServices.java
  ===================================================================
  RCS file: /l/extreme/cvs/codes/xsul/java/modules/xservo_soap_http/xsul/xservo_soap_http/HttpBasedServices.java,v
  retrieving revision 1.19
  retrieving revision 1.20
  diff -u -b -t -w -r1.19 -r1.20
  --- HttpBasedServices.java	18 Apr 2006 18:03:48 -0000	1.19
  +++ HttpBasedServices.java	6 Jun 2006 20:17:24 -0000	1.20
  @@ -4,7 +4,7 @@
    *
    * This software is open source. See the bottom of this file for the licence.
    *
  - * $Id: HttpBasedServices.java,v 1.19 2006/04/18 18:03:48 aslom Exp $
  + * $Id: HttpBasedServices.java,v 1.20 2006/06/06 20:17:24 aslom Exp $
    */
   package xsul.xservo_soap_http;
   
  @@ -13,9 +13,9 @@
   import java.io.OutputStream;
   import java.io.Reader;
   import java.io.Writer;
  -import java.net.URI;
  -import java.util.HashMap;
  +import java.util.Iterator;
   import java.util.Map;
  +import java.util.TreeMap;
   import org.xmlpull.v1.XmlPullParser;
   import org.xmlpull.v1.XmlPullParserException;
   import org.xmlpull.v1.XmlSerializer;
  @@ -23,10 +23,12 @@
   import org.xmlpull.v1.builder.XmlDocument;
   import org.xmlpull.v1.builder.XmlElement;
   import org.xmlpull.v1.builder.XmlInfosetBuilder;
  +import org.xmlpull.v1.builder.XmlNamespace;
   import org.xmlpull.v1.parser_pool.XmlPullParserPool;
   import xsul.MLogger;
   import xsul.XmlConstants;
   import xsul.XsulException;
  +import xsul.XsulVersion;
   import xsul.http_server.HttpMiniServer;
   import xsul.http_server.HttpMiniServlet;
   import xsul.http_server.HttpServerException;
  @@ -41,13 +43,8 @@
   import xsul.soap.SoapUtil;
   import xsul.soap11_util.Soap11Util;
   import xsul.soap12_util.Soap12Util;
  -import xsul.util.FastUUIDGen;
   import xsul.util.Utf8Reader;
   import xsul.util.Utf8Writer;
  -import xsul.ws_addressing.WsAddressing;
  -import xsul.ws_addressing.WsaInvoker;
  -import xsul.ws_addressing.WsaMessageInformationHeaders;
  -import xsul.ws_addressing.WsaRelatesTo;
   import xsul.wsdl.WsdlDefinitions;
   import xsul.wsdl.WsdlPort;
   import xsul.wsdl.WsdlService;
  @@ -59,10 +56,10 @@
    * This class provides services over HTTP.
    */
   public class HttpBasedServices implements XServiceServo {
  -    
       private static final MLogger logger = MLogger.getLogger();
       private final static XmlInfosetBuilder builder = XmlConstants.BUILDER;
       private static final XmlPullParserPool pool = new XmlPullParserPool(builder.getFactory());
  +    private static final String WSDL_SUFFIX = "?wsdl";
       
       private HttpMiniServer server;
       private HttpMiniServlet servlet;
  @@ -71,10 +68,9 @@
       private long startTime = System.currentTimeMillis() - 1; //defensive programming ot avoid divide-per-zero
       private long requestXmlMsgCount;
       private long numberOfConnections;
  +    private String serverName = XsulVersion.getUserAgent();
       
  -    private Map services = new HashMap();
  -    
  -    
  +    private Map services = new TreeMap();
       
       public HttpBasedServices(int tcpPort) throws DynamicInfosetProcessorException  {
           setServerPort(tcpPort);
  @@ -104,6 +100,16 @@
       }
       
       
  +    public void setServerName(String serverName) {
  +        if(serverName == null) throw new IllegalArgumentException("null");
  +        if(serverName.length() == 0) throw new IllegalArgumentException("empty");
  +        this.serverName = serverName;
  +    }
  +    
  +    public String getServerName() {
  +        return serverName;
  +    }
  +    
       //    public void addGlobalHandler(XHandler handler) {
       //        //globalHandlers.add(handler);
       //    }
  @@ -127,6 +133,16 @@
           return service;
       }
       
  +    public String getServiceWsdl(String serviceName) {
  +        //return httpServices.getServer().getLocation() + "/"+SERVICE_NAME+"?wsdl";
  +        if(serviceName == null) throw new IllegalArgumentException();
  +        if(services.get(serviceName) == null) {
  +            throw new XsulException("there is no service with name "+serviceName);
  +        }
  +        String loc = getServer().getLocation() + "/"+serviceName+WSDL_SUFFIX;
  +        return loc;
  +    }
  +        
       //    public XService newService(String name, String wsdlLoc, Object serviceImpl) {
       //
       //        WsdlDefinitions def = WsdlResolver.getInstance().loadWsdlFromPath(serviceImpl.getClass(), wsdlLoc);
  @@ -138,9 +154,6 @@
       //        return service;
       //    }
       
  -    
  -    
  -    
       public void setServerPort(int tcpPort) throws DynamicInfosetProcessorException {
           if(tcpPort < 0 || tcpPort > 65535) {
               throw new IllegalArgumentException("TCP port must be between 0 and 65535");
  @@ -215,7 +228,7 @@
           String path = req.getPath();
           if(method.equals("GET")) {
               int posWsdl = -1;
  -            if((posWsdl = path.indexOf("?wsdl")) != -1) {
  +            if((posWsdl = path.indexOf(WSDL_SUFFIX)) != -1) {
                   int lastSlash = path.lastIndexOf("/");
                   String name = path.substring(lastSlash+1, posWsdl);
                   XService service = (XService) services.get(name);
  @@ -233,12 +246,28 @@
                   // print some monitoring statistics
                   // alive, uptime, #msgs, average ($msgs/second)
                   XsulMonitoringStats s = XsulMonitoringUtil.createStats(
  -                    "XSUL2", startTime, requestXmlMsgCount, numberOfConnections);
  +                    serverName, startTime, requestXmlMsgCount, numberOfConnections);
  +              
  +
  +                XmlDocument xhtmlDoc =  XsulMonitoringUtil.createXhtmlStatsDoc(s, UTF8);
  +                XmlElement htmlBody = xhtmlDoc.getDocumentElement().requiredElement(null, "body");
  +                XmlNamespace htmlNs = htmlBody.getNamespace();
  +                XmlElement p = htmlBody.addElement(htmlNs, "p");
  +                p.addChild("Services WSDL: ");
  +                // add list of services
  +                for(Iterator i = services.keySet().iterator(); i.hasNext(); ) {
  +                    String serviceName = (String) i.next();
  +                    String serviceWsdl = getServiceWsdl(serviceName);
  +                    XmlElement a = p.addElement("a");
  +                    a.addAttribute("href", serviceWsdl);
  +                    a.addChild(serviceName);
  +                    //a.addChild(" WSDL");
  +                    p.addChild(" ");
  +                }
                   
                   //                XmlDocument outgoingDoc = builder.newDocument("1.0", Boolean.TRUE, UTF8);
                   //                XmlElement xhtml = XsulMonitoringUtil.createXhtmlStats(s);
                   //                outgoingDoc.setDocumentElement(xhtml);
  -                XmlDocument xhtmlDoc =  XsulMonitoringUtil.createXhtmlStatsDoc(s, UTF8);
                   writeXmlDoc(res, UTF8, xhtmlDoc);
               }
               
  @@ -301,10 +330,10 @@
           
           try {
               XsulMonitoringStats stats = XsulMonitoringUtil.createStats(
  -                "XSUL2", startTime, requestXmlMsgCount, numberOfConnections);
  +                serverName, startTime, requestXmlMsgCount, numberOfConnections);
               outgoingDoc = XsulMonitoringUtil.processMonitoringRequest(
                   stats,
  -                incomingXml, soapUtil);
  +                incomingXml, soapUtil); // support "ping" method!
               
               if(outgoingDoc == null) {
                   invoke(ctx, soapUtil);
  
  
  
  1.5       +5 -2      codes/xsul/java/tests/xsul/async_msg/EchoAsyncService.java
  
  Index: EchoAsyncService.java
  ===================================================================
  RCS file: /l/extreme/cvs/codes/xsul/java/tests/xsul/async_msg/EchoAsyncService.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -b -t -w -r1.4 -r1.5
  --- EchoAsyncService.java	18 Nov 2005 16:34:32 -0000	1.4
  +++ EchoAsyncService.java	6 Jun 2006 20:17:24 -0000	1.5
  @@ -47,6 +47,8 @@
           if(args.length > 2) usage("");
           int tcpPort = args.length > 0 ? Integer.parseInt(args[0]) : 0;
           httpServices = new HttpBasedServices(tcpPort);
  +        httpServices.setServerName("XSUL-EchoAsync/"+XsulVersion.getImplementationVersion());
  +        
           System.out.println("Server started on "+httpServices.getServerPort());
           
           String wsdlLoc = args.length > 1 ? args[1] : DEFAULT_WSDL_LOC;
  @@ -61,7 +63,8 @@
       }
       
       public static String getServiceWsdlLocation() {
  -        return httpServices.getServer().getLocation() + "/"+SERVICE_NAME+"?wsdl";
  +        //return httpServices.getServer().getLocation() + "/"+SERVICE_NAME+"?wsdl";
  +        return httpServices.getServiceWsdl(SERVICE_NAME);
       }
       public static void shutdownServer() {
           httpServices.getServer().shutdownServer();