Showing posts with label programming. Show all posts
Showing posts with label programming. Show all posts

Thursday, September 11, 2008

Aplikasi load-balancer

Saat ini saya butuh aplikasi load-balancer yang akan digunakan oleh aplikasi saat melakukan koneksi ke sebuah system yang terdiri dari beberapa back-end server. Terpikir untuk menggunakan aplikasi load-balancer gratisan tapi setelah dipikir lagi mungkin gak bisa karena load-balancer yang saya perlukan adalah load-balancer yang harus melakukan pendistribusian berdasarkan sebuah grup transaksi (beberapa request). Beberapa request yang akan dilakukan adalah:
  1. Login
  2. Do-something-A
  3. Do-something-B
  4. Do-something-C
  5. Logout
ketiga request diatas harus selalu dikirimkan ke server yang sama. Hal ini diperlukan karena server-server yang menjadi tujuan tidak merupakan satu cluster sehingga session login yang dilakukan di server A tidak tereplikasi di server lainnya.

Jadi metode load-balancing yang saya perlukan adalah sticky load-balancing berdasarkan group transaction. Sticky berarti menempel. Beberapa transaksi yang saling berkaitan harus menempel (dikirimkan) pada server yang sama.

Sticky load-balancing adalah hal yang biasa dilakukan apalagi pada load-balancing trafik HTTP dan pengelompokan tujuan biasanya didasarkan pada:
  • Alamat IP pengirim
  • Session pengguna/cookies yang informasinya biasa terdapat pada HTTP header
  • Bagian (parameter) yang ada di request URL
Jadi yang saya butuhkan bukanlah load-balancing sederhana dengan algoritma round-robin.

Sejak beberapa tahun lalu saya sudah menggunakan pound sebagai load-balancer dan reverse-proxy. Aplikasi ini gratis, mudah instalasinya, mudah dikonfigurasi tapi cocok untuk implementasi load-balancer HTTP/HTTPS.

Jika anda menginginkan load balancer yang melakukan pembagian pada layer TCP maka beberapa alternatif ini bisa digunakan:
Untuk kebutuhan saya diatas sepertinya tidak bisa menggunakan aplikasi gratis tersebut, jadi saya berencana untuk meng-enhance apalikasi saja supaya melakukan load-balancingnya sendiri.

Catatan tambahan (2010/02/28):
Beberapa aplikasi load balancer yang mendukung sticky load balancing
  • HAproxy, dapat melakukan sticky load balancing berdasarkan cookie misalnya JSESSIONID, lihat dokumentasinya disini.
  • NGINX, lihat dokumentasinya disini
  • Crossroad

Wednesday, October 18, 2006

Mengapa saya tidak suka BEA weblogic workshop 8

Beberapa bulan ini saya berkutat dengan proyek portal yang menggunakan BEA weblogic workshop. Setelah mendapatkan training, saya baru tau kelebihan-kelebihan dari weblogic workshop. IDE ini mengedepankan kemudahan untuk membuat aplikasi J2EE dengan cara memberikan komponen-komponen yang sudah dibuat. Ini memudahkan kita untuk memakainya dengan hanya click atau click-and-drag. Behind the sceen, IDE ini menggunakan xdoclet, framework Java Page Flow (Struts), Java controls.

Tetapi sebagai development evirontment, saya tetap tidak suka dengan BEA weblogic workshop 8. Beberapa alasan diantaranya yaitu:

  • Tidak memiliki fasilitas refactor code. Menurut saya ini fasilitas basic yang perlu dimiliki untuk Java IDE modern.
  • Tidak memiliki akses ke kode library yang telah kita buat walaupun library tersebut masih dalam satu Project. Ini membuat kita tidak dapat dengan mudah menuju suatu kode class dari kode class lain yang menggunakannya. Hal ini karena ... baca point berikut ini
  • Library dalam suatu folder perlu dikompilasi menjadi jar file terlebih dahulu agar library atau applikasi lain dalam satu project dapat menggunakannya.
  • Tidak memiliki fasilitas pemformat kode (code beautifier).
  • Tidak dapat menjalankan applikasi java sederhana yang memiliki main method. Kita harus deploy di application server untuk dapat menjalankan suatu class sederhana. Ini merepotkan saat kita ingin melakukan test.
  • Workshop + application server membutuhkan resource besar dan sering berjalan sangat lambat.

Kelihatan simpel tapi menurut saya itu sudah cukup mengurangi produktifitas.

Friday, May 12, 2006

Jangan refactor kode orang lain tanpa memberitahukannya.

