<!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 - 
    Integration 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="">
    Integration 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>
    
                          <a href="developers-guide.html" title="Developer's Guide">
          <i class="none"></i>
        Developer's Guide</a>
            </li>
                  
      <li class="active">
    
            <a href="#"><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="#Pluggable_APIs">Pluggable APIs</a><ul><li><a href="#Components">Components</a><ul><li><a href="#General_Strategy">General Strategy</a></li><li><a href="#Example_1">Example 1</a></li><li><a href="#Example_2">Example 2</a></li><li><a href="#Reference">Reference</a></li></ul></li><li><a href="#LoggingTracing">Logging/Tracing</a><ul><li><a href="#JustificationRationale">Justification/Rationale</a></li><li><a href="#Integration">Integration</a></li><li><a href="#Mechanism">Mechanism</a></li><li><a href="#Logger_Configuration">Logger Configuration</a></li></ul></li><li><a href="#Configuration">Configuration</a></li><li><a href="#Handlers">Handlers</a></li><li><a href="#Internationalization">Internationalization</a><ul><li><a href="#Translation">Translation</a></li><li><a href="#Extending_Message_Files">Extending Message Files</a></li></ul></li><li><a href="#Performance_Monitoring">Performance Monitoring</a></li><li><a href="#Encoding">Encoding</a></li><li><a href="#WSDL_Parser_and_Code_Generator_Framework">WSDL Parser and Code Generator Framework</a><ul><li><a href="#Symbol_Table">Symbol Table</a></li><li><a href="#Parser_Front_End_and_Generator_Framework">Parser Front End and Generator Framework</a></li><li><a href="#Code_Generator_Back_End">Code Generator Back End</a></li><li><a href="#WSDL_Framework_Extension_Examples">WSDL Framework Extension Examples</a><ul><li><a href="#Example_1_-_Simple_extension_of_WSDL2Java_-_additional_artifact">Example 1 - Simple extension of WSDL2Java - additional artifact</a></li><li><a href="#Example_2_-_Not_quite_as_simple_an_extension_of_WSDL2Java_-_change_an_artifact">Example 2 - Not quite as simple an extension of WSDL2Java - change an artifact</a></li></ul></li></ul></li></ul></li><li><a href="#Client_SSL">Client SSL</a></li></ul>

</div>

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

<p>The primary purpose of this guide is to present how Axis can be integrated into an existing web application server, such as Tomcat or WebSphere, for example. Axis has a number of Pluggable APIs that are necessary for such an integration.</p>

<p>The reader may find useful background information in the <a href="architecture-guide.html">Architecture Guide</a>.</p>

</div>

<div class="section"><h2>Pluggable APIs<a name="Pluggable_APIs"></a></h2>

<p>The following are the points that are pluggable in order to integrate Axis into a web application server. The first subsection details a number of pluggable components in general. More details are provided for other components in the remaining subsections.</p>

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

<p>This section describes in general how to plug specializations of various components into Axis.</p>

<div class="section"><h4>General Strategy<a name="General_Strategy"></a></h4>

<p>To override the default behavior for a pluggable component:</p>

<ul>
  <li>Develop implementation of components interface</li>
  <li>Define the implementation class to Axis by either creating a service definition file (prefered) or by setting a system property.
    <ul>
      <li><b>PREFERED:</b> To create a service definition file:
        <ul>
          <li>The name of the service definition file is derived from the interface or abstract class which the service implements/extends:<br />
            <tt>/META-INF/services/&lt;componentPackage&gt;.&lt;interfaceName&gt;</tt>.</li>
          <li>Put the fully qualified class name of the implementation class on a line by itself in the service definition file.</li>
        </ul>
      </li>
      <li>Set system property:
        <ul>
          <li>The name of the system property is the name of the interface.</li>
          <li>The value of the system property is the name of the implementation.</li>
          <li>The optional system property name (in table, below) may be also be used.</li>
          <li>Setting a system property is not prefered, particularly in a J2EE or other application hosting environment, because it imposes a directive across all applications. This may or may not be appropriate behavior. If it is to be done, it should never be done from within a Web Application at runtime.</li>
        </ul>
      </li>
    </ul>
  </li>
  <li>Package the implementation class and, if used, the service definition file in a JAR file and/or place it where it can be picked up by a class loader (CLASSPATH).</li>
</ul>

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

<p>To override the default behavior for the Java Compiler:</p>

<ul>
  <li>An implementation of the <tt>Compiler</tt> interface is already provided for the <tt>Jikes</tt> compiler.</li>
  <li>Create the service definition file named:<br />
    <tt>/META-INF/services/org.apache.axis.components.compiler.Compiler</tt></li>
  <li>Add the following line to the service definition file:<br />
    <tt>org.apache.axis.components.compiler.Jikes</tt></li>
  <li>Since <tt>org.apache.axis.components.compiler.Jikes</tt> is packaged with Axis, all that needs to be done is to ensure that the service definition file is loadable by a class loader.</li>
</ul>

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

<p>To override the default behavior for the SocketFactory in an environment that does not allow resources to be located/loaded appropriately, or where the behavior needs to be forced to a specific implementation:</p>

<ul>
  <li>Provide an implementation of the <tt>SocketFactory</tt> interface, for example <tt>your.package.YourSocketFactory</tt></li>
  <li>Set the system property named<br />
    <tt>org.apache.axis.components.net.SocketFactory</tt><br />
    to the value<br />
    <tt>your.package.YourSocketFactory</tt><br /><br />
    This can be done by using the JVM commandline<br />
    <tt>-Dorg.apache.axis.components.net.SocketFactory=your.package.YourSocketFactory</tt></li>
  <li>Ensure that the implementation class is loadable by a class loader.</li>
</ul>

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

<p>(Component/Package: org.apache.axis.components.*)</p>

<table border="0" class="table table-striped">

<tr class="a">
  <th>Component/Package</th>
  <th>Factory</th>
  <th>Interface</th>
  <th>Optional System Property</th>
  <th>Default Implementation</th>
</tr>

<tr class="b">
  <td>compiler</td>
  <td>CompilerFactory.getCompiler()</td>
  <td>Compiler</td>
  <td>axis.Compiler</td>
  <td>Javac</td>
</tr>

<tr class="a">
  <td>image</td>
  <td>ImageIOFactory.getImageIO()</td>
  <td>ImageIO</td>
  <td>axis.ImageIO</td>
  <td>MerlinIO, JimiIO, JDK13IO</td>
</tr>

<tr class="b">
  <td>jms</td>
  <td>JMSVendorAdapterFactory.getJMSVendorAdapter()</td>
  <td>JMSVendorAdapter</td>
  <td></td>
  <td>JNDIVendorAdapter</td>
</tr>

<tr class="a">
  <td>net</td>
  <td>SocketFactoryFactory.getFactory()</td>
  <td>SocketFactory</td>
  <td>axis.socketFactory</td>
  <td>DefaultSocketFactory</td>
</tr>

<tr class="b">
  <td>net</td>
  <td>SocketFactoryFactory.getSecureFactory()</td>
  <td>SecureSocketFactory</td>
  <td>axis.socketSecureFactory</td>
  <td>JSSESocketFactory</td>
</tr>
</table>

<!-- <h3><a name="System Management Plug"></a>System Management</h3>
What points are necessary to manage Axis?
<ul>
  <li>Justification/Rationale - why is this plug point necessary? Spec compliance?</li>
  <li>Interfaces</li>
  <li>Mechanism</li>
  <ul>
    <li>Life cycle</li>
    <li>Exception handling - in general; plug-in shouldn't throw any exceptions - does runtime ignore? Log?)</li>
    <li>Multiple thread support? Ie., is synchronization required?</li>
  </ul>
  <li>Configuration/reconfiguration</li>
  <li>Default behavior if not plugged.</li>
  <li>Example</li>
</ul> -->

</div></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>Justification/Rationale<a name="JustificationRationale"></a></h4>

<p>A pluggable logging/trace facility enables Axis to direct logging/trace messages to a host web application server's logging facility. A central logging facility with a single point of configuration/control is superior to distinct logging mechanisms for each of a multitude of middleware components that are to be integrated into a web application server.</p>

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

<p>The minimum requirement to integrate with another logger is to provide an implementation of the <tt>org.apache.commons.logging.Log</tt> interface. In addition, an implementation of the <tt>org.apache.commons.logging.LogFactory</tt> interface can be provided to meet specific requirements for connecting to, or instantiating, a logger.</p>

<ul>
  <li><b>org.apache.commons.logging.Log</b>
    <p>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);

  log.isFatalEnabled();
  log.isErrorEnabled();
  log.isWarnEnabled();
  log.isInfoEnabled();
  log.isDebugEnabled();
  log.isTraceEnabled();</pre></div>
    <p>Semantics for these methods are such that it is expected that the severity of messages is ordered, from highest to lowest:</p>
    <ul>
      <li>fatal - Consider logging to console and system log.</li>
      <li>error - Consider logging to console and system log.</li>
      <li>warn - Consider logging to console and system log.</li>
      <li>info - Consider logging to console and system log.</li>
      <li>debug - Log to system log, if enabled.</li>
      <li>trace - Log to system log, if enabled.</li>
    </ul>
  </li>
  <li><b>org.apache.commons.logging.LogFactory</b>
    <p>If desired, the default implementation of the <tt>org.apache.commons.logging.LogFactory</tt> interface can be overridden, allowing the JDK 1.3 Service Provider discovery process to locate and create a LogFactory specific to the needs of the application. Review the Javadoc for the <tt>LogFactoryImpl.java</tt> for details.</p>
  </li>
</ul>

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

<ul>
  <li><b>Life cycle</b>
    <p>The JCL LogFactory implementation must assume responsibility for either connecting/disconnecting to a logging toolkit, or instantiating/initializing/destroying a logging toolkit.</p>
  </li>
  <li><b>Exception handling</b>
    <p>The JCL Log interface doesn't specify any exceptions to be handled, the implementation must catch any exceptions.</p>
  </li>
  <li><b>Multiple threads</b>
    <p>The JCL Log and LogFactory implementations must ensure that any synchronization required by the logging toolkit is met.</p>
  </li>
</ul>

</div><div class="section"><h4>Logger Configuration<a name="Logger_Configuration"></a></h4>

<ul>
  <li><b>Log</b>
    <p>The default <tt>LogFactory</tt> provided by JCL can be configured to instantiate a specific implementation of the <tt>org.apache.commons.logging.Log</tt> interface by setting the property <tt>org.apache.commons.logging.Log</tt>. This property can be specified as a system property, or in the <tt>commons-logging.properties</tt> file, which must exist in the CLASSPATH.</p>
  </li>
  <li><b>Default logger if not plugged</b>
    <p>The Jakarta Commons Logging SPI uses the implementation of the <tt>org.apache.commons.logging.Log</tt> interface specified by the system property <tt>org.apache.commons.logging.Log</tt>. If the property is not specified or the class is not available then the JCL provides access to a default logging toolkit by searching the CLASSPATH for the following toolkits, in order of preference:</p>
    <ul>
      <li><a class="externalLink" href="http://jakarta.apache.org/log4j/docs/index.html">Log4J</a></li>
      <li>JDK 1.4</li>
      <li>JCL SimpleLog</li>
    </ul>
  </li>
</ul>

</div></div>

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

<p>The internal data model used by Axis is based on an Axis specific data model: Web Services Deployment Descriptor (WSDD). Axis initially obtains the WSDD information for a service from an instance of <tt>org.apache.axis.EngineConfiguration</tt>.</p>

<p>The EngineConfiguration is provided by an implementation of the interface <tt>org.apache.axis.EngineConfigurationFactory</tt>, which currently provides methods that return client and server configurations.</p>

<p>Our focus will be how to define the implementation class for <tt>EngineConfigurationFactory</tt>.</p>

<ul>
  <li>Justification/Rationale
    <p>While the default behaviour is sufficient for general use of Axis, integrating Axis into an existing application server may require an alternate deployment model. A customized implementation of the EngineConfigurationFactory would map from the hosts deployment model to Axis's internal deployment model.</p>
  </li>
  <li>Mechanism
    <p>The relevant sequence of instructions used to obtain configuration information and initialize Axis is as follows:</p>
    <div class="source"><pre class="prettyprint">EngineConfigurationFactory factory = EngineConfigurationFactoryFinder(someContext);
EngineCongfiguration config = factory.getClientEngineConfig();
AxisClient = new AxisClient(config);</pre></div>
    <p>The details may vary (server versus client, whether other factories are involved, etc). Regardless, the point is that integration code is responsible for calling <tt>EngineConfigurationFactoryFinder(someContext)</tt> and ensuring that the results are handed to Axis. <tt>someContext</tt> is key to how the factory finder locates the appropriate implementation of EngineConfigurationFactory to be used, if any.</p>
    <p>EngineConfigurationFactoryFinder works as follows:</p>
    <ul>
      <li>Obtain a list of classes that implement <tt>org.apache.axis.EngineConfigurationFactory</tt>, in the following order:
        <ul>
          <li>The value of the system property <tt>axis.EngineConfigFactory</tt>.</li>
          <li>The value of the system property <tt>org.apache.axis.EngineConfigurationFactory</tt>.</li>
          <li>Locate all resources named <tt>META-INF/services/org.apache.axis.EngineConfigurationFactory</tt>. Each line of such a resource identifies the name of a class implementing the interface ('#' comments, through end-of-line).</li>
          <li><tt>org.apache.axis.configuration.EngineConfigurationFactoryServlet</tt></li>
          <li><tt>org.apache.axis.configuration.EngineConfigurationFactoryDefault</tt></li>
        </ul>
      </li>
      <li>Classes implementing EngineConfigurationFactory are required to provide the method<br />
        <tt>public static EngineConfigurationFactory newFactory(Object)</tt><br />
        This method is called, passing <tt>someContext</tt> as the parameter.</li>
      <li>The <tt>newFactory</tt> method is required to check the <tt>someContext</tt> parameter to determine if it is meaningfull to the class (at a minimum, verify that it is of an expected type, or class) and may, in addition, examine the overall runtime environment. If the environment can provide information required by an EngineConfigurationFactory, then the <tt>newFactory()</tt> may return in instance of that factory. Otherwise, <tt>newFactory()</tt> must return null.</li>
      <li>EngineConfigurationFactoryFinder returns the first non-null factory it obtains.</li>
    </ul>
  </li>
  <li>Default behavior
    <p>The default behaviour is provided by the last two elements of the list of implementing classes, as described above:</p>
    <ul>
      <li><tt>org.apache.axis.configuration.EngineConfigurationFactoryServlet</tt>
        <p><tt>newFactory(obj)</tt> is called. If <tt>obj instanceof javax.servlet.ServletContext</tt> is true, then an instance of this class is returned.</p>
        <p>The default Servlet factory is expected to function as a server (as a client it will incorrectly attempt to load the WSDD file <tt>client-config.wsdd</tt> from the current working directory!).</p>
        <p>The default Servlet factory will open the Web Application resource <tt>/WEB-INF/server-config.wsdd</tt> (The name of this file may be changed using the system property <tt>axis.ServerConfigFile</tt>):</p>
        <ul>
          <li>If it exists as an accessible file (i.e. not in a JAR/WAR file), then it opens it as a file. This allows changes to be saved, if changes are allowed &amp; made using the Admin tools.</li>
          <li>If it does not exist as a file, then an attempt is made to access it as a resource stream (getResourceAsStream), which works for JAR/WAR file contents.</li>
          <li>If the resource is simply not available, an attempt is made to create it as a file.</li>
          <li>If all above attempts fail, a final attempt is made to access <tt>org.apache.axis.server.server-config.wsdd</tt> as a data stream.</li>
        </ul>
      </li>
      <li><tt>org.apache.axis.configuration.EngineConfigurationFactoryDefault</tt>
        <p><tt>newFactory(obj)</tt> is called. If <tt>obj</tt> is null then an instance of this class is returned. A non-null <tt>obj</tt> is presumed to require a non-default factory.</p>
        <p>The default factory will load the WSDD files <tt>client-config.wsdd</tt> or <tt>server-config.wsdd</tt>, as appropriate, from the current working directory. The names of these files may be changed using the system properties <tt>axis.ClientConfigFile</tt> and <tt>axis.ServerConfigFile</tt>, respectively.</p>
      </li>
    </ul>
  </li>
</ul>

</div>

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

<p>See the <a href="architecture-guide.html">Architecture Guide</a> for current information on Handlers.</p>

</div>

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

<p>Axis supports internationalization by providing both a property file of the strings used in Axis, and an extension mechanism that facilitates accessing internal Axis messages and extending the messages available to integration code based on existing Axis code.</p>

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

<ul>
  <li>Justification/Rationale
    <p>In order for readers of languages other than English to be comfortable with Axis, we provide a mechanism for the strings used in Axis to be translated. We do not provide any translations in Axis; we merely provide a means by which translators can easily plug in their translations.</p>
  </li>
  <li>Mechanism
    <p>Axis provides english messages in the Java resource named org.apache.axis.i18n.resource.properties (in the source tree, the file is named xml-axis/java/src/org/apache/axis/i18n/resource.properties).</p>
    <p>Axis makes use of the Java internationalization mechanism - i.e., a java.util.ResourceBundle backed by a properties file - and the java.text.MessageFormat class to substitute parameters into the message text.</p>
    <ul>
      <li>java.util.ResourceBundle retrieves message text from a property file using a key provided by the program. Entries in a message resource file are of the form &lt;key&gt;=&lt;message&gt;.</li>
      <li>java.text.MessageFormat substitutes variables for markers in the message text. Markers use the syntax <tt>&quot;{X}&quot;</tt> where <tt>X</tt> is the number of the variable, starting at 0.</li>
    </ul>
    <p>For example: <tt>myMsg00=My {0} is {1}.</tt></p>
    <p>Translation requires creating an alternate version of the property file provided by Axis for a target language. The JavaDoc for <tt>java.utils.ResourceBundle</tt> provides details on how to identify different property files for different locales.</p>
    <p>For details on using Axis's internationalization tools, see the <a href="developers-guide.html">Developer's Guide</a>.</p>
  </li>
  <li>Default behavior
    <p>The default behavior, meaning what happens when a translated file doesn't exist for a given locale, is to fall back on the English-language properties file. If that file doesn't exist (unlikely unless something is seriously wrong), Axis will throw an exception with an English-language reason message.</p>
  </li>
</ul>

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

<p>Axis provides a Message file extension mechanism that allows Axis-based code to use Axis message keys, as well as new message keys unique to the extended code.</p>

<ul>
  <li>Justification/Rationale
    <p>Axis provides pluggable interfaces for various Axis entities, including EngineConfigurationFactory's, Provides, and Handlers. Axis also provides a variety of implementations of these entities. It is convenient to use Axis source code for such implementations as starting points for developing extentions and customizations that fulfill the unique needs of the end user.</p>
  </li>
  <li>Procedure
    <p>To extend the Axis message file:</p>
    <ul>
      <li>Copy the Axis source file <tt>java/src/org/apache/axis/i18n/Messages.java</tt> to your project/package, say <tt>my/project/package/path/Messages.java</tt>.
        <ul>
          <li>Set the <tt>package</tt> declaration in the copied file to the correct package name.</li>
          <li>Set the private attribute <tt>projectName</tt> to <tt>&quot;my.project&quot;</tt>: the portion of the package name that is common to your project. <tt>projectName</tt> must be equal to or be a prefix of the copied Messages package name.</li>
        </ul>
      </li>
      <li>Create the file <tt>my/project/package/path/resource.properties</tt>. Add new message key/value pairs to this file.</li>
      <li>As you copy Axis source files over to your project, change the <tt>import org.apache.axis.i18n.Messages</tt> statement to <tt>import my.project.package.path.Messages</tt>.</li>
      <li>Use the methods provided by the class Messages, as discussed in the <a href="developers-guide.html">Developer's Guide</a>, to access the new messages.</li>
    </ul>
  </li>
  <li>Behavior
    <ul>
      <li>Local Search
        <p><tt>Messages</tt> begins looking for a key's value in the <tt>resources.properties</tt> resource in it's (Messages) package.</p>
      </li>
      <li>Hierarchical Search
        <p>If <tt>Messages</tt> cannot locate either the key, or the resource file, it walks up the package hierarchy until it finds it. The top of the hierarchy, above which it will not search, is defined by the <tt>projectName</tt> attribute, set above.</p>
      </li>
      <li>Default behavior
        <p>If the key cannot be found in the package hierarchy then a default resource is used. The default behaviour is determined by the <tt>parent</tt> attribute of the <tt>Messages</tt> class copied to your extensions directory.</p>
        <p>Unless changed, the default behavior, meaning what happens when a key isn't defined in the new properties file, is to fall back to the Axis properties file (org.apache.axis.i18n.resource.properties).</p>
      </li>
    </ul>
  </li>
</ul>

</div></div>

<div class="section"><h3>Performance Monitoring<a name="Performance_Monitoring"></a></h3>

<p>Axis does not yet include specific Performance Monitoring Plugs.</p>

<!-- <ul>
  <li>Justification/Rationale - why is this plug point necessary? Spec compliance?</li>
  <li>Interfaces</li>
  <li>Mechanism</li>
  <ul>
    <li>Life cycle</li>
    <li>Exception handling - in general; plug-in shouldn't throw any exceptions - does runtime ignore? Log?)</li>
    <li>Multiple thread support? Ie., is synchronization required?</li>
  </ul>
  <li>Configuration/reconfiguration</li>
  <li>Default behavior if not plugged.</li>
  <li>Example</li>
</ul> -->

</div>

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

<p>Axis does not yet include an Encoding Plug.</p>

<!-- How can a system integrator plug in other encoding mechanisms such as SOAP 1.2 or optimized XML-based encoding?
<ul>
  <li>Justification/Rationale - why is this plug point necessary? Spec compliance?</li>
  <li>Interfaces</li>
  <li>Mechanism</li>
  <ul>
    <li>Life cycle</li>
    <li>Exception handling - in general; plug-in shouldn't throw any exceptions - does runtime ignore? Log?)</li>
    <li>Multiple thread support? Ie., is synchronization required?</li>
  </ul>
  <li>Configuration/reconfiguration</li>
  <li>Default behavior if not plugged.</li>
  <li>Example</li>
</ul> -->

</div>

<div class="section"><h3>WSDL Parser and Code Generator Framework<a name="WSDL_Parser_and_Code_Generator_Framework"></a></h3>

<p>WSDL2Java is Axis's tool to generate Java artifacts from WSDL. This tool is extensible. If users of Axis wish to extend Axis, then they may also need to extend or change the generated artifacts. For example, if Axis is inserted into some product which has an existing deployment model that's different than Axis's deployment model, then that product's version of WSDL2Java will be required to generate deployment descriptors other than Axis's deploy.wsdd.</p>

<p>What follows immediately is a description of the framework. If you would rather dive down into the dirt of <a href="#WSDL20Examples">examples</a>, you could learn a good deal just from them. Then you could come back up here and learn the gory details.</p>

<p>There are three parts to WSDL2Java:</p>

<ol style="list-style-type: decimal">
  <li>The symbol table</li>
  <li>The parser front end with a generator framework</li>
  <li>The code generator back end (WSDL2Java itself)</li>
</ol>

<div class="section"><h4>Symbol Table<a name="Symbol_Table"></a></h4>

<p>The symbol table, found in org.apache.axis.wsdl.symbolTable, will contain all the symbols from a WSDL document, both the symbols from the WSDL constructs themselves (portType, binding, etc), and also the XML schema types that the WSDL refers to.</p>

<p><font color="#FF0000">NOTE: Needs lots of description here.</font></p>

<p>The symbol table is not extensible, but you <b>can</b> add fields to it by using the Dynamic Variables construct:</p>

<ul>
  <li>You must have some constant object for a dynamic variable key. For example: public static final String MY_KEY = &quot;my key&quot;;</li>
  <li>You set the value of the variable in your GeneratorFactory.generatorPass: entry.setDynamicVar(MY_KEY, myValue);</li>
  <li>You get the value of the variable in your generators: Object myValue = entry.getDynamicVar(MY_KEY);</li>
</ul>

</div><div class="section"><h4>Parser Front End and Generator Framework<a name="Parser_Front_End_and_Generator_Framework"></a></h4>

<p>The parser front end and generator framework is located in org.apache.axis.wsdl.gen. The parser front end consists of two files:</p>

<ul>
  <li>Parser
    <div class="source"><pre class="prettyprint">public class Parser {
  public Parser();
  public boolean isDebug();
  public void setDebug(boolean);
  public boolean isImports();
  public void setImports(boolean);
  public boolean isVerbose();
  public void setVerbose(boolean);
  public long getTimeout();
  public void setTimeout(long);
  public java.lang.String getUsername();
  public void setUsername(java.lang.String);
  public java.lang.String getPassword();
  public void setPassword(java.lang.String);
  public GeneratorFactory getFactory();
  public void setFactory(GeneratorFactory);
  public org.apache.axis.wsdl.symbolTable.SymbolTable getSymbolTable();
  public javax.wsdl.Definition getCurrentDefinition();
  public java.lang.String getWSDLURI();
  public void run(String wsdl) throws java.lang.Exception;
  public void run(String context, org.w3c.dom.Document wsdlDoc)
    throws java.io.IOException, javax.wsdl.WSDLException;
}</pre></div>
    <p>The basic behavior of this class is simple: you instantiate a Parser, then you run it.</p>
    <div class="source"><pre class="prettyprint">Parser parser = new Parser();
