Home > Services
Web Services
This chapter describes how to implement Web Services on the webMethods MDM side, offering the ability for any software client to interact with webMethods MDM through SOAP (Simple Object Access Protocol) messages.
We will go through the following steps:
Step 1 - Install Axis
Axis is available here.
We've been using version 1.4 of Axis to implement our Web Services.
Please download the version from one of the mirror site and install (unzip) it on your computer.
As of now, we assume Axis is installed on <your install dir>.
Step 2 - Deploy Axis on the web server
We need to deploy Axis on the same web server as webMethods MDM for them to interact.
Here we assume that you have a web server up and running on the localhost at port 8080. This is where webMethods MDM has been generally deployed. If your server is on a different port, please replace references to 8080 with your own port number.
In your Application Server installation, you should find a directory into which web applications ("webapps") are to be placed. Into this directory, copy the <your install dir>/webapps/axis directory from the axis distribution. You can actually name this directory anything you want, just be aware that the name you choose will form the basis for the URL by which clients will access your service. The rest of this document assumes that the default webapp name, "axis" has been used; please rename these references if appropriate.
You need to declare the axis webapp in the Application Server web.xml file, under the Host tag:
<Context path="/axis" docBase="<path to webapps/axis>" />
This way, webMethods MDM and axis webapps will collaborate under the same Application Server.
You can test your configuration using this link.
Step 3 - Create a Web Service
Let's create our first Web Service using Axis. This Service will give the ability to access to operations : import and export.
These two operations:
import java.io.*;
import com.softwareag.mdm.adaptation.*;
import com.softwareag.mdm.service.*;
public class mdmWebService
{
public String importMethod(String login, String password, String adaptationName, String data)
{
String summary;
final Adaptation ada = AdaptationName.forName(adaptationName).resolve();
if (ada == null)
{
summary = "Unknown adaptation " + adaptationName;
return summary;
}
// Creates a container for runnning services
ProgrammaticService svc = ProgrammaticService.createForLogin(login, password);
svc.setSessionTrackingInfo("Import WebService");
final StringBuffer msg = new StringBuffer();
final ImportSpec is = new ImportSpec();
is.setSourceStream(new ByteArrayInputStream(data.getBytes()));
is.setTargetAdaptation(ada);
// Defines the procedure
Procedure proc = new Procedure()
{
public void execute(ProcedureContext aContext) throws Exception
{
aContext.doImport(is);
msg.append("Data has been imported into adaptation [" + ada.toPublicReference()
+ "].");
}
};
// Requests the execution in the container and handles the result
ProcedureResult result = svc.execute(proc);
if (result.hasFailed())
summary = "Exception: " + result.getException();
else
summary = "Execution successful: " + msg;
return summary;
}
public String exportMethod(String login, String password, String adaptationName)
{
ByteArrayOutputStream stream = new ByteArrayOutputStream();
String summary;
final Adaptation ada = AdaptationName.forName(adaptationName).resolve();
if (ada == null)
{
summary = "Unknown adaptation " + adaptationName;
return summary;
}
// Creates a container for running services
ProgrammaticService svc = ProgrammaticService.createForLogin(login, password);
svc.setSessionTrackingInfo("Export WebService");
final ExportSpec es = new ExportSpec();
es.setDestinationStream(stream);
es.setSourceAdaptation(ada);
es.setContentIndented(true);
// Defines the procedure
Procedure proc = new Procedure()
{
public void execute(ProcedureContext aContext) throws Exception
{
aContext.doExport(es);
}
};
// Requests the execution in the container and handles the result
ProcedureResult result = svc.execute(proc);
if (result.hasFailed())
summary = "Exception: " + result.getException();
else
summary = stream.toString();
return summary;
}
}
Step 4 - Deploy the Web Service
The class we have just set up implements the Web Service. What remains to be done is to tell Axis how to expose this web service. Axis takes a Web Service Deployment Descriptor (WSDD) file that describes in XML what the service is, what methods it exports and other aspects of the SOAP endpoint.
The Axis user guide and reference guide cover these WSDD files.
Here is our deploy.wsdd file:
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<service name="mdmWebService" provider="java:RPC">
<requestFlow>
<handler type="soapmonitor"/>
</requestFlow>
<responseFlow>
<handler type="soapmonitor"/>
</responseFlow>
<parameter name="className" value="com.softwareag.mdm.webservices.mdmWebService"/>
<parameter name="allowedMethods" value="*"/>
</service>
</deployment>
.. and the corresponding undeploy.wsdd file:
<service name="mdmWebService"/>
</undeployment>
To deploy/undeploy the Web Service under Axis, please run Java with the following parameters:
main class: org.apache.axis.client.AdminClient
arguments:-lhttp://localhost:8080/axis/services/AdminService "<path to the wsdd file> "
Now the Web Service is ready to be called.
Step 5 - Create a Web Service client
Below are java code examples that illustrate how to consume the preceding Web Service using Axis.
Please refer to the Axis documentation for some more information about the java classes and methods used in our Axis client classes.
import java.io.*;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.*;
import org.apache.axis.utils.Options;
import javax.xml.namespace.QName;
import javax.xml.rpc.*;
public class ClientExport
{
public static void main(String [] args)
{
try {
Options options = new Options(args);
String endpointURL = options.getURL();
args = options.getRemainingArgs();
String user;
String password;
String adaptation;
String file;
if ((args == null) || (args.length < 4))
{
System.out.println("Usage: client <user> <password> <adaptation reference> <file to export to>");
return;
}
else
{
user = args[0];
password = args[1];
adaptation = args[2];
file = args[3];
}
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress( new java.net.URL(endpointURL) );
call.setOperationName( new QName("http://webservices.softwareag.com", "exportMethod") );
call.addParameter( "user", XMLType.XSD_STRING, ParameterMode.IN);
call.addParameter( "password", XMLType.XSD_STRING, ParameterMode.IN);
call.addParameter( "adaptation", XMLType.XSD_STRING, ParameterMode.IN);
call.setReturnType(XMLType.XSD_STRING );
String ret = (String) call.invoke( new Object[] { user,password,adaptation} );
FileOutputStream fos = new FileOutputStream(file);
fos.write(ret.getBytes());
fos.flush();
fos.close();
System.out.println("Return message from export service: " + ret);
}
catch (Exception e)
{
System.err.println(e.toString());
}
}
}
In order to execute the code, please run Java with the following parameters:
main class: com.softwareag.mdm.webservices.ClientExport
arguments: -lhttp://localhost:8080/axis/services/mdmWebService "<user>" "<password>" "<your adaptation reference>" "<path to the xml file to export to> "
import java.io.*;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.*;
import org.apache.axis.utils.Options;
import javax.xml.namespace.QName;
import javax.xml.rpc.*;
public class ClientImport
{
public static void main(String [] args)
{
try {
Options options = new Options(args);
String endpointURL = options.getURL();
args = options.getRemainingArgs();
String user;
String password;
String adaptation;
String file;
if ((args == null) || (args.length < 4))
{
System.out.println("Usage: client <user> <password> <adaptation reference> <file to import from>");
return;
}
else
{
user = args[0];
password = args[1];
adaptation = args[2];
file = args[3];
}
LineNumberReader reader = new LineNumberReader(new FileReader(file));
StringBuffer sb = new StringBuffer();
String line;
while ((line= reader.readLine())!=null)
{
sb.append(line);
}
String stream =sb.toString();
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress( new java.net.URL(endpointURL) );
call.setOperationName( new QName("http://webservices.softwareag.com", "importMethod") );
call.addParameter( "user", XMLType.XSD_STRING, ParameterMode.IN);
call.addParameter( "password", XMLType.XSD_STRING, ParameterMode.IN);
call.addParameter( "adaptation", XMLType.XSD_STRING, ParameterMode.IN);
call.addParameter( "data", XMLType.XSD_STRING, ParameterMode.IN);
call.setReturnType( org.apache.axis.encoding.XMLType.XSD_STRING );
String ret = (String) call.invoke( new Object[] { user,password,adaptation,stream } );
System.out.println("Return message from import service: " + ret);
}
catch (Exception e)
{
System.err.println(e.toString());
}
}
}
In order to execute the code, please run Java with the following parameters:
main class: com.softwareag.mdm.webservices.ClientImport
arguments: -lhttp://localhost:8080/axis/services/mdmWebService "<user>" "<password>" "<your adaptation reference>"
"<path to the xml file to import from>"
Note - Instant deployment
Axis gives the ability to
instantly deploy
any java code
as a web service. Please refer to the corresponding Axis users's guide chapter for some more information.
Simply put : if you copy any <source.java> Java source code into <your webapp root>/axis /<source.jws>, Axis automatically locates the file, compiles the class, and converts SOAP calls correctly into Java invocations of your service class.
Then, the corresponding web service is ready to be used. (Check http://localhost:8080/axis/<source.jws>?wsdl to get the wsdl file).
Services Web
Ce chapitre décrit comment implémenter des Web Services côté MDM, offrant la possibilité à tout client logiciel d'interagir avec webMethods MDM à travers des messages SOAP (Simple Object Access Protocol ).
Nous allons décrire les étapes suivantes :
Etape 1 - Installation d'Axis
Axis est disponible ici.
Nous avons utilisé la version 1.4 d'Axis pour implémenter nos Web Services.
Téléchargez SVP la version à partir d'un site mirroir et installez (dézippez)
le fichier sur votre disque dur.
A partir de maintenant, nous partons du principe qu'Axis est installé dans le répertoire <votre
répertoire d'installation>.
Etape 2 - Déploiement d'Axis sur le serveur web
Nous devons déployer Axis sur le serveur web où webMethods MDM est installé pour permettre leur interaction.
Nous faisons ici l'hypothèse que vous avez un serveur web qui s'exécute sur localhost au port 8080. C'est ici qu'webMethods MDM est généralement installé. Si votre serveur est sur un port différent, veuillez remplacer les références au port 8080 avec votre propre numéro de port.
Dans le répertoire d'installation de votre serveur d'application, vous devriez trouver un répertoire dans lequel les applications web ("webapps") doivent être installées. Dans ce répertoire, veuillez copier le répertoire <votre répertoire d'installation>/webapps/axis en provenance de la distribution axis téléchargée précédemment. Vous pouvez appeler ce répertoire comme bon vous semble, soyez juste prudent sur le fait que le nom choisi sera utilisé pour la construction de l'URL de base par laquelle les clients accèderont à vos services. Dans le reste de ce document, nous partons du principe que vous avez utilisé "axis" comme nom de webapp par défaut; veuillez renommer ces références si nécessaire.
Vous devez déclarer la webapp axis dans le fichier web.xml du serveur d'application, sous la balise Host :
<Context path="/axis" docBase="<chemin vers webapps/axis>" />
De cette façon, les webapps webMethods MDM et axis collaboreront dans le même serveur d'application.
Vous pouvez tester votre configuration en utilisant le lien.
Etape 3 - Créer un Web Service
Créons notre premier Web Service utilisant Axis. Ce Service donnera la possibilité d'accès aux opérations d'import et export.
Les deux opérations :
import java.io.*;
import com.softwareag.mdm.adaptation.*;
import com.softwareag.mdm.service.*;
public class mdmWebService
{
public String importMethod(String login, String password, String adaptationName, String data)
{
String summary;
final Adaptation ada = AdaptationName.forName(adaptationName).resolve();
if (ada == null)
{
summary = "Unknown adaptation " + adaptationName;
return summary;
}
// Creates a container for running services
ProgrammaticService svc = ProgrammaticService.createForLogin(login, password);
svc.setSessionTrackingInfo("Import WebService");
final StringBuffer msg = new StringBuffer();
final ImportSpec is = new ImportSpec();
is.setSourceStream(new ByteArrayInputStream(data.getBytes()));
is.setTargetAdaptation(ada);
// Defines the procedure
Procedure proc = new Procedure()
{
public void execute(ProcedureContext aContext) throws Exception
{
aContext.doImport(is);
msg.append("Data has been imported into adaptation [" + ada.toPublicReference()
+ "].");
}
};
// Requests the execution in the container and handles the result
ProcedureResult result = svc.execute(proc);
if (result.hasFailed())
summary = "Exception: " + result.getException();
else
summary = "Execution successful: " + msg;
return summary;
}
public String exportMethod(String login, String password, String adaptationName)
{
ByteArrayOutputStream stream = new ByteArrayOutputStream();
String summary;
final Adaptation ada = AdaptationName.forName(adaptationName).resolve();
if (ada == null)
{
summary = "Unknown adaptation " + adaptationName;
return summary;
}
// Creates a container for running services
ProgrammaticService svc = ProgrammaticService.createForLogin(login, password);
svc.setSessionTrackingInfo("Export WebService");
final ExportSpec es = new ExportSpec();
es.setDestinationStream(stream);
es.setSourceAdaptation(ada);
es.setContentIndented(true);
// Defines the procedure
Procedure proc = new Procedure()
{
public void execute(ProcedureContext aContext) throws Exception
{
aContext.doExport(es);
}
};
// Requests the execution in the container and handles the result
ProcedureResult result = svc.execute(proc);
if (result.hasFailed())
summary = "Exception: " + result.getException();
else
summary = stream.toString();
return summary;
}
}
Etape 4 - Déploiement du Web Service
La classe que nous venons de créer réalise le Web Service. Il ne nous reste plus qu'à indiquer à Axis comment exposer ce web service. Axis utilise un fichier Web Service Deployment Descriptor (WSDD) qui décrit en XML ce qu'est le service, quelles méthodes il expose et d'autres aspects de SOAP.
Le guide utilisateur et le
guide de référence Axis
couvrent la description de ces fichiers WSDD.
Voici notre fichier de déploiement deploy.wsdd :
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<service name="mdmWebService" provider="java:RPC">
<requestFlow>
<handler type="soapmonitor"/>
</requestFlow>
<responseFlow>
<handler type="soapmonitor"/>
</responseFlow>
<parameter name="className" value="com.softwareag.mdm.webservices.mdmWebService"/>
<parameter name="allowedMethods" value="*"/>
</service>
</deployment>
et le fichier d'annulation du déploiement undeploy.wsdd :
<service name="mdmWebService"/>
</undeployment>
Pour déployer/annuler le Web Service sous Axis, veuillez lancer la commande Java avec les paramètres
suivants :
classe principale: org.apache.axis.client.AdminClient
arguments:-lhttp://localhost:8080/axis/services/AdminService "<chemin vers le fichier wsdd> "
Le Web Service est maintenant prêt à être appelé.
Etape 5 - Créer un client à notre Web Service
Vous trouverez ci-dessous des exemples de code Java qui illustrent comment utiliser les Web Services
précédents sous Axis.
Veuillez vous référer à la
documentation Axis
pour de plus amples informations à propos des classes et méthodes Java utilisées dans
l'implémentation de notre client Axis.
import java.io.*;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.*;
import org.apache.axis.utils.Options;
import javax.xml.namespace.QName;
import javax.xml.rpc.*;
public class ClientExport
{
public static void main(String [] args)
{
try {
Options options = new Options(args);
String endpointURL = options.getURL();
args = options.getRemainingArgs();
String user;
String password;
String adaptation;
String file;
if ((args == null) || (args.length < 4))
{
System.out.println("Usage: client <user> <password> <adaptation reference> <file to export to>");
return;
}
else
{
user = args[0];
password = args[1];
adaptation = args[2];
file = args[3];
}
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress( new java.net.URL(endpointURL) );
call.setOperationName( new QName("http://webservices.softwareag.com", "exportMethod") );
call.addParameter( "user", XMLType.XSD_STRING, ParameterMode.IN);
call.addParameter( "password", XMLType.XSD_STRING, ParameterMode.IN);
call.addParameter( "adaptation", XMLType.XSD_STRING, ParameterMode.IN);
call.setReturnType(XMLType.XSD_STRING );
String ret = (String) call.invoke( new Object[] { user,password,adaptation} );
FileOutputStream fos = new FileOutputStream(file);
fos.write(ret.getBytes());
fos.flush();
fos.close();
System.out.println("Return message from export service: " + ret);
}
catch (Exception e)
{
System.err.println(e.toString());
}
}
}
Pour exécuter le code, veuillez lancer la commande Java avec les paramètres suivants :
classe principale : com.softwareag.mdm.webservices.ClientExport
arguments: -lhttp://localhost:8080/axis/services/mdmWebService "<utilisateur>" "<mot de passe >" "<référence de l'adaptation à exporter >" "<chemin vers le fichier xml cible > "
import java.io.*;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.*;
import org.apache.axis.utils.Options;
import javax.xml.namespace.QName;
import javax.xml.rpc.*;
public class ClientImport
{
public static void main(String [] args)
{
try {
Options options = new Options(args);
String endpointURL = options.getURL();
args = options.getRemainingArgs();
String user;
String password;
String adaptation;
String file;
if ((args == null) || (args.length < 4))
{
System.out.println("Usage: client <user> <password> <adaptation reference> <file to import from>");
return;
}
else
{
user = args[0];
password = args[1];
adaptation = args[2];
file = args[3];
}
LineNumberReader reader = new LineNumberReader(new FileReader(file));
StringBuffer sb = new StringBuffer();
String line;
while ((line= reader.readLine())!=null)
{
sb.append(line);
}
String stream =sb.toString();
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress( new java.net.URL(endpointURL) );
call.setOperationName( new QName("http://webservices.softwareag.com", "importMethod") );
call.addParameter( "user", XMLType.XSD_STRING, ParameterMode.IN);
call.addParameter( "password", XMLType.XSD_STRING, ParameterMode.IN);
call.addParameter( "adaptation", XMLType.XSD_STRING, ParameterMode.IN);
call.addParameter( "data", XMLType.XSD_STRING, ParameterMode.IN);
call.setReturnType( org.apache.axis.encoding.XMLType.XSD_STRING );
String ret = (String) call.invoke( new Object[] { user,password,adaptation,stream } );
System.out.println("Return message from import service: " + ret);
}
catch (Exception e)
{
System.err.println(e.toString());
}
}
}
Pour exécuter le code, veuillez lancer la commande Java avec les paramètres suivants :
classe principale : com.softwareag.mdm.webservices.ClientImport
arguments: -lhttp://localhost:8080/axis/services/mdmWebService "<utilisateur>" "<mot de passe>" "<référence de l'adaptation où importer>"
"<chemin vers le fichier xml source >"
Note - Déploiement instantané
Axis donne la possibilité de déployer en un clin d'oeil tout code source Java en un web service.
Veuillez vous référer au
chapitre correspondant
dans le guide de l'utilisateur Axis pour de plus amples informations.
Pour résumer, si vous copiez n'importe quel code source Java <source.java>
vers <racine de la webapp >/axis /<source.jws>, Axis détecte automatiquement le fichier, compile la classe, et convertit correctement les appels SOAP en invocations Java de votre classe service.
Ainsi, le web service correspondant est prêt à être utilisé (Cf http://localhost:8080/axis/<source.jws>?wsdl pour récupérer le fichier wsdl).
Home > Services