Refactor adalah pekerjaan yang baik, tetapi jangan lakukan jika refactor menyangkut kode orang lain tanpa memberitahukan detil apa yang telah di-refactor kepada orang yang telah menuliskan kode tersebut.

Refactor yang dilakukan tanpa diketahui orang yang menulis kode tersebut akan menyebabkan produktifitas menurun. Ini karena orang yang menuliskan kode pertama harus mempelajari kembali dan melakukan pelacakan perubahan. Lebih baik lagi jika perubahan selalu diinformasikan kepada semua anggota tim.

Thursday, May 11, 2006

JAX-RPC berubah menjadi JAX-WS

JAX-RPC (Java API for XML Based RPC) yang dispesifikasikan pada JSR-101 berubah nama menjadi JAX-WS (Java API for XML Web Services) dengan spesifikasi JSR-224.

Perubahan ini terjadi pada versi JAX-RPC 2.0, setelah JAX-RPC 1.1

Hal ini karena kesalahaan penamaan awal sebab JAX-RPC memberi kesan spesifikasi/library hanya untuk RPC padahal sebenarnya termasuk juga untuk Web Services.

Perubahan mendasar pada versi ini adalah digunakannya JAXB sebagai library untuk databinding.

Katanya dengan JAX-WS dibanding JAX-RPC maka generated code dari WSDL akan lebih sedikit (dalam hal line of code dan tentu saja size/byte) dan coding menjadi lebih mudah.

Tetapi target platform JAX-WS adalah Java SE 5, jadi jangan harap yang masih menggunakan JDK/JRE 1.4 bisa menggunakannya. Pada library ini code yang kita buat dimudahkan dengan adanya annotation yang mulai ada pada JDK/JRE versi 1.5

Seperti versi sebelumnya JAX-WS ini memenuhi standar:
  • WS-I Basic Profile 1.1
  • WS-I Attachments Profile 1.0
  • WS-I Simple SOAP Binding Profile 1.0

Yang saya tidak suka adalah, JAX-WS ini akan dimasukan dalam standar library JRE/JDK yaitu pada versi Mustang (Java SE 6). Buat saya seharusnya library ini cukup dimasukan ke spesifikasi Java Enterprise (JEE) sehingga JRE tidak semakin besar dan dipenuhi dengan framework-framework yang bukan inti (core libray).

Wednesday, May 10, 2006

Component/dependecy analyst

Setelah selesai membuat suatu program/software, ada baiknya Anda lakukan analisis komponen yaitu analisis ketergantungan antar modul atau komponen yang ada pada program/software Anda untuk kemudian anda dapat me-refactor kode program sehingga hubungan antar komponen menjadi lebih teratur (nggak jelimet).

Beberapa aplikasi untuk component/dependecy analyst untuk program Java diantaranya:

http://clarkware.com/software/JDepend.html
http://www.kirkk.com/Main/JarAnalyzer

Saturday, March 18, 2006

Service provider dalam file JAR

Sejak Java 1.3, suatu file JAR dapat berisi file metadata yang menspesifikasikan service provider class. File tersebut berada di direktori META-INF/services dan disebut sebagai file konfigurasi-profider (provider-configuration file)

Service disini adalah suatu set dari beberapa interface atau beberapa class, dan provider (service provider) adalah implementasi spesifik dari suatu service.

Sebuah provider biasanya sebuah class berfungsi sebagai proxy dari semua operasi yang ada pada sebuah service. Provider haruslah tidak memiliki argumen pada constructor-nya, sehingga dapat diinisialisasi saat pencarian (lookup).

Sebuah provider-configuration file harus memiliki nama sesuai dengan nama (fully-qualified name) dari abstract service class. File tersebut berisi list dari provider-class konkrit yang ada dalam file JAR. Komentar dapat ditambahakan pada file dengan karakter '#'

Sebagai contoh, mari kita membuat sebuah class service pada suatu aplikasi dengan nama com.ejlp.spi.EncryptorProvider yang

memiliki method abstract sebagai berikut:

public abstract Encryptor getEncryptor(String s);


Kita dapat membuat suatu provider dalam file JAR yang terpisah dengan aplikasi dan mengimplementasikan abstract class com.ejlp.spi.EncryptorProvider. Misalnya kita membuat class com.ic.DESEncryptor sebagi provider:

public class DESEncryptor extends com.ejlp.spi.EncryptorProvider {

   public DESEncryptor() {}

   public abstract Encryptor getEncryptor(String s) {
      //...
   }

}


Kemudian pada JAR file kita buat teks file META-INF/services/com.ejlp.spi.EncryptorProvider yang berisi line berikut

#Provider for DES encryptor
com.ic.DESEncryptor


Pada aplikasi yang akan menggunakan provider, kita bisa membuat mekanisme seperti ini:

 static {
     for (Iterator i = Service.providers(EncryptorProvider.class); i.hasNext(); ) {
         EncryptorProvider ep = (EncryptorProvider) i.next();
         registerProvider(ep.class.getName, ep);
     }
 }


 registerProvider(String name, EncryptorProvider ep) {
   //... Add provider to a Map
 }


 Encryptor getEncryptor(String providerName) {
   //... get provider by its name, otherwise get default provider
 }



Links:
JAR File Specification
Bacaan bagus tentang service framework: Introduction to Services Framework

Wednesday, March 15, 2006

JSR 160 (JMX Remoting)

JSR-160 (JMX Remoting)

JMX (JSR-3) mendefinisikan API untuk management aplikasi Java yang bersifat local.
Jika dibutuhkan client yang terkoneksi ke aplikasi Java yang mendukung JMX, maka koneksi dilakukan dengan cara yang tidak standar, biasanaya menggunakan RMI atau HTTP.
JMX remote API merupakan ekstensi dari spesifikasi JMX versi 1.2

Untuk itu dibuatlah JSR-160 yang memperluas JSR-3 yaitu memberikan sebuah standar API untuk koneksi ke suatu aplikasi JMX secara remote.
JMX remoting API terdiri dari package yang harus (mandatory) diimplementasikan dan ada bagian yang tidak mandatory.

Package yang ada pada JSR-160 adalah:

javax.management.remote
javax.management.remote.generic (optional package)
javax.management.remote.jmxmp (optional package)
javax.management.remote.message (digunakan untuk wrapping object yang dikirim dari client ke server)
javax.management.remote.rmi (mandatory package)

*** Connector
Connector (JMX API connector) adalah bagian yang bertanggung jawab untuk mentransmisikan permintaan (request) client ke sebuah remote MBean server.
Connector yang mandatory pada JSR-160 adalah yang berbasis RMI (RMI/JRMP atau RMI/IIOP)
Connector yang tidak mandatory adalah yang berbasis pada:
  • Java serialization (JMX Messaging Protocol/JMXMP) yang disebut Generic JMX API Connector
  • TCP socket protokol lainnya (disebut User-Defined Protocols Connector)
Connector merupakan class yang mengimplementasikan interface javax.management.remote.JMXConnector


*** Connector server
Connector server (JMX API connector server) disisipkan (attach) pada MBean Server (JMX agent) agar connector dapat berinteraksi dengannya.
Direpresentasikan dengan suatu super class: javax.management.remote.JMXConnectorServer
Connector server berasosiasi dengan MBean server dengan cara meregisterkannya pada MBean server atau memberikan MBean server pada constructornya.
Connector server perlu di-start() untuk mulai mendengarkan (listening) koneksi dari client.
Connector server berhenti ketika di-stop() atau akan di-unregister dari MBean Server

*** Pengalamatan
Alamat JMXConnectorServer menggunakan format URL.
URL tersebut digunakan JMXConnector untuk melakukan koneksi ke JMXConnectorServer
Bentuk pengalamannya seperti ini:

service:jmx:://[host[:port]][url-path]

protocol adalah jenis protokol yang digunakan misalnya rmi", "iiop", "jmxmp" atau yang lainnya
Representasi alamat connector adalah class javax.management.remote.JMXServiceURL

*** Contoh

Membuat connector server:

MBeanServer mbs = MBeanServerFactory.createMBeanServer();
JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:9999/server");
Map environment = null;

JMXConnectorServer cs = JMXConnectorServerFactory.newJMXConnectorServer(url, environment, mbs);
cs.start();

Membuat connector client:

JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:9999/server");
Map environment = null;
JMXConnector connector = JMXConnectorFactory.newJMXConnector(url, environment);
connector.connect(connectionEnvironment);

// Obtain a "stub" for the remote MBeanServer
MBeanServerConnection mbsc = connector.getMBeanServerConnection();

// Call the remote MBeanServer
String domain = mbsc.getDefaultDomain()

*** Discovery dan Lookup Service

Digunakan untuk 'mengiklankan' (advertise) dan mencari JMX agent
Infrasuktur untuk discovery dan lookup Service ini bisa menggunakan yang sudah ada seperti:
  • Service Location Protocol (SLP)
  • Java Naming and Directory Interface (JNDI)
  • Jini Network Technology


*** Referensi JMX Remote API
JavaTM Management Extensions (JMX) Remote API Overview
JavaTM Management Extensions (JMX) Remote API Tutorial
API Documentation

Semuanya bisa didownload dari pake reference implementation (RI)

Wednesday, July 27, 2005

commons-dbutils little hacks

commons-dbutils-1.0

1. Mapping nama kolom ke bean properties
Untuk merubah mapping nama kolom ke bean properties, dari standar penulisan field tabel di database yaitu dengan separator underscore "_" menjadi standar penulisan object field di java class yaitu tanpa separator dengan huruf kapital di awal kata. Misalnya: CUSTOMER_NAME menjadi customerName.

Ubah method mapColumnsToProperties pada class BeanProcessor pada line 365 yaitu:

String columnName = rsmd.getColumnName(col);
menjadi
columnName = StringUtils.replace(columnName, "_", "");
Referensi ini ternyata lebih baik dari apa yang saya buat disini.

2. QueryRunner yang bersifat scrollable.
Kita biasanya perlu berpindah-pindah cursor (scrollable) dari suatu result set dengan menggunakan method afterLast(), beforeFirst() dan lain-lain.

Default class QueryRunner dalam commons-dbutils adalah menghasilkan ResultSet yang bersifat TYPE_FORWARD_ONLY dan CONCUR_READ_ONLY. Untuk mengubah agar ResultSet dapat kita perlu membuat subclass dari class QueryRunner yang implementasinya seperti ini:

/*
* Created on Sep 23, 2004
*
*/

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.sql.DataSource;
import org.apache.commons.dbutils.QueryRunner;

public class QueryRunnerScrollable extends QueryRunner {

public QueryRunnerScrollable() {
super();
}

public QueryRunnerScrollable(DataSource ds) {
super(ds);
}

protected PreparedStatement prepareStatement(Connection conn, String sql)
throws SQLException {
return conn.prepareStatement(
sql,
ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_READ_ONLY);
}
}

Monday, June 06, 2005

Java Network Launching application

Ini beberapa alternatif aplikasi untuk lauching java program lewat network:

Wednesday, June 01, 2005

Apa spring framework memiliki feature AOP?

Spring menggunakan istilah interceptor untuk melakukan mekanisme AOP. Memang dalam dokumentasi spring disebutkan bahwa AOP pada spring framework dibuat sederhana dan tidak memiliki semua kemampuan seperti layaknya AOP framework.

Interceptor/interception ternyata merupakan istilah yang lebih cocok untuk enterprise framework seperti disebutkan dalam buku "Pattern of Software Architecture" karya Schmidt, dijelaskan

The Interceptor architectural pattern allows services to be added transparently to a framework and triggered automatically when certain events occur.

Artikel ini, "Setting the Story Straight: AOP != Interception" (link dari web archive) menarik untuk dibaca. Menurut penulisnya interception pattern berbeda dengan AOP.

Sebagai kesimpulan artikel tersebut: Interception can be seen as a simplified form of AOP.

Friday, May 06, 2005

Java XML-RPC, gampang banget...

Ingin membuat aplikasi client-server? tidak mau membuat web service karena terlalu ribet? tidak mau terlalu banyak coding dengan RMI? coba XML-RPC menggunakan Apache XML-RPC

Apache XML-RPC mudah digunakan. Hanya dengan sedikit coding kita sudah bisa membuat aplikasi client-server. Bisa menggunakan Built-in HTTP Server sebagai server atau kita juga bisa membuat servlet yang di-deploy di web server (servlet container).

Langkah pertama membuat class handler yang akan menjadi class pemroses (processor) dari setiap request. Contoh :
 public class Messenger {
public String send(String address, String message) {
// process sending message here
return "Sending successful to " + address+ " message is \"" + message + "\"";
}
}
Lalu buat server:
  import org.apache.xmlrpc.WebServer;
public class XmlRpcServer {
public static void main(String[] args) {
try {
WebServer webServer = new WebServer(7777);
webServer.addHandler("MyMessanger", new Messenger());
webServer.start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Setelah itu jalankan server, dan buat client:
  import java.io.IOException;
import java.net.MalformedURLException;
import java.util.Vector;
import org.apache.xmlrpc.XmlRpcClient;
import org.apache.xmlrpc.XmlRpcException;
public class SmsEngineClient {
public static void main(String[] args) {
try {
XmlRpcClient client = new XmlRpcClient("http://localhost:7777");
Vector params = new Vector ();
params.addElement("friend");
params.addElement ("Apa kabar euy?");
String result = (String) client.execute("MyMessanger.send", params);
System.out.println(result);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (XmlRpcException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Jalankan program client, dan lihat hasilnya. Mudah sekali.

Dengan XML-RPC kita bisa dengan mudah melakukan pertukaran data dengan tipe:
int, boolean, java.lang.String, double, java.util.Date, java.util.Hashtable, java.util.Vector dan byte[] (byte array, untuk pengiriman file misalnya).

Jadi kenapa tidak pakai XML-RPC saja?

Menjalankan program Java pada Windows Service atau sebagai Unix daemon

Ingin menjalakan program java sebagai Windows Service? atau sebagai daemon di sistem operasi Linux atau Unix?

Kita bisa gunakan Java Service Wrapper dengan mudah untuk keperluan tersebut. Java Service Wrapper mempunyai tiga metode untuk dapat menjalankan aplikasi java kita sebagai Windows service atau daemon.

Metode yang paling mudah bahkan tanpa mengubah sedikitpun aplikasi yang sudah kita buat. Pada versi 3.1.2, hanya dengan mengubah file wrapper.conf sesuai kebutuhan dan menjalankan file MyApp.bat, kita sudah bisa menjalankan aplikasi java sebagai Windows service.

Tutorial menyusul...

Paging pada iBatis

iBatis memiliki inteface PaginatedList dengan PaginatedArrayList sebagai class implementasi yang bisa kita gunakan untuk keperluan paging dengan mudah. Tetapi sayangnya interface tersebut tidak memiliki method untuk mendapatkan berapa jumlah keseluruhan data. Kita hanya bisa membuat navigasi previous dan next dengan informasi halaman (page) tanpa bisa menampilkan jumlah seleuruh halaman atau record yang ada.

Dibawah ini kode demo menggunakan falitas paging pada ibatis:
 PaginatedList usersPL = UserDao.getUserPaginatedList(2);
for (int i =0; i < usersPL .size(); i++) {
System.out.println(usersPL .get(i));
}
System.out.println(
"-- Page: " + usersPL .getPageIndex() +
", Row size: " + usersPL .getPageSize() );

System.out.println("-- Goto page 3");
usersPL .gotoPage(3);
for (int i =0; i< usersPL .size(); i++) {
System.out.println(usersPL .get(i));
}
System.out.println("-- Page: " + usersPL .getPageIndex() );

System.out.println("-- Goto next page");
usersPL.nextPage(3);
for (int i =0; i< usersPL .size(); i++) {
System.out.println(usersPL .get(i));
}
System.out.println("-- Page: " + usersPL.getPageIndex() );

Monday, April 18, 2005

AJAX: Web based rich client application

Yang belum tau AJAX artikel "Ajax: A New Approach to Web Applications" merupakan artikel utama yang mempopulerkan teknik ini.

AJAX = Asynchronous JavaScript + CSS + DOM + XMLHttpRequest.

AJAX merupakan sebutan untuk teknik pada aplikasi web yang menggunakan :
  • Presentasi web berbasis standar XHTML dan CSS;
  • Tampilan dan interaksi dinamis menggunakan Document Object Model (DOM);
  • Perukaran dan manipulasi data menggunakan XML dan XSLT;
  • Penggambilan data secara asynchronous menggunakan XMLHttpRequest;
  • Menggunakan JavaScript sebagai teknologi yang menggabungkan komponen2 tersebut.
Keuntungan menggunakan AJAX:
  • Lebih efektif, karena beberapa hal :
    • Transfer data hanya untuk bagian tertentu yang akan diupdate pada sebuah halaman web sehingga transfer data lebih kecil.
    • Beberapa proses cenderung dilakukan di client
  • Halaman web lebih interaktif atau responsif
Kerugiannya:
  • Sangat tergantung pada kompabilitas browser karena menggunakan client side scripting.
  • Point accessibility bisa menurun karena tergantung pada konfigurasi/kemampuan browser.
  • Lebih rumit dari aplikasi web biasa karena banyak menggunakan client side scripting, hal ini bisa diminimalisasi dengan adanya tools, library atau framework. Misalnya menggunakan DWR, JavaScript O Lait
  • Effort testing/debugging lebih besar
Saat ini pun kelihatannya Sun mulai mengadopsi AJAX sebagai blueprint solusi untuk aplikasi J2EE. Coba baca artikel: Asynchronous JavaScript and XML (AJAX) with Java 2 Enterprise Edition

Website portal tentang AJAX, www.ajaxmatters.com bagus untuk referensi, karena berisi link-link tentang artikel, tutorial, sample code dan lain-lain.

Links lainnya:
JavaScript/ECMAScript Language Specification
ECMAScript for XML (E4X) Specification
Document Object Model (DOM) Level 3 Load and Save Specification



Friday, April 15, 2005

Hati-hati menggunakan Singleton pada aplikasi Java.

Kita biasanya menggunakan singleton class (pattern) untuk keperluan caching, dimana setiap object yang mengakses instance dari singleton class akan mendapatkan nilai yang sama.
Instance dari class singleton hanya akan ada satu dalam JVM, karena pattern ini menghindari pembuatan instance baru jika sudah ada sebuah instance.
Dengan singleton pattern kita terhindar dari meng-create object berulang-ulang.

Tapi kita perlu hati-hati menggunakan Singelton di aplikasi J2EE. Karena ada scalability issue yang harus diperhatikan jika kita menggunakan singleton.

Perhatikan, ada beberapa hal yang membuat Singleton tidak singleton.

Jika aplikasi kita multithreding, ada masalah synchronization yang membuat class singleton menjadi beberapa instances. Yaitu jika pada method yang meng-create instance dari class singleton diakses oleh lebih dari satu thread pada waktu yang --hampir-- bersamaan.

Jika aplikasi kita menggunakan lebih dari satu JVM misalnya pada aplikasi terdistribusi/cluster, bagaimana kita menduplikasi singleton antar JVM?

Singleton biasanya menggunakan "static" keyword, dan ini bisa menimbulkan masalah pada aplikasi J2EE yang menggunakan banyak (lebih dari satu) class loader.

Pada JDK 1.2 virtual machine, singleton dapat di-garbage collection. Karena pada dasarnya instance akan dihapus oleh GC jika tidak ada object lain yang menyimpan reference ke class atau instance tersebut.

Friday, March 18, 2005

WS-* spesification map

Kalau kita belajar web service maka kita akan dibingungkan dengan banyaknya spesifikasi/standar yang digunakan. Spesifikasi web service biasanya open sehingga mudah dipelajari tapi karena banyaknya perusahaan atau organisasi yang membuat spesifikasi yang kadang mirip, kita jadi dibingungkan dengan spesifikasi tersebut. Spesifikasi yang mirip biasanya mulcul karena memang merupakan solusi untuk masalah yang sama.

Jika ingin melihat bagaimana rumitnya spesifikasi web service, kita bisa lihat peta "Web Services & WS_* Specifications"

Selain itu juga kita bisa lihat Big Picture of the XML family Of Spesifications.

Tuesday, March 15, 2005

PHP: NuSOAP dan DIME attachment

Butuh sending atau receiving DIME attachment pada web service manggunakan NuSOAP?

Saat ini saya sedang membuat sebuah class tambahan agar class soapclient dapat mendukung DIME attachment. Class ini dibuat seperti class soapclientmime pada file nusoapdime.php yang dibuat oleh Scott Nichol. Karena PEAR::SOAP sudah mendukung DIME attachment, maka dengan bantuan class Net_DIME dari PEAR maka pekerjaan ini jadi lebih mudah.

Saat ini create DIME attachment yang saya bikin untuk request (memmbuat DIME message untuk dikirim) sudah selesai. Inti perkerjaannya adalah disini :

function &_makeDIMEMessage(&$xml) {
// See class nusoap_base
$namespaces = 'http://schemas.xmlsoap.org/soap/envelope/';

// encode any attachments using DIME (see this link)
// now we have to DIME encode the message
$dime =& new Net_DIME_Message();
$msg =& $dime->encodeData($xml,$namespaces,NULL,NET_DIME_TYPE_URI);

// add the attachements
$c = count($this->requestAttachments);
for ($i=0; $i < $c; $i++) {
$attachment =& $this->requestAttachments[$i];
if ($attachment['data'] == '' && $attachment['filename'] <> '') {
if ($fd = fopen($attachment['filename'], 'rb')) {
$data = fread($fd, filesize($attachment['filename']));
fclose($fd);
} else {
$data = '';
}
$attachment['data'] = $data;
}
$msg .= $dime->encodeData($attachment['data'],
$attachment['contenttype'],
$attachment['cid'],
NET_DIME_TYPE_MEDIA);
}
$msg .= $dime->endMessage();
return $msg;
}
Selanjutnya agar NuSOAP support DIME attachment kita perlu penambahan kapabilitas untuk menerima response DIME message dan kapabilitas pada WSDL.

Friday, March 11, 2005

PHP: NuSOAP with certificate authentication

Dirjen Pajak Indonesia membuat Web Service untuk pelaporan pajak dari individu ataupun lembaga/perusahaan. Ini ide bagus, tapi sayang implementasinya kurang bagus. Saya tidak terlibat dengan project tersebut tapi setidaknya tau.

Web service yang dibuat tersebut disebut dengan eFiling (Electronic Filing System) yang maksudnya adalah layanan untuk mengirimkan Surat Pemberitahuan Pajak Tahunan (SPT) secara online. Web service tersebut dijual ke beberapa ASP (Application Service Provider), kemudian ASP tersebut membuat aplikasi sendiri yang mudah digunakan oleh masyarakat luas.

Implementasi web service tersebut menggunakan .NET, sayangnya pengembang proyek tidak memperhatikan interoperability dan kurang peduli dengan dokumentasi. Sehingga menyulitkan ASP untuk membuat aplikasinya. Walaupun saya bukan salah seorang dari ASP yang ada tapi saya tau sekali hal ini. Dengar-dengar proyek ini sudah berlangsung lama, lebih dari setahun dan hingga saat ini belum satu pun ASP yang benar-benar siap untuk menjual produk/layanannya ke masyarakat, padahal eFiling ini sudah diluncurkan oleh Presiden.

Tapi saya bukan ingin mengomentari proyek tersebut. Saya hanya memberikan highlight bahwa dalam pembangunan web service yang melibatkan banyak pihak yang menggunakannya masalah interoperability, dokumentasi dan keamanan sangatlah penting.

Implementasi web service ini cukup baik dilihat dari segi keamanan (security). eFiling menerapkan user authentication, XML-Encryption, XML Digital Signature (XML-Dsig), dan menggunakan SSL (HTTPS) dengan koneksi dedicated (antara ASP dan Dirjen Pajak). Keempat hal tersebut sudah cukup untuk membuat web service cukup aman.

User authentication yang digunakan adalah dengan mekanisme login menggunakan username dan password. XML-Encryption dan XML-DSig, karena standar yang umum/bebas dan gratis sudah banyak diimplementasikan. SSL dengan authentikasi sertifikat juga hal yang sudah biasa didunia web. Tapi sayangnya eFiling menggunakan DIME (Direct Internet Message Encapsultion) untuk mekanisme attachment pada SOAP. DIME adalah standar Microsoft, pernah disubmit ke IETF tapi tidak pernah menjadi RTF. Mekanisme attachment untuk web service, kita bisa menggunakan standar SOAP with attachments (Sw/A).

Implementasi web service client untuk eFiling ini akan sangat sulit jika kita ingin menggunakan PHP. Ini karena PHP tidak memiliki library yang memadai untuk standar-standar web service (WS-*). Setelah bersusah payah mencari-cari dengan google, akhirnya didapatkan NuSOAP sebagai kandidat utama untuk mencoba implementasi web service client untuk eFiling. Kenapa NuSOAP, karena library ini support koneksi dengan SLL dan authentication dengan digital certificate. Tapi ternyata NuSOAP tidak mendukung XML-Encryption dan XML-DSig dan DIME. Library PHP PEAR::SOAP mendukung DIME attachment dengan package DIME_Attachment tapi sayangnya tidak support authentication dengan digital certificate.

Tidak adanya library untuk XML-Encryption dan XML-DSig membuat aplikasi PHP harus dibuat saling beroperasi dengan aplikasi yang dibuat dengan bahasa lain yang memiliki library untuk kedua fungsi tersebut.

NuSOAP yang digunakan juga perlu mengalami perubahan untuk bisa sukses digunakan ketika authentication menggunakan digital certificate. Dibawah ini contoh code PHP menggunakan library nusoap.er.php (NuSOAP yang sudah dimodifikasi, saya akan upload code ini lain waktu) :
<html>
<head>
<title>DJP SOAP test</title>
</head>
<body>
<?
require_once('nusoap.er.php');

$soapclient = new soapclient('https://eFiling:1208/certReqWs/RegistrationService.asmx?WSDL','wsdl');

$username="";
$password="";
$certparams = array('cainfofile' => '/home/ejlp/htdocs/.cert/CADJP.cert',
'sslcertfile' => '/home/ejlp/htdocs/.cert/korupsipajak.cert.pem',
'sslkeyfile' => '/home/ejlp/htdocs/.cert/korupsipajak.key.pem',
'passphrase' => 'password');
$soapclient->setCredentials($username,$password,'certificate', $certparams);
ini_set("soap.wsdl_cache_enabled", "1");
$soapclient->create();

$err = $soapclient->getError();
if ($err) {
echo '<p><b>Create soapclient error: ' . $err . '</b></p>';
}

$proxy = $soapclient->getproxy();
$params = array( 'UserName' => 'test' , 'Password' => 'testpassword');
$results = $proxy->GetNPWP($params);

echo '<h3>Request:</h3> <xmp>'.$proxy->request.'</xmp>';
echo '<h3>Response:</h3> <xmp>'.$proxy->response.'</xmp>';
echo '<h3>Debug:</h3> <xmp>'.$proxy->debug_str.'</xmp>';
?>
</body>
</html>

Tuesday, February 22, 2005

Web service: standar baru untuk optimasi SOAP

- W3C XML Schema specification mensyaratkan binary data pada XML untuk diencode menggunakan base64 atau hexadecimal. Base64 encoding membuat data membesar 50%, sedangkan hexadecimal encoding memperbesar dua kalinya.

- SOAP menggunakan format XML sehingga binary data dapat diikutkan dengan menggunakan encoding. Tapi encoding binary data akan membuat file menjadi lebih besar sehingga tidak efektif karena memakan space, bandwith serta menambah proses encoding/decoding.

- Binary data dalam SOAP message bisa direpresentasikan dalam format byte array, dengan menggunakan tipe xsd:hexBinary atau xsd:base64Binary. Tapi Implemantasi SOAP biasanya tidak mendukung format byte array yang besar.

- Transfer binary data juga bisa dilakukan dengan SOAP with attachments (Sw/A), yang merupakan extension dari standar SOAP 1.1. Sw/A menggunakan MIME multipart/related message seperti pada attachement email, biasanya menggunakan base64 encoding.

- W3C membuat standar untuk mengoptimalisasi transmisi paket SOAP dengan standar XML-binary Optimized Packaging (XOP), SOAP Message Transmission Optimization Mechanism (MTOM), dan Resource Representation SOAP Header Block (RRSHB).

- XOP membuat encoding binary data pada dokumen XML menjadi lebih efisien. XOP bekerja pada level XML Information Set (Infoset) sehingga representasi abstrak dari XML dokumen dapat dapat diserialisasi (deserialize) dengan cara yang berbeda-beda.

- MTOM mendefinisikan bagaimana XOP dapat ditransmisikan dengan optimal menggunakan SOAP message. MTOM bisa menjadi solusi pengganti SOAP with Attachments (Sw/A) yang tidak di support oleh Microsoft sampai saat ini.

- RRSHB mendefiniskan bagaimana SOAP client dapat menggambil data dari original resource atau dari cache (local data) sehingga tidak perlu adanya transmisi lewat network.

- Karena ke-3 recomendation W3C tersebut baru dirilis 25 January 2005, jadi belum ada implementasi library untuk itu. Mungkin dari BEA, IBM atau Microsoft akan segera merilis library untuk memudahkan kita melakukan implementasi karena ketiga perusahaan tersebut yang banyak meberpartisipasi pada ke-3 recomendation tersebut.

- Ke-3 recomendation ini akan jadi next standar web service baru selain standar SOAP baru, SOAP 1.2

Saturday, February 05, 2005

Web service: standar dan organisasi

W3C develops interoperable technologies (specifications, guidelines, software, and tools) to lead the Web to its full potential. W3C creates a final specification or set of guidelines called Recommendation.

SOAP (Simple Object Access Protocol), WSDL (Web Services Description Language), UDDI (Universal Description, Discovery and Integration), XML (EXtensible Markup Language), XML Schema

OASIS is a not-for-profit, international consortium that drives the development, convergence, and adoption of e-business standards. Final realease of their standard called OASIS Standard.

OASIS Standards are approved within an OASIS Committee, submitted for public review, implemented by at least three organizations, and finally ratified by the Consortium's membership at-large.

WSRP (OASIS Web Services for Remote Portlets), WSS (Web Services Security),UDDI Specification, WSRM (Web Services Reliable Messaging)

WS-I is an open industry organization chartered to promote Web services interoperability across platforms, operating systems and programming languages.

WS-I makes :
  • Profiles provide implementation guidelines for how related Web services specifications should be used together for best interoperability.
  • Sample Applications demonstrate Web services applications that are compliant with WS-I guidelines.
  • Testing Tools are used to determine whether the messages exchanged with a Web service conform to WS-I guidelines.
Basic Profile 1.1, Simple SOAP Binding Profile 1.0, Attachments Profile 1.0

Followers