damitha 2004/02/10 21:52:50
Added: targets/axis/cpp lininstall-guide.ihtml linuser-guide.ihtml
Log:
Revision Changes Path
1.1 ws-site/targets/axis/cpp/lininstall-guide.ihtml
Index: lininstall-guide.ihtml
===================================================================
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Axis C++ Linux Installation Guide</title>
<style type="text/css">
.command {color: #B20000;
text-indent: 60pt;
font-family: helvetica;
font-weight: bold}</style>
<meta name="generator" content="amaya 8.1b, see http://www.w3.org/Amaya/">
</head>
<body>
<h1>Installing and deploying web applications using xml-AxisC++</h1>
<p></p>
<h1>Contents</h1>
<ul>
<li><a href="#Introducti">Introduction</a></li>
<li><a href="#What">What You Need</a></li>
<li><a href="#Installati">Installing On Linux</a></li>
<li><a href="#Installing">Installing expat</a></li>
<li><a href="#Installing1">Installing Apache</a></li>
<li><a href="#Installing2">Installing AxisC++</a></li>
<li><a href="#Validating">Validating The Installation</a></li>
</ul>
<p><a name="Introducti"></a></p>
<h1>Introduction</h1>
<p>This document describes how to install Apache Axis C++. It assumes you
already know how to write and run C++/C code and not scared away by XML. You
should also have familiarity with Web servers. This version of Axis C++ is
tested on Apache web server.</p>
<p>For more details on using Axis C++, please see the <a
href="linuser-guide.html">user guide</a>.This will instruct you how to
install Axis C++ on Linux and Windows</p>
<p></p>
<p><a name="What"></a></p>
<h1>What You need</h1>
<p>It needs a few helper libraries, for logging, WSDL processing and
introspection. You need to have following in order to run Axis C++ engine.</p>
<ul>
<li>expat parser</li>
<li>Apache</li>
</ul>
<p></p>
<p><a name="Installati"></a></p>
<h1>Installation On Linux</h1>
<p>We tested with the following</p>
<ul>
<li>Redhat Linux 8.0(2.4.18-14) RedhatLinux9.0(2.4.20-8), Mandrake8.0(2.4.8-26)</li>
<li>Apache 1.3 [apache_1.3.27.tar .gz, apache_1.3.28.tar.gz)] (Source), Apache2.0 (source)</li>
<li>expat [expat-1.95.7.tar.gz](Source) >(Source)</li>
</ul>
<p></p>
<p><b>Downloading the source or binary from the mirror site and setting the
environment variables</b></p>
<p>You can download the Axis C++ source or binary from one of the apache
mirror sites<a href="http://ws.apache.org/axis/cpp/download.html">http://ws.apache.org/axis/cpp/download.html</a></p>
<p></p>
<p>Your downloaded distribution is axis-c-src-1_0-linux.tar.gz. After you
extracting it for example as,
<strong>/home/axisuser/projects/axis-c-src-1_0-linux</strong> you can
rename it as <strong>axis_c</strong></p>
<p></p>
<p>You have to set the environment variable $AXISCPP_HOME to the directory where you extracted the tar ball.. We further assume that the user dose the
installation and has the linux user account axisuser. For example I have my
<AXISCPP_HOME> as following.</p>
<p>/home/axisuser/projects</p>
<p><a name="Installing"></a></p>
<h1>Installing expat</h1>
<p>You can get expat from
the uri <a href="http://sourceforge.net/projects/expat/">http://sourceforge.net/projects/expat/</a></p>
<p></p>
<p>You have to follow the expat installation guide to install it </p>
<p></p>
<p><a name="Installing1"></a></p>
<h1>Installing Apache</h1>
<p>Get the apache downloadable software. (We used the source
apache_1.3.27.tar.gz). Build it with sharable module support.</p>
<p><strong>$ ./configure --enable-module=so</strong></p>
<p>Note:- Here "so" is simple letters</p>
<p></p>
<p><strong>$ make</strong></p>
<p><strong>$ make install</strong></p>
<p></p>
<p>Starting the Apache server</p>
<p></p>
<p><strong>$ usr/local/apache/bin/apachectl start</strong></p>
<p class="command"><span class="command"></span></p>
<p>Stopping the Apache Server</p>
<p></p>
<p><strong>$ usr/local/apache/bin/apachectl stop</strong></p>
<p><a name="Installing2"></a></p>
<h1>Installing Axis C++</h1>
<p>Create an environment variable called AXISCPP_HOME.</p>
<p><strong>$ cd /home/axisuser</strong></p>
<p class="command"><span class="command"></span></p>
<p><strong>[axisuser@localhost axisuser]$ vi ./.bash_profile</strong></p>
<p></p>
<p><strong>AXISCPP_HOME="/home/axisuser/projects/axis_c"</strong></p>
<p></p>
<p><strong>export AXISCPP_HOME</strong></p>
<p class="command"><span class="command"></span></p>
<p>Save it and back in the terminal window.</p>
<p><strong>$ source ~/.bash_profile</strong></p>
<p class="command"><span class="command"></span></p>
<p>Verify the above change had been correctly effected by typing</p>
<p></p>
<p><strong>$ echo $AXISCPP_HOME</strong></p>
<p class="command"><span class="command"></span></p>
<p>Copy expat.h include file</p>
<p><strong>$ cp -f <expat instdirectory>/include/expat.h/*
$AXISCPP_HOME /include/expat/</strong></p>
<p>Copy the expat libraries</p>
<p><strong>$ cp -f <expatinstdirectory>/lib/* /usr/lib/</strong></p>
<p class="command"><span class="command"></span></p>
<p>Copy apache include files</p>
<p><strong>$ cp -f <apacheinstdirectory>/include/*
$AXISCPP_HOME/include/apache1_3/</strong></p>
<p class="command"><span class="command"></span></p>
<p><strong>$ cd $AXISCPP_HOME</strong></p>
<p class="command"><span class="command"></span></p>
<p>To Build from the Axis C++ source execute these.</p>
<p></p>
<p><strong>$ sh autogen.sh</strong></p>
<p><strong>$ sh runconfig</strong></p>
<p><strong>$ make</strong></p>
<p><strong>$ make install</strong></p>
<p>
<p>
-----------------------------------------------------------------------
</p>
<strong>NOTE: </strong>If you use apache2.0 following two small changes has to be done in $AXISCPP_HOME/configure.ac and $AXISCPP_HOME/src/server/Makefile.am)
</p>
<p>
in $AXISCPP_HOME/configure.ac
</p>
<p>
comment
</p>
<p>
<strong>
AC_OUTPUT(Makefile src/Makefile src/common/Makefile src/engine/Makefile src/soap/Makefile src/wsdd/Makefile src/xml/Makefile src/server/Makefile src/server/apache/Makefile)
</strong>
</p>
<p>
and uncomment
</p>
<p>
<strong>
#AC_OUTPUT(Makefile src/Makefile src/common/Makefile src/engine/Makefile src/soap/Makefile src/wsdd/Makefile src/xml/Makefile src/server/Makefile src/server/apache2/Makefile)
</strong>
</p>
<p>
in $AXISCPP_HOME/src/server/Makefile.am
</p>
<p>
change
SUBDIRS = apache
to
SUBDIRS = apache2
</p>
<p>
-----------------------------------------------------------------
</p>
<p>Now libaxiscpp_mod.so (If you built for apache2 this is libaxiscpp_mod2.so) should have been created in $AXISCPP_HOME/bin directory. Note:- you can give the install path inside the runconfigure
script.</p>
<p></p>
<p>Now you need to edit /usr/local/apache/conf/httpd.conf</p>
<p><strong>$ vi /usr/local/apache/conf/httpd.conf</strong></p>
<p class="command"><span class="command"></span></p>
<p>At the bottom of the file you have to include following lines and save
it.</p>
<p></p>
<p><strong>LoadModule axis_module libexec/libaxiscpp_mod.so (in apache2 replace libexec with modules and libaxiscpp_mod.so with libaxiscpp_mod2.so)</strong></p>
<p><strong><Location /axis></strong></p>
<p><strong>SetHandler axis</strong></p>
<p><strong></Location></strong></p>
<p class="command"><span class="command"></span></p>
<p>Copy $AXISCPP_HOME/bin/libaxiscpp_mod.so into
/usr/local/Apache/libexec/ (in apache2 replace libexec with modules and libaxiscpp_mod.so with libaxiscpp_mod2.so)</p>
<p><strong>$cp -f $AXISCPP_HOME/bin/libaxiscpp_mod.so
/usr/local/apache/libexec (in apache2 replace
libexec with modules and libaxiscpp_mod.so with libaxiscpp_mod2.so)</strong></p>
<p class="command"><span class="command"></span></p>
<p>Restart apache</p>
<p><a name="Validating"></a></p>
<h1>Validating The Installation</h1>
<p>If you have done installation successfully it will display the Axis C++
welcome page when you point to URI <a
href="http://localhost/axis">http://localhost/axis</a>.</p>
<p></p>
<p><b>Deploying a Web Service Using InteropBase.wsdl</b></p>
<p>You can deploy your own web service or the sample webservices with the
guidance in the <a href="linuser-guide.html">userguide</a></p>
<p></p>
<p>WSDL2Ws tool must run on a jvm.</p>
</body>
</html>
1.1 ws-site/targets/axis/cpp/linuser-guide.ihtml
Index: linuser-guide.ihtml
===================================================================
<html>
<head>
<meta http-equiv="Content-Type" content="text/html">
<title>Axis C++ User Guide</title>
</head>
<body>
<h1>Contents</h1>
<dl>
<dt><a href="#Introducti">Introduction</a></dt>
<dt><a href="#What">What's in this release</a></dt>
<dt><a href="#Axis">Axis C++ now delivers the following key
features</a></dt>
<dt><a href="#What1">What's Missing</a></dt>
<dt><a href="#Installing">Installing Axis and Using this Guide</a></dt>
<dt><a href="#Download">Download Source Distribution</a></dt>
<dd><a href="#Server">ServerSide Skeleton and Wrappers generated by
WSDL2ws Tool.</a></dd>
<dd><a href="#Deploying">Deploying Services</a></dd>
<dd><a href="#Client">Client side Stubs Generated by the wsdl2ws
Tool</a></dd>
<dd><a href="#Handler">Handler Sample</a></dd>
<dt><a href="#Download1">Download Binary</a></dt>
<dd><a href="#Server1">ServerSide Skeleton and Wrappers generated by
WSDL2ws Tool.</a></dd>
<dd><a href="#Deploying1">Deploying Services</a></dd>
<dd><a href="#Client1">Client side Stubs Generated by the wsdl2ws
Tool</a></dd>
<dd><a href="#Handler1">Handler Sample</a></dd>
<dt><a href="#Getting">Getting a CVS checkout</a></dt>
</dl>
<p><a name="Introducti"></a></p>
<h1>Introduction</h1>
<p>Welcome to Axis C++, the opensource c++ implementation of SOAP ! What is
SOAP? SOAP is an XML-based communication protocol and encoding format for
inter-application communication. Originally conceived by Microsoft and
Userland software, it has evolved through several generations and the current
spec, SOAP 1.2 is fast growing in popularity and usage. The W3C's XML
Protocol working group is in the process of turning SOAP into a true open
standard, and as of this writing has released a working draft of SOAP 1.2,
which cleans up some of the more confusing areas of the 1.1 spec. SOAP is
widely viewed as the backbone to a new generation of cross-platform
cross-language distributed computing applications, termed Web Services. What
is Axis C++? Axis C++ is essentially a SOAP engine.</p>
<p></p>
<p>This version is written in C++. Axis C++ SOAP engine adopts most of Axis
Java architecture. But it has some major architectural innovations over Axis
Java in order to achieve greater performance and efficiency.</p>
<p><a name="What"></a></p>
<h1>What's in this release?</h1>
<p>- Soap engine with both client and server support</p>
<p>- Partial support for both SOAP 1.1 and SOAP 1.2</p>
<p>- WSDD based deployment with dynamic deployment tools.</p>
<p>- Support for all basic types, Complex types and Arrays</p>
<p>- WSDL2WS tool for building C/C++ components</p>
<p>- Server side – Skeletons and Wrappers</p>
<p>- Client side – Stubs</p>
<p>- WSDL2WS tool that generates wrappers, which perform the following
functions. These wrappers act as RPC Providers.</p>
<p>- Serialization</p>
<p>- Deserialization</p>
<p>- Method invocation</p>
<p>- WSDLs hosted statistically in the server.</p>
<p>- Standalone server (with HTTP support)</p>
<p>- Web server modules for Apache 1.3 & (Linux/Windows)</p>
<p>- Basic Wrapper Class Generator tool with following functionalities.</p>
<p>- Wrapping existing systems as web services</p>
<p>- WSDL generation</p>
<p>- Web interface to the deployed services and their WSDL s.</p>
<p>- Sample web services and client applications.</p>
<p><a name="Axis"></a></p>
<h1>Axis C++ now delivers the following key features</h1>
<p>- Speed: Axis uses SAX (event-based) parsing to acheive significantly
greater speed than earlier versions of Apache</p>
<p>SOAP.</p>
<p>- Flexibility</p>
<p>- Stability , Component oriented Deployment</p>
<p>- Transport Framework</p>
<p>- WSDL support</p>
<p></p>
<p>AxisC++ 1.0supports the Web Service Description Language, version 1.1,
which allows you to easily build stubs to access remote services, and also to
automatically export machine-readable descriptions of your deployed services
from Axis. We hope you enjoy using Axis c++ 1.0. Please note that this is an
open-source effort - if you feel the code could use some new features or
fixes, please get involved and lend a hand! The Axis developer community
welcomes your participation. Let us know what you think! Please send feedback
about the package to <a
href="mailto:axis-user@xml.apache.org">axis-user@xml.apache.org</a></p>
<p><a name="What1"></a></p>
<h1>What's Missing ?</h1>
<p>Full SOAP 1.2 support.</p>
<p><a name="Installing"></a></p>
<h1>Installing Axis and Using this Guide</h1>
<p>See the Axis Installation Guide for instructions on installing Axis C++</p>
<p></p>
<p><strong>Sample tests using InteropBase.wsdl: for Linux Users</strong></p>
<p>Before running the examples in this guide, you'll need to make sure that
your environment variables and other configurations are set correctly as
described in Installation guide. That is you need</p>
<p></p>
<p>- Axis C++</p>
<p>- Apache1.3 (or Apache2.0)</p>
<p>- expat</p>
<p>- j2SDK1.4</p>
<p></p>
<p>installed and configured.</p>
<p><a name="Download"></a></p>
<h1>Download Source Distribution</h1>
<p>Let's take a look at a sample InteropBase service client that will call
methods of a InteropBase service deployed on Axis C++. You can find the
<strong>InteropBase.wsdl</strong> for this example at</p>
<p></p>
<p><strong>$AXISCPP_HOME/samples/client/interoptests/base </strong></p>
<p></p>
<p></p>
<p>When starting with the valid WSDL file to use Axis C++ you have to get
started with the tool called WSDL2Ws which is written in Java. source for
WSDL2Ws tool is in</p>
<p></p>
<p><strong>$AXISCPP_HOME/src/wsdl</strong></p>
<p></p>
<p>You need the following jar files included in the
<strong>CLASSPATH</strong> .</p>
<p></p>
<p>- axis.jar</p>
<p>- commons-discovery.jar</p>
<p>- commons-logging.jar</p>
<p>- jaxrpc.jar</p>
<p>- saaj.jar</p>
<p>- wsdl4j.jar</p>
<p>- xml-apis.jar</p>
<p></p>
<p>The <strong>CLASSPATH</strong> Environment Variable should have the
absolute paths of the jars (including the jar file name) given as a colon
separated list</p>
<p></p>
<p>Here is a sample <strong>/home/axisuser/.bash_profile</strong> file where
we specified those</p>
<p></p>
<p><strong>AXIS_JARS_HOME="$AXISCPP_HOME/lib/axisjava"</strong></p>
<p></p>
<p><strong>AXIS_JARS="$AXIS_JARS_HOME/axis-<br>
</strong><strong>ant.jar:$AXIS_JARS_HOME/axis.jar:$AXIS_JARS_HOME/commons-<br>
</strong><strong>discovery.jar:$AXIS_JARS_HOME/commons-<br>
</strong><strong>logging.jar:$AXIS_JARS_HOME/jaxrpc.jar:$AXIS_JARS_HOME/log4j-<br>
</strong><strong>1.2.4.jar:$AXIS_JARS_HOME/saaj.jar:$AXIS_JARS_HOME/wsdl4j.jar"</strong></p>
<p></p>
<p><strong>JAVA_HOME="/usr/java"</strong></p>
<p></p>
<p><strong>PATH="$PATH:$JAVA_HOME/bin:."</strong></p>
<p></p>
<p><strong>CLASSPATH="$CLASSPATH:./:$JAVA_HOME/lib:$AXIS_JARS:"</strong></p>
<p></p>
<p><strong>export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC
AXIS_JARS_HOME</strong></p>
<p><strong>AXIS_JARS JAVA_HOME CLASSPATH</strong></p>
<p></p>
<p>Now</p>
<p></p>
<p><strong>$ cd $AXISCPP_HOME/src/wsdl/</strong></p>
<p></p>
<p><strong>$ mkdir temp</strong></p>
<p></p>
<p><strong>$javac -d ./temp -sourcepath .
./org/apache/axis/wsdl/wsdl2ws/*.java</strong></p>
<p></p>
<p><strong>$cd temp</strong></p>
<p></p>
<p><strong>$jar -cvf wsdl2ws.jar org</strong></p>
<p></p>
<p><strong>$cp -f wsdl2ws.jar $AXISCPP_HOME/lib/axis</strong></p>
<p></p>
<p>add this jar to the classpath as well.</p>
<p><a name="Server"></a></p>
<h1>Server side Skeleton And Wrappers Generated by the wsdl2ws Tool</h1>
<p>We use the sample at</p>
<p></p>
<p><strong>$AXISCPP_HOME/src/server/samples/interoptests/base.</strong></p>
<p></p>
<p>We use this sample to demonstrate the generation of serverside skeletons
and how to deploy a web service using it.</p>
<p></p>
<p>Inside this folder you will find InteropBase.wsdl file using which we
generate skeleton and Wrappers. Here is the command line arguments to
generate the skeleton.</p>
<p></p>
<p><strong>cd $AXISCPP_HOME/server/samples/interoptests/base</strong></p>
<p></p>
<p><strong>% java org.apache.axis.wsdl.wsdl2ws.WSDL2Ws InteropBase.wsdl -lc++
-sserver</strong></p>
<p></p>
<p>Note: If you give <strong>-o. /GenClassesServer</strong> then the server
create a folder named GenClassServer and put the source there. Otherwise the
source is put in the current folder where the tool is run.</p>
<p></p>
<p>In this sample it generates</p>
<p></p>
<p>- ArrayOffloat.h</p>
<p>- ArrayOfint.h</p>
<p>- ArrayOfSOAPStruct.h</p>
<p>- ArrayOfstring.h</p>
<p>- InteropTestPortType.h</p>
<p>- InteropTestPortTypeWrapper.h</p>
<p>- SOAPStruct.h</p>
<p>- InteropTestPortType.cpp</p>
<p>- InteropTestPortTypeService.cpp</p>
<p>- InteropTestPortTypeWrapper.cpp</p>
<p>- SOAPStruct.cpp</p>
<p></p>
<p>You can fill skeltons with your business logic. In this example it is done
for you in <strong>InteropTestPortType.Cpp</strong></p>
<p></p>
<p><strong>////////////////////////////////////</strong></p>
<p><strong>//This is the Service implementation CPP file genarated by
theWSDL2Ws.</strong></p>
<p><strong>// InteropTestPortType.cpp: implemtation for the
InteropTestPortType.</strong></p>
<p><strong>//</strong></p>
<p><strong>////////////////////////////////////</strong></p>
<p><strong>#include "InteropTestPortType.h"</strong></p>
<p><strong>InteropTestPortType::InteropTestPortType()</strong></p>
<p><strong>{</strong></p>
<p><strong>}</strong></p>
<p><strong>InteropTestPortType::~InteropTestPortType()</strong></p>
<p><strong>{</strong></p>
<p><strong>}</strong></p>
<p><strong>string InteropTestPortType::echoString(string Value0)</strong></p>
<p><strong>{</strong></p>
<p><strong>//Following line is not generated. You have to fill it. Here it is
filled for you.</strong></p>
<p><strong>return Value0;</strong></p>
<p><strong>}</strong></p>
<p><strong>ArrayOfstring InteropTestPortType::echoStringArray(ArrayOfstring
Value0)</strong></p>
<p><strong>{</strong></p>
<p><strong>//Following line is not generated. You have to fill it. Here it is
filled for you.</strong></p>
<p><strong>return Value0;</strong></p>
<p><strong>}</strong></p>
<p><strong>int InteropTestPortType::echoInteger(int Value0)</strong></p>
<p><strong>{</strong></p>
<p><strong>//Following line is not generated. You have to fill it. Here it is
filled for you.</strong></p>
<p><strong>}</strong></p>
<p><strong>ArrayOfint InteropTestPortType::echoIntegerArray(ArrayOfint
Value0)</strong></p>
<p><strong>{</strong></p>
<p><strong>//Following line is not generated. You have to fill it. Here it is
filled for you.</strong></p>
<p><strong>return Value0;</strong></p>
<p><strong>}</strong></p>
<p><strong>float InteropTestPortType::echoFloat(float Value0)</strong></p>
<p><strong>{</strong></p>
<p><strong>//Following line is not generated. You have to fill it. Here it is
filled for you.</strong></p>
<p><strong>return Value0;</strong></p>
<p><strong>}</strong></p>
<p><strong>ArrayOffloat InteropTestPortType::echoFloatArray(ArrayOffloat
Value0)</strong></p>
<p><strong>{</strong></p>
<p><strong>//Following line is not generated. You have to fill it. Here it is
filled for you.</strong></p>
<p><strong>return Value0;</strong></p>
<p><strong>}</strong></p>
<p><strong>SOAPStruct* InteropTestPortType::echoStruct(SOAPStruct*
Value0)</strong></p>
<p><strong>{</strong></p>
<p><strong>//Following line is not generated. You have to fill it. Here it is
filled for you.</strong></p>
<p><strong>return Value0;</strong></p>
<p><strong>}</strong></p>
<p><strong>ArrayOfSOAPStruct
InteropTestPortType::echoStructArray(ArrayOfSOAPStruct Value0)</strong></p>
<p><strong>{</strong></p>
<p><strong>//Following line is not generated. You have to fill it. Here it is
filled for you.</strong></p>
<p><strong>return Value0;</strong></p>
<p><strong>}</strong></p>
<p><strong>void InteropTestPortType::echoVoid()</strong></p>
<p><strong>{</strong></p>
<p><strong>}</strong></p>
<p><strong>Axis_Base64Binary
InteropTestPortType::echoBase64(Axis_Base64Binary Value0)</strong></p>
<p><strong>{</strong></p>
<p><strong>//Following line is not generated. You have to fill it. Here it is
filled for you.</strong></p>
<p><strong>return Value0;</strong></p>
<p><strong>}</strong></p>
<p><strong>Axis_DateTime InteropTestPortType::echoDate(Axis_DateTime
Value0)</strong></p>
<p><strong>{</strong></p>
<p><strong>//Following line is not generated. You have to fill it. Here it is
filled for you.</strong></p>
<p><strong>return Value0;</strong></p>
<p><strong>}</strong></p>
<p><strong>Axis_HexBinary InteropTestPortType::echoHexBinary(Axis_HexBinary
Value0)</strong></p>
<p><strong>{</strong></p>
<p><strong>//Following line is not generated. You have to fill it. Here it is
filled for you.</strong></p>
<p><strong>return Value0;</strong></p>
<p><strong>}</strong></p>
<p><strong>Axis_Decimal InteropTestPortType::echoDecimal(Axis_Decimal
Value0)</strong></p>
<p><strong>{</strong></p>
<p><strong>//Following line is not generated. You have to fill it. Here it is
filled for you.</strong></p>
<p><strong>return Value0;</strong></p>
<p><strong>}</strong></p>
<p><strong>Axis_Boolean InteropTestPortType::echoBoolean(Axis_Boolean
Value0)</strong></p>
<p><strong>{</strong></p>
<p><strong>//Following line is not generated. You have to fill it. Here it is
filled for you.</strong></p>
<p><strong>return Value0;</strong></p>
<p><strong>}</strong></p>
<p><a name="Deploying"></a></p>
<h1>Deploying the Service</h1>
<p></p>
<p>The Folder called deploy in the
<strong>$AXISCPP_HOME/</strong> should be copied to apache
root folder .Rename the deploy folder as <strong>"Axis"</strong>. Give all
permissions to this folder.</p>
<p></p>
<p><strong>$ cp –rf $AXISCPP_HOME/deploy
/usr/local/apache</strong></p>
<p><strong>$ cd /usr/local/apache</strong></p>
<p><strong>$ mv deploy Axis</strong></p>
<p><strong>$ chmod -R 777 Axis</strong></p>
<p></p>
<p>Now set the environment variable <strong>AXIS_HOME</strong> pointing to
this directory.</p>
<p></p>
<p><strong>AXIS_HOME="/usr/local/apache/Axis"</strong></p>
<p></p>
<p>Note that inside $AXIS_HOME directory there is a file called axiscpp.conf.
Make sure that it has read permissions. This file contains key, value pairs
of paths used by the Axis Soap Engine. You can change the WSDDFILEPATH and
AXISLOGPATH inside this file according to your choice.</p>
<p></p>
<p>Type the Following Command to build the service(You can always use
makefiles instead of the following commands to build.)</p>
<p></p>
<p><strong>cd $AXISCPP_HOME/samples/server/introptests/base</strong></p>
<p></p>
<p><strong>$ g++ -DHAVE_CONFIG_H -I. -I. -I.. -I$AXISCPP_HOME/include
-Wshadow -Wall</strong></p>
<p><strong>-pedantic -ansi -g -O2 -c ./*.cpp -fPIC</strong></p>
<p></p>
<p><strong>$ g++ -shared -Wl,--whole-archive -Wl,--no-whole-archive -I. -I..
-L$AXISCPP_HOME/lib/expat</strong></p>
<p><strong>-lexpat -Wl,-soname -Wl,libinteropbase.so.0 -o
libinteropbase.so ./*.o</strong></p>
<p></p>
<p>By typing this in the command line the dynamic library (
<strong>libinteropbase.so</strong> for example) is created which is used for
the deployment. This library has to be placed in</p>
<p></p>
<p><strong>$AXIS_HOME/webservices where $AXIS_HOME =
/usr/local/apache/Axis</strong></p>
<p></p>
<p>Modify the <strong>server.wsdd</strong>. Modify the server.wsdd
appropriate for your service. (You have a sample server.wsdd file given below
appropriately filled for this service).</p>
<p></p>
<p><strong><?xml version="1.0" encoding="UTF-8"?></strong><br>
<strong><deployment
xmlns="http://xml.apache.org/axis/wsdd/"xmlns:C="http://xml.apache.org/axis/wsdd/providers/c"></strong><br><br>
<strong>< service name="InteropBase" provider="C:RPC"
description="SOAPBuilders Interoperability Lab Round 2 base test suite
described at http://www.whitemesa.com/interop/proposal2.html
"></strong><br>
<strong>< parameter name="allowedMethods" value="echoString EchoInt
echoStringArray echoInteger echoIntegerArray echoFloat echoFloatArray
echoStruct echoStructArray echoVoid echoBase64 echoDate echoHexBinary
echoDecimal echoBoolean "/></strong><br>
<strong>< parameter name="className"
value="/usr/local/apache/Axis/webservices/libinteropbase.so"/></strong><br>
<strong>< /service></strong><br>
<strong></deployment></strong></p>
<p></p>
<p><strong>Note:</strong> You should make a backup of
<strong>$AXIS_HOME/conf/server.wsdd</strong> and edit the original file so
that it is exactly as above.</p>
<p></p>
<p>server.wsdd should be in</p>
<p><strong>/usr/local/apache/Axis/conf/</strong></p>
<p></p>
<p>Start the Apache server</p>
<p><strong>$ /usr/local/apache/bin/apachectl start</strong></p>
<p></p>
<p>Now open a browser and enter the link http://localhost:80/axis If the
service is correctly deployed then it will be displayed in a table of
deployed services which contain information such as service name, link to
wsdl and a description of the service.</p>
<p><a name="Client"></a></p>
<h1>Client side Stubs Generated by the wsdl2ws Tool</h1>
<p></p>
<p>WSDL2Ws tools will generate the stubs for the client side. You will have
C++ Client class and header file.</p>
<p></p>
<p><strong>cd $AXISCPP_HOME/samples/client/interoptests/base</strong></p>
<p></p>
<p><strong>$ java org.apache.axis.wsdl.wsdl2ws.WSDL2Ws InteropBase.wsdl -lc++
-sclient</strong></p>
<p></p>
<p><strong>Note:</strong> again if you specify
<strong>-o./GenClassesClient</strong> you will have source generated inside
GenClassClient folder instead of current folder where the tool is run. Before
compiling the client you have to write a class which contain a main method in
which InteropTestPortType instance is created and its methods are called.</p>
<p></p>
<p><strong>// InteropBaseClient.cpp : Defines the entry point for the console
application.</strong></p>
<p><strong>//</strong></p>
<p><strong>#include "InteropTestPortType.h"</strong></p>
<p><strong>#define ARRAYSIZE 2</strong></p>
<p><strong>int main(int argc, char* argv[])</strong></p>
<p><strong>{</strong></p>
<p><strong>int x;</strong></p>
<p><strong>char buffer[100];</strong></p>
<p><strong>InteropTestPortType ws;</strong></p>
<p><strong>printf("invoking echoString...\n");</strong></p>
<p><strong>//testing echoString</strong></p>
<p><strong>if (ws.echoString("hello world") == "hello world")</strong></p>
<p><strong>printf("successful\n");</strong></p>
<p><strong>else</strong></p>
<p><strong>printf("failed\n");</strong></p>
<p><strong>// testing echoStringArray</strong></p>
<p><strong>ArrayOfstring arrstr;</strong></p>
<p><strong>arrstr.m_Array = new string[ARRAYSIZE];</strong></p>
<p><strong>arrstr.m_Size = ARRAYSIZE;</strong></p>
<p><strong>for (x=0;x {</strong></p>
<p><strong>sprintf(buffer, "%dth element of string array", x);</strong></p>
<p><strong>arrstr.m_Array[x] = buffer;</strong></p>
<p><strong>}</strong></p>
<p><strong>printf("invoking echoStringArray...\n");</strong></p>
<p><strong>if (ws.echoStringArray(arrstr).m_Array != NULL)</strong></p>
<p><strong>printf("successful\n");</strong></p>
<p><strong>else</strong></p>
<p><strong>printf("failed\n");</strong></p>
<p><strong>// testing echoInteger</strong></p>
<p><strong>printf("invoking echoInteger...\n");</strong></p>
<p><strong>if (ws.echoInteger(56) == 56)</strong></p>
<p><strong>printf("successful\n");</strong></p>
<p><strong>else</strong></p>
<p><strong>printf("failed\n");</strong></p>
<p><strong>// testing echoIntegerArray</strong></p>
<p><strong>ArrayOfint arrint;</strong></p>
<p><strong>arrint.m_Array = new int[ARRAYSIZE];</strong></p>
<p><strong>arrint.m_Size = ARRAYSIZE;</strong></p>
<p><strong>for (x=0;x {</strong></p>
<p><strong>arrint.m_Array[x] = x;</strong></p>
<p><strong>}</strong></p>
<p><strong>printf("invoking echoIntegerArray...\n");</strong></p>
<p><strong>if (ws.echoIntegerArray(arrint).m_Array != NULL)</strong></p>
<p><strong>printf("successful\n");</strong></p>
<p><strong>else</strong></p>
<p><strong>printf("failed\n");</strong></p>
<p><strong>// testing echoFloat</strong></p>
<p><strong>printf("invoking echoFloat...\n");</strong></p>
<p><strong>if (ws.echoFloat(1.4214) > 1.42)</strong></p>
<p><strong>printf("successful\n");</strong></p>
<p><strong>else</strong></p>
<p><strong>printf("failed\n");</strong></p>
<p><strong>// testing echoFloat</strong></p>
<p><strong>ArrayOffloat arrfloat;</strong></p>
<p><strong>arrfloat.m_Array = new float[ARRAYSIZE];</strong></p>
<p><strong>arrfloat.m_Size = ARRAYSIZE;</strong></p>
<p><strong>for (x=0;x {</strong></p>
<p><strong>arrfloat.m_Array[x] = 1.1111*x;</strong></p>
<p><strong>}</strong></p>
<p><strong>printf("invoking echoFloatArray...\n");</strong></p>
<p><strong>if (ws.echoFloatArray(arrfloat).m_Array != NULL)</strong></p>
<p><strong>printf("successful\n");</strong></p>
<p><strong>else</strong></p>
<p><strong>printf("failed\n");</strong></p>
<p><strong>// testing echo Struct</strong></p>
<p><strong>SOAPStruct stct;</strong></p>
<p><strong>stct.varFloat = 12345.7346345;</strong></p>
<p><strong>stct.varInt = 5000;</strong></p>
<p><strong>stct.varString = "This is string in SOAPStruct";</strong></p>
<p><strong>printf("invoking echoStruct...\n");</strong></p>
<p><strong>if (ws.echoStruct(&stct) != NULL)</strong></p>
<p><strong>printf("successful\n");</strong></p>
<p><strong>else</strong></p>
<p><strong>printf("failed\n");</strong></p>
<p><strong>//testing echo Array of Struct</strong></p>
<p><strong>ArrayOfSOAPStruct arrstct;</strong></p>
<p><strong>arrstct.m_Array = new SOAPStruct[ARRAYSIZE];</strong></p>
<p><strong>arrstct.m_Size = ARRAYSIZE;</strong></p>
<p><strong>for (x=0;x {</strong></p>
<p><strong>arrstct.m_Array[x].varFloat = 1.1111*x;</strong></p>
<p><strong>arrstct.m_Array[x].varInt = x;</strong></p>
<p><strong>sprintf(buffer, "varString of %dth element of SOAPStruct array",
x);</strong></p>
<p><strong>arrstct.m_Array[x].varString = buffer;</strong></p>
<p><strong>}</strong></p>
<p><strong>//testing echo Struct Array</strong></p>
<p><strong>printf("invoking echoStructArray...\n");</strong></p>
<p><strong>if (ws.echoStructArray(arrstct).m_Array != NULL)</strong></p>
<p><strong>printf("successful\n");</strong></p>
<p><strong>else</strong></p>
<p><strong>printf("failed\n");</strong></p>
<p><strong>//testing echo void</strong></p>
<p><strong>printf("invoking echoVoid...\n");</strong></p>
<p><strong>ws.echoVoid();</strong></p>
<p><strong>printf("successful\n");</strong></p>
<p><strong>//testing echo base 64 binary</strong></p>
<p><strong>printf("invoking echoBase64...\n");</strong></p>
<p><strong>if (ws.echoBase64("</strong></p>
<p><strong>BCDF675E234242WHRTKMJDGKGUEJ898636JFJFHEJDGWTDHFJRURYGBCDHTWRSG")</strong></p>
<p><strong>=="BCDF675E234242WHRTKMJDGKGUEJ898636JFJFHEJDGWTDHFJRURYGBCDHTWRSG")
<br>
printf("successful\n");</strong></p>
<p><strong>else</strong></p>
<p><strong>printf("failed\n");</strong></p>
<p><strong>time_t tim;</strong></p>
<p><strong>time(&tim);</strong></p>
<p><strong>tm* lt = gmtime(&tim);</strong></p>
<p><strong>printf("invoking echoDate...\n");</strong></p>
<p><strong>if (memcmp(&ws.echoDate(*lt), lt, sizeof(tm)) ==
0)</strong></p>
<p><strong>printf("successful\n");</strong></p>
<p><strong>else</strong></p>
<p><strong>printf("failed\n");</strong></p>
<p><strong>//testing echo hex binary</strong></p>
<p><strong>printf("invoking echoHexBinary...\n");</strong></p>
<p><strong>if
(ws.echoHexBinary("CCCFFA46552BC7D5A09BC5F23DE9E0FE7862AD45BC87D02FEE")
==</strong></p>
<p><strong>"CCCFFA46552BC7D5A09BC5F23DE9E0FE7862AD45BC87D02FEE")</strong></p>
<p><strong>printf("successful\n");</strong></p>
<p><strong>else</strong></p>
<p><strong>printf("failed\n");</strong></p>
<p><strong>//testing echo decimal</strong></p>
<p><strong>printf("invoking echoDecimal...\n");</strong></p>
<p><strong>if (ws.echoDecimal(1234.567890) > 1234.56)</strong></p>
<p><strong>printf("successful\n");</strong></p>
<p><strong>else</strong></p>
<p><strong>printf("failed\n");</strong></p>
<p><strong>//testing echo boolean</strong></p>
<p><strong>printf("invoking echoBoolean...\n");</strong></p>
<p><strong>if (ws.echoBoolean(1) == 1)</strong></p>
<p><strong>printf("successful\n");</strong></p>
<p><strong>else</strong></p>
<p><strong>printf("failed\n");</strong></p>
<p><strong>getchar();</strong></p>
<p><strong>return 0;</strong></p>
<p><strong>}</strong></p>
<p>Creating the client library</p>
<p></p>
<p><strong>cd $AXISCPP_HOME/src/client</strong></p>
<p><strong>$sh autogen.sh</strong></p>
<p><strong>$sh runconfig</strong></p>
<p><strong>$make</strong></p>
<p><strong>$make install</strong></p>
<p></p>
<p>This will automatically create <strong>libaxiscpp_client.so</strong> and
copy it to the <strong>$AXISCPP_HOME/lib/axis</strong> (as configured in
runconfig script)</p>
<p></p>
<p>Now</p>
<p><strong>cd $AXISCPP_HOME/samples/client/interoptests/base</strong></p>
<p></p>
<p><strong>$ g++ -DHAVE_CONFIG_H -I. -I. -I.. -I$AXISCPP_HOME/include
-Wshadow -Wall -pedantic<br>
</strong><strong>- ansi -g -O2 -c ./*.cpp -fPIC</strong></p>
<p></p>
<p>
<strong>$ g++ -g -O2 -o interopbase InteropBaseClient.o SOAPStruct.o InteropTestPortType.o $AXISCPP_HOME/lib/axis/libaxiscpp_client.a $AXISCPP_HOME/bin/libaxiscpp_mod.a -L$AXISCPP_HOME/lib/expat -lexpat -ldl</strong><br>
</p>
<p></p>
<p>
Note that in the above command replace libaxiscpp_mod.a with libaxiscpp_mod2.a if you work with
apache2
</p>
<p>Start the Apache Server(Assuming base service is deployed.)</p>
<p><strong>$ /usr/local/apache/bin/apachectl start</strong></p>
<p>to run</p>
<p>
<strong>$ cd $AXISCPP_HOME/samples/client/interoptests/base
</p>
<p><strong>$ ./interopbase</strong></p>
<p><a name="Handler"></a></p>
<h1>Handler Sample</h1>
<p></p>
<p>If you want to test handlers go into the
<strong>$AXISCPP_HOME/src/server/handlers</strong> folder where example
handlers are included. Several sample handlers are included there covering the concepts of
service specific, global and transport handlers. We will show you the detail
of running a service specific handler named loghandler. The task of this
handler is writing to a file the number of times the service is accessed.</p>
<p></p>
<p><strong>cd
$AXISCPP_HOME/src/server/handlers/custom/loghandler</strong></p>
<p><strong>$sh autogen.sh</strong></p>
<p><strong>$sh runconfig</strong></p>
<p><strong>$make</strong></p>
<p><strong>$make install</strong></p>
<p></p>
<p>The handler library will be installed at
<strong>$(AXIS_HOME)/handlers/custom/loghandler</strong> Now edit the
<strong>$(AXIS_HOME)/conf/server.wsdd</strong> to include the handler for a
particular service.</p>
<p></p>
<p><strong><service name="InteropBase" provider="C:RPC"
description="SOAPBuilders Interoperability Lab Round</strong><br>
<strong>2 base test suite described at
http://www.whitemesa.com/interop/proposal2.html "></strong><br>
<strong><requestFlow name="calchandlers"></strong><br>
<strong><handler name="LogAccessCount"</strong><br>
<strong>type="/usr/local/apache/Axis/handlers/custom/loghandler/libloghandler.so"></strong><br>
<strong><parameter name="logAccessCountFile"</strong><br>
<strong>value="/usr/local/apache/Axis/handlers/custom/loghandler/LogAccessCountFile"/></strong><br>
<strong></handler></strong><br>
<strong></requestFlow></strong><br>
<strong><parameter name="allowedMethods" value="echoString EchoInt
echoStringArray</strong><br>
<strong>echoInteger echoIntegerArray echoFloat echoFloatArray echoStruct
echoStructArray echoVoid</strong><br>
<strong>echoBase64 echoDate echoHexBinary echoDecimal echoBoolean
"/></strong><br>
<strong><parameter name="className"
value="/usr/local/apache/Axis/webservices/libinteropbase.so"/></strong><br>
<strong></service></strong></p>
<p></p>
<p>Restart the apache web server and test your handler using the web service
client for InteropBase webservice. When the client is run an entry will be
added to
<strong>$AXIS_HOME/handlers/custom/loghandler/LogAccessCountFile</strong>
Note that the folder in which the LogAccessCountFile is created should have
write access. You can test the global handlers and transport handlers in a
similar manner. Note the change you have to make in server.wsdd. You can see
how this is done in the specimen folder
<strong>$AXISCPP_HOME/deploy/conf/server.wsdd</strong>.</p>
<p><a name="Download1"></a></p>
<h1>Download Binary Distribution</h1>
<p>Let's take a look at a sample InteropBase service client that will call
methods of a InteropBase service deployed on Axis C++. You can find the
<strong>InteropBase.wsdl</strong> for this example at</p>
<p></p>
<p><strong>$AXISCPP_HOME/deploy/wsdls</strong></p>
<p></p>
<p>You need the following jar files included in the
<strong>CLASSPATH</strong> .</p>
<p></p>
<p>- axis.jar</p>
<p>- commons-discovery.jar</p>
<p>- commons-logging.jar</p>
<p>- jaxrpc.jar</p>
<p>- saaj.jar</p>
<p>- wsdl4j.jar</p>
<p>- xml-apis.jar</p>
<p></p>
<p>The <strong>CLASSPATH</strong> Environment Variable should have the
absolute paths of the jars (including the jar file name) given as a colon
separated list</p>
<p></p>
<p>Here is a sample <strong>/home/axisuser/.bash_profile</strong> file where
we specified those</p>
<p></p>
<p><strong>AXIS_JARS_HOME="$AXISCPP_HOME/lib/axisjava"</strong></p>
<p></p>
<p><strong>AXIS_JARS="$AXIS_JARS_HOME/axis-</strong><br>
<strong>ant.jar:$AXIS_JARS_HOME/axis.jar:$AXIS_JARS_HOME/commons-</strong><br>
<strong>discovery.jar:$AXIS_JARS_HOME/commons-</strong><br>
<strong>logging.jar:$AXIS_JARS_HOME/jaxrpc.jar:$AXIS_JARS_HOME/log4j-</strong><br>
<strong>1.2.4.jar:$AXIS_JARS_HOME/saaj.jar:$AXIS_JARS_HOME/wsdl4j.jar"</strong></p>
<p></p>
<p><strong>JAVA_HOME="/usr/java"</strong></p>
<p></p>
<p><strong>PATH="$PATH:$JAVA_HOME/bin:."</strong></p>
<p><strong>CLASSPATH="$CLASSPATH:./:$JAVA_HOME/lib:$AXIS_JARS:$AXISCPP_HOME/lib/axis/wsdl2ws.jar"</strong></p>
<p></p>
<p><strong>export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC
AXIS_JARS_HOME</strong></p>
<p><strong>AXIS_JARS JAVA_HOME CLASSPATH</strong></p>
<p><a name="Server1"></a></p>
<h1>Server side Skeleton And Wrappers Generated by the wsdl2ws Tool .</h1>
<p>We use the sample at</p>
<p></p>
<p><strong>$AXISCPP_HOME/samples/server/interoptests/base</strong>.</p>
<p></p>
<p>We use this sample to demonstrate the generation of serverside skeletons
and how to deploy a web service using it.</p>
<p>Inside this folder you will find InteropBase.wsdl file using which we
generate skeleton and Wrappers. Here is the command line arguments to
generate the skeleton.</p>
<p></p>
<p><strong>cd $AXISCPP_HOME/samples/server/interoptests/base</strong></p>
<p></p>
<p><strong>% java org.apache.axis.wsdl.wsdl2ws.WSDL2Ws InteropBase.wsdl -lc++
-sserver</strong></p>
<p></p>
<p>Note: If you give <strong>-o. /GenClassesServer</strong> then the server
create a folder named GenClassServer and put the source there. Otherwise the
source is put in the current folder where the tool is run.</p>
<p></p>
<p>In this sample it generates</p>
<p></p>
<p>- ArrayOffloat.h</p>
<p>- ArrayOfint.h</p>
<p>- ArrayOfSOAPStruct.h</p>
<p>- ArrayOfstring.h</p>
<p>- InteropTestPortType.h</p>
<p>- InteropTestPortTypeWrapper.h</p>
<p>- SOAPStruct.h</p>
<p>- InteropTestPortType.cpp</p>
<p>- InteropTestPortTypeService.cpp</p>
<p>- InteropTestPortTypeWrapper.cpp</p>
<p>- SOAPStruct.cpp</p>
<p></p>
<p>You can fill skeltons with your business logic. In this example it is done
for you in <strong>InteropTestPortType.Cpp</strong></p>
<p></p>
<p><strong>/////////////////////////////////</strong></p>
<p><strong>//This is the Service implementation CPP file genarated by
theWSDL2Ws.</strong></p>
<p><strong>// InteropTestPortType.cpp: implemtation for the
InteropTestPortType.</strong></p>
<p><strong>//</strong></p>
<p><strong>////////////////////////////////</strong></p>
<p><strong>#include "InteropTestPortType.h"</strong></p>
<p><strong>InteropTestPortType::InteropTestPortType()</strong></p>
<p><strong>{</strong></p>
<p><strong>}</strong></p>
<p><strong>InteropTestPortType::~InteropTestPortType()</strong></p>
<p><strong>{</strong></p>
<p><strong>}</strong></p>
<p><strong>string InteropTestPortType::echoString(string Value0)</strong></p>
<p><strong>{</strong></p>
<p><strong>//Following line is not generated. You have to fill it. Here it is
filled for you.</strong></p>
<p><strong>return Value0;</strong></p>
<p><strong>}</strong></p>
<p><strong>ArrayOfstring InteropTestPortType::echoStringArray(ArrayOfstring
Value0)</strong></p>
<p><strong>{</strong></p>
<p><strong>//Following line is not generated. You have to fill it. Here it is
filled for you.</strong></p>
<p><strong>return Value0;</strong></p>
<p><strong>}</strong></p>
<p><strong>int InteropTestPortType::echoInteger(int Value0)</strong></p>
<p><strong>{</strong></p>
<p><strong>//Following line is not generated. You have to fill it. Here it is
filled for you.</strong></p>
<p><strong>}</strong></p>
<p><strong>ArrayOfint InteropTestPortType::echoIntegerArray(ArrayOfint
Value0)</strong></p>
<p><strong>{</strong></p>
<p><strong>//Following line is not generated. You have to fill it. Here it is
filled for you.</strong></p>
<p><strong>return Value0;</strong></p>
<p><strong>}</strong></p>
<p><strong>float InteropTestPortType::echoFloat(float Value0)</strong></p>
<p><strong>{</strong></p>
<p><strong>//Following line is not generated. You have to fill it. Here it is
filled for you.</strong></p>
<p><strong>return Value0;</strong></p>
<p><strong>}</strong></p>
<p><strong>ArrayOffloat InteropTestPortType::echoFloatArray(ArrayOffloat
Value0)</strong></p>
<p><strong>{</strong></p>
<p><strong>//Following line is not generated. You have to fill it. Here it is
filled for you.</strong></p>
<p><strong>return Value0;</strong></p>
<p><strong>}</strong></p>
<p><strong>SOAPStruct* InteropTestPortType::echoStruct(SOAPStruct*
Value0)</strong></p>
<p><strong>{</strong></p>
<p><strong>//Following line is not generated. You have to fill it. Here it is
filled for you.</strong></p>
<p><strong>return Value0;</strong></p>
<p><strong>}</strong></p>
<p><strong>ArrayOfSOAPStruct
InteropTestPortType::echoStructArray(ArrayOfSOAPStruct Value0)</strong></p>
<p><strong>{</strong></p>
<p><strong>//Following line is not generated. You have to fill it. Here it is
filled for you.</strong></p>
<p><strong>return Value0;</strong></p>
<p><strong>}</strong></p>
<p><strong>void InteropTestPortType::echoVoid()</strong></p>
<p><strong>{</strong></p>
<p><strong>}</strong></p>
<p><strong>Axis_Base64Binary
InteropTestPortType::echoBase64(Axis_Base64Binary Value0)</strong></p>
<p><strong>{</strong></p>
<p><strong>//Following line is not generated. You have to fill it. Here it is
filled for you.</strong></p>
<p><strong>return Value0;</strong></p>
<p><strong>}</strong></p>
<p><strong>Axis_DateTime InteropTestPortType::echoDate(Axis_DateTime
Value0)</strong></p>
<p><strong>{</strong></p>
<p><strong>//Following line is not generated. You have to fill it. Here it is
filled for you.</strong></p>
<p><strong>return Value0;</strong></p>
<p><strong>}</strong></p>
<p><strong>Axis_HexBinary InteropTestPortType::echoHexBinary(Axis_HexBinary
Value0)</strong></p>
<p><strong>{</strong></p>
<p><strong>//Following line is not generated. You have to fill it. Here it is
filled for you.</strong></p>
<p><strong>return Value0;</strong></p>
<p><strong>}</strong></p>
<p><strong>Axis_Decimal InteropTestPortType::echoDecimal(Axis_Decimal
Value0)</strong></p>
<p><strong>{</strong></p>
<p><strong>//Following line is not generated. You have to fill it. Here it is
filled for you.</strong></p>
<p><strong>return Value0;</strong></p>
<p><strong>}</strong></p>
<p><strong>Axis_Boolean InteropTestPortType::echoBoolean(Axis_Boolean
Value0)</strong></p>
<p><strong>{</strong></p>
<p><strong>//Following line is not generated. You have to fill it. Here it is
filled for you.</strong></p>
<p><strong>return Value0;</strong></p>
<p><strong>}</strong></p>
<p><a name="Deploying1"></a></p>
<h1>Deploying the Services</h1>
<p></p>
<p>The Folder called deploy in the
<strong>$AXISCPP_HOME/</strong> should be copied to apache
root folder .Rename the deploy folder as <strong>"Axis"</strong>. Give all
permissions to this folder.</p>
<p></p>
<p><strong>$ cp –rf $AXISCPP_HOME/deploy
/usr/local/apache</strong></p>
<p><strong>$ cd /usr/local/apache</strong></p>
<p><strong>$ mv deploy Axis</strong></p>
<p><strong>$ chmod -R 777 Axis</strong></p>
<p></p>
<p>Now set the environment variable <strong>AXIS_HOME</strong> pointing to
this directory.</p>
<p></p>
<p><strong>AXIS_HOME="/usr/local/apache/Axis"</strong></p>
<p></p>
<p>Type the Following Command to build the service(You can always use
makefiles instead of the following commands to build.)</p>
<p></p>
<p><strong>cd $AXISCPP_HOME/samples/server/introptests/base</strong></p>
<p></p>
<p><strong>$ g++ -DHAVE_CONFIG_H -I. -I. -I.. -I$AXISCPP_HOME/include
-Wshadow -Wall<br>
</strong><strong>-pedantic -ansi -g -O2 -c ./*.cpp -fPIC</strong></p>
<p></p>
<p><strong>$ g++ -shared -Wl,--whole-archive -Wl,--no-whole-archive -I. -I..
-L$AXISCPP_HOME/lib/expat -lexpat -Wl,-soname -Wl,libinteropbase.so.0 -o
libinteropbase.so ./*.o</strong></p>
<p></p>
<p>By typing this in the command line the dynamic library (
<strong>libinteropbase.so</strong> for example) is created which is used for
the deployment. This library has to be placed in</p>
<p></p>
<p><strong>$AXIS_HOME/webservices where $AXIS_HOME =
/usr/local/apache/Axis</strong></p>
<p></p>
<p>Modify the <strong>server.wsdd</strong>. Modify the server.wsdd
appropriate for your service. (You have a sample server.wsdd file given below
appropriately filled for this service).</p>
<p></p>
<p><strong><?xml version="1.0" encoding="UTF-8"?></strong><br>
<strong><deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:C="http://xml.apache.org/axis/wsdd/providers/c"></strong></p>
<br>
<strong>< service name="InteropBase" provider="C:RPC"
description="SOAPBuilders Interoperability Lab Round 2 base test suite
described at http://www.whitemesa.com/interop/proposal2.html
"></strong><br>
<strong>< parameter name="allowedMethods" value="echoString EchoInt
echoStringArray echoInteger echoIntegerArray echoFloat echoFloatArray
echoStruct echoStructArray echoVoid echoBase64 echoDate echoHexBinary
echoDecimal echoBoolean "/></strong><br>
<strong>< parameter name="className"
value="/usr/local/apache/Axis/webservices/libinteropbase.so"/></strong><br>
<strong>< /service></strong><br>
<strong></deployment></strong></p>
<p></p>
<p><strong>Note:</strong> You should make a backup of
<strong>$AXIS_HOME/conf/server.wsdd</strong> and edit the original file so
that it is exactly as above.</p>
<p></p>
<p>server.wsdd should be in</p>
<p><strong>usr/local/apache/Axis/conf/</strong></p>
<p></p>
<p>Start the Apache server</p>
<p><strong>$ usr/local/apache/bin/apachectl start</strong></p>
<p></p>
<p>Now open a browser and enter the link http://localhost:80/axis If the
service is correctly deployed then it will be displayed in a table of
deployed services which contain information such as service name, link to
wsdl and a description of the service.</p>
<p><a name="Client1"></a></p>
<h1>Client side Stubs Generated by the wsdl2ws Tool</h1>
<p></p>
<p>WSDL2Ws tools will generate the stubs for the client side. You will have
C++ Client class and header file.</p>
<p></p>
<p><strong>cd $AXISCPP_HOME/samples/client/interoptests/base</strong></p>
<p></p>
<p><strong>$ java org.apache.axis.wsdl.wsdl2ws.WSDL2Ws InteropBase.wsdl -lc++
-sclient</strong></p>
<p></p>
<p>Note: again if you specify <strong>-o./GenClassesClient</strong> you will
have source generated inside <strong>GenClassClient</strong> folder instead
of current folder where the tool is run. Before compiling the client you have
to write a class which contain a main method in which InteropTestPortType
instance is created and its methods are called.</p>
<p></p>
<p><strong>// InteropBaseClient.cpp : Defines the entry point for the console
application.</strong></p>
<p><strong>//</strong></p>
<p><strong>#include "InteropTestPortType.h"</strong></p>
<p><strong>#define ARRAYSIZE 2</strong></p>
<p><strong>int main(int argc, char* argv[])</strong></p>
<p><strong>{</strong></p>
<p><strong>int x;</strong></p>
<p><strong>char buffer[100];</strong></p>
<p><strong>InteropTestPortType ws;</strong></p>
<p><strong>printf("invoking echoString...\n");</strong></p>
<p><strong>//testing echoString</strong></p>
<p><strong>if (ws.echoString("hello world") == "hello world")</strong></p>
<p><strong>printf("successful\n");</strong></p>
<p><strong>else</strong></p>
<p><strong>printf("failed\n");</strong></p>
<p><strong>// testing echoStringArray</strong></p>
<p><strong>ArrayOfstring arrstr;</strong></p>
<p><strong>arrstr.m_Array = new string[ARRAYSIZE];</strong></p>
<p><strong>arrstr.m_Size = ARRAYSIZE;</strong></p>
<p><strong>for (x=0;x {</strong></p>
<p><strong>sprintf(buffer, "%dth element of string array", x);</strong></p>
<p><strong>arrstr.m_Array[x] = buffer;</strong></p>
<p><strong>}</strong></p>
<p><strong>printf("invoking echoStringArray...\n");</strong></p>
<p><strong>if (ws.echoStringArray(arrstr).m_Array != NULL)</strong></p>
<p><strong>printf("successful\n");</strong></p>
<p><strong>else</strong></p>
<p><strong>printf("failed\n");</strong></p>
<p><strong>// testing echoInteger</strong></p>
<p><strong>printf("invoking echoInteger...\n");</strong></p>
<p><strong>if (ws.echoInteger(56) == 56)</strong></p>
<p><strong>printf("successful\n");</strong></p>
<p><strong>else</strong></p>
<p><strong>printf("failed\n");</strong></p>
<p><strong>// testing echoIntegerArray</strong></p>
<p><strong>ArrayOfint arrint;</strong></p>
<p><strong>arrint.m_Array = new int[ARRAYSIZE];</strong></p>
<p><strong>arrint.m_Size = ARRAYSIZE;</strong></p>
<p><strong>for (x=0;x {</strong></p>
<p><strong>arrint.m_Array[x] = x;</strong></p>
<p><strong>}</strong></p>
<p><strong>printf("invoking echoIntegerArray...\n");</strong></p>
<p><strong>if (ws.echoIntegerArray(arrint).m_Array != NULL)</strong></p>
<p><strong>printf("successful\n");</strong></p>
<p><strong>else</strong></p>
<p><strong>printf("failed\n");</strong></p>
<p><strong>// testing echoFloat</strong></p>
<p><strong>printf("invoking echoFloat...\n");</strong></p>
<p><strong>if (ws.echoFloat(1.4214) > 1.42)</strong></p>
<p><strong>printf("successful\n");</strong></p>
<p><strong>else</strong></p>
<p><strong>printf("failed\n");</strong></p>
<p><strong>// testing echoFloat</strong></p>
<p><strong>ArrayOffloat arrfloat;</strong></p>
<p><strong>arrfloat.m_Array = new float[ARRAYSIZE];</strong></p>
<p><strong>arrfloat.m_Size = ARRAYSIZE;</strong></p>
<p><strong>for (x=0;x {</strong></p>
<p><strong>arrfloat.m_Array[x] = 1.1111*x;</strong></p>
<p><strong>}</strong></p>
<p><strong>printf("invoking echoFloatArray...\n");</strong></p>
<p><strong>if (ws.echoFloatArray(arrfloat).m_Array != NULL)</strong></p>
<p><strong>printf("successful\n");</strong></p>
<p><strong>else</strong></p>
<p><strong>printf("failed\n");</strong></p>
<p><strong>// testing echo Struct</strong></p>
<p><strong>SOAPStruct stct;</strong></p>
<p><strong>stct.varFloat = 12345.7346345;</strong></p>
<p><strong>stct.varInt = 5000;</strong></p>
<p><strong>stct.varString = "This is string in SOAPStruct";</strong></p>
<p><strong>printf("invoking echoStruct...\n");</strong></p>
<p><strong>if (ws.echoStruct(&stct) != NULL)</strong></p>
<p><strong>printf("successful\n");</strong></p>
<p><strong>else</strong></p>
<p><strong>printf("failed\n");</strong></p>
<p><strong>//testing echo Array of Struct</strong></p>
<p><strong>ArrayOfSOAPStruct arrstct;</strong></p>
<p><strong>arrstct.m_Array = new SOAPStruct[ARRAYSIZE];</strong></p>
<p><strong>arrstct.m_Size = ARRAYSIZE;</strong></p>
<p><strong>for (x=0;x {</strong></p>
<p><strong>arrstct.m_Array[x].varFloat = 1.1111*x;</strong></p>
<p><strong>arrstct.m_Array[x].varInt = x;</strong></p>
<p><strong>sprintf(buffer, "varString of %dth element of SOAPStruct array",
x);</strong></p>
<p><strong>arrstct.m_Array[x].varString = buffer;</strong></p>
<p><strong>}</strong></p>
<p><strong>//testing echo Struct Array</strong></p>
<p><strong>printf("invoking echoStructArray...\n");</strong></p>
<p><strong>if (ws.echoStructArray(arrstct).m_Array != NULL)</strong></p>
<p><strong>printf("successful\n");</strong></p>
<p><strong>else</strong></p>
<p><strong>printf("failed\n");</strong></p>
<p><strong>//testing echo void</strong></p>
<p><strong>printf("invoking echoVoid...\n");</strong></p>
<p><strong>ws.echoVoid();</strong></p>
<p><strong>printf("successful\n");</strong></p>
<p><strong>//testing echo base 64 binary</strong></p>
<p><strong>printf("invoking echoBase64...\n");</strong></p>
<p><strong>if (ws.echoBase64("</strong></p>
<p><strong>BCDF675E234242WHRTKMJDGKGUEJ898636JFJFHEJDGWTDHFJRURYGBCDHTWRSG")</strong></p>
<p><strong>=="BCDF675E234242WHRTKMJDGKGUEJ898636JFJFHEJDGWTDHFJRURYGBCDHTWRSG")
<br>
printf("successful\n");</strong></p>
<p><strong>else</strong></p>
<p><strong>printf("failed\n");</strong></p>
<p><strong>time_t tim;</strong></p>
<p><strong>time(&tim);</strong></p>
<p><strong>tm* lt = gmtime(&tim);</strong></p>
<p><strong>printf("invoking echoDate...\n");</strong></p>
<p><strong>if (memcmp(&ws.echoDate(*lt), lt, sizeof(tm)) ==
0)</strong></p>
<p><strong>printf("successful\n");</strong></p>
<p><strong>else</strong></p>
<p><strong>printf("failed\n");</strong></p>
<p><strong>//testing echo hex binary</strong></p>
<p><strong>printf("invoking echoHexBinary...\n");</strong></p>
<p><strong>if (ws.echoHexBinary("<br>
CCCFFA46552BC7D5A09BC5F23DE9E0FE7862AD45BC87D02FEE") ==</strong></p>
<p><strong>"CCCFFA46552BC7D5A09BC5F23DE9E0FE7862AD45BC87D02FEE")</strong></p>
<p><strong>printf("successful\n");</strong></p>
<p><strong>else</strong></p>
<p><strong>printf("failed\n");</strong></p>
<p><strong>//testing echo decimal</strong></p>
<p><strong>printf("invoking echoDecimal...\n");</strong></p>
<p><strong>if (ws.echoDecimal(1234.567890) > 1234.56)</strong></p>
<p><strong>printf("successful\n");</strong></p>
<p><strong>else</strong></p>
<p><strong>printf("failed\n");</strong></p>
<p><strong>//testing echo boolean</strong></p>
<p><strong>printf("invoking echoBoolean...\n");</strong></p>
<p><strong>if (ws.echoBoolean(1) == 1)</strong></p>
<p><strong>printf("successful\n");</strong></p>
<p><strong>else</strong></p>
<p><strong>printf("failed\n");</strong></p>
<p><strong>getchar();</strong></p>
<p><strong>return 0;</strong></p>
<p><strong>}</strong></p>
<p></p>
<p>You will find the client libraries required to run the sample client
installed in <strong>$AXISCPP_HOME/lib/axis</strong></p>
<p></p>
<p>Now</p>
<p></p>
<p><strong>cd $AXISCPP_HOME/samples/client/interoptests/base</strong></p>
<p></p>
<p><strong>$ g++ -DHAVE_CONFIG_H -I. -I. -I.. -I$AXISCPP_HOME/include
-Wshadow -Wall -pedantic<br>
</strong><strong>- ansi -g -O2 -c ./*.cpp -fPIC</strong></p>
<p></p>
<p><strong>$ g++ -g -O2 -o interopbase InteropBaseClient.o SOAPStruct.o
InteropTestPortType.o $AXISCPP_HOME/lib/axis/libaxiscpp_client.a
$AXISCPP_HOME/lib/axis/libaxiscpp_mod.a -L$AXISCPP_HOME/lib/expat -lexpat -ldl $AXISCPP_HOME/lib/axis/libaxiscpp_client.a $AXISCPP_HOME/lib/axis/libaxiscpp_mod.a
-L$AXISCPP_HOME/lib/expat -lexpat -ldl</strong></p>
<p></p>
<p>Start the Apache Server(Assuming base service is deployed.)</p>
<p></p>
<p><strong>$ /usr/local/apache/bin/apachectl start</strong></p>
<p></p>
<p>To Run</p>
<p>
<strong>$ cd $AXISCPP_HOME/samples/client/interoptests/base
</p>
<p><strong>$ ./interopbase</strong></p>
<p><a name="Handler1"></a></p>
<h1>Handler Sample</h1>
<p></p>
<p>Sample handler libraries are included in
<strong>$(AXISCPP_HOME)/src/server/handlers</strong> folder. Several sample handlers are
included there covering the concepts of service specific, global and
transport handlers. We will show you the detail of running a service specific
handler named loghandler. The task of this handler is writing to a file the
number of times the service is accessed.</p>
<p></p>
<p><strong>cp -rf $AXISCPP_HOME/deploy/handlers $(AXIS_HOME)/</strong></p>
<p></p>
<p><strong><service name="InteropBase" provider="C:RPC"
description="SOAPBuilders Interoperability Lab Round</strong><br>
<strong>2 base test suite described at
http://www.whitemesa.com/interop/proposal2.html "></strong><br>
<strong><requestFlow name="calchandlers"></strong><br>
<strong><handler name="LogAccessCount"</strong><br>
<strong>type="/usr/local/apache/Axis/handlers/custom/loghandler/libloghandler.so"></strong><br>
<strong><parameter name="logAccessCountFile"</strong><br>
<strong>value="/usr/local/apache/Axis/handlers/custom/loghandler/LogAccessCountFile"/></strong><br>
<strong></handler></strong><br>
<strong></requestFlow></strong><br>
<strong><parameter name="allowedMethods" value="echoString EchoInt
echoStringArray</strong><br>
<strong>echoInteger echoIntegerArray echoFloat echoFloatArray echoStruct
echoStructArray echoVoid </strong><br>
<strong>echoBase64 echoDate echoHexBinary echoDecimal echoBoolean
"/></strong><br>
<strong><parameter name="className"
value="/usr/local/apache/Axis/webservices/libinteropbase.so"/></strong><br>
<strong></service></strong></p>
<p></p>
<p>Restart the apache web server and test your handler using the web service
client for InteropBase webservice. When the client is run an entry will be
added to
<strong>/usr/local/apache/Axis/handlers/custom/loghandler/LogAccessCountFile</strong>
Note that the folder in which the LogAccessCountFile is created should have
write access. You can test the global handlers and transport handlers in a
similar manner. Note the change you have to make in server.wsdd. You can see
how this is done in the specimen folder
<strong>$(AXISCPP_HOME)/deploy/conf/server.wsdd</strong>.</p>
<p></p>
<p><strong>TODO:</strong> document how the users can write their own handlers
and webservices. For the time being users can refer to the samples given and
follow their example to write their own handlers and webservices. This task
is fairly easy if you follow the examples.</p>
<p></p>
<p>You can use the tcpmon program of Axis Java to view what goes on the wire
when a soap transaction is taking place. Please visit <a
href="http://ws.apache.org/axis">http://ws.apache.org/axis/</a> and get Axis
java, to obtain tcpmon.</p>
<p></p>
<p>Your contribution to Axis C++ as a developer, tester is highly
appreciated. You can download the latest source from the cvs repository as
documented below.</p>
<p><a name="Getting"></a></p>
<h1>Getting a CVS checkout</h1>
<p>Visit <a href="http://ws.apache.org/">http://ws.apache.org/</a> click on
"axis" and then on <strong>"CVS Repository"</strong> to find details on
accessing the CVS Repository. It will have instructions similar to the
following."Anyone can checkout source code from our anonymous CVS server. To
do so, simply use the following commands (if you are using a GUI CVS client,
configure it appropriately):</p>
<p></p>
<p><strong>cvs -d :pserver:anoncvs@cvs.apache.org:/home/cvspublic
login</strong></p>
<p><strong>password: anoncvs</strong></p>
<p><strong>cvs -d :pserver:anoncvs@cvs.apache.org:/home/cvspublic checkout
ws-axis"</strong></p>
<p></p>
<p>The examples given below will be based on these lines of instructions.</p>
<p></p>
<p>To use the command line cvs client go to <a
href="http://www.cvshome.org">http://www.cvshome.org</a> and download the cvs
binaries for windows. Extract the cvs binaries from the downloaded zip file.
There will be a <strong>"cvs.exe"</strong> file when this is extracted. Set
the PATH environment variable to where "cvs.exe" is. You would have to do the
following to get a checkout from the command line cvs client.</p>
<p></p>
<p><strong>cvs -d :pserver:anoncvs@cvs.apache.org:/home/cvspublic
login</strong></p>
<p></p>
<p>Now you will be prompted for the password. Enter the password.</p>
<p><strong>password: anoncvs</strong></p>
<p></p>
<p>Now enter the following cvs command to checkout the axis Repository.</p>
<p></p>
<p><strong>cvs -d :pserver:anoncvs@cvs.apache.org:/home/cvspublic checkout
ws-axis</strong></p>
<p>The checkout of the repository will be created in the current directory in
a folder named “ws-axis”</p>
</body>
</html>
|