Wednesday, June 28, 2006

Handle SOAP messages on MIDP devices using kSOAP

Andhika Candra W
203114774

XML menyajikan kemampuan untuk memproses yang baik yang merupakan salah satu persyaratan utama untuk aplikasi Wireless Web Service. MIDP/J2ME standar kurang memiliki kemampuan untuk XML API, yang tidak tergabung dalam spesifiksi MIDP 2.0 atau yang lainnya. Untuk itu dibutuhkan CLDC/library tambahan untuk menghandle XML, terutama untuk XML Web Service.

Untuk itu di enhydra.org terdapat package untuk dapat menjalankan aplikasi SOAP danXML pada KVM. Class utama pada kSOAP adalah SoapObject yang dapat build SOAP pada wireless aplikasi.

Kode program dibawah menampilkan Hello World dengan menggunakan kSOAP:

ByteArrayInputStream bis = new ByteArrayInputStream (mesg.getBytes ());
InputStreamReader reader = new InputStreamReader (bis);
XmlParser xp = new XmlParser (reader);
// Use default mapping between Java objects and Soap elements
SoapEnvelope envelope = new SoapEnvelope (new ClassMap (Soap.VER12));
envelope.parse (xp);

variable mesg berisi keseluruhan SOAP document.

Sekarang kita mendapatkan isi dari SOAP envelope.
Kode dibawah ini mendapatkan child pertama dari SOAP Body element:
// For Hello World Listing 1String result = (String) envelope.getBody();

Kode dibawah ini mendapatkan grandchild pertama dari SOAP Body element:
// For Hello World Listing 2
String result = (String) envelope.getResult();

Method SoapEnvelope.getResult() mendapatkan nilai dari SOAP RPC response messages yang berisi Hello World seperti pada Listing 2. SOAP parser bukan mendapatkan text string dari SOAP document melainkan mapping SOAP XML ke JAVA object.

kSOAP objects structure

Pada SOAP message, element xsi:type berfungsi untuk mendapatkan tipe data dari sebuah XML element. Sebagai contoh 123, berarti sebuah nilai integer yang besarnya 123. Sedangkan 123 berarti sebuah string yang isinya "123".
kSOAP secara otomatis mapping 4 tipe SOAP ke Java type berdasar list berikut :
xsd:int --> java.lang.Integer
xsd:long --> java.lang.Long
xsd:string --> java.lang.String
xsd:boolean --> java.lang.Boolean

Sewaktu kSOAP parser membaca tiap element SOAP, parser tersebut membaca XML element tersebut ke dalam memori internal Java data object berdasarkan rule berikut:
1. Jika SOAP element merupakan salah satu dari tipe diatas maka parser mengkonversi menjadi Java object tersebut
2. Jika SOAP element tidak memiliki child(primitive element) tetapi merupakan sebuah default tipe, maka dikonversi menjadi SoapPrimitive Object. Tetapi element original tipenya dapat didapatkan melalui method getNamespace() dan getName(). Dapat juga mengkases string melalui method SoapPrimitive.toString().
3. Jika SOAP element memiliki children maka diubah menjadi KVMSerializable Object. KVMSerializable adalah sebuah interface, kSOAP menyediakan implement untuk interface tsb yang bernama SoapObject.
4. Element dari children yang lebih kompleks dikonversi menjadi properties-properties didalam SoapObject sesuai 3 rule diatas. Setiap property memiliki PropertyInfo yang berisi informasi seperti SOAP element name dan JavaObject type. PropertyInfo tidak support element namespace, tapi untuk kSOAP release berikutnya akan support.

Advanced Features

Arrays

Listing . Stock-order response message dengan array


xmlns:SOAP-ENV="http://www.w3.org/2001/12/soap-envelope"
xmlns:SOAP-ENC="http://www.w3.org/2001/12/soap-encoding"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:n="http://www.javaworld.com/ksoap/test">



Michael Yuan
SOAP-ENC:arrayType="n:transaction[2]">

ABC
500
true
43.21


XYZ
1000
true
123.45


2002-07-18T23:20:52.52Z





kSOAP mengubah SOAP array menjadi java.util.Vector. Nethod vector,elementAT(i) mengekstrak array ke i. Tergantung dari arrayType, object tersebut bisa berupa SoapObject, SoapPrimitive atau default java type atau marshaled java object. Pada program diatas, array diubah menjadi SoapObject.

SoapObject Template

Pada contoh diatas, kita hanya membahas mengenai SOAP document dan parsing ke SoapObject. Pada banyak kasus, kita sering menangani message dengan format tertentu dan menginginkan parser untuk validate sebelum diparsing. Untuk proses validate dipakai class java biasa ClassMap. Untuk itu kita perlu menambah SoapObject template kosongan yang berisi informasi parent SOAP type, children element names dan Java types.

Dengan method ClassMap.addTemplate() pada SoapObject atau ClassMap.addMapping pada Marshal Object, maka ditambahkan SOAP type pada SoapPrimitive Object.

Source:
enhydra.org
http://www.javaworld.com/javaworld/jw-08-2002/jw-0823-wireless.html?
http://webservices.xml.com/pub/a/ws/2003/08/19/ksoap.html

No comments: