OpenVMS Notes: SOAP, Apache AXIS2, gSOAP

  1. The VMS SharkThe information and software presented on this web site are intended for educational use only by OpenVMS application developers and OpenVMS system attendants.
  2. The information and software presented on this web site are provided free of charge.
  3. The information and software presented on this web site are presented to you as-is. I will not be held responsible in any way if the information and software presented on this web site damages your computer system, business or organization (sounds like the legal warning from a Microsoft shrink-wrap seal, eh?)
  4. Is this text too small? You have two options:
    1. hold down the CTRL key while rolling the mouse wheel (zoom-in, zoom-out)
    2. use your keyboard like so:
      • hit: CTRL with "-" key to zoom smaller
      • hit: CTRL with "+" key to zoom larger
      • hit: CTRL with zero key to reset zoom
 

Table of Contents

e-Business Product Name Confusion (re: OpenVMS)

e-Business Product Name Confusion
Product Description/Notes
ANT Another Neat Tool (an Apache scripting tool meant to replace various OS script interpreters)
Apache HTTPd Hyper Text Transport Protocol daemon is a standalone product which operates on TCP/IP ports 80 (http) and 443 (https) by default. When OpenVMS was owned by Compaq, this product was called CSWS (Compaq Secure Web Sever) pronounced "C-Swiss". Since HP bought (err, merged with) Compaq, I have heard HP engineers refer to this product as "Swiss" but the downloadable modules still have a "CSWS" prefix.
- CSWS_JAVAHP's name for Apache Tomcat (requires Java)
- CSWS_PERLHP's name for a module which enables Apache HTTPd to access Perl (requires Perl)
- CSWS_PHPHP's name for a module which provides Apache HTTPd with a PHP Interpreter
Apache TomcatA standalone Java-based web server product which operates on TCP/IP port 8080 by default
(configure the connector kit to facilitate back channels between HTTPd and Tomcat)
Confusingly, the Compaq/HP Tomcat module for OpenVMS is named CSWS_JAVA
- JakartaApache's umbrella name for Java projects
- Catalina Name of Tomcat's Servlet Container Technology
- CoyoteTomcat's Java-based HTTPd server
- JasperTomcat's JSP (Java Server Page) technology
GNV GNU Not VMS (Unix-like command interpreter for OpenVMS which includes BASH)
JavaStandalone product required by Tomcat. You want the development kit (because of the JIT compiler), not the run-time kit.
1.5
and
higher
  1.4
and
lower
 
JDK java development kit SDK standard development kit
JRE java runtime edition RTE run time edition
OpenSSLSecure Sockets Layer standalone product (not used by Apache HTTPd which has its own built-in SSL routines)
Question: So why would you ever use it? Answer: to support encryption in client apps or standalone server apps
Required by OpenVMS 8.x (used to validate HP patch kits)
PerlStandalone product (required by CSWS_PERL)
SOAP Toolkit 1.1 SOAP 1.0 - based upon Apache SOAP 2.31 - Apache's proof-of-concept SOAP offering (now obsolete)
SOAP Toolkit 2.0 SOAP 1.1 - based upon Apache AXIS/Java - Apache's first production SOAP engine (now obsolete)
AXIS2 SOAP 1.2 - based upon Apache AXIS2/Java - Apache's second production SOAP engine
SSLSecure Sockets Layer standalone product (not used by Apache HTTPd which has its own built-in SSL routines)
Question: So why would you ever use it? Answer: to support encryption in client apps or standalone server apps
Required by OpenVMS 8.x (used to validate HP patch kits)
WSITWeb Services Integration Toolkit (technology for accessing web services from high level languages)
UDDIUniversal Description Discovery and Integration is another Web Services component
(this technology has not lived up to original expectations)
gSOAP generated SOAP. A third-party SOAP engine supporting code written in either C or C++
(this looks like a very promising alternative to AXIS2/c which is not available on OpenVMS unless you are willing to do your own build from Apache sources)

Installing Apache SOAP on OpenVMS

SOAP (Simple Object Access Protocol) is an XML extension for sending messages to other systems on the internet. It is platform neutral as well a language neutral.

AXIS (Apache eXtensible Interaction System)

SOAP
Technology
Original
Product
Name
Official
VMS
Name
Requires
Tomcat?
Document Links Language
SOAP 1.0 Apache SOAP SOAP Toolkit 1.x Y http://www.w3.org/TR/soap/ Java
SOAP 1.1 Apache AXIS/Java SOAP Toolkit 2.x Y http://en.wikipedia.org/wiki/Apache_Axis Java
SOAP 1.1 and 1.2 Apache AXIS2/Java Axis2 Y http://en.wikipedia.org/wiki/Apache_Axis2 Java
SOAP 1.1 and 1.2 gSOAP   N http://www.cs.fsu.edu/~engelen/soap.html C/C++

Notes:

Installing AXIS2 (supports SOAP 1.1 and SOAP 1.2) on Tomcat

Installing AXIS (only supports SOAP 1.1) on Tomcat

 Caveat: do not install AXIS if possible. AXIS2 is faster and much more feature-rich.

AXIS/AXIS2 Tutorials etc.

Miscellaneous notes and hints

"Army Instructions" for creating an AXIS2 Service on OpenVMS

==============================================================================================
title    : AAA_help.TXT
author   : Neil Rieck
date     : 2010.07.21
purpose  : A "Simple Service" demo for Apache Axis2 on OpenVMS-8.3
reference: http://people.apache.org/~ruchithf/hw-axis2/
notes    : 1. the original steps have been modified for use on OpenVMS
         : 2. case is important for directories
         : 3. AXIS2 will not deploy a service unless the extension is ".aar"
         : 4. my DCL script "SENS" will toggle process case-sensitivity
         : 5. some variable and method names have been changed to assist in WSDL + XSD hacking
==============================================================================================

step1   -------------------------------------------------------------------------
        $ create SimpleService.java
        ...using these contents (which I modified from the source)

	/**
	 * The service implementation class
	 */
	public class SimpleService {
		/**
		 * The ssAdd method will be exposed as operation ssAdd
		 *
		 * note: the "ss" prefix means "simple service"
		 */
		public int ssAdd(int ssValue1, ssValue2) {
			return ssValue1 + ssValue2;
		}
		/**
		 * The ssSubtract method will be exposed as operation ssSubtract
		 */
		public int ssSubtract(int ssValue1, ssValue2) {
			return ssValue1 - ssValue2;
		}
		/**
		 * The ssEcho method will be exposed as operation ssEcho
		*/
		public String ssEcho(String ssValue3) {
			return ssValue3;
		}
	}

step2   -------------------------------------------------------------------------
        $ cre/dir [.TEMP]
        $ cre/dir [.TEMP.META-INF]
        $ create  [.TEMP.META-INF]services.xml
        ...using these contents (which I modified from the source)

        <service name="SimpleService">
            <description>
                Simple Service Hack
            </description>
            <parameter name="ServiceClass" locked="false">SimpleService</parameter>
            <operation name="ssAdd">
                <messageReceiver
                        mep="http://www.w3.org/2004/08/wsdl/in-out"                   <--- optional
                        class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
            </operation>
            <operation name="ssSubtract">
                <messageReceiver
                        mep="http://www.w3.org/2004/08/wsdl/in-out"                   <--- optional
                        class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
            </operation>
            <operation name="ssEcho">
                <messageReceiver
                        mep="http://www.w3.org/2004/08/wsdl/in-out"                   <--- optional
                        class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
            </operation>
        </service>

step3   -------------------------------------------------------------------------
        $ javac "SimpleService.java" -d TEMP/     (doublequote to to preserve case)

step4   -------------------------------------------------------------------------
        $ jar "cvf" "SimpleService.aar"  "-C" TEMP/ "META-INF/services.xml"
        $ jar "uvf" "SimpleService.aar"  "-C" TEMP/ "SimpleService.class"
 
step5   -------------------------------------------------------------------------
        test the archive like so:

        $ unzip -l SimpleService.aar

        Archive:  AXIS2$ROOT:[000000.NEIL.SS]SimpleService.aar;21
          Length     Date   Time    Name
         --------    ----   ----    ----
                0  08-10-10 13:41   META-INF/
               70  08-10-10 13:41   META-INF/MANIFEST.MF
              572  08-10-10 13:40   META-INF/services.xml
              585  08-10-10 13:41   SimpleService.class
         --------                   -------
             1227                   4 files

step6   -------------------------------------------------------------------------
        put into production:

        $ copy SimpleService.aar  -
                APACHE$COMMON:[JAKARTA.TOMCAT.webapps.axis2.WEB-INF.services]

step 7	-------------------------------------------------------------------------
	Probe the service with IE8:

	http://yada.net:8080/axis2/services/listServices view the available services
	http://yada.net:8080/axis2/services/SimpleService?xsd view the associated xsd
	http://yada.net:8080/axis2/services/SimpleService?wsdl view the associated wsdl
	http://yada.net:8080/axis2/services/SimpleService?wsdl2 view the associated wsdl2

	Test the service methods with IE8:

	http://yada.net:8080/axis2/services/SimpleService/ssEcho?param0=Hello
	http://yada.net:8080/axis2/services/SimpleService/ssAdd?param0=34&param1=12
	http://yada.net:8080/axis2/services/SimpleService/ssSubtract?param0=34&param1=12

(using AXIS/AXIS2 to) Generate a WSDL Document

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
                  xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
                  xmlns:ns0="http://ws.apache.org/axis2"
                  xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"
                  xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
                  xmlns:ns1="http://org.apache.axis2/xsd"
                  xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl"
                  xmlns:xs="http://www.w3.org/2001/XMLSchema"
                  xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
                  targetNamespace="http://ws.apache.org/axis2">
    <wsdl:documentation>SimpleService</wsdl:documentation>
    <wsdl:types>
        <xs:schema xmlns:ns="http://ws.apache.org/axis2"
                   attributeFormDefault="qualified"
                   elementFormDefault="qualified"
                   targetNamespace="http://ws.apache.org/axis2">
            <xs:element name="ssAdd">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element minOccurs="0" name="param0" type="xs:int"/>
                        <xs:element minOccurs="0" name="param1" type="xs:int"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:element name="ssAddResponse">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element minOccurs="0" name="return" type="xs:int"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:element name="ssSubtract">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element minOccurs="0" name="param0" type="xs:int"/>
                        <xs:element minOccurs="0" name="param1" type="xs:int"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:element name="ssSubtractResponse">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element minOccurs="0" name="return" type="xs:int"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:element name="ssEcho">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element minOccurs="0" name="param0" nillable="true" type="xs:string"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:element name="ssEchoResponse">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element minOccurs="0" name="return" nillable="true" type="xs:string"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:schema>
    </wsdl:types>
    <wsdl:message name="ssSubtractRequest">
        <wsdl:part name="parameters" element="ns0:ssSubtract"/>
    </wsdl:message>
    <wsdl:message name="ssSubtractResponse">
        <wsdl:part name="parameters" element="ns0:ssSubtractResponse"/>
    </wsdl:message>
    <wsdl:message name="ssEchoRequest">
        <wsdl:part name="parameters" element="ns0:ssEcho"/>
    </wsdl:message>
    <wsdl:message name="ssEchoResponse">
        <wsdl:part name="parameters" element="ns0:ssEchoResponse"/>
    </wsdl:message>
    <wsdl:message name="ssAddRequest">
        <wsdl:part name="parameters" element="ns0:ssAdd"/>
    </wsdl:message>
    <wsdl:message name="ssAddResponse">
        <wsdl:part name="parameters" element="ns0:ssAddResponse"/>
    </wsdl:message>
    <wsdl:portType name="SimpleServicePortType">
        <wsdl:operation name="ssSubtract">
            <wsdl:input message="ns0:ssSubtractRequest" wsaw:Action="urn:ssSubtract"/>
            <wsdl:output message="ns0:ssSubtractResponse" wsaw:Action="urn:ssSubtractResponse"/>
        </wsdl:operation>
        <wsdl:operation name="ssEcho">
            <wsdl:input message="ns0:ssEchoRequest" wsaw:Action="urn:ssEcho"/>
            <wsdl:output message="ns0:ssEchoResponse" wsaw:Action="urn:ssEchoResponse"/>
        </wsdl:operation>
        <wsdl:operation name="ssAdd">
            <wsdl:input message="ns0:ssAddRequest" wsaw:Action="urn:ssAdd"/>
            <wsdl:output message="ns0:ssAddResponse" wsaw:Action="urn:ssAddResponse"/>
        </wsdl:operation>
    </wsdl:portType>
    <wsdl:binding name="SimpleServiceSOAP11Binding" type="ns0:SimpleServicePortType">
        <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
        <wsdl:operation name="ssSubtract">
            <soap:operation soapAction="urn:ssSubtract" style="document"/>
            <wsdl:input>
                <soap:body use="literal"/>
            </wsdl:input>
            <wsdl:output>
                <soap:body use="literal"/>
            </wsdl:output>
        </wsdl:operation>
        <wsdl:operation name="ssEcho">
            <soap:operation soapAction="urn:ssEcho" style="document"/>
            <wsdl:input>
                <soap:body use="literal"/>
            </wsdl:input>
            <wsdl:output>
                <soap:body use="literal"/>
            </wsdl:output>
        </wsdl:operation>
        <wsdl:operation name="ssAdd">
            <soap:operation soapAction="urn:ssAdd" style="document"/>
            <wsdl:input>
                <soap:body use="literal"/>
            </wsdl:input>
            <wsdl:output>
                <soap:body use="literal"/>
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:binding name="SimpleServiceSOAP12Binding" type="ns0:SimpleServicePortType">
        <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
        <wsdl:operation name="ssSubtract">
            <soap12:operation soapAction="urn:ssSubtract" style="document"/>
            <wsdl:input>
                <soap12:body use="literal"/>
            </wsdl:input>
            <wsdl:output>
                <soap12:body use="literal"/>
            </wsdl:output>
        </wsdl:operation>
        <wsdl:operation name="ssEcho">
            <soap12:operation soapAction="urn:ssEcho" style="document"/>
            <wsdl:input>
                <soap12:body use="literal"/>
            </wsdl:input>
            <wsdl:output>
                <soap12:body use="literal"/>
            </wsdl:output>
        </wsdl:operation>
        <wsdl:operation name="ssAdd">
            <soap12:operation soapAction="urn:ssAdd" style="document"/>
            <wsdl:input>
                <soap12:body use="literal"/>
            </wsdl:input>
            <wsdl:output>
                <soap12:body use="literal"/>
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:binding name="SimpleServiceHttpBinding" type="ns0:SimpleServicePortType">
        <http:binding verb="POST"/>
        <wsdl:operation name="ssSubtract">
            <http:operation location="SimpleService/ssSubtract"/>   <--- notice this syntax (you can change it)
            <wsdl:input>
                <mime:content type="text/xml" part="ssSubtract"/>
            </wsdl:input>
            <wsdl:output>
                <mime:content type="text/xml" part="ssSubtract"/>
            </wsdl:output>
        </wsdl:operation>
        <wsdl:operation name="ssEcho">
            <http:operation location="SimpleService/ssEcho"/>	    <--- notice this syntax (you can change it)
            <wsdl:input>
                <mime:content type="text/xml" part="ssEcho"/>
            </wsdl:input>
            <wsdl:output>
                <mime:content type="text/xml" part="ssEcho"/>
            </wsdl:output>
        </wsdl:operation>
        <wsdl:operation name="ssAdd">
            <http:operation location="SimpleService/ssAdd"/>	    <--- notice this syntax (you can change it)
            <wsdl:input>
                <mime:content type="text/xml" part="ssAdd"/>
            </wsdl:input>
            <wsdl:output>
                <mime:content type="text/xml" part="ssAdd"/>
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:service name="SimpleService">
        <wsdl:port name="SimpleServiceSOAP11port_http" binding="ns0:SimpleServiceSOAP11Binding">
            <soap:address location="http://kawc09.on.bell.ca:8080/axis2/services/SimpleService"/>
        </wsdl:port>
        <wsdl:port name="SimpleServiceSOAP12port_http" binding="ns0:SimpleServiceSOAP12Binding">
            <soap12:address location="http://kawc09.on.bell.ca:8080/axis2/services/SimpleService"/>
        </wsdl:port>

        <wsdl:port name="SimpleServiceHttpport" binding="ns0:SimpleServiceHttpBinding">
            <http:address location="http://kawc09.on.bell.ca:8080/axis2/services/SimpleService"/>
        </wsdl:port>
    </wsdl:service>
</wsdl:definitions>

gSOAP (very, very fast)

gSOAP (all platforms)

gSOAP Toolkit for OpenVMS

gSOAP on OpenVMS

Tips for using gSOAP on OpenVMS

My gSOAP Application for OpenVMS

Overview (Implements the PUSH-PUSH model)

Flow #1 (Company 1 to 2)

		   Company #1				   Company #2
		   SOAP Client				   SOAP Server
+-------+	+---------------+			+---------------+	+------+
| Human	+------>| create ticket +- HTTP POST ---------->| Queue Msg/Job +------>| db   |
| Event	|	| update ticket |<-------- Status: 200 -+ HTTP response |	| code |
+-------+	+---------------+			+---------------+	+--+---+
		   SOAP Server				   SOAP Client		   |
		+---------------+			+---------------+	   |
		| Queue Msg/Job	|<---------- HTTP POST -+ Action: Reply	|<---------+
		| HTTP Response +- Status: 200 -------->| within 60 sec	|
		+---------------+			+---------------+

Flow #2 (Company 2 to 1)

		   Company #1				   Company #2
		   SOAP Server				   SOAP Client
 +------+	+---------------+			+---------------+	+-------+
 | db   |<------+ Queue Msg/Job |<---------- HTTP POST -+ Update Ticket |<------+ Human |
 | code |	| HTTP response +- Status: 200 -------->| Close Ticket	|	| Event	|
 +--+---+	+---------------+			+---------------+	+-------+
    |		   SOAP Client				   SOAP Server
    |		+---------------+			+---------------+
    +---------->| Action: Reply	+- HTTP POST ---------->| Queue Msg/Job	|
		| within 60 sec |<-------- Status: 200 -+ HTTP Response	|
		+---------------+			+---------------+

Links:


Back to OpenVMS
Back to Apache Notes
Back to Home
Neil Rieck
Kitchener - Waterloo - Cambridge, Ontario, Canada.