Mentions légales du service

Skip to content
Snippets Groups Projects
Commit 5627f9c4 authored by Jérôme Euzenat's avatar Jérôme Euzenat
Browse files

- fully implemented the webservice connection

parent 5ea7e8de
No related branches found
No related tags found
No related merge requests found
/*
* $Id: AlignmentClient.java 522 2007-07-18 09:08:08Z euzenat $
*
* Copyright (C) INRIA Rhne-Alpes, 2007.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/**
* Example of connection to the Alignment Server through HTTP/SOAP
* Inspired from SOAPClient4XG by Bob DuCharme
* $Id: Client.java 521 2007-07-18 09:02:04Z euzenat $
*
*/
import fr.inrialpes.exmo.align.impl.BasicParameters;
import fr.inrialpes.exmo.align.util.NullStream;
import org.semanticweb.owl.align.Parameters;
import java.util.Hashtable;
import java.util.Enumeration;
import java.io.PrintStream;
import java.io.File;
import java.io.*;
import java.net.*;
import gnu.getopt.LongOpt;
import gnu.getopt.Getopt;
public class AlignmentClient {
public static final String //Port Strings
HTML = "8089",
WSDL = "7777";
public static final String //IP Strings
HOST = "localhost";
private int debug = 0;
private String filename = null;
private String outfile = null;
private String paramfile = null;
private Hashtable services = null;
private URL SOAPUrl = null;
private String SOAPAction = null;
public static void main(String[] args) {
try { new AlignmentClient().run( args ); }
catch ( Exception ex ) { ex.printStackTrace(); };
}
public void run(String[] args) throws Exception {
services = new Hashtable();
// Read parameters
Parameters params = readParameters( args );
if ( outfile != null ) {
// This redirects error outout to log file given by -o
System.setErr( new PrintStream( outfile ) );
}
// JE//: Should not be correct.
SOAPUrl = new URL( "http://" + HOST + ":" + HTML + "/aserv" );
if ( debug > 0 ) {
System.err.println("***** Parameter parsed");
for ( int i=0; i < args.length; i++ ){
System.err.print( args[i]+" / " );
}
System.err.println();
}
// Create the SOAP message
String message = createMessage( params );
if ( debug > 1 ){
System.err.print("***** Send to "+SOAPUrl+" :: "+SOAPAction);
System.err.println("==>");
System.err.println(message);
System.err.println();
}
// Send message
String answer = sendMessage( message, params );
if ( debug > 1 ){
System.err.println("***** Received ==>");
System.err.println(answer);
System.err.println();
}
// Displays it
displayAnswer( answer );
}
public String createMessage( Parameters params ) throws Exception {
String messageBegin = "<SOAP-ENV:Envelope xmlns:SOAP-ENV=\'http://schemas.xmlsoap.org/soap/envelope/\' " +
"xmlns:xsi=\'http://www.w3.org/1999/XMLSchema-instance\' " +
"xmlns:xsd=\'http://www.w3.org/1999/XMLSchema\'>" +
"<SOAP-ENV:Body>";
String messageBody = "";
String cmd = (String)params.getParameter( "command" );
if ( cmd.equals("list" ) ) {
String arg = (String)params.getParameter( "arg1" );
if ( arg.equals("methods" ) ){
SOAPAction = "listmethods";
} else if ( arg.equals("renderers" ) ){
SOAPAction = "listrenderers";
} else if ( arg.equals("services" ) ){
SOAPAction = "listservices";
} else if ( arg.equals("alignments" ) ){
SOAPAction = "listalignments";
} else {
usage();
System.exit(-1);
}
} else if ( cmd.equals("wsdl" ) ) {
SOAPAction = "wsdl";
} else if ( cmd.equals("find" ) ) {
SOAPAction = "find";
String uri1 = (String)params.getParameter( "arg1" );
String uri2 = (String)params.getParameter( "arg2" );
if ( uri2 == null ){
usage();
System.exit(-1);
}
messageBody = "<uri1>"+uri1+"</uri1><uri2>"+uri2+"</uri2>";
} else if ( cmd.equals("match" ) ) {
SOAPAction = "align";
String uri1 = (String)params.getParameter( "arg1" );
String uri2 = (String)params.getParameter( "arg2" );
if ( uri2 == null ){
usage();
System.exit(-1);
}
String method = null;
String arg3 = (String)params.getParameter( "arg3" );
if ( arg3 != null ) {
method = uri1; uri1 = uri2; uri2 = arg3;
}
arg3 = (String)params.getParameter( "arg4" );
messageBody = "<url1>"+uri1+"</url1><url2>"+uri2+"</url2>";
if ( method != null )
messageBody += "<method>"+method+"</method>";
//fr.inrialpes.exmo.align.impl.method.SubsDistNameAlignment
if ( arg3 != null )
messageBody += "<force>"+arg3+"</force>";
} else if ( cmd.equals("trim" ) ) {
SOAPAction = "cut";
String id = (String)params.getParameter( "arg1" );
String thres = (String)params.getParameter( "arg2" );
if ( thres == null ){
usage();
System.exit(-1);
}
String method = null;
String arg3 = (String)params.getParameter( "arg3" );
if ( arg3 != null ) {
method = thres; thres = arg3;
}
messageBody = "<id>"+id+"</id><threshold>"+thres+"</threshold>";
if ( method != null )
messageBody += "<method>"+method+"</method>";
} else if ( cmd.equals("invert" ) ) {
SOAPAction = "invert";
String uri = (String)params.getParameter( "arg1" );
if ( uri == null ){
usage();
System.exit(-1);
}
messageBody = "<id>"+uri+"</id>";
} else if ( cmd.equals("store" ) ) {
SOAPAction = "store";
String uri = (String)params.getParameter( "arg1" );
if ( uri == null ){
usage();
System.exit(-1);
}
messageBody = "<id>"+uri+"</id>";
} else if ( cmd.equals("load" ) ) {
SOAPAction = "load";
String url = (String)params.getParameter( "arg1" );
if ( url == null ){
usage();
System.exit(-1);
}
messageBody = "<url>"+url+"</url>";
/* This may read the input stream!
// Most likely Web service request
int length = request.getContentLength();
char [] mess = new char[length+1];
try {
new BufferedReader(new InputStreamReader(request.getInputStream())).read( mess, 0, length);
} catch (Exception e) {
e.printStackTrace(); // To clean up
}
params.setProperty( "content", new String( mess ) );
*/
/* Or even better:
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String line;
while ((line = in.readLine()) != null) {
wsdlSpec += line + "\n";
}
if (in != null) in.close();
*/
} else if ( cmd.equals("retrieve" ) ) {
SOAPAction = "retrieve";
String uri = (String)params.getParameter( "arg1" );
String method = (String)params.getParameter( "arg2" );
if ( method == null ){
usage();
System.exit(-1);
}
messageBody = "<id>"+uri+"</id><method>"+method+"</method>";
} else if ( cmd.equals("metadata" ) ) {
SOAPAction = "metadata";
String uri = (String)params.getParameter( "arg1" );
String key = (String)params.getParameter( "arg2" );
if ( key == null ){
usage();
System.exit(-1);
}
messageBody = "<id>"+uri+"</id><key>"+key+"</key>";
} else {
usage();
System.exit(-1);
}
// Create input message and URL
String messageEnd = "</SOAP-ENV:Body>"+"</SOAP-ENV:Envelope>";
String message = messageBegin + messageBody + messageEnd;
return message;
}
public String sendMessage( String message, Parameters param ) throws Exception {
// Create the connection
URLConnection connection = SOAPUrl.openConnection();
HttpURLConnection httpConn = (HttpURLConnection) connection;
byte[] b = message.getBytes();
// Create HTTP Request
httpConn.setRequestProperty( "Content-Length",
String.valueOf( b.length ) );
httpConn.setRequestProperty("Content-Type","text/xml; charset=utf-8");
httpConn.setRequestProperty("SOAPAction",SOAPAction);
httpConn.setRequestMethod( "POST" );
httpConn.setDoOutput(true);
httpConn.setDoInput(true);
// Send the request through the connection
OutputStream out = httpConn.getOutputStream();
out.write( b );
out.close();
// Read the response and write it to standard output
InputStreamReader isr = new InputStreamReader(httpConn.getInputStream());
BufferedReader in = new BufferedReader(isr);
String answer = "";
String line;
while ((line = in.readLine()) != null) {
answer += line + "\n";
}
if (in != null) in.close();
return answer;
}
public Parameters readParameters( String[] args ) {
Parameters params = new BasicParameters();
params.setParameter( "host", HOST );
// Read parameters
LongOpt[] longopts = new LongOpt[16];
// General parameters
longopts[0] = new LongOpt("help", LongOpt.NO_ARGUMENT, null, 'h');
longopts[1] = new LongOpt("output", LongOpt.REQUIRED_ARGUMENT, null, 'o');
longopts[2] = new LongOpt("debug", LongOpt.OPTIONAL_ARGUMENT, null, 'd');
longopts[3] = new LongOpt("impl", LongOpt.REQUIRED_ARGUMENT, null, 'l');
longopts[4] = new LongOpt("D", LongOpt.REQUIRED_ARGUMENT, null, 'D');
// Service parameters
longopts[5] = new LongOpt("html", LongOpt.OPTIONAL_ARGUMENT, null, 'H');
longopts[6] = new LongOpt("jade", LongOpt.OPTIONAL_ARGUMENT, null, 'A');
longopts[7] = new LongOpt("wsdl", LongOpt.OPTIONAL_ARGUMENT, null, 'W');
longopts[8] = new LongOpt("jxta", LongOpt.OPTIONAL_ARGUMENT, null, 'P');
// DBMS Server parameters
longopts[9] = new LongOpt("dbmshost", LongOpt.REQUIRED_ARGUMENT, null, 'm');
longopts[10] = new LongOpt("dbmsport", LongOpt.REQUIRED_ARGUMENT, null, 's');
longopts[11] = new LongOpt("dbmsuser", LongOpt.REQUIRED_ARGUMENT, null, 'u');
longopts[12] = new LongOpt("dbmspass", LongOpt.REQUIRED_ARGUMENT, null, 'p');
longopts[13] = new LongOpt("dbmsbase", LongOpt.REQUIRED_ARGUMENT, null, 'b');
longopts[14] = new LongOpt("host", LongOpt.REQUIRED_ARGUMENT, null, 'S');
longopts[15] = new LongOpt("serv", LongOpt.REQUIRED_ARGUMENT, null, 'i');
// Is there a way for that in LongOpt ???
Getopt g = new Getopt("", args, "ho:S:l:d::D:H::A::W::P::m:s:u:p:b:i:", longopts);
int c;
String arg;
while ((c = g.getopt()) != -1) {
switch (c) {
case 'h' :
usage();
System.exit(0);
case 'o' :
/* Use filename instead of stdout */
outfile = g.getOptarg();
break;
case 'd' :
/* Debug level */
arg = g.getOptarg();
if ( arg != null ) debug = Integer.parseInt(arg.trim());
else debug = 4;
break;
case 'H' :
/* HTTP Server + port */
arg = g.getOptarg();
if ( arg != null ) {
params.setParameter( "http", arg );
} else {
params.setParameter( "http", HTML );
}
// This shows that it does not work
services.put( "fr.inrialpes.exmo.align.service.HTMLAServProfile", params.getParameter( "http" ) );
break;
case 'W' :
/* Web service + port */
arg = g.getOptarg();
if ( arg != null ) {
params.setParameter( "wsdl", arg );
} else {
params.setParameter( "wsdl", WSDL );
}
break;
case 'S' :
/* Server */
params.setParameter( "host", g.getOptarg() );
break;
case 'D' :
/* Parameter definition */
arg = g.getOptarg();
int index = arg.indexOf('=');
if ( index != -1 ) {
params.setParameter( arg.substring( 0, index),
arg.substring(index+1));
} else {
System.err.println("Bad parameter syntax: "+g);
usage();
System.exit(0);
}
break;
}
}
if (debug > 0) {
params.setParameter("debug", new Integer(debug));
} else if ( params.getParameter("debug") != null ) {
debug = Integer.parseInt((String)params.getParameter("debug"));
}
// Store the remaining arguments in param
int i = g.getOptind();
if ( args.length < i + 1 ){
usage();
System.exit(-1);
} else {
params.setParameter("command", args[i++]);
for ( int k = 1; i < args.length; i++,k++ ){
params.setParameter("arg"+k, args[i]);
}
}
return params;
}
public void displayAnswer( String answer ) {
// Printout to be improved...
System.out.println( answer );
}
// Really missing:
// OUTPUT(o): what for, there is no output (maybe LOGS)
// LOAD(l): good idea, load from file, but what kind? sql?
// PARAMS(p is taken, P is taken): yes good as well to read parameters from file
public void usage() {
System.err.println("usage: AlignmentClient [options] command [args]");
System.err.println("options are:");
System.err.println("\t--html[=port] -H[port]\t\t\tLaunch HTTP service");
System.err.println("\t--wsdl[=port] -W[port]\t\t\tLaunch Web service");
System.err.println("\t--output=filename -o filename\tRedirect output to filename");
System.err.println("\t--debug[=n] -d[n]\t\tReport debug info at level n");
System.err.println("\t-Dparam=value\t\t\tSet parameter");
System.err.println("\t--help -h\t\t\tPrint this message");
System.err.println();
System.err.println("commandss are:");
System.err.println("\twsdl");
System.err.println("\tfind URI URI");
System.err.println("\tmatch URI URI");
System.err.println("\ttrim AURI [method] threshold");
System.err.println("\tinvert AURI");
System.err.println("\tload URI | File");
System.err.println("\tstore AURI");
System.err.println("\tretrieve AURI");
// System.err.println("\tmetadata AURI key");
System.err.println("\tlist alignments");
System.err.println("\tlist method");
System.err.println("\tlist renderers");
System.err.println("\tlist services");
System.err.println("\n$Id$\n");
}
}
/**
* Example of connection to the Alignment Server through HTTP/SOAP
* Inspired from SOAPClient4XG by Bob DuCharme
* $Id$
*
*/
import java.io.*;
import java.net.*;
public class Client {
public static void main(String[] args) throws Exception {
String SOAPUrl = "http://localhost:8089/aserv";
String MessageBegin = "<SOAP-ENV:Envelope xmlns:SOAP-ENV=\'http://schemas.xmlsoap.org/soap/envelope/\' " +
"xmlns:xsi=\'http://www.w3.org/1999/XMLSchema-instance\' " +
"xmlns:xsd=\'http://www.w3.org/1999/XMLSchema\'> " +
"<SOAP-ENV:Body>";
// Create input message and URL
String SOAPAction = "align"; // define the specific action name
//String SOAPAction = "listmethods"; // define the specific action name
String MessageBody = "<url1>http://alignapi.gforge.inria.fr/tutorial/myOnto.owl</url1>" + // defind the profer argument for the specific action name
"<url2>http://alignapi.gforge.inria.fr/tutorial/edu.mit.visus.bibtex.owl</url2>" +
"<method>fr.inrialpes.exmo.align.impl.method.SubsDistNameAlignment</method>" +
"<force>false</force>";
String MessageEnd = "</SOAP-ENV:Body> "+"</SOAP-ENV:Envelope>";
String Message = MessageBegin + MessageBody + MessageEnd;
// Create the connection where we're going to send the file.
System.out.println("Send to "+SOAPUrl+" :: "+SOAPAction);
System.out.println("==>");
System.out.println(Message);
System.out.println("");
// Create the connection
URL url = new URL(SOAPUrl);
URLConnection connection = url.openConnection();
HttpURLConnection httpConn = (HttpURLConnection) connection;
byte[] b = Message.getBytes();
// Create HTTP Request
httpConn.setRequestProperty( "Content-Length",
String.valueOf( b.length ) );
httpConn.setRequestProperty("Content-Type","text/xml; charset=utf-8");
httpConn.setRequestProperty("SOAPAction",SOAPAction);
httpConn.setRequestMethod( "POST" );
httpConn.setDoOutput(true);
httpConn.setDoInput(true);
// Send the request through the connection
OutputStream out = httpConn.getOutputStream();
out.write( b );
out.close();
// Read the response and write it to standard output
InputStreamReader isr = new InputStreamReader(httpConn.getInputStream());
BufferedReader in = new BufferedReader(isr);
String inputLine = in.readLine();
// while ((inputLine = in.readLine()) != null)
System.out.println("Receive ==>");
System.out.println(inputLine);
in.close();
}
}
......@@ -2,30 +2,44 @@ Examples for AlignmentServer web service communication.
# $Id$
This directory contains an example of connecting to the Alignment Server through web services.
It is rudimentary and minimal... but works.
This directory contains an example of connecting to the
Alignment Server through web services.
-------------------------------------
CLIENT INVOKATION
java AlignmentClient keyword [genoptions] [options]
genoptions:
-d [num] debug level
-h hostname
-q quiet
java AlignmentClient wsdl -> XML
=> Find the WSDL file from the path
java AlignmentClient find URI URI -> AURI
java AlignmentClient match [method] URI URI -> AURI
-> CleanUp reception (err messages)
java AlignmentClient trim [method] AURI float -> AURI
java AlignmentClient invert AURI -> AURI
java AlignmentClient load URI | <stdin> -> AURI
=> finir la partie stdin
java AlignmentClient store AURI -> AURI
java AlignmentClient retrieve AURI method -> XML
=> embed a <?xml ...>
=> not always XML
//-java AlignmentClient metadata AURI key -> XML
java AlignmentClient list alignments -> XML
java AlignmentClient list method -> XML
java AlignmentClient list renderers -> XML
java AlignmentClient list services -> XML
----------------------------------
USE
$ javac Client
$ javac -cp .:../../lib/procalign.jar AlignmentClient.java
$ java Client
Send to http://localhost:8089/aserv :: align
==>
<SOAP-ENV:Envelope xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/' xmlns:xsi='http://www.w3.org/1999/XMLSchema-instance' xmlns:xsd='http://www.w3.org/1999/XMLSchema'> <SOAP-ENV:Body><url1>http://alignapi.gforge.inria.fr/tutorial/myOnto.owl</url1><url2>http://alignapi.gforge.inria.fr/tutorial/edu.mit.visus.bibtex.owl</url2><method>fr.inrialpes.exmo.align.impl.method.SubsDistNameAlignment</method><force>false</force></SOAP-ENV:Body> </SOAP-ENV:Envelope>
$ java -cp .:../../lib/procalign.jar AlignmentClient match file:///Java/alignapi/html/tutorial/myOnto.owl file:///Java/alignapi/html/tutorial/myOnto.owl
<SOAP-ENV:Envelope xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/' xmlns:xsi='http://www.w3.org/1999/XMLSchema-instance' xmlns:xsd='http://www.w3.org/1999/XMLSchema'> <SOAP-ENV:Body><id>1</id><sender>http://localhost:8089</sender><receiver>LocalHTMLInterface</receiver><in-reply-to>fr.inrialpes.exmo.align.service.Message@dd3d1b</in-reply-to><content>http://localhost:8089/alid/1186044903591/898</content> </SOAP-ENV:Body></SOAP-ENV:Envelope>
Receive ==>
<SOAP-ENV:Envelope xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/' xmlns:xsi='http://www.w3.org/1999/XMLSchema-instance' xmlns:xsd='http://www.w3.org/1999/XMLSchema'> <SOAP-ENV:Body><id>0</id><sender>http://localhost:8089</sender><receiver>LocalHTMLInterface</receiver><in-reply-to>fr.inrialpes.exmo.align.service.Message@ce3388</in-reply-to><content>http://localhost:8089/alid/1181763377472/560</content> </SOAP-ENV:Body></SOAP-ENV:Envelope>
------------------------------------
FILES
SOAPClient4XG.java
-> a minimal SOAP client for sending messages
soap-example.xml
-> a sample Soap message for the previous client
Client.java
-> a more adapted Client to the AlignmentServer
Sympa.wsdl
/**
* SOAPClient4XG. Read the SOAP envelope file passed as the second
* parameter, pass it to the SOAP endpoint passed as the first parameter, and
* print out the SOAP envelope passed as a response. with help from Michael
* Brennan 03/09/01
*
* java SOAPClient4XG http://services.xmethods.net:80/soap/servlet/rpcrouter weatherreq.xml
*
* @author Bob DuCharme
* @version 1.1
* @param SOAPUrl URL of SOAP Endpoint to send request.
* @param xmlFile2Send A file with an XML document of the request.
*
* 5/23/01 revision: SOAPAction added
*/
import java.io.*;
import java.net.*;
public class SOAPClient4XG {
public static void main(String[] args) throws Exception {
if (args.length < 2) {
System.err.println("Usage: java SOAPClient4XG " +
"http://soapURL soapEnvelopefile.xml" +
" [SOAPAction]");
System.err.println("SOAPAction is optional.");
System.exit(1);
}
String SOAPUrl = args[0];
String xmlFile2Send = args[1];
String SOAPAction = "";
if (args.length > 2)
SOAPAction = args[2];
// Create the connection where we're going to send the file.
URL url = new URL(SOAPUrl);
URLConnection connection = url.openConnection();
HttpURLConnection httpConn = (HttpURLConnection) connection;
// Open the input file. After we copy it to a byte array, we can see
// how big it is so that we can set the HTTP Cotent-Length
// property. (See complete e-mail below for more on this.)
FileInputStream fin = new FileInputStream(xmlFile2Send);
ByteArrayOutputStream bout = new ByteArrayOutputStream();
// Copy the SOAP file to the open connection.
copy(fin,bout);
fin.close();
byte[] b = bout.toByteArray();
// Set the appropriate HTTP parameters.
httpConn.setRequestProperty( "Content-Length",
String.valueOf( b.length ) );
httpConn.setRequestProperty("Content-Type","text/xml; charset=utf-8");
httpConn.setRequestProperty("SOAPAction",SOAPAction);
httpConn.setRequestMethod( "POST" );
httpConn.setDoOutput(true);
httpConn.setDoInput(true);
// Everything's set up; send the XML that was read in to b.
OutputStream out = httpConn.getOutputStream();
out.write( b );
out.close();
// Read the response and write it to standard out.
InputStreamReader isr =
new InputStreamReader(httpConn.getInputStream());
BufferedReader in = new BufferedReader(isr);
String inputLine;
while ((inputLine = in.readLine()) != null)
System.out.println(inputLine);
in.close();
}
// copy method from From E.R. Harold's book "Java I/O"
public static void copy(InputStream in, OutputStream out)
throws IOException {
// do not allow other threads to read from the
// input or write to the output while copying is
// taking place
synchronized (in) {
synchronized (out) {
byte[] buffer = new byte[256];
while (true) {
int bytesRead = in.read(buffer);
if (bytesRead == -1) break;
out.write(buffer, 0, bytesRead);
}
}
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment