Fall Semester 2002


Lecture Notes Twenty-Eight: AXIS: The Apache Extensible Interaction System
Axis is the latest version of the Apache SOAP project.

The acronym Axis means

a fancy way of saying it's a

Installing an Axis server is relatively simple.

As of October 7, 2002, Axis 1.0 is available.

I am downloading the compressed archive

 xml-axis-10.tar.gz 07-Oct-2002 08:07  6.6M  GZIP compressed file
You don't have to. Just keep reading.

I then uncompress and unarchive the file. That takes up about 40-50 MB of space.

(No need for you to do any of that, but keep reading.)

We will present the fastest easiest installation of xml-axis.

(The original document is posted here.)

0. Introduction

1. Step One: Creating the WebApps.

Here's how I did it:

burrowww.cs.indiana.edu% pwd 
/nfs/paca/home/user1/dgerman
burrowww.cs.indiana.edu% cd $CATALINA_HOME
burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4
burrowww.cs.indiana.edu% cd webapps
burrowww.cs.indiana.edu% ls -ld axis
ls: axis: No such file or directory
burrowww.cs.indiana.edu% cp -r /l/www/classes/a348/fall2002/webapps/axis . 
burrowww.cs.indiana.edu% ls -ld axis
drwxr-xr-x   3 dgerman  faculty       512 Nov 17 23:53 axis
burrowww.cs.indiana.edu% du -a axis
1       ./index.html
13      ./happyaxis.jsp
2       ./WEB-INF/web.xml
1       ./WEB-INF/users.lst
1       ./WEB-INF/perms.lst
1088    ./WEB-INF/lib/axis.jar
26      ./WEB-INF/lib/commons-logging.jar
35      ./WEB-INF/lib/jaxrpc.jar
120     ./WEB-INF/lib/wsdl4j.jar
19      ./WEB-INF/lib/saaj.jar
384     ./WEB-INF/lib/log4j-1.2.4.jar
376     ./WEB-INF/lib/axis-ant.jar
62      ./WEB-INF/lib/commons-discovery.jar
2111    ./WEB-INF/lib
1       ./WEB-INF/classes/samples/bidbuy/vInterface.class
2       ./WEB-INF/classes/samples/bidbuy/Address.class
1       ./WEB-INF/classes/samples/bidbuy/rfq$18.class
1       ./WEB-INF/classes/samples/bidbuy/rfq$13.class
2       ./WEB-INF/classes/samples/bidbuy/rfq$5.class
1       ./WEB-INF/classes/samples/bidbuy/rfq$12.class
2       ./WEB-INF/classes/samples/bidbuy/LineItem.class
1       ./WEB-INF/classes/samples/bidbuy/rfq$4.class
2       ./WEB-INF/classes/samples/bidbuy/BidService.class
2       ./WEB-INF/classes/samples/bidbuy/rfq$17.class
1       ./WEB-INF/classes/samples/bidbuy/rfq$9.class
1       ./WEB-INF/classes/samples/bidbuy/rfq$11.class
2       ./WEB-INF/classes/samples/bidbuy/Service.class
2       ./WEB-INF/classes/samples/bidbuy/rfq$MyTableModel.class
1       ./WEB-INF/classes/samples/bidbuy/rfq$16.class
1       ./WEB-INF/classes/samples/bidbuy/rfq$3.class
5       ./WEB-INF/classes/samples/bidbuy/TestClient.class
1       ./WEB-INF/classes/samples/bidbuy/rfq$8.class
1       ./WEB-INF/classes/samples/bidbuy/rfq$10.class
2       ./WEB-INF/classes/samples/bidbuy/rfq$2.class
2       ./WEB-INF/classes/samples/bidbuy/rfq$15.class
1       ./WEB-INF/classes/samples/bidbuy/rfq$7.class
2       ./WEB-INF/classes/samples/bidbuy/rfq$1.class
8       ./WEB-INF/classes/samples/bidbuy/v3.class
4       ./WEB-INF/classes/samples/bidbuy/RegistryService.class
1       ./WEB-INF/classes/samples/bidbuy/rfq$14.class
2       ./WEB-INF/classes/samples/bidbuy/rfq$6.class
18      ./WEB-INF/classes/samples/bidbuy/rfq.class
2       ./WEB-INF/classes/samples/bidbuy/PurchaseOrder.class
1       ./WEB-INF/classes/samples/bidbuy/rfq$19.class
74      ./WEB-INF/classes/samples/bidbuy
2       ./WEB-INF/classes/samples/integrationGuide/example2/MyGeneratorFactory.class
3       ./WEB-INF/classes/samples/integrationGuide/example2/MyDeployWriter.class
1       ./WEB-INF/classes/samples/integrationGuide/example2/MyEmitter.class
2       ./WEB-INF/classes/samples/integrationGuide/example2/WSDL2Useless.class
9       ./WEB-INF/classes/samples/integrationGuide/example2
2       ./WEB-INF/classes/samples/integrationGuide/example1/MyWSDL2Java.class
3       ./WEB-INF/classes/samples/integrationGuide/example1/MyListPortsWriter.class
6       ./WEB-INF/classes/samples/integrationGuide/example1
16      ./WEB-INF/classes/samples/integrationGuide
3       ./WEB-INF/classes/samples/encoding/DataDeser.class
1       ./WEB-INF/classes/samples/encoding/DataSerFactory.class
3       ./WEB-INF/classes/samples/encoding/DataSer.class
1       ./WEB-INF/classes/samples/encoding/DataDeserFactory.class
6       ./WEB-INF/classes/samples/encoding/TestSer.class
1       ./WEB-INF/classes/samples/encoding/ElementService.class
2       ./WEB-INF/classes/samples/encoding/Data.class
3       ./WEB-INF/classes/samples/encoding/TestElem.class
21      ./WEB-INF/classes/samples/encoding
4       ./WEB-INF/classes/samples/echo/SOAPStruct.class
4       ./WEB-INF/classes/samples/echo/InteropTestServiceLocator.class
26      ./WEB-INF/classes/samples/echo/InteropTestSoapBindingStub.class
1       ./WEB-INF/classes/samples/echo/TestClient$1.class
3       ./WEB-INF/classes/samples/echo/InteropTestPortType.class
4       ./WEB-INF/classes/samples/echo/echoHeaderStringHandler.class
4       ./WEB-INF/classes/samples/echo/echoHeaderStructHandler.class
1       ./WEB-INF/classes/samples/echo/InteropTestService.class
7       ./WEB-INF/classes/samples/echo/InteropTestSoapBindingImpl.class
5       ./WEB-INF/classes/samples/echo/SOAPStructStruct.class
5       ./WEB-INF/classes/samples/echo/SOAPArrayStruct.class
2       ./WEB-INF/classes/samples/echo/TestClient$2.class
15      ./WEB-INF/classes/samples/echo/TestClient.class
82      ./WEB-INF/classes/samples/echo
8       ./WEB-INF/classes/samples/security/SignedSOAPEnvelope.class
3       ./WEB-INF/classes/samples/security/Client.class
1       ./WEB-INF/classes/samples/security/Service.class
5       ./WEB-INF/classes/samples/security/LogHandler.class
3       ./WEB-INF/classes/samples/security/ClientSigningHandler.class
21      ./WEB-INF/classes/samples/security
3       ./WEB-INF/classes/samples/userguide/example4/LogHandler.class
1       ./WEB-INF/classes/samples/userguide/example4/Service.class
2       ./WEB-INF/classes/samples/userguide/example4/Client.class
7       ./WEB-INF/classes/samples/userguide/example4
1       ./WEB-INF/classes/samples/userguide/example3/MyService.class
3       ./WEB-INF/classes/samples/userguide/example3/Client.class
5       ./WEB-INF/classes/samples/userguide/example3
2       ./WEB-INF/classes/samples/userguide/example1/TestClient.class
3       ./WEB-INF/classes/samples/userguide/example1
4       ./WEB-INF/classes/samples/userguide/example5/Client.class
2       ./WEB-INF/classes/samples/userguide/example5/BeanService.class
2       ./WEB-INF/classes/samples/userguide/example5/Order.class
9       ./WEB-INF/classes/samples/userguide/example5
1       ./WEB-INF/classes/samples/userguide/example6/WidgetPrice.class
2       ./WEB-INF/classes/samples/userguide/example6
3       ./WEB-INF/classes/samples/userguide/example2/CalcClient.class
4       ./WEB-INF/classes/samples/userguide/example2
31      ./WEB-INF/classes/samples/userguide
1       ./WEB-INF/classes/samples/jaxrpc/hello/Hello.class
2       ./WEB-INF/classes/samples/jaxrpc/hello/ServerHandler.class
5       ./WEB-INF/classes/samples/jaxrpc/hello/HelloBindingStub.class
1       ./WEB-INF/classes/samples/jaxrpc/hello/HelloWorld.class
4       ./WEB-INF/classes/samples/jaxrpc/hello/HelloWorldLocator.class
1       ./WEB-INF/classes/samples/jaxrpc/hello/HelloBindingImpl.class
15      ./WEB-INF/classes/samples/jaxrpc/hello
8       ./WEB-INF/classes/samples/jaxrpc/address/AddressSoapBindingStub.class
1       ./WEB-INF/classes/samples/jaxrpc/address/AddressServiceService.class
4       ./WEB-INF/classes/samples/jaxrpc/address/AddressBean.class
1       ./WEB-INF/classes/samples/jaxrpc/address/AddressSoapBindingImpl.class
4       ./WEB-INF/classes/samples/jaxrpc/address/AddressServiceServiceLocator.class
1       ./WEB-INF/classes/samples/jaxrpc/address/AddressService.class
20      ./WEB-INF/classes/samples/jaxrpc/address
36      ./WEB-INF/classes/samples/jaxrpc
4       ./WEB-INF/classes/samples/addr/DOMUtils.class
4       ./WEB-INF/classes/samples/addr/AddressBookServiceLocator.class
8       ./WEB-INF/classes/samples/addr/AddressBookSOAPBindingStub.class
1       ./WEB-INF/classes/samples/addr/AddressBook.class
4       ./WEB-INF/classes/samples/addr/AddressBookSOAPBindingSkeleton.class
6       ./WEB-INF/classes/samples/addr/Address.class
1       ./WEB-INF/classes/samples/addr/AddressBookService.class
2       ./WEB-INF/classes/samples/addr/AddressBookSOAPBindingImpl.class
4       ./WEB-INF/classes/samples/addr/Phone.class
5       ./WEB-INF/classes/samples/addr/Main.class
2       ./WEB-INF/classes/samples/addr/StateType.class
42      ./WEB-INF/classes/samples/addr
3       ./WEB-INF/classes/samples/transport/tcp/AdminClient.class
5       ./WEB-INF/classes/samples/transport/tcp/GetQuote.class
3       ./WEB-INF/classes/samples/transport/tcp/TCPTransport.class
5       ./WEB-INF/classes/samples/transport/tcp/TCPListener$SocketHandler.class
1       ./WEB-INF/classes/samples/transport/tcp/Handler.class
4       ./WEB-INF/classes/samples/transport/tcp/TCPSender.class
5       ./WEB-INF/classes/samples/transport/tcp/TCPListener.class
27      ./WEB-INF/classes/samples/transport/tcp
4       ./WEB-INF/classes/samples/transport/FileTest.class
3       ./WEB-INF/classes/samples/transport/FileReader.class
3       ./WEB-INF/classes/samples/transport/FileSender.class
1       ./WEB-INF/classes/samples/transport/FileTransport.class
39      ./WEB-INF/classes/samples/transport
4       ./WEB-INF/classes/samples/message/TestMsg.class
1       ./WEB-INF/classes/samples/message/MessageService.class
6       ./WEB-INF/classes/samples/message
3       ./WEB-INF/classes/samples/stock/GetInfo.class
2       ./WEB-INF/classes/samples/stock/ComInfoService.class
3       ./WEB-INF/classes/samples/stock/StockQuoteService.class
4       ./WEB-INF/classes/samples/stock/GetQuote.class
3       ./WEB-INF/classes/samples/stock/GetQuote2.class
5       ./WEB-INF/classes/samples/stock/GetQuote1.class
21      ./WEB-INF/classes/samples/stock
1       ./WEB-INF/classes/samples/attachments/EchoAttachmentsService$MemoryOnlyDataSource.class
1       ./WEB-INF/classes/samples/attachments/TestRef$MemoryOnlyDataSource.class
10      ./WEB-INF/classes/samples/attachments/TestRef.class
7       ./WEB-INF/classes/samples/attachments/EchoAttachmentsService.class
10      ./WEB-INF/classes/samples/attachments/EchoAttachment.class
30      ./WEB-INF/classes/samples/attachments
5       ./WEB-INF/classes/samples/jms/JMSTest.class
6       ./WEB-INF/classes/samples/jms
3       ./WEB-INF/classes/samples/proxy/ProxyService.class
4       ./WEB-INF/classes/samples/proxy
3       ./WEB-INF/classes/samples/misc/TestClient.class
4       ./WEB-INF/classes/samples/misc
434     ./WEB-INF/classes/samples
435     ./WEB-INF/classes
2551    ./WEB-INF
58      ./SOAPMonitorApplet.java
4       ./StockQuoteService.jws
5       ./EchoHeaders.jws
10      ./fingerprint.jsp
2643    .
burrowww.cs.indiana.edu%burrowww.cs.indiana.edu% 
Make sure you also update your server.xml!

Note: This looks like a lot of stuff but it does not take more than 2MB of space.

2. Step Two: Installing the Dependencies

That means

Also note that

3. Step Three: Installing the Web Services

4. Step Four: Starting the Web Server

You know what that means:

burrowww.cs.indiana.edu% ps -ef | grep dgerman
 dgerman 27045 26426  0 09:43:02 pts/52   0:00 grep dgerman
 dgerman 24937 27736  0 08:00:05 ?        0:00 /u/dgerman/apache/apache_1.3.26/bin/httpd
 dgerman 26426 26421  0 09:18:38 pts/52   0:00 -csh
 dgerman 24917 27736  0 08:00:05 ?        0:00 /u/dgerman/apache/apache_1.3.26/bin/httpd
 dgerman 27736     1  0   Oct 08 ?        0:05 /u/dgerman/apache/apache_1.3.26/bin/httpd
 dgerman 24867 27736  0 08:00:04 ?        0:00 /u/dgerman/apache/apache_1.3.26/bin/httpd
 dgerman 26526     1  0 09:20:10 pts/52   0:16 /l/jdk/bin/../bin/sparc/native_threads/java -Djava.endorsed.dirs=/nfs/paca/home
 dgerman 24908 27736  0 08:00:04 ?        0:00 /u/dgerman/apache/apache_1.3.26/bin/httpd
 dgerman 24886 27736  0 08:00:04 ?        0:00 /u/dgerman/apache/apache_1.3.26/bin/httpd
burrowww.cs.indiana.edu% $CATALINA_HOME/bin/shutdown.sh
Using CATALINA_BASE:   /nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4
Using CATALINA_HOME:   /nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4
Using CATALINA_TMPDIR: /nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4/temp
Using JAVA_HOME:       /l/jdk
burrowww.cs.indiana.edu% ps -ef | grep dgerman                        
 dgerman 27080 26426  0 09:43:31 pts/52   0:00 grep dgerman
 dgerman 24937 27736  0 08:00:05 ?        0:00 /u/dgerman/apache/apache_1.3.26/bin/httpd
 dgerman 26426 26421  0 09:18:38 pts/52   0:00 -csh
 dgerman 24917 27736  0 08:00:05 ?        0:00 /u/dgerman/apache/apache_1.3.26/bin/httpd
 dgerman 27736     1  0   Oct 08 ?        0:05 /u/dgerman/apache/apache_1.3.26/bin/httpd
 dgerman 24867 27736  0 08:00:04 ?        0:00 /u/dgerman/apache/apache_1.3.26/bin/httpd
 dgerman 24908 27736  0 08:00:04 ?        0:00 /u/dgerman/apache/apache_1.3.26/bin/httpd
 dgerman 24886 27736  0 08:00:04 ?        0:00 /u/dgerman/apache/apache_1.3.26/bin/httpd
burrowww.cs.indiana.edu% $CATALINA_HOME/bin/startup.sh
Using CATALINA_BASE:   /nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4
Using CATALINA_HOME:   /nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4
Using CATALINA_TMPDIR: /nfs/paca/home/user1/dgerman/tomcat/jakarta-tomcat-4.0.4/temp
Using JAVA_HOME:       /l/jdk
burrowww.cs.indiana.edu% ps -ef | grep dgerman
 dgerman 24937 27736  0 08:00:05 ?        0:00 /u/dgerman/apache/apache_1.3.26/bin/httpd
 dgerman 26426 26421  0 09:18:38 pts/52   0:00 -csh
 dgerman 24917 27736  0 08:00:05 ?        0:00 /u/dgerman/apache/apache_1.3.26/bin/httpd
 dgerman 27736     1  0   Oct 08 ?        0:05 /u/dgerman/apache/apache_1.3.26/bin/httpd
 dgerman 27117 26426  0 09:43:47 pts/52   0:00 grep dgerman
 dgerman 24867 27736  0 08:00:04 ?        0:00 /u/dgerman/apache/apache_1.3.26/bin/httpd
 dgerman 27091     1 10 09:43:40 pts/52   0:06 /l/jdk/bin/../bin/sparc/native_threads/java -Djava.endorsed.dirs=/nfs/paca/home
 dgerman 24908 27736  0 08:00:04 ?        0:00 /u/dgerman/apache/apache_1.3.26/bin/httpd
 dgerman 24886 27736  0 08:00:04 ?        0:00 /u/dgerman/apache/apache_1.3.26/bin/httpd
burrowww.cs.indiana.edu% 
When your server is running:

Well, now you're basically done.

5. Step Five: Installation Testing.

You must perform the following checks:

When you validate make sure that

So you must not proceed until

Optional components are optional; install them when you need them.

If all looks well, from the start page select the link that allows you to view the list of deployed services. This will list all registered web services, unless the servlet is configured not to do so. On this page you should be able to click on (wsdl) for each deplyed web service to make sure that your web service is up and running. (Note though that you might have to view the source of the returned document, as your browser may not be able to understand or show the XML for the WSDL description).

6. Step Six: Deploying the Web Services.

The sequence of steps that we need to take is presented below.

7. Step Seven: Testing.

This step is optional, but highly recommended.

(For us, of course, it is mandatory).

Create a folder in which you place what you find in /u/dgerman/axis.

burrowww.cs.indiana.edu% ls -ld *
-rw-r--r--   1 dgerman  faculty     16755 Nov 18 01:15 axis-ant.jar
-rw-r--r--   1 dgerman  faculty   1006221 Nov 18 01:15 axis.jar
-rw-r--r--   1 dgerman  faculty     63515 Nov 18 01:15 commons-discovery.jar
-rw-r--r--   1 dgerman  faculty     26342 Nov 18 01:15 commons-logging.jar
-rw-r--r--   1 dgerman  faculty     35623 Nov 18 01:15 jaxrpc.jar
-rw-r--r--   1 dgerman  faculty    378778 Nov 18 01:15 log4j-1.2.4.jar
-rw-r--r--   1 dgerman  faculty     18459 Nov 18 01:15 saaj.jar
-rw-r--r--   1 dgerman  faculty    109356 Nov 18 01:15 wsdl4j.jar
-rw-r--r--   1 dgerman  faculty   1812019 Nov 18 01:15 xerces.jar
burrowww.cs.indiana.edu% 
Then change your CLASSPATH to include all these files:

setenv CLASSPATH /u/dgerman/axis/axis-ant.jar:$CLASSPATH
setenv CLASSPATH /u/dgerman/axis/axis.jar:$CLASSPATH
setenv CLASSPATH /u/dgerman/axis/commons-discovery.jar:$CLASSPATH
setenv CLASSPATH /u/dgerman/axis/commons-logging.jar:$CLASSPATH
setenv CLASSPATH /u/dgerman/axis/jaxrpc.jar:$CLASSPATH
setenv CLASSPATH /u/dgerman/axis/log4j-1.2.4.jar:$CLASSPATH
setenv CLASSPATH /u/dgerman/axis/saaj.jar:$CLASSPATH
setenv CLASSPATH /u/dgerman/axis/wsdl4j.jar:$CLASSPATH
setenv CLASSPATH /u/dgerman/axis/xerces.jar:$CLASSPATH
(I assume that you will be using a /u/username/axis folder).

Now copy /l/www/classes/a348/fall2002/samples/stock in the same folder.

(Again, this is only a few files, so the space taken is not that big.)

burrowww.cs.indiana.edu% pwd
/nfs/paca/home/user1/dgerman/axis
burrowww.cs.indiana.edu% ls -l
total 3440
-rw-r--r--   1 dgerman  faculty     16755 Nov 18 01:15 axis-ant.jar
-rw-r--r--   1 dgerman  faculty   1006221 Nov 18 01:15 axis.jar
-rw-r--r--   1 dgerman  faculty     63515 Nov 18 01:15 commons-discovery.jar
-rw-r--r--   1 dgerman  faculty     26342 Nov 18 01:15 commons-logging.jar
-rw-r--r--   1 dgerman  faculty     35623 Nov 18 01:15 jaxrpc.jar
-rw-r--r--   1 dgerman  faculty    378778 Nov 18 01:15 log4j-1.2.4.jar
-rw-r--r--   1 dgerman  faculty     18459 Nov 18 01:15 saaj.jar
-rw-r--r--   1 dgerman  faculty    109356 Nov 18 01:15 wsdl4j.jar
-rw-r--r--   1 dgerman  faculty   1812019 Nov 18 01:15 xerces.jar
burrowww.cs.indiana.edu% cp -r /l/www/classes/a348/fall2002/samples/stock . 
burrowww.cs.indiana.edu% ls -ld *
-rw-r--r--   1 dgerman  faculty     16755 Nov 18 01:15 axis-ant.jar
-rw-r--r--   1 dgerman  faculty   1006221 Nov 18 01:15 axis.jar
-rw-r--r--   1 dgerman  faculty     63515 Nov 18 01:15 commons-discovery.jar
-rw-r--r--   1 dgerman  faculty     26342 Nov 18 01:15 commons-logging.jar
-rw-r--r--   1 dgerman  faculty     35623 Nov 18 01:15 jaxrpc.jar
-rw-r--r--   1 dgerman  faculty    378778 Nov 18 01:15 log4j-1.2.4.jar
-rw-r--r--   1 dgerman  faculty     18459 Nov 18 01:15 saaj.jar
drwxr-xr-x   2 dgerman  faculty      1024 Nov 18 10:04 stock
-rw-r--r--   1 dgerman  faculty    109356 Nov 18 01:15 wsdl4j.jar
-rw-r--r--   1 dgerman  faculty   1812019 Nov 18 01:15 xerces.jar
burrowww.cs.indiana.edu% du -a stock
1       stock/testit.sh
1       stock/client_deploy.xml
3       stock/GetInfo.class
4       stock/ComInfoService.java
1       stock/undeploy.wsdd
3       stock/build.xml
2       stock/ComInfoService.class
2       stock/deploy.wsdd
3       stock/StockQuoteService.class
3       stock/GetQuote2.class
6       stock/GetQuote2.java
4       stock/GetInfo.java
1       stock/testit.cmd
1       stock/users.lst
5       stock/GetQuote.java
5       stock/StockQuoteService.java
4       stock/GetQuote.class
11      stock/GetQuote1.java
3       stock/README
5       stock/GetQuote1.class
4       stock/StockQuoteService.jws
3       stock/GetQuote.wsdl
1       stock/perms.lst
77      stock
burrowww.cs.indiana.edu% 
To run these samples we must do the following:

  1. Set up the CLASSPATH variable.

  2. Start a server.

  3. Deploy a service.

  4. Run the sample.

To set up the CLASSPATH variable

After that we need to realize the server is already running.

Then we need to deploy a service.

Let's deploy the stock quote service.

From the samples/stock folder we run the following:

java org.apache.axis.client.AdminClient \
  -lhttp://burrowww.cs.indiana.edu:10600/acis/services/AdminService deploy.wsdd
Check to see that a new service has been deployed (on happyAxis).

To run the sample we simply need

Now that all of this is working, the question is: how do we use it?

That's where SkatesTown comes in.

There are a few more notes (unfinished, but useful as they are) that I will list here:

There's also one more set of notes, on XML-RPC, that completes this class.


Last updated: Nov 18, 2002 by Adrian German for A348/A548