<!--
  ~ 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.
  -->

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta name="generator" content=
"HTML Tidy for Windows (vers 14 June 2007), see www.w3.org" />
<title>ADB Integration With Axis2</title>
</head>
<body>
<h1>ADB Integration With Axis2</h1>
<p>This document will assist you in writing an extension using the
integrator in order to integrate ADB with Axis2.</p>
<h2>Content</h2>
<ul>
<li><a href="#intro">Introduction</a></li>
<li><a href="#select_modes">Selection of Generation Modes for
ADB</a></li>
<li><a href="#remember">Things to Remember</a></li>
</ul>
<h2><a name="intro" id="intro">Introduction</a></h2>
<p>ADB Integration with Axis2 is simple and straightforward. Given
the extension mechanism of the Axis2 code generator, the obvious
choice for the integrator is to write an extension. The extension
that is added to support ADB is the SimpleDBExtension
(<strong>org.apache.axis2.wsdl.codegen.extension.SimpleDBExtension</strong>)
and can be found in the extensions list of the
codegen-config.properties file.</p>
<a name="select_modes" id="select_modes"></a>
<h2>Selection of Generation Modes for ADB</h2>
<p>The extension sets the options for the code generator via the
CompilerOptions, depending on the user's settings. The following
table summarizes the use of options. Please refer to the <a href=
"adb-howto.html">ADB-How to document</a> for the
different generation modes and their descriptions.</p>
<table>
<tbody>
<tr>
<td><strong>User parameters</strong></td>
<td><strong>Selected code generation parameters</strong></td>
</tr>
<tr>
<td>None (no parameter other than mandatory ones)</td>
<td>wrapClasses=false,writeClasses=false</td>
</tr>
<tr>
<td>-ss (server side)</td>
<td>wrapClasses=false,writeClasses=true</td>
</tr>
<tr>
<td>-u (unwrap classes)</td>
<td>wrapClasses=false,writeClasses=true</td>
</tr>
</tbody>
</table>
<p>The following parameters (prefixed with -E) can be used to
override these settings manually:</p>
<table>
<tbody>
<tr>
<td><strong>Parameter Name</strong></td>
<td><strong>Allowed values</strong></td>
<td><strong>Description</strong></td>
</tr>
<tr>
<td>r</td>
<td>true, false</td>
<td>Sets the write flag. If set to true the classes will be written
by ADB</td>
</tr>
<tr>
<td>w</td>
<td>true, false</td>
<td>Sets the wrapping flag. if true the classes will be
wrapped.</td>
</tr>
</tbody>
</table>
<p>Note that these parameters have no corresponding long names and
MUST be prefixed with a -E to be processed by the code generator.
For example:</p>
<pre>
WSDL2Java .... -Er true
</pre>
<a name="remember" id="remember"></a>
<h2>Things to Remember</h2>
<ol>
<li>SimpleDBExtension is for the ADB databinding framework only and
will process requests only when this framework is specified during
code generation (using the switch -d adb). In the most recent
release, the default has been set as ADB and hence if the -d option
is missing then the databinding framework will be ADB.</li>
</ol>
<hr />
</body>
</html>
