3.7.4 Pengunduhan Metadata
Pengunduhan metadata hanya dilakukan di sisi pengumpul. Alamat repositori diperoleh dari daftar antrean yang terdapat di koordinator. Metadata yang telah
diunduh kemudian disimpan dalam berkas XML. Proses selanjutnya adalah pengumpul mengirimkan berkas XML tersebut ke koordinator. Koordinator
menerima metadata yang dikirim oleh masing-masing pengumpul. Dengan menggunakan
stream
yang sama, pengunduhan dan pembacaan berkas XML tidak dapat dilakukan pada saat yang bersamaan. Salah satu dari kedua
proses tersebut akan mengalami kegagalan dalam pembacaan. Menggunakan dua buah stream yang berbeda dapat menyelesaikan masalah tersebut, tetapi akan
menghabiskan lebih banyak
bandwidth
karena mengakses dua alamat yang sama. Solusi yang diterapkan pada aplikasi ini adalah dengan menggunakan satu
stream
dan menyimpannya terlebih dahulu di pengumpul. Kemudian melakukan pembacaan
berkas XML yang telah disimpan. Implementasi pengunduhan dimulai dari inisialisasi koneksi ke Internet:
URL url = new URLrequestUrl; URLConnection urlConn = url.openConnection;
InputStream in = urlConn.getInputStream; System.out.printthis.user + Mengunduh + id + : +
requestUrl.substring0, 45 + ... ; OutputStream out = new BufferedOutputStreamnew
FileOutputStreamSystem.getPropertyuser.dir + \\xml\\ + id + .xml;
Universitas Sumatera Utara
Setelah alamat repositori yang diperoleh dari daftar antrean berhasil diunduh oleh pengumpul, selanjutnya akan dilakukan pembacaan berkas XML. Implementasi
pembacaan berkas XML adalah sebagai berikut:
baca XML byte[] buffer = new byte[1024];
int numRead; while numRead = in.readbuffer = -1 {
out.writebuffer, 0, numRead; }
out.flush; out.close;
String xmlURI = System.getPropertyuser.dir + \\xml\\ + id + .xml;
InputSource inputSource = new InputSourcenew FileInputStreamnew FilexmlURI;
inputSource.setEncodingUTF-8;
3.7.5 Komunikasi Pengumpul dan Koordinator
Sesuai dengan diagram aktivitas pada Gambar 3.9, pengumpul mengambil daftar antrean dari
database
melalui koordinator. Dalam hal ini pengumpul tidak secara langsung berkomunikasi dengan
database
yang terdapat di koordinator. Koordinator yang merespon permintaan pengumpul dan kemudian mengirimkan
hasilnya kepada pengumpul. Komunikasi antara pengumpul dan koordinator dimungkinkan dengan menerapkan RMI.
Universitas Sumatera Utara
Tidak terdapat permasalahan pada pemanggilan fungsi yang terdapat di koordinator. Akan tetapi ada satu masalah yang ditemukan yaitu pengiriman berkas
XML dari pengumpul ke koordinator. Untuk mengirimkan variabel atau objek ke komputer yang berbeda, RMI menggunakan sebuah fitur yang dinamakan serialisasi.
Dengan adanya serialisasi, variabel atau objek dapat dikirimkan ke komputer yang berbeda.
Hal yang sama tidak dapat diimplementasikan pada berkas XML, karena RMI bekerja menggunakan pemanggilan berdasarkan nilai. Objek diserialisasikan jika
belum mengimplementasikan
class
Remote.
Class
Remote digunakan agar objek yang dibuat oleh
server
RMI dapat dikenali oleh aplikasi klien. Oleh karena itu berkas XML yang telah dijadikan
stream
harus dikonversi terlebih dahulu menjadi
byte
. Untuk mengirimkan berkas XML ke koordinator, pengumpul memanggil fungsi upload dengan menyertakan dua buah argumen yaitu src dan dest. Deklarasi
fungsi upload tertera pada kode di bawah ini:
public void uploadFile src, File dest throws IOException { try {
copy new FileInputStreamsrc, this.server.getOutputStreamdest;
} catch RemoteException re { re.printStackTrace;
} }
Universitas Sumatera Utara
Argumen src merupakan berkas XML yang akan dikirimkan dari pengumpul ke koordinator. Berkas ini telah disimpan sebelumnya di direktori lokal pengumpul.
Kode berikut adalah nilai dari argumen src:
String xmlURI = System.getPropertyuser.dir + \\xml\\ + id + .xml;
Variabel id merupakan nomor identitas unik yang diperoleh dari daftar antrean. Sedangkan argumen dest adalah nama berkas XML yang akan disimpan pada
koordinator. Pemanggilan fungsi upload adalah sebagai berikut:
uploadnew FilexmlURI, new Fileid + .xml;
Sebelum berkas XML dikirim ke koordinator, terlebih dahulu dilakukan
konversi menjadi
byte
menggunakan kode berikut ini:
public void copyInputStream in, OutputStream out throws IOException {
byte[] b = new byte[BUF_SIZE]; int len;
while len = in.readb = 0 { out.writeb, 0, len;
} in.close;
out.close; }
Universitas Sumatera Utara
Pada fungsi copy digunakan tempat pada memori sebesar BUF_SIZE. Nilai BUF_SIZE adalah 1024 x 64. Pengiriman berkas XML tidak dilakukan sekaligus
melainkan per bagian sebesar BUF_SIZE. Perulangan pengiriman sebahagian berkas XML dilakukan oleh fungsi copy pada bagian berikut:
while len = in.readb = 0 { out.writeb, 0, len;
}
Penerimaan berkas
XML oleh
koordinator menggunakan
fungsi getOutputStream yang terletak di sisi
server
. Fungsi ini dipanggil melalui RMI oleh pengumpul.
public OutputStream getOutputStreamFile f throws IOException {
return new RMIOutputStreamnew RMIOutputStreamImpl new FileOutputStreamf;
}
Fungsi getOutputStream tidak secara langsung mengirimkan
byte
dari pengumpul ke koordinator. Diperlukan satu
class
lainnya untuk berkomunikasi dengan pengumpul. Walaupun menggunakan metode komunikasi yang sama yaitu
RMI, pengiriman berkas XML tidak dapat menggunakan
port
1099. Koordinator dan pengumpul menggunakan
port
9999 karena tidak digunakan oleh aplikasi lainnya. Implementasi yang dilakukan adalah sebagai berikut:
Universitas Sumatera Utara
public class RMIOutputStreamImpl implements RMIOutputStreamInterf {
private OutputStream out; public RMIOutputStreamImplOutputStream out throws
IOException { this.out = out;
UnicastRemoteObject.exportObjectthis, 9999; }
public void writeint b throws IOException { out.writeb;
} public void writebyte[] b, int off, int len throws
IOException { out.writeb, off, len;
} public void close throws IOException {
out.close; }
}
3.8 Perhitungan Peningkatan Perolehan Metadata