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

Followers