Pengunduhan Metadata Komunikasi Pengumpul dan Koordinator

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