parser.run(&quot;myfile.wsdl&quot;);</pre></div>
    <p>There are various options on the parser that have accessor methods:</p>
    <ul>
      <li>debug - default is false - dump the symbol table after the WSDL file has been parsed</li>
      <li>imports - default is true - should imported files be visited?</li>
      <li>verbose - default is false - list each file as it is being parsed</li>
      <li>timeout - default is 45 - the number of seconds to wait before halting the parse</li>
      <li>username - no default - needed for protected URI's</li>
      <li>password - no default - needed for protected URI's</li>
    </ul>
    <p>Other miscellaneous methods on the parser:</p>
    <ul>
      <li>get/setFactory - get or set the GeneratorFactory on this parser - see below for details. The default generator factory is NoopFactory, which generates nothing.</li>
      <li>getSymbolTable - once a run method is called, the symbol table will be populated and can get queried.</li>
      <li>getCurrentDefinition - once a run method is called, the parser will contain a Definition object which represents the given wsdl file. Definition is a WSDL4J object.</li>
      <li>getWSDLURI - once the run method which takes a string is called, the parser will contain the string representing the location of the WSDL file. Note that the other run method - run(String context, Document wsdlDoc) - does not provide a location for the wsdl file. If this run method is used, getWSDLURI will be null.</li>
      <li>There are two run methods. The first, as shown above, takes a URI string which represents the location of the WSDL file. If you've already parsed the WSDL file into an XML Document, then you can use the second run method, which takes a context and the WSDL Document.</li>
    </ul>
    <p>An extension of this class would ...</p>
    <p><font color="#FF0000">NOTE: continue this sentiment...</font></p>
  </li>

  <li>WSDL2
    <p>Parser is the programmatic interface into the WSDL parser. WSDL2 is the command line tool for the parser. It provides an extensible framework for calling the Parser from the command line. It is named WSDL2 because extensions of it will likely begin with WSDL2: <b>WSDL2</b>Java, <b>WSDL2</b>Lisp, <b>WSDL2</b>XXX.</p>
    <div class="source"><pre class="prettyprint">public class WSDL2 {
  protected WSDL2();
  protected Parser createParser();
  protected Parser getParser();
  protected void addOptions(org.apache.axis.utils.CLOptionDescriptor[]);
  protected void parseOption(org.apache.axis.utils.CLOption);
  protected void validateOptions();
  protected void printUsage();
  protected void run(String[]);
  public static void main(String[]);
}</pre></div>
    <p>Like all good command line tools, it has a main method. Unlike some command line tools, however, its methods are not static. Static methods are not extensible. WSDL2's main method constructs an instance of itself and calls methods on that instance rather than calling static methods. These methods follow a behavior pattern. The main method is very simple:</p>
    <div class="source"><pre class="prettyprint">public static void main(String[] args) {
  WSDL2 wsdl2 = new WSDL2();
  wsdl2.run(args);
}</pre></div>
    <p>The constructor calls createParser to construct a Parser or an extension of Parser.</p>
    <p>run calls:</p>
    <ul>
      <li>parseOption to parse each command line option and call the appropriate Parser accessor. For example, when this method parses --verbose, it calls parser.setVerbose(true)</li>
      <li>validateOptions to make sure all the option values are consistent</li>
      <li>printUsage if the usage of the tool is in error</li>
      <li>parser.run(args);</li>
    </ul>
    <p>If an extension has additional options, then it is expected to call addOptions before calling run. So extensions will call, as necessary, getParser, addOptions, run. Extensions will override, as necessary, createParser, parseOption, validateOptions, printUsage.</p>
    <p>The generator framework consists of 2 files:</p>
    <ul>
      <li>Generator
        <p>The Generator interface is very simple. It just defines a generate method.</p>
        <div class="source"><pre class="prettyprint">public interface Generator
{
  public void generate() throws java.io.IOException;
}</pre></div>
      </li>
      <li>GeneratorFactory
        <div class="source"><pre class="prettyprint">public interface GeneratorFactory
{
  public void generatorPass(javax.wsdl.Definition, SymbolTable);
  public Generator getGenerator(javax.wsdl.Message, SymbolTable);
  public Generator getGenerator(javax.wsdl.PortType, SymbolTable);
  public Generator getGenerator(javax.wsdl.Binding, SymbolTable);
  public Generator getGenerator(javax.wsdl.Service, SymbolTable);
  public Generator getGenerator(TypeEntry, SymbolTable);
  public Generator getGenerator(javax.wsdl.Definition, SymbolTable);
  public void setBaseTypeMapping(BaseTypeMapping);
  public BaseTypeMapping getBaseTypeMapping();
}</pre></div>
        <p>The GeneratorFactory interface defines a set of methods that the parser uses to get generators. There should be a generator for each of the WSDL constructs (message, portType, etc - note that these depend on the WSDL4J classes: javax.xml.Message, javax.xml.PortType, etc); a generator for schema types; and a generator for the WSDL Definition itself. This last generator is used to generate anything that doesn't fit into the previous categories.</p>
        <p>In addition to the getGeneratorMethods, the GeneratorFactory defines a generatorPass method which provides the factory implementation a chance to walk through the symbol table to do any preprocessing before the actual generation begins.</p>
        <p>Accessors for the base type mapping are also defined. These are used to translate QNames to base types in the given target mapping.</p>
      </li>
    </ul>
    <p>In addition to Parser, WSDL2, Generator, and GeneratorFactory, the org.apache.axis.wsdl.gen package also contains a couple of no-op classes: NoopGenerator and NoopFactory. NoopGenerator is a convenience class for extensions that do not need to generate artifacts for every WSDL construct. For example, WSDL2Java does not generate anything for messages, therefore its factory's getGenerator(Message, SymbolTable) method returns an instance of NoopGenerator. NoopFactory returns a NoopGenerator for all getGenerator methods. The default factory for Parser is the NoopFactory.</p>
  </li>
</ul>

</div><div class="section"><h4>Code Generator Back End<a name="Code_Generator_Back_End"></a></h4>

<p>The meat of the WSDL2Java back end generators is in org.apache.axis.wsdl.toJava. Emitter extends Parser. org.apache.axis.wsdl.WSDL2Java extends WSDL2. JavaGeneratorFactory implements GeneratorFactory. And the various JavaXXXWriter classes implement the Generator interface.</p>

<p><font color="#FF0000">NOTE: Need lots more description here...</font></p>

</div><div class="section"><h4>WSDL Framework Extension Examples<a name="WSDL_Framework_Extension_Examples"></a></h4>

<p>Everything above sounds rather complex. It is, but that doesn't mean your extension has to be.</p>

<div class="section"><h5>Example 1 - Simple extension of WSDL2Java - additional artifact<a name="Example_1_-_Simple_extension_of_WSDL2Java_-_additional_artifact"></a></h5>

<p>The simplest extension of the framework is one which generates everything that WSDL2Java already generates, plus something new. Example 1 is such an extension. It's extra artifact is a file for each service that lists that service's ports. I don't know why you'd want to do this, but it makes for a good, simple example. See samples/integrationGuide/example1 for the complete implementation of this example.</p>

<ul>
  <li>First you must create your writer that writes the new artifact. This new class extends org.apache.axis.wsdl.toJava.JavaWriter. JavaWriter dictates behavior to its extensions; it calls writeFileHeader and writeFileBody. Since we don't care about a file header for this example, writeFileHeader is a no-op method. writeFileBody does the real work of this writer.
    <div class="source"><pre class="prettyprint">public class MyListPortsWriter extends JavaWriter {
  private Service service;
  public MyListPortsWriter(
      Emitter emitter,
      ServiceEntry sEntry,
      SymbolTable symbolTable) {
    super(emitter,
          new QName(
            sEntry.getQName().getNamespaceURI(),
            sEntry.getQName().getLocalPart() + &quot;Lst&quot;),
          &quot;&quot;,
          &quot;lst&quot;,
          &quot;Generating service port list file&quot;,
          &quot;service list&quot;);
    this.service = sEntry.getService();
  }
  protected void writeFileHeader() throws IOException {
  }
  protected void writeFileBody() throws IOException {
    Map portMap = service.getPorts();
    Iterator portIterator = portMap.values().iterator();

    while (portIterator.hasNext()) {
      Port p = (Port) portIterator.next();
      pw.println(p.getName());
    }
    pw.close();
  }
}</pre></div>
  </li>
  <li>Then you need a main program. This main program extends WSDL2Java so that it gets all the functionality of that tool. The main of this tool does 3 things:
    <ul>
      <li>instantiates itself</li>
      <li>adds MyListPortsWriter to the list of generators for a WSDL service</li>
      <li>calls the run method.</li>
    </ul>
    <p>That's it! The base tool does all the rest of the work.</p>
    <div class="source"><pre class="prettyprint">public class MyWSDL2Java extends WSDL2Java {

  public static void main(String args[]) {
    MyWSDL2Java myWSDL2Java = new MyWSDL2Java();

    JavaGeneratorFactory factory =
        (JavaGeneratorFactory) myWSDL2Java.getParser().getFactory();
    factory.addGenerator(Service.class, MyListPortsWriter.class);

    myWSDL2Java.run(args);
  }
}</pre></div>
  </li>
</ul>

</div><div class="section"><h5>Example 2 - Not quite as simple an extension of WSDL2Java - change an artifact<a name="Example_2_-_Not_quite_as_simple_an_extension_of_WSDL2Java_-_change_an_artifact"></a></h5>

<p>In this example, we'll replace deploy.wsdd with mydeploy.useless. For brevity, mydeploy.useless is rather useless. Making it useful is an exercise left to the reader. See samples/integrationGuide/example2 for the complete implementation of this example.</p>

<ul>
  <li>First, here is the writer for the mydeploy.useless. This new class extends org.apache.axis.wsdl.toJava.JavaWriter. JavaWriter dictates behavior to its extensions; it calls writeFileHeader and writeFileBody. Since we don't care about a file header for this example, writeFileHeader is a no-op method. writeFileBody does the real work of this writer. It simply writes a bit of a song, depending on user input.
    <p>Note that we've also overridden the generate method. The parser always calls generate, but since this is a server-side artifact, we don't want to generate it unless we are generating server-side artifacts (in other words, in terms of the command line options, we've specified the --serverSide option).</p>
    <div class="source"><pre class="prettyprint">public class MyDeployWriter extends JavaWriter {
  public MyDeployWriter(Emitter emitter, Definition definition,
      SymbolTable symbolTable) {
    super(emitter,
          new QName(definition.getTargetNamespace(), &quot;deploy&quot;),
          &quot;&quot;,
          &quot;useless&quot;,
          &quot;Generating deploy.useless&quot;, &quot;deploy&quot;);
  }
  public void generate() throws IOException {
    if (emitter.isServerSide()) {
      super.generate();
    }
  }
  protected void writeFileHeader() throws IOException {
  }
  protected void writeFileBody() throws IOException {
    MyEmitter myEmitter = (MyEmitter) emitter;
    if (myEmitter.getSong() == MyEmitter.RUM) {
      pw.println(&quot;Yo!  Ho!  Ho!  And a bottle of rum.&quot;);
    }
    else if (myEmitter.getSong() == MyEmitter.WORK) {
      pw.println(&quot;Hi ho!  Hi ho!  It's off to work we go.&quot;);
    }
    else {
      pw.println(&quot;Feelings...  Nothing more than feelings...&quot;);
    }
    pw.close();
  }
}</pre></div>
  </li>
  <li>Since we're changing what WSDL2Java generates, rather than simply adding to it like the previous example did, calling addGenerator isn't good enough. In order to change what WSDL2Java generates, you have to create a generator factory and provide your own generators. Since we want to keep most of WSDL2Java's artifacts, we can simply extend WSDL2Java's factory - JavaGeneratorFactory - and override the addDefinitionGenerators method.
    <div class="source"><pre class="prettyprint">public class MyGeneratorFactory extends JavaGeneratorFactory {
  protected void addDefinitionGenerators() {
    // WSDL2Java's JavaDefinitionWriter
    addGenerator(Definition.class, JavaDefinitionWriter.class);

    // our DeployWriter
    addGenerator(Definition.class, MyDeployWriter.class);

    // WSDL2Java's JavaUndeployWriter
    addGenerator(Definition.class, JavaUndeployWriter.class);
  }
}</pre></div>
  </li>

  <li>Now we must write the API's to our tool. Since we've added an option - song - we need both the programmatic API - an extension of Parser (actually Emitter in this case since we're extending WSDL2Java and Emitter is WSDL2Java's parser extension) - and the command line API.
    <p>Here is our programmatic API. It adds song accessors to Emitter. It also, in the constructor, lets the factory know about the emitter and the emitter know about the factory.</p>
    <div class="source"><pre class="prettyprint">public class MyEmitter extends Emitter {
  public static final int RUM  = 0;
  public static final int WORK = 1;
  private int song = -1;

  public MyEmitter() {
    MyGeneratorFactory factory = new MyGeneratorFactory();
    setFactory(factory);
    factory.setEmitter(this);
  }
  public int getSong() {
    return song;
  }
  public void setSong(int song) {
    this.song = song;
  }
}</pre></div>
    <p>And here is our command line API. It's a bit more complex that our previous example's main program, but it does 2 extra things:</p>
    <ol style="list-style-type: decimal">
      <li>accept a new command line option: --song rum|work (this is the biggest chunk of the new work).</li>
      <li>create a new subclass of Parser</li>
    </ol>
    <div class="source"><pre class="prettyprint">public class WSDL2Useless extends WSDL2Java {
  protected static final int SONG_OPT = 'g';
  protected static final CLOptionDescriptor[] options
    = new CLOptionDescriptor[]{
        new CLOptionDescriptor(&quot;song&quot;,
            CLOptionDescriptor.ARGUMENT_REQUIRED,
            SONG_OPT,
            &quot;Choose a song for deploy.useless:  work or rum&quot;)
  };

  public WSDL2Useless() {
    addOptions(options);
  }
  protected Parser createParser() {
    return new MyEmitter();
  }
  protected void parseOption(CLOption option) {
    if (option.getId() == SONG_OPT) {
      String arg = option.getArgument();
      if (arg.equals(&quot;rum&quot;)) {
        ((MyEmitter) parser).setSong(MyEmitter.RUM);
      }
      else if (arg.equals(&quot;work&quot;)) {
        ((MyEmitter) parser).setSong(MyEmitter.WORK);
      }
    }
    else {
      super.parseOption(option);
    }
  }
  public static void main(String args[]) {
    WSDL2Useless useless = new WSDL2Useless();

    useless.run(args);
  }
}</pre></div>
    <p>Let's go through this one method at a time.</p>
    <ul>
      <li>constructor - this constructor adds the new option --song rum|work. (the abbreviated version of this option is &quot;-g&quot;, rather an odd abbreviation, but &quot;-s&quot; is the abbreviation for --serverSide and &quot;-S&quot; is the abbreviation for --skeletonDeploy. Bummer. I just picked some other letter.)</li>
      <li>createParser - we've got to provide a means by which the parent class can get our Parser extension.</li>
      <li>parseOption - this method processes our new option. If the given option isn't ours, just let super.parseOption do its work.</li>
      <li>main - this main is actually simpler than the first example's main. The first main had to add our generator to the list of generators. In this example, the factory already did that, so all that this main must do is instantiate itself and run itself.</li>
    </ul>
  </li>
</ul>

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

</div>

<div class="section"><h2>Client SSL<a name="Client_SSL"></a></h2>

<p>The default pluggable secure socket factory module (see <a href="#PluggableAPIs">Pluggable APIs</a>) uses JSSE security. Review the JSSE documentation for details on installing, registering, and configuring JSSE for your runtime environment.</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>