Reactome WebService a SOAP API

2008/07/05

Reactome WS API dava k dispozicii [XSD schemu prenasanych dat](http://www.reactome.org:8080/caBIOWebApp/services/caBIOService?wsdl | WSDL subor]], ktory sa odkazuje na [[http://www.reactome.org:8080/caBIOWebApp/docs/caBIOExtensionsXMLSchema.xsd ).

Problem s publikovanym WSDL je v pouzivanom bindingu. WSDL vzniklo zjavne automatickym generovanim z Java tried publikovanych v stacku Axis1. Tento stack je vsak prastary a jediny styl sprav, ktory podporuje, je RPC/encoded.

Kamenom urazu je to, ze ziadny z modernych frameworkov uz nepodporuje tento binding a ak podporuje (prikladom je Metro), tak len velmi limitovane.

Dalsim problemom tohto WSDL je divne definovana schema - komplexne typy su prapodivne a CXF aj Metro na nich zlyhaju.

Tretou nevyhodou je zapnutie sendMultiRefs v Axis2, ktora posiela spravy v kvazi „efektivnom tvare" - data, ktore sa opakuju, su posielane len raz a namiesto nich je v SOAP sprave len odkaz na prislusny jedinecny element (atribut href). Tento mechanizmus je umozneny v pripade stylu rpc/encoded. Problem je, ze ziadny z frameworkov (okrem Axis1) nepodporuje odkazy na elementy.

Jedinym riesenim, ako spracovavat odpovede na Reactome WS, je pouzit stary Axis1 a vygenerovat z neho klienta automaticky.

java -cp axis.jar;axis-ant.jar;commons-discovery-0.2.jar;commons-logging-1.0.4.jar;jaxrpc.jar;log4j-1.2.8.jar;saaj.jar;wsdl4j-1.5.1.jar org.apache.axis.wsdl.WSDL2Java http://www.reactome.org:8080/caBIOWebApp/services/caBIOService?wsdl

Vysledkom bude velky pocet .java suborov, ktore tvoria zdrojaky klienta. Tu sa vsak prejavi dalsia nekompatibilita WSDL suboru. Vacsina tried dedi od Object[] (ano, od pola objektov), co je zjavna hlupost. V dokumentacii k Reactome WS sa odporuca urobit hromadny search-and-replace, kde sa pole objektov nahradi ArrayListom. Inak povedane, treba urobit replace extends java.lang.Object[] na extends java.util.ArrayList. Pouzitie klienta je potom priamociare:

public class Reactome {
	public static void main(String[] args) throws Exception {
		CaBioDomainWSEndPointServiceLocator locator = new CaBioDomainWSEndPointServiceLocator();
		CaBioDomainWSEndPoint service = locator.getcaBIOService();
		Reaction reaction = (Reaction) service.queryById(114263L);
		System.out.println(reaction.getName());
	}
}
>> Home