<!DOCTYPE html>
<!--
 | Generated by Apache Maven Doxia at May 28, 2013
 | Rendered using Apache Maven Fluido Skin 1.3.0
-->
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta name="Date-Revision-yyyymmdd" content="20130528" />
    <meta http-equiv="Content-Language" content="en" />
    <title>Apache Axis - 
    Developer's Guide</title>
    <link rel="stylesheet" href="./css/apache-maven-fluido-1.3.0.min.css" />
    <link rel="stylesheet" href="./css/site.css" />
    <link rel="stylesheet" href="./css/print.css" media="print" />

      
    <script type="text/javascript" src="./js/apache-maven-fluido-1.3.0.min.js"></script>

    
            </head>
        <body class="topBarDisabled">
          
                
                    
    
        <div class="container-fluid">
          <div id="banner">
        <div class="pull-left">
                                <div id="bannerLeft">
                <h2>Axis</h2>
                </div>
                      </div>
        <div class="pull-right">                                <a href="./" id="bannerRight">
                                                                                                <img src="images/axis-small.png"  alt="Apache Axis"/>
                </a>
      </div>
        <div class="clear"><hr/></div>
      </div>

      <div id="breadcrumbs">
        <ul class="breadcrumb">
                
                    
                              <li class="">
                    <a href="http://www.apache.org/" class="externalLink" title="Apache">
        Apache</a>
        </li>
      <li class="divider ">/</li>
            <li class="">
                    <a href="../../" title="Axis">
        Axis</a>
        </li>
      <li class="divider ">/</li>
            <li class="">
                    <a href="../" title="Axis 1.x">
        Axis 1.x</a>
        </li>
      <li class="divider ">/</li>
            <li class="">
                    <a href="./" title="Java">
        Java</a>
        </li>
      <li class="divider ">/</li>
        <li class="">
    Developer's Guide</li>
        
                
                    
                  <li id="publishDate" class="pull-right">Last Published: 2013-05-28</li> <li class="divider pull-right">|</li>
              <li id="projectVersion" class="pull-right">Version: 1.4.1-SNAPSHOT</li>
            
                            </ul>
      </div>

            
      <div class="row-fluid">
        <div id="leftColumn" class="span3">
          <div class="well sidebar-nav">
                
                    
                <ul class="nav nav-list">
                    <li class="nav-header">About</li>
                                
      <li>
    
                          <a href="index.html" title="Introduction">
          <i class="none"></i>
        Introduction</a>
            </li>
                  
      <li>
    
                          <a href="issue-tracking.html" title="Issue Tracking">
          <i class="none"></i>
        Issue Tracking</a>
            </li>
                  
      <li>
    
                          <a href="mail-lists.html" title="Mailing Lists">
          <i class="none"></i>
        Mailing Lists</a>
            </li>
                  
      <li>
    
                          <a href="source-repository.html" title="Source Repository">
          <i class="none"></i>
        Source Repository</a>
            </li>
                  
      <li>
    
                          <a href="artifacts.html" title="Artifacts & Dependencies">
          <i class="none"></i>
        Artifacts & Dependencies</a>
            </li>
                  
      <li>
    
                          <a href="apiDocs/index.html" title="Javadocs">
          <i class="none"></i>
        Javadocs</a>
            </li>
                              <li class="nav-header">Downloads</li>
                                
      <li>
    
                          <a href="releases.html" title="Releases">
          <i class="none"></i>
        Releases</a>
            </li>
                                                                                                                                            
      <li>
    
                          <a href="changelog.html" title="Changelogs">
          <i class="icon-chevron-right"></i>
        Changelogs</a>
                  </li>
                  
      <li>
    
                          <a href="snapshots.html" title="Snapshots">
          <i class="none"></i>
        Snapshots</a>
            </li>
                              <li class="nav-header">Documentation</li>
                                
      <li>
    
                          <a href="overview.html" title="Overview">
          <i class="none"></i>
        Overview</a>
            </li>
                  
      <li>
    
                          <a href="install.html" title="Installation">
          <i class="none"></i>
        Installation</a>
            </li>
                  
      <li>
    
                          <a href="user-guide.html" title="User's Guide">
          <i class="none"></i>
        User's Guide</a>
            </li>
                  
      <li class="active">
    
            <a href="#"><i class="none"></i>Developer's Guide</a>
          </li>
                  
      <li>
    
                          <a href="integration-guide.html" title="Integration Guide">
          <i class="none"></i>
        Integration Guide</a>
            </li>
                  
      <li>
    
                          <a href="architecture-guide.html" title="Architecture Guide">
          <i class="none"></i>
        Architecture Guide</a>
            </li>
                  
      <li>
    
                          <a href="reference.html" title="Reference Guide">
          <i class="none"></i>
        Reference Guide</a>
            </li>
                  
      <li>
    
                          <a href="reading.html" title="Reading Guide">
          <i class="none"></i>
        Reading Guide</a>
            </li>
                              <li class="nav-header">More...</li>
                                
      <li>
    
                          <a href="ant/ant.html" title="Ant Tasks">
          <i class="none"></i>
        Ant Tasks</a>
            </li>
                  
      <li>
    
                          <a href="maven/index.html" title="Maven Plugins">
          <i class="none"></i>
        Maven Plugins</a>
            </li>
                  
      <li>
    
                          <a href="castor/index.html" title="Castor Databinding">
          <i class="none"></i>
        Castor Databinding</a>
            </li>
                  
      <li>
    
                          <a href="xmlbeans/index.html" title="XmlBeans Databinding">
          <i class="none"></i>
        XmlBeans Databinding</a>
            </li>
                  
      <li>
    
                          <a href="transports/jms/index.html" title="JMS Transport">
          <i class="none"></i>
        JMS Transport</a>
            </li>
                  
      <li>
    
                          <a href="transports/http-hc3/index.html" title="HttpClient 3 Transport">
          <i class="none"></i>
        HttpClient 3 Transport</a>
            </li>
                  
      <li>
    
                          <a href="transports/http-javanet/index.html" title="java.net HTTP Transport">
          <i class="none"></i>
        java.net HTTP Transport</a>
            </li>
                  
      <li>
    
                          <a href="standalone-server/index.html" title="Stand-alone Server">
          <i class="none"></i>
        Stand-alone Server</a>
            </li>
                              <li class="nav-header">Apache</li>
                                
      <li>
    
                          <a href="http://www.apache.org/licenses/LICENSE-2.0.html" class="externalLink" title="License">
          <i class="none"></i>
        License</a>
            </li>
                  
      <li>
    
                          <a href="http://www.apache.org/foundation/sponsorship.html" class="externalLink" title="Sponsorship">
          <i class="none"></i>
        Sponsorship</a>
            </li>
                  
      <li>
    
                          <a href="http://www.apache.org/foundation/thanks.html" class="externalLink" title="Thanks">
          <i class="none"></i>
        Thanks</a>
            </li>
                  
      <li>
    
                          <a href="http://www.apache.org/security/" class="externalLink" title="Security">
          <i class="none"></i>
        Security</a>
            </li>
            </ul>
                
                    
                            <form id="search-form" action="http://www.google.com/search" method="get" >
    
  <input value="ws.apache.org/axis/java" name="sitesearch" type="hidden"/>
  <input class="search-query" name="q" id="query" type="text" />
</form>
<script type="text/javascript" src="http://www.google.com/coop/cse/brand?form=search-form"></script>
          
          <hr class="divider" />

           <div id="poweredBy">
                            <div class="clear"></div>
                            <div class="clear"></div>
                            <div class="clear"></div>
                             <a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy">
        <img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" />
      </a>
                  </div>
          </div>
        </div>
        
                
        <div id="bodyColumn"  class="span9" >
                                  
            <!-- ~ Licensed to the Apache Software Foundation (ASF) under one
  ~ or more contributor license agreements. See the NOTICE file
  ~ distributed with this work for additional information
  ~ regarding copyright ownership. The ASF licenses this file
  ~ to you under the Apache License, Version 2.0 (the
  ~ "License"); you may not use this file except in compliance
  ~ with the License. You may obtain a copy of the License at
  ~
  ~ http://www.apache.org/licenses/LICENSE-2.0
  ~
  ~ Unless required by applicable law or agreed to in writing,
  ~ software distributed under the License is distributed on an
  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  ~ KIND, either express or implied. See the License for the
  ~ specific language governing permissions and limitations
  ~ under the License. -->
  

<div class="section"><h2>Table of Contents<a name="Table_of_Contents"></a></h2>

<ul><li><a href="#Table_of_Contents">Table of Contents</a></li><li><a href="#Introduction">Introduction</a></li><li><a href="#General_Guidelines">General Guidelines</a></li><li><a href="#Development_Environment">Development Environment</a></li><li><a href="#Pluggable-Components">Pluggable-Components</a><ul><li><a href="#Discovery">Discovery</a></li><li><a href="#LoggingTracing">Logging/Tracing</a><ul><li><a href="#Using_the_Logger_SPI">Using the Logger SPI</a></li><li><a href="#Guidelines">Guidelines</a><ul><li><a href="#Message_Priorities">Message Priorities</a></li></ul></li><li><a href="#Configuring_the_Logger">Configuring the Logger</a><ul><li><a href="#Log4J">Log4J</a></li></ul></li></ul></li><li><a href="#Axis_Servlet_Query_String_Plug-ins">Axis Servlet Query String Plug-ins</a></li></ul></li><li><a href="#Configuration_Properties">Configuration Properties</a></li><li><a href="#Exception_Handling">Exception Handling</a></li><li><a href="#Compile_and_Run">Compile and Run</a></li><li><a href="#Internationalization">Internationalization</a><ul><li><a href="#Developer_Guidelines">Developer Guidelines</a><ul><li><a href="#Example">Example</a></li></ul></li><li><a href="#Interface">Interface</a><ul><li><a href="#The_getMessage_methods">The getMessage methods</a></li></ul></li><li><a href="#Extending_Message_Files">Extending Message Files</a></li></ul></li><li><a href="#Adding_Testcases">Adding Testcases</a><ul><li><a href="#Creating_a_WSDL_Test">Creating a WSDL Test</a></li></ul></li><li><a href="#Test_Structure">Test Structure</a></li><li><a href="#Adding_Source_Code_Checks">Adding Source Code Checks</a></li><li><a href="#JUnit_and_Axis">JUnit and Axis</a></li><li><a href="#Debugging">Debugging</a><ul><li><a href="#Using_tcpmon_to_Monitor_Functional_Tests.">Using tcpmon to Monitor Functional Tests.</a></li><li><a href="#Using_SOAP_Monitor_to_Monitor_Functional_Tests">Using SOAP Monitor to Monitor Functional Tests</a></li><li><a href="#Running_a_Single_Functional_Test">Running a Single Functional Test</a></li><li><a href="#Turning_on_Debug_Output">Turning on Debug Output</a></li><li><a href="#Writing_Temporary_Output">Writing Temporary Output</a></li></ul></li><li><a href="#Running_the_JAX-RPC_Compatibility_Tests">Running the JAX-RPC Compatibility Tests</a></li></ul>

</div>

<div class="section"><h2>Introduction<a name="Introduction"></a></h2>

<p>This guide is a collection of topics related to developing code for Axis.</p>

</div>

<div class="section"><h2>General Guidelines<a name="General_Guidelines"></a></h2>

<ul>
  <li>Axis specific information (svn repository access, mailing list info, etc.) can be found on the <a class="externalLink" href="http://ws.apache.org/axis/index.html">Axis Home Page</a>.</li>
  <li>Axis uses the <a class="externalLink" href="http://jakarta.apache.org/site/guidelines.html">Jakarta Project Guidelines.</a></li>
  <li>Code changes should comply with <a class="externalLink" href="http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html">&quot;Code Conventions for the Java Programming Language&quot;</a></li>
  <li>When fixing a bug, please include the href of the bug in the svn commit message.</li>
  <li>Incompatible changes to <a href="user-guide.html#PublishedAxisInterfaces">published Axis interfaces</a> should be avoided where possible. When changes are necessary, for example to maintain or improve the overall modularity of Axis, the impact on users must be considered and, preferably, documented.</li>
  <li>If you are making a big change that may affect interoperability, please run the <a class="externalLink" href="http://xml.apache.org/~rubys/echotest.pl">echotest2 round 2 interop test</a> to ensure that your change does not result in any new interop failures. You will also need the <a class="externalLink" href="http://xml.apache.org/~rubys/client_deploy.wsdd">client_deploy.wsdd</a>. Here are the <a class="externalLink" href="http://xml.apache.org/~rubys/ApacheClientInterop.html">nightly interop test results</a>.</li>
</ul>

</div>

<div class="section"><h2>Development Environment<a name="Development_Environment"></a></h2>

<p>The following packages are required for axis development:</p>

<ul>
  <li><a class="externalLink" href="http://jakarta.apache.org/ant/index.html">ant</a> - Java based build tool. <b>Please Note: Version 1.5 OR HIGHER is required</b></li>
  <li><a class="externalLink" href="http://www.junit.org">junit</a> - testing package</li>
  <li><a class="externalLink" href="http://xml.apache.org/dist/xerces-j">xerces</a> - xml processor</li>
  <li>Install Java 1.3.1 JDK (or later).</li>
</ul>

<p>The Axis jar files are built in the <tt>xml-axis/java/build/lib</tt> directory. Here is an example CLASSPATH, which I use when developing code:</p>

<div class="source"><pre class="prettyprint">G:\xerces\xerces-1_4_2\xerces.jar
G:\junit3.7\junit.jar
G:\xml-axis\java\build\lib\commons-discovery.jar
G:\xml-axis\java\build\lib\commons-logging.jar
G:\xml-axis\java\build\lib\wsdl4j.jar
G:\xml-axis\java\build\lib\axis.jar
G:\xml-axis\java\build\lib\log4j-1.2.8.jar
G:\xml-axis\java\build\classes
</pre></div>

<p>If you access the internet via a proxy server, you'll need to set an environment variable so that the Axis tests do the same. Set ANT_OPTS to, for example:</p>

<div class="source"><pre class="prettyprint">-Dhttp.proxyHost=proxy.somewhere.com
-Dhttp.proxyPort=80
-Dhttp.nonProxyHosts=&quot;localhost&quot;</pre></div>

</div>

<div class="section"><h2>Pluggable-Components<a name="Pluggable-Components"></a></h2>

<p>The <a href="architecture-guide.html">Axis Architecture Guide</a> explains the requirements for pluggable components.</p>

<div class="section"><h3>Discovery<a name="Discovery"></a></h3>

<p>An Axis-specific component factory should be created of the form:</p>

<p><tt>org.apache.axis.components.&lt;componentType&gt;.&lt;factoryClassName&gt;</tt></p>

<p>For example, <tt>org.apache.axis.components.logger.LogFactory</tt> is the factory, or discovery mechanism, for the logger component/service.</p>

<p>The <tt>org.apache.axis.components.image</tt> package demonstrates both a factory, and supporting classes for different image tools used by Axis. This is representative of a pluggable component that uses external tooling, isolating it behind a 'thin' wrapper to Axis that provides only a limited interface to meet Axis minimal requirements. This allows future designers and implementors to gain an explicit understanding of the Axis's
  specific requirements on these tools.</p>

</div>

<div class="section"><h3>Logging/Tracing<a name="LoggingTracing"></a></h3>

<p>Axis logging and tracing is based on the Logging component of the <a class="externalLink" href="http://jakarta.apache.org/commons/index.html">Jakarta Commons</a> project, or the Jakarta Commons Logging (JCL) SPI. The JCL provides a Log interface with thin-wrapper implementations for other logging tools, including <a class="externalLink" href="http://jakarta.apache.org/log4j/docs/index.html">Log4J</a>, <a class="externalLink" href="http://jakarta.apache.org/avalon/logkit/index.html">Avalon LogKit</a>, and JDK 1.4. The interface maps closely to Log4J and LogKit.</p>

<div class="section"><h4>Using the Logger SPI<a name="Using_the_Logger_SPI"></a></h4>

<p>To use the JCL SPI from a Java class, include the following import statements:</p>

<div class="source"><pre class="prettyprint">import org.apache.commons.logging.Log;
import org.apache.axis.components.logger.LogFactory;</pre></div>

<p>For each class definition, declare and initialize a <tt>log</tt> attribute as follows:</p>

<div class="source"><pre class="prettyprint">public class CLASS {
  private static Log log =
    LogFactory.getLog(CLASS.class);
    ...</pre></div>

<p>Messages are logged to a <i>logger</i>, such as <tt>log</tt> by invoking a method corresponding to <i>priority</i>: The <tt>Log</tt> interface defines the following methods for use in writing log/trace messages to the log:</p>

<div class="source"><pre class="prettyprint">log.fatal(Object message);
log.fatal(Object message, Throwable t);
log.error(Object message);
log.error(Object message, Throwable t);
log.warn(Object message);
log.warn(Object message, Throwable t);
log.info(Object message);
log.info(Object message, Throwable t);
log.debug(Object message);
log.debug(Object message, Throwable t);
log.trace(Object message);
log.trace(Object message, Throwable t);</pre></div>

<p>While semantics for these methods are ultimately defined by the implementation of the Log interface, it is expected that the severity of messages is ordered as shown in the above list.</p>

<p>In addition to the logging methods, the following are provided:</p>

<div class="source"><pre class="prettyprint">log.isFatalEnabled();
log.isErrorEnabled();
log.isWarnEnabled();
log.isInfoEnabled();
log.isDebugEnabled();
log.isTraceEnabled();</pre></div>

<p>These are typically used to guard code that only needs to execute in support of logging, and that introduces undesirable runtime overhead in the general case (logging disabled).</p>

</div><div class="section"><h4>Guidelines<a name="Guidelines"></a></h4>

<div class="section"><h5>Message Priorities<a name="Message_Priorities"></a></h5>

<p>It is important to ensure that log message are appropriate in content and severity. The following guidelines are suggested:</p>

<ul>
  <li>fatal - Severe errors that cause the Axis server to terminate prematurely. Expect these to be immediately visible on a console, and MUST be internationalized.</li>
  <li>error - Other runtime errors or unexpected conditions. Expect these to be immediately visible on a console, and MUST be internationalized.</li>
  <li>warn - Use of deprecated APIs, poor use of API, almost errors, other runtime situations that are undesirable or unexpected, but not necessarily &quot;wrong&quot;. Expect these to be immediately visible on a console, and MUST be internationalized.</li>
  <li>info - Interesting runtime events (startup/shutdown). Expect these to be immediately visible on a console, so be conservative and keep to a minimum. These MUST be internationalized.</li>
  <li>debug - detailed information on flow of through the system. Expect these to be written to logs only. These NEED NOT be internationalized, but it never hurts...</li>
  <li>trace - more detailed information. Expect these to be written to logs only. These NEED NOT be internationalized, but it never hurts...</li>
</ul>

</div></div><div class="section"><h4>Configuring the Logger<a name="Configuring_the_Logger"></a></h4>

<p>The Jakarta Commons Logging (JCL) SPI can be configured to use different logging toolkits. To configure which logger is used by the JCL, see the <a href="integration-guide.html">Axis System Integration Guide</a>.</p>

<p>Configuration of the behavior of the JCL ultimately depends upon the logging toolkit being used. The JCL SPI (and hence Axis) uses <a class="externalLink" href="http://jakarta.apache.org/log4j/docs/index.html">Log4J</a> by default if it is available (in the CLASSPATH).</p>

<div class="section"><h5>Log4J<a name="Log4J"></a></h5>

<p>As <a class="externalLink" href="http://jakarta.apache.org/log4j/docs/index.html">Log4J</a> is the prefered/default logger for Axis, a <i>few</i> details are presented herein to get the developer going.</p>

<p>Configure Log4J using system properties and/or a properties file:</p>

<ul>
  <li><b>log4j.configuration=<i>log4j.properties</i></b>
    <p>Use this system property to specify the name of a Log4J configuration file. If not specified, the default configuration file is <i>log4j.properties</i>. A <i>log4j.properties</i> file is provided in <tt>axis.jar</tt>.</p>
    <p>This properties file can sometimes be overridden by placing a file of the same name so as to appear before <tt>axis.jar</tt> in the CLASSPATH. However, the precise behaviour depends on the classloader that is in use at the time, so we don't recommend this technique.</p>
    <p>A safe way of overriding the properties file is to replace it in axis.jar. However, this isn't very convenient, especially if you want to tweak the properties during a debug session to filter out unwanted log entries. A more convenient alternative is to use an absolute file path to specify the properties file. This will even ignore web app's and their classloaders. So, for example on Linux, you could specify the system property:</p>
    <p><tt>log4j.configuration=file:/home/fred/log4j.props</tt></p>
  </li>

  <li><b>log4j.debug</b>
    <p>A good way of telling where log4j is getting its configuration from is to set this system property and look at the messages on standard output.</p>
  </li>

  <li><b>log4j.rootCategory=<i>priority</i> [, <i>appender</i>]*</b>
    <p>Set the default (root) logger priority.</p>
  </li>

  <li><b>log4j.logger.<i>logger.name</i>=<i>priority</i></b>
    <p>Set the priority for the named logger and all loggers hierarchically lower than, or below, the named logger. <i>logger.name</i> corresponds to the parameter of <tt>LogFactory.getLog(<i>logger.name</i>)</tt>, used to create the logger instance. Priorities are: <tt>DEBUG</tt>, <tt>INFO</tt>, <tt>WARN</tt>, <tt>ERROR</tt>, or <tt>FATAL</tt>.</p>

    <p>Log4J understands hierarchical names, enabling control by package or high-level qualifiers: <tt>log4j.logger.org.apache.axis.encoding=DEBUG</tt> will enable debug messages for all classes in both <tt>org.apache.axis.encoding</tt> and <tt>org.apache.axis.encoding.ser</tt>. Likewise, setting <tt>log4j.logger.org.apache.axis=DEBUG</tt> will enable debug message for all Axis classes, but not for other Jakarta projects.</p>

    <p>A combination of settings will enable you to see the log events that you are interested in and omit the others. For example, the combination:</p>
    <div class="source"><pre class="prettyprint">log4j.logger.org.apache.axis=DEBUG 
log4j.logger.org.apache.axis.encoding=INFO
log4j.logger.org.apache.axis.utils=INFO
log4j.logger.org.apache.axis.message=INFO</pre></div>
    <p>cuts down the number of a log entries produced by a single request to a manageable number.</p>
  </li>

  <li><b>log4j.appender.<i>appender</i>.Threshold=<i>priority</i></b>
    <p>Log4J <i>appenders</i> correspond to different output devices: console, files, sockets, and others. If appender's <i>threshold</i> is less than or equal to the message priority then the message is written by that appender. This allows different levels of detail to be appear at different
log destinations.</p>
    <p>For example: one can capture DEBUG (and higher) level information in a logfile, while limiting console output to INFO (and higher).</p>
  </li>
</ul>

</div></div></div>

<div class="section"><h3>Axis Servlet Query String Plug-ins<a name="Axis_Servlet_Query_String_Plug-ins"></a></h3>

<p>Any servlet that is derived from the <tt>org.apache.axis.transport.http.AxisServlet</tt> class supports a number of standard query strings (<i>?list</i>, <i>?method</i>, and <i>?wsdl</i>) that provide information from or perform operations on a web service (for instance, <i>?method</i> is used to invoke a method on a web service and <i>?wsdl</i> is used to retrieve the WSDL document for a web service). Axis servlets are not limited to these three query strings and developers may create their own &quot;plug-ins&quot; by implementing the <tt>org.apache.axis.transport.http.QSHandler</tt> interface. There is one method in this interface that must be implemented, with the following signature:</p>

<p><tt>public void invoke (MessageContext msgContext) throws AxisFault;</tt></p>

<p>The <tt>org.apache.axis.MessageContext</tt> instance provides the developer with a number of useful objects (such as the Axis engine instance, and HTTP servlet objects) that are accessible by its <tt>getProperty</tt> method. The following constants can be used to retrieve various objects provided by the Axis servlet invoking the query string plug-in:</p>

<ul>
  <li><b>org.apache.axis.transport.http.HTTPConstants.PLUGIN_NAME</b>
    <p>A <tt>String</tt> containing the name of the query string plug-in. For instance, if the query string <i>?wsdl</i> is provided, the name of the plugin is <i>wsdl</i>.</p>
  </li>

  <li><b>org.apache.axis.transport.http.HTTPConstants.PLUGIN_SERVICE_NAME</b>
    <p>A <tt>String</tt> containing the name of the Axis servlet that inovked the query string plug-in.</p>
  </li>

  <li><b>org.apache.axis.transport.http.HTTPConstants.PLUGIN_IS_DEVELOPMENT</b>
    <p>A <tt>Boolean</tt> containing <tt>true</tt> if this version of Axis is considered to be in development mode, <tt>false</tt> otherwise.</p>
  </li>

  <li><b>org.apache.axis.transport.http.HTTPConstants.PLUGIN_ENABLE_LIST</b>
    <p>A <tt>Boolean</tt> containing <tt>true</tt> if listing of the Axis server configuration is allowed, <tt>false</tt> otherwise.</p>
  </li>

  <li><b>org.apache.axis.transport.http.HTTPConstants.PLUGIN_ENGINE</b>
    <p>A <tt>org.apache.axis.server.AxisServer</tt> object containing the engine for the Axis server.</p>
  </li>

  <li><b>org.apache.axis.transport.http.HTTPConstants.MC_HTTP_SERVLETREQUEST</b>
    <p>The <tt>javax.servlet.http.HttpServletRequest</tt> object from the Axis servlet that invoked the query string plug-in</p>
  </li>

  <li><b>org.apache.axis.transport.http.HTTPConstants.MC_HTTP_SERVLETRESPONSE</b>
    <p>The <tt>javax.servlet.http.HttpServletResponse</tt> object from the Axis servlet that invoked the query string plug-in</p>
  </li>

  <li><b>org.apache.axis.transport.http.HTTPConstants.PLUGIN_WRITER</b>
    <p>The <tt>java.io.PrintWriter</tt> object from the Axis servlet that invoked the query string plug-in</p>
  </li>

  <li><b>org.apache.axis.transport.http.HTTPConstants.PLUGIN_LOG</b>
    <p>The <tt>org.apache.commons.logging.Log</tt> object from the Axis servlet that invoked the query string plug-in, which is used to log messages.</p>
  </li>

  <li><b>org.apache.axis.transport.http.HTTPConstants.PLUGIN_EXCEPTION_LOG</b>
    <p>The <tt>org.apache.commons.logging.Log</tt> object from the Axis servlet that invoked the query string plug-in, which is used to log exceptions.</p>
  </li>
</ul>

<p>Query string plug-in development is much like normal servlet development since the same basic information and methods of output are available to the developer. Below is an example query string plug-in which simply displays the value of the system clock (<tt>import</tt> statements have been omitted for brevity):</p>

<div class="source"><pre class="prettyprint">public class QSClockHandler implements QSHandler {
  public void invoke (MessageContext msgContext) throws AxisFault {
    PrintWriter out = (PrintWriter) msgContext.getProperty (HTTPConstants.PLUGIN_WRITER);
    HttpServletResponse response = (HttpServletResponse)
        msgContext.getProperty (HTTPConstants.MC_HTTP_SERVLETRESPONSE);

    response.setContentType (&quot;text/html&quot;);

    out.println (&quot;&lt;HTML&gt;&lt;BODY&gt;&lt;H1&gt;&quot; + System.currentTimeMillis()
        + &quot;&lt;/H1&gt;&lt;/BODY&gt;&lt;/HTML&gt;&quot;);
  }
}</pre></div>

<p>Once a query string plug-in class has been created, the Axis server must be set up to recognize the query string which invokes it. See the section <a href="reference.html#DeploymentWSDDReference">Deployment (WSDD) Reference</a> in the <a href="reference.html">Axis Reference Guide</a> for information on how the HTTP transport section of the Axis server configuration file must be set up.</p>

</div>

</div>

<div class="section"><h2>Configuration Properties<a name="Configuration_Properties"></a></h2>

<p>Axis is in the process of moving away from using system properties as the primary point of internal configuration. Avoid calling <tt>System.getProperty()</tt>, and instead call <tt>AxisProperties.getProperty</tt>. <tt>AxisProperties.getProperty</tt> will call <tt>System.getProperty</tt>, and will (eventually) query other sources of configuration information.</p>

<p>Using this central point of access will allow the global configuration system to be redesigned to better support multiple Axis engines in a single JVM.</p>

</div>

<div class="section"><h2>Exception Handling<a name="Exception_Handling"></a></h2>

<p>Guidelines for Axis exception handling are based on best-practices for exception handling. While there are details specific to Axis in these guidelines, they apply in principle to any project; they are included here for two reasons. First, because they are not listed elsewhere in the Apache/Jakarta guidelines (or haven't been found). Second, because adherence to these guidelines is considered crucial to enterprise ready middleware.</p>

<p>These guidelines are fundamentally independent of programming language. They are based on experience, but proper credit must be given to <i>More Effective C++</i>, by Scott Meyers, for opening the eyes of the innocent(?) many years ago.</p>

<p>Finally, these are guidelines. There will always be exceptions to these guidelines, in which case all that can be asked (as per these guidelines) is that they be logged in the form of comments in the code.</p>

<ul>
  <li><b>Primary Rule: Only Catch An Exception If You Know What To Do With It</b>
    <p>If code catches an exception, it should know what to do with it at that point in the program. Any exception to this rule must be documented with a GOOD reason. Code reviewers are invited to put on their vulture beaks and peck away...</p>
    <p>There are a few corollaries to this rule.</p>
    <ul>
      <li><b>Handle Specific Exceptions in Inner Code</b>
        <p>Inner code is code <i>deep</i> within the program. Such code should catch specific exceptions, or categories of exceptions (parents in
exception hierarchies), <u>if and only if</u> the exception can be resolved and normal flow restored to the code. Note that behaviour of this sort may be significantly different between non-interactive code versus an interactive tool.</p>
      </li>
      <li><b>Catch All Exceptions in Outermost Flow of Control</b>
        <p>Ultimately, all exceptions must be dealt with at one level or another. For command-line tools, this means the <tt>main</tt> method
or program. For a middleware component, this is the entry point(s) into the component. For Axis this is <tt>AxisServlet</tt> or equivalent.</p>
        <p>After catching specific exceptions which can be resolved internally, the outermost code must ensure that all internally generated exceptions are caught and handled. While there is generally not much that can be done, at a minimum the code should <u>log the exception</u>. In addition to logging, the Axis Server wraps all such exceptions in AxisFaults and returns them to the client code.</p>
        <p>This may seem contrary to the primary rule, but in fact we are claiming that Axis does know what to do with this type of exception: exit gracefully.</p>
      </li>
    </ul>
  </li>

  <li><b>Catching and Logging Exceptions</b>
    <p>When an Exception is going to cross a component boundry (client/server, or system/business logic), the exception must be caught and logged by the throwing component. It may then be rethrown, or wrapped, as described below.</p>
    <p>When in doubt, log the exception.</p>
    <ul>
      <li><b>Catch and Throw</b>
        <p>If an exception is caught and rethrown (unresolved), logging of the exception is at the discretion of the coder and reviewers. If any comments are logged, the exception should also be logged.</p>
        <p>When in doubt, log the exception and any related local information that can help to identify the complete context of the exception.</p>
        <p>Log the exception as an <i>error</i> (<tt>log.error()</tt>) if it is known to be an unresolved or unresolvable error, otherwise log it at the <i>informative</i> level (<tt>log.info()</tt>).</p>
      </li>

      <li><b>Catch and Wrap</b>
        <p>When exception <tt>e</tt> is caught and wrapped by a new exception <tt>w</tt>, log exception <tt>e</tt> before throwing <tt>w</tt>.</p>
        <p>Log the exception as an <i>error</i> (<tt>log.error()</tt>) if it is known to be an unresolved or unresolvable error, otherwise log it at the <i>informative</i> level (<tt>log.info()</tt>).</p>
      </li>

      <li><b>Catch and Resolve</b>
        <p>When exception <tt>e</tt> is caught and resolved, logging of the exception is at the discretion of the coder and reviewers. If any comments are logged, the exception should also be logged (<tt>log.info()</tt>). Issues that must be balanced are performance and problem resolvability.</p>
        <p>Note that in many cases, ignoring the exception may be appropriate.</p>
      </li>
    </ul>
  </li>

  <li><b>Respect Component Boundries</b>
    <p>There are multiple aspects of this guideline. On one hand, this means that business logic should be isolated from system logic. On the other hand, this means that client's should have limited exposure/visibility to implementation details of a server - particularly when the server is published to outside parties. This implies a well designed server interface.</p>
    <ul>
      <li><b>Isolate System Logic from Business Logic</b>
        <p>Exceptions generated by the Axis runtime should be handled, where possible, within the Axis runtime. In the worst case the details of an exception are to be logged by the Axis runtime, and a generally descriptive Exception raised to the Business Logic.</p>
        <p>Exceptions raised in the business logic (this includes the server and Axis handlers) must be delivered to the client code.</p>
      </li>

      <li><b>Protect System Code from User Code</b>
        <p>Protect the Axis runtime from uncontrolled user business logic. For Axis, this means that dynamically configurable <tt>handlers</tt>,
<tt>providers</tt> and other user controllable hook-points must be guarded by <tt>catch(Exception ...)</tt>. Exceptions generated by user code and caught by system code should be:</p>
        <ul>
          <li>Logged, and</li>
          <li>Delivered to the client program</li>
        </ul>
      </li>

      <li><b>Isolate Visibility into Server from Client</b>
        <p>Specific exceptions should be logged at the server side, and a more general exception thrown to the client. This prevents clues as to the nature of the server (such as handlers, providers, etc) from being revealed to client code. The Axis component boundries that should be respected are:</p>
        <ul>
          <li>Client Code &lt;--&gt; AxisClient</li>
          <li>AxisClient &lt;--&gt; AxisServlet (AxisServer/AxisEngine)</li>
          <li>AxisServer/AxisEngine &lt;--&gt; Web Service</li>
        </ul>
      </li>
    </ul>
  </li>

  <li><b>Throwing Exceptions in Constructors</b>
    <p>Before throwing an exception in a constructor, ensure that any resources owned by the object are cleaned up. For objects holding resources, this requires catching <u>all</u> exceptions thrown by methods called within the constructor, cleaning up, and rethrowing the exceptions.</p>
  </li>
</ul>

</div>

<div class="section"><h2>Compile and Run<a name="Compile_and_Run"></a></h2>

<p>The <tt>xml-axis/java/build.xml</tt> file is the primary 'make' file used by ant to build the application and run the tests. The <tt>build.xml</tt> file defines ant build <i>targets</i>. Read the build.xml file for more information. Here are some of the useful targets:</p>

<ul>
  <li>compile -&gt; compiles the source and creates xml-axis/java/build/lib/axis.jar</li>
  <li>javadocs -&gt; creates the javadocs in xml-axis/java/build/javadocs</li>
  <li>functional-tests -&gt; compiles and runs the functional tests</li>
  <li>all-tests -&gt; compiles and runs all of the tests</li>
</ul>

<p>To compile the source code:</p>

<div class="source"><pre class="prettyprint">cd xml-axis/java
ant compile</pre></div>

<p>To run the tests:</p>

<div class="source"><pre class="prettyprint">cd xml-axis/java
ant functional-tests</pre></div>

<p><b>Note:</b> these tests start a server on port 8080. If this clashes with the port used by your web application server (such as Tomcat), you'll need to change one of the ports or stop your web application server when running the tests.</p>

<p><b>Please run <tt>ant functional-tests</tt> and <tt>ant all-tests</tt> before checking in new code.</b></p>

</div>

<div class="section"><h2>Internationalization<a name="Internationalization"></a></h2>

<p>If you make changes to the source code that results in the generation of text (error messages or debug information), you must follow the following guidelines to ensure that your text is properly translated.</p>

<div class="section"><h3>Developer Guidelines<a name="Developer_Guidelines"></a></h3>

<ol style="list-style-type: decimal">
  <li>Your text string should be added as a property to the resource.properties file (xml-axis/java/src/org/apache/axis/i18n/resource.properties). Note that some of the utility applications (i.e. tcpmon) have their own resource property files (tcpmon.properties).</li>
  <li>The resource.properties file contains translation and usage instructions. Entries in a message resource file are of the form <tt>&lt;key&gt;=&lt;message&gt;</tt> Here is an example message:
    <p>sample00=My name is {0}, and my title is {1}.</p>
    <ol style="list-style-type: decimal">
      <li>sample00 is the key that the code will use to access this message.</li>
      <li>The text after the = is the message text.</li>
      <li>The <tt>{<i>number</i>}</tt> syntax defines the location for inserts.</li>
    </ol>
  </li>

  <li>The code should use the static method org.apache.axis.i18n.Messages.getMessage to obtain the text and add inserts. Here is an example usage:
    <p><tt>Messages.getMessage(&quot;sample00&quot;, &quot;Rich Scheuerle&quot;, &quot;Software Developer&quot;);</tt></p>
  </li>

  <li>All keys in the properties file should use the syntax &lt;string&gt;&lt;2-digit-suffix&gt;.
    <ol style="list-style-type: decimal">
      <li><b>Never change the message text in the properties file.</b> The message may be used in multiple places in the code. Plus translation is only done on new keys.</li>
      <li>If a code change requires a change to a message, create a new entry with an incremented 2-digit suffix.</li>
      <li>All new entries should be placed at the bottom of the file to ease translation.</li>
      <li>We may occasionally want to trim the properties file of old data, but this should only be done on major releases.</li>
    </ol>
  </li>
</ol>

<div class="section"><h4>Example<a name="Example"></a></h4>

<p>Consider the following statement:</p>

<div class="source"><pre class="prettyprint">if (operationName == null)
  throw new AxisFault( &quot;No operation name specified&quot; );</pre></div>

<p>We will add an entry into org/apache/axis/i18n/resource.properties:</p>

<p><tt>noOperation=No operation name specified.</tt></p>

<p>And change the code to read:</p>

<div class="source"><pre class="prettyprint">if (operationName == null)
  throw new AxisFault(Messages.getMessage(&quot;noOperation&quot;));</pre></div>

</div></div>

<div class="section"><h3>Interface<a name="Interface"></a></h3>

<p>Axis uses the standard Java internationalization class <tt>java.util.ResourceBundle</tt> to access property files and message strings, and uses <tt>java.text.MessageFormat</tt> to format the strings using variables. Axis provides a single class <tt>org.apache.axis.i18n.Messages</tt> that manages both ResourceBundle and MessageFormat classes. Messages methods are:</p>

<p><tt>public static java.util.ResourceBundle getResourceBundle();</tt></p>
<p><tt>public static String getMessage(String key) throws java.util.MissingResourceException;</tt></p>
<p><tt>public static String getMessage(String key, String var) throws java.util.MissingResourceException;</tt></p>
<p><tt>public static String getMessage(String key, String var1, String var2) throws java.util.MissingResourceException;</tt></p>
<p><tt>public static String getMessage(String key, String[] vars) throws java.util.MissingResourceException;</tt></p>

<p>Axis programmers can work with the resource bundle directly via a call to <tt>Messages.getResourceBundle()</tt>, but the <tt>getMessage()</tt> methods should be used instead for two reasons:</p>

<ol style="list-style-type: decimal">
  <li>It's a shortcut. It is cleaner to call<br />
    <tt>Messages.getMessage(&quot;myMsg00&quot;);</tt><br />
    than<br />
    <tt>Messages.getResourceBundle().getString(&quot;myMsg00&quot;);</tt>
  </li>
  <li>The <tt>getMessage</tt> methods enable messages with variables.</li>
</ol>

<div class="section"><h4>The getMessage methods<a name="The_getMessage_methods"></a></h4>

<p>If you have a message with no variables</p>

<p><tt>myMsg00=This is a string.</tt></p>

<p>then simply call</p>

<p><tt>Messages.getMessage(&quot;myMsg00&quot;);</tt></p>

<p>If you have a message with variables, use the syntax <tt>&quot;{X}&quot;</tt> where <tt>X</tt> is the number of the variable, starting at 0. For example:</p>

<p><tt>myMsg00=My {0} is {1}.</tt></p>

<p>then call:</p>

<p><tt>Messages.getMessage(&quot;myMsg00&quot;,&quot;name&quot;, &quot;Russell&quot;);</tt></p>

<p>and the resulting string will be:  &quot;My name is Russell.&quot;</p>

<p>You could also call the String array version of <tt>getMessage</tt>:</p>

<p><tt>Messages.getMessage(&quot;myMsg00&quot;, new String[] {&quot;name&quot;, &quot;Russell&quot;});</tt></p>

<p>The String array version of <tt>getMessage</tt> is all that is necessary, but the vast majority of messages will have 0, 1 or 2 variables, so the other <tt>getMessage</tt> methods are provided as a convenience to avoid the complexity of the String array version.</p>

<p>Note that the <tt>getMessage</tt> methods throw <tt>MissingResourceException</tt> if the resource cannot be found. And ParseException if there are more {X} entries than arguments. These exceptions are <tt>RuntimeException</tt>'s, so the caller doesn't have to explicitly catch them.</p>

<p>The resource bundle properties file is org/apache/axis/i18n/resource.properties.</p>

</div></div>

<div class="section"><h3>Extending Message Files<a name="Extending_Message_Files"></a></h3>

<p>Generally, within Axis all messages are placed in org.apache.axis.i18n.resource.properties. There are facilities for extending the messages without modifying this file for integration or 3rd party extensions to Axis. See the <a href="integration-guide.html#Internationalization">Integration Guide</a> for details.</p>

</div>

</div>

<div class="section"><h2>Adding Testcases<a name="Adding_Testcases"></a></h2>

<p>See Also: <a href="#TestStructure">Test and Samples Structure</a></p>

<p><b>Editor's Note:</b> We need more effort to streamline and simplify the addition of tests. We also need to think about categorizing tests as the test bucket grows.</p>

<p>If you make changes to Axis, please add a test that uses your change. Why?</p>

<ul>
  <li>The test validates that your new code works.</li>
  <li>The test protects your change from bugs introduced by future code changes.</li>
  <li>The test is an example to users of the features of Axis.</li>
  <li>The test can be used as a starting point for new development.</li>
</ul>

<p>Some general principles:</p>

<ul>
  <li>Tests should be self-explanatory.</li>
  <li>Tests should not generate an abundance of output</li>
  <li>Tests should hook into the existing junit framework.</li>
  <li>Each test or group of related tests should have its own directory in the <tt>xml-axis/java/test</tt> directory</li>
</ul>

<p>One way to build a test is to &quot;cut and paste&quot; the existing tests, and then modify the test to suit your needs. This approach is becoming more complicated as the different kinds of tests grow.</p>

<p>A good &quot;non-wsdl&quot; test for reference is test/saaj.</p>

<div class="section"><h3>Creating a WSDL Test<a name="Creating_a_WSDL_Test"></a></h3>

<p>Here are the steps that I used to create the <tt>sequence</tt> test, which generates code from a wsdl file and runs a sequence validation test:</p>

<ol style="list-style-type: decimal">
  <li>Created a <tt>xml-axis/java/test/wsdl/sequence</tt> directory.</li>
  <li>Created a <tt>SequenceTest.wsdl</tt> file defining the webservice.</li>
  <li>Ran the Wsdl2java emitter to create Java files:
    <p><tt>java org.apache.axis.wsdl.Wsdl2java -t -s SequenceTest.wsdl</tt></p>
    <ol style="list-style-type: decimal">
      <li>The -t option causes the emitter to generate a *TestCase.java file that hooks into the test harness. This file is operational without any additional changes. Copy the *TestCase.java file into the same directory as your wsdl file. (Ideally only the Java files that are changed need to be in your directory.) So this file is not needed, but please make sure to modify your &lt;wsdl2java ...&gt; clause (described below) to emit a
testcase.</li>
      <li>The -s option causes the emitter to generate a *SOAPBindingImpl.java file. The Java file contains empty methods for the service. You probably want to fill them in with your own logic. Copy the *SOAPBindingImpl.java file into the same directory as your wsdl file. (If no changes are needed in the Java file, you don't need to save it. But you will need to make sure that your &lt;wsdl2java ...&gt; clause generates a skeleton).</li>
      <li>Remove all of the Java files that don't require modification. So you should have three files in your directory (wsdl file, *TestCase.java, and *SOAPBindingImpl.java). My sequence test has an another file due to some additional logic that I needed.</li>
    </ol>
  </li>
  <li>The <tt>test/wsdl/sequence/build.xml</tt> file controls the building of this test. Locate the &quot;compile&quot; target. Add a clause that runs the Wsdl2java code. I would recommend stealing something from the test/wsdl/roundtrip/build.xml file (it does a LOT of wsdl2java and java2wsdl calls). Here is the one for SequenceTest:
    <div class="source"><pre class="prettyprint">&lt;!-- Sequence Test --&gt;
&lt;wsdl2java url=&quot;${axis.home}/test/wsdl/sequence/SequenceTest.wsdl&quot;
    output=&quot;${axis.home}/build/work&quot;
    deployscope=&quot;session&quot;
    skeleton=&quot;yes&quot;
    messagecontext=&quot;no&quot;
    noimports=&quot;no&quot;
    verbose=&quot;no&quot;
    testcase=&quot;no&quot;&gt;
&lt;mapping namespace=&quot;urn:SequenceTest2&quot; package=&quot;test.wsdl.sequence&quot;/&gt;
&lt;/wsdl2java&gt;</pre></div>
  </li>
  <li>Enable the <tt>run</tt> target in the new build.xml file. You need to choose from the <tt>execute-Component</tt> and the (soon to be introduced) <tt>execute-Simple-Test</tt> target. These control HOW the test is invoked when run as a single component. The <tt>execute-Component</tt> sets up the tcp-server and http-server prior to running the test, as well as handles deploying and services that may be needed. The <tt>execute-Simple-test</tt> simply invokes the raw test class file.</li>
  <li>Done. Run <tt>ant functional-tests </tt>to verify. Check in your test.</li>
</ol>

</div>

</div>

<div class="section"><h2>Test Structure<a name="Test_Structure"></a></h2>

<p><a href="AxisTestRedesign.html">The Test and Samples Redesign Document is here</a></p>

<p>As of Axis 1.0, RC1, we have moved to a &quot;componentized&quot; test structure. Instead of having one high-level large recursive function, there are smaller, simple &quot;component&quot; build.xml files in the leaf level of the test/** and samples/** trees.</p>

<p>These &quot;component&quot; files have a common layout. Their primary targets are:</p>

<ul>
  <li>clean - reset the build destination(s)</li>
  <li>compile - javac, wsdl2java, java2wsdl instructions</li>
  <li>run - &quot;executes&quot; the test</li>
</ul>

<p>A &quot;sample&quot; test xml file can be found in test/templateTest</p>

</div>

<div class="section"><h2>Adding Source Code Checks<a name="Adding_Source_Code_Checks"></a></h2>

<p>The Axis build performs certain automated checks of the files in the source directory (java/src) to make sure certain conventions are followed such as using internationalised strings when issuing messages.</p>

<p>If a convention can be reduced to a regular expression match, it can be enforced at build time by updating java/test/utils/TestSrcContent.java.</p>

<p>All that is necessary is to add a pattern to the static FileNameContentPattern array. Each pattern has three parameters:</p>

<ol style="list-style-type: decimal">
  <li>a pattern that matches filenames that are to be checked,</li>
  <li>a pattern to be searched for in the chosen files, and</li>
  <li>a boolean indicating whether the pattern is to be allowed (typically false indicating not allowed).</li>
</ol>

<p>A reasonable summary of the regular expression notation is provided in the <a class="externalLink" href="http://jakarta.apache.org/oro/api/org/apache/oro/text/regex/package-summary.html">Jakarta ORO javadocs</a>.</p>

</div>

<div class="section"><h2>JUnit and Axis<a name="JUnit_and_Axis"></a></h2>

<p>You try to run some JUnit tests on an Axis client that invokes a web service, and you always get this exception:</p>

<div class="source"><pre class="prettyprint">java.lang.ExceptionInInitializerError 
at org.apache.axis.client.Service.&lt;init&gt;(Service.java:108) 
... 

Caused by: org.apache.commons.logging.LogConfigurationException: ... 
org.apache.commons.logging.impl.Jdk14Logger does not implement Log 
at org.apache.commons.logging.impl.LogFactoryImpl.newInstance
(LogFactoryImpl.java:555) 
...</pre></div>

<p>Actually, the Jdk14Logger does implement Log. What you have is a JUnit classloading issue. JUnit's graphical TestRunner has a feature where it will dynamically reload modified classes every time the user presses the &quot;Run&quot; button. This way, the user doesn't need to relaunch the TestRunner after every edit. For this, JUnit uses its own classloader, junit.runner.TestCaseClassLoader. As of JUnit 3.8.1, confusion can arise between TestCaseClassLoader and the system class loader as to which loader did or should load which classes.</p>

<p>There are two ways to avoid this problem.</p>

<ul>
  <li>Sure and simple fix. Turn off dynamic class reloading by running junit.swingui.TestRunner with the -noloading argument.</li>
  <li>Finicky and fancy fix, only necessary if you want dynamic class reloading. Tell TestCaseClassLoader to ignore certain packages and their sub-packages, deferring them to the system classloader. You can do this using a file located in junit.jar, junit/runner/excluded.properties. Its content appears as follows:
    <div class="source"><pre class="prettyprint">#
# The list of excluded package paths for the TestCaseClassLoader
#
excluded.0=sun.*
excluded.1=com.sun.*
excluded.2=org.omg.*
excluded.3=javax.*
excluded.4=sunw.*
excluded.5=java.*
excluded.6=org.w3c.dom.*
excluded.7=org.xml.sax.*
excluded.8=net.jini.*</pre></div>
  </li>
</ul>

<p>Copy this file, preserving the directory path, into another location, e.g. deployDir. So the copied properties file's path will be deployDir/junit/runner/excluded.properties. Add an extra entry to the end of this file:</p>

<div class="source"><pre class="prettyprint">excluded.9=org.apache.*</pre></div>

<p>Edit your classpath so that deployDir appears before junit.jar. This way, the modified excluded.properties will be used, rather than the default. (Don't add the path to excluded.properties itself to the classpath.)</p>

<p>This fix will prevent the commons-logging exception. However, other classloading problems might still arise. For example:</p>

<div class="source"><pre class="prettyprint">Dec 10, 2002 7:16:16 PM org.apache.axis.encoding.ser.BeanPropertyTarget set 
SEVERE: Could not convert [Lfoo.bar.Child; to bean field 'childrenAsArray', 
type [Lfoo.bar.Child; 
Dec 10, 2002 7:16:16 PM org.apache.axis.client.Call invoke 
SEVERE: Exception: 
java.lang.IllegalArgumentException: argument type mismatch 
at org.apache.axis.encoding.ser.BeanPropertyTarget.set
(BeanPropertyTarget.java:182) 
at org.apache.axis.encoding.DeserializerImpl.valueComplete
(DeserializerImpl.java:284) 
...</pre></div>

<p>In this case, you have no choice but to give up on dynamic class reloading and use the -noloading argument.</p>

<p>One other heads-up about JUnit testing of an Axis web service. Suppose you have run JUnit tests locally on the component that you want to expose as a web service. You press the &quot;Run&quot; button to initiate a series of tests. Between each test, all your data structures are re-initialized. Your tests produce a long green bar. Good.</p>

<p>Suppose you now want to run JUnit tests on an Axis client that is connecting to an application server running the Axis web application and with it your web service. Between each test, JUnit will automatically re-initialize your client.</p>

<p>Your server-side data structures are a different matter. If you're checking your server data at the end of each test (as you should be) and you run more than one test at a time, the second and later tests will fail because they are generating cumulative data on the Axis server based on preceding tests rather than fresh data based only on the current one.</p>

<p>This means that, for each test, you must manually re-initialize your web service. One way to accomplish this is to add to your web service interface a re-initialize operation. Then have the client call that operation at the start of each test.</p>

</div>

<div class="section"><h2>Debugging<a name="Debugging"></a></h2>

<div class="section"><h3>Using tcpmon to Monitor Functional Tests.<a name="Using_tcpmon_to_Monitor_Functional_Tests."></a></h3>

<p>Here is an easy way to monitor the messages while running <tt>functional-tests</tt> (or <tt>all-tests</tt>).</p>

<p>Start up tcpmon listening on 8080 and forwarding to a different port:</p>

<p><tt>java org.apache.axis.utils.tcpmon 8080 localhost 8011</tt></p>

<p>Run your tests, but use the forwarded port for the SimpleAxisServer, and indicate that functional-tests should continue if a failure occurs.</p>

<p><tt>ant functional-tests -Dtest.functional.SimpleAxisPort=8011 -Dtest.functional.fail=no</tt></p>

<p>The SOAP messages for all of the tests should appear in the tcpmon window.</p>

<p><tt>tcpmon</tt> is described in more detail in the <a href="user-guide.html#AppendixUsingTheAxisTCPMonitorTcpmon">Axis User's Guide</a>.</p>

</div>

<div class="section"><h3>Using SOAP Monitor to Monitor Functional Tests<a name="Using_SOAP_Monitor_to_Monitor_Functional_Tests"></a></h3>

<p>If you are debugging code that is running as a web application using a web application server (such as Tomcat) then you may also use the SOAP Monitor utility to view the SOAP request and response messages.</p>

<p>Start up the SOAP monitor utility by loading the SOAP monitor applet in your web browser window:</p>

<p><tt>http://localhost:&lt;port&gt;/axis/SOAPMonitor</tt></p>

<p>As you run your tests, the SOAP messages should appear in the SOAP monitor window.</p>

<p><tt>SOAP Monitor</tt> is described in more detail in the <a href="user-guide.html#AppendixUsingTheSOAPMonitor">Axis User's Guide</a>.</p>

</div>

<div class="section"><h3>Running a Single Functional Test<a name="Running_a_Single_Functional_Test"></a></h3>

<p>In one window start the server:</p>

<p><tt>java org.apache.axis.transport.http.SimpleAxisServer -p 8080</tt></p>

<p>In another window, first deploy the service you're testing:</p>

<p><tt>java org.apache.axis.client.AdminClient deploy.wsdd</tt></p>

<p>Then bring up the JUnit user interface with your test. For example, to run the the multithread test case:</p>

<p><tt>java junit.swingui.TestRunner -noloading test.wsdl.multithread.MultithreadTestCase</tt></p>

</div>

<div class="section"><h3>Turning on Debug Output<a name="Turning_on_Debug_Output"></a></h3>

<p>This section is oriented to the Axis default logger: Log4J. For additional information on Log4J, see the section <a href="#LoggingTracing">Configuring the Logger</a>.</p>

<ul>
  <li><b>Overriding Log4J properties</b>
    <p>The <tt>log4j.properties</tt> file is packaged in <tt>axis.jar</tt> with reasonable default settings. Subsequent items presume changes to these settings. There are multiple options open to the developer, most of which involve extracting <tt>log4j.properties</tt> from <tt>axis.jar</tt> and modifying as appropriate.</p>
    <ul>
      <li>If you are building and executing <tt>Java</tt> programs from a command line or script file, include the JVM option <tt>-Dlog4j.configuration=<i>yourConfigFile</i></tt>.</li>
      <li>Set <tt>CLASSPATH</tt> such that your version of <tt>log4j.properties</tt> appears prior to <tt>axis.jar</tt> in the <tt>CLASSPATH</tt>.</li>
      <li>If you are building and executing your programs using <tt>ant</tt> (this includes building Axis and running it's tests), set the environment variable <tt>ANT_OPTS</tt> to <tt>-Dlog4j.configuration=<i>yourConfigFile</i></tt>.</li>
      <li>If you are building Axis, you can change <tt>src/log4j.properties</tt> directly. Be sure NOT to commit your change(s).</li>
    </ul>
  </li>

  <li><b>Turning on ALL DEBUG Output</b>
    <ul>
      <li>Set the <tt>log4j.rootCategory</tt> <i>priority</i> to <tt>DEBUG</tt>.</li>
      <li>Set the <i>priority</i> threshold for an appender to <tt>DEBUG</tt> (The <tt>log4j.properties</tt> file in Axis defines two appenders: <tt>CONSOLE</tt> and <tt>LOGFILE</tt>).</li>
    </ul>
  </li>

  <li><b>Selective DEBUG Output</b>
    <ul>
      <li>Set the <tt>log4j.rootCategory</tt> <i>priority</i> to <tt>INFO</tt> or higher.</li>
      <li>Set the <tt>log4j.logger.<i>logger.name</i></tt> <i>priority</i> to <tt>DEBUG</tt> for the loggers that you are interested in.</li>
      <li>Set the <i>priority</i> threshold for an appender to <tt>DEBUG</tt> (The <tt>log4j.properties</tt> file in Axis defines two appenders: <tt>CONSOLE</tt> and <tt>LOGFILE</tt>).</li>
      <li>If you are still seeing more than you want to see, you will need to use other tools to extract the information you are interested in from the log output. Use appropriate key words in log messages and use tools such as <tt>grep</tt> to search for them in log messages.</li>
    </ul>
  </li>
</ul>

</div>

<div class="section"><h3>Writing Temporary Output<a name="Writing_Temporary_Output"></a></h3>

<p>Remember that Axis is targeted for use in a number of open-source and other web applications, and so it needs to be a good citizen. Writing output using <tt>System.out.println</tt> or <tt>System.err.println</tt> should be avoided.</p>

<p>Developers may be tempted to use <tt>System.out.println</tt> while debugging or analyzing a system. If you choose to do this, you will need to disable the <tt>util/TestSrcContent</tt> test, which enforces avoidance of <tt>System.out.println</tt> and <tt>System.err.println</tt>. It follows that you will need to remove your statements before checking the code back in.</p>

<p>As an alternative, we strongly encourage you to take a few moments and introduce debug statements: <tt>log.debug(&quot;reasonably terse and meaningful message&quot;)</tt>. If a debug message is useful for understanding a problem now, it may be useful again in the future to you or a peer.</p>

</div>

</div>

<div class="section"><h2>Running the JAX-RPC Compatibility Tests<a name="Running_the_JAX-RPC_Compatibility_Tests"></a></h2>

<p>As well as a specification, JAX-RPC has a Technology Compatibility Kit (TCK) which is available to members of the JAX-RPC Expert Group (and others?).</p>

<p>The kit comes as a zip file which you should unzip into a directory of your choosing. The installation instructions are in the JAX-RPC Release Notes document which is stored in the docs directory. If you open the index.html file in the docs directory using a web browser, you'll see a list of all the documents supplied with the kit.</p>

<p>Note that the kit includes the JavaTest test harness which is used for running the compatibility tests.</p>

<p>If any more information is needed about running these tests, please add it here!</p>

</div>

  

                  </div>
            </div>
          </div>

    <hr/>

    <footer>
            <div class="container-fluid">
              <div class="row span12">Copyright &copy;                    2000-2013
                        <a href="http://www.apache.org/">The Apache Software Foundation</a>.
            All Rights Reserved.      
                    
      </div>

        
        
                </div>
    </footer>
  </body>
</html>