Posts filed under ‘Java Technology’

Memanggil web service dari server Java EE di client PHP

Seorang mahasiswa yang sedang membuat skripsi bertanya apakah mungkin membuat sebuah web service dengan Java Enterprise Edition kemudian memanggilnya di client PHP?  Pada kesempatan tatap muka yang singkat, saya menjawab secara ringkas dengan merujuk pada definisi web services. Web services adalah sistem yang dirancang secara khusus untuk mendukung interaksi pertukaran data mesin ke mesin melalui jaringan. Selama berkomunikasi melalui metode yang sama, maka proses komunikasi dapat terjadi tanpa membedakan OS maupun bahasa pemograman yang dipakai.   Saat ini ada dua jenis web services, yaitu yang berbasis REST dan berbasis SOAP. Web services berbasis REST cenderung lebih ringan dan lebih mudah dipelajari dibandingkan dengan SOAP. Hal ini menyebabkan terjadinya peralihan dari web services berbasis SOAP ke REST.

Pada kesempatan tertulis ini, saya akan memberikan sebuah contoh halaman PHP yang memanggil web services yang dibuat dengan Java Enterprise Edition. Metode yang dipergunakan adalah metode berbasis SOAP.

Saya akan membuat dua proyek, yaitu:

  1. Server web service yang menggunakan teknologi Java Enterprise Edition. Saya menggunakan NetBeans IDE dan GlassFish bawaannya.
  2. Sebuah halaman PHP yang mengakses layanan web service yang disediakan oleh server di atas.

Membuat Server Web Service dengan Java EE

Langkah-langkah yang saya lakukan adalah:

  1. Memilih menu File, New Project di NetBeans IDE. Kemudian saya memilih Java Web di Categories, dan Web Application di Projects. Setelah memberi nama proyek dan menentukan lokasi penyimpanan, saya men-klik tombol Finish.
  2. Men-klik kanan nama proyek, kemudian memilih menu New, Other... Pada dialog yang muncul, saya memilih Web Services di bagian Categories, dan Web Service di bagian File Typesseperti yang terlihat di gambar berikut ini:

    Membuat Web Services Baru

    Membuat Web Services Baru

  3.  Pada Web Service Name, saya mengisi dengan nama PerhitunganWS. Pada bagian package, saya mengisi dengan nama package co.id.jocki.ws. Setelah itu, saya men-klik tombol Finish.

NetBeans akan membuat sebuah class baru yang berada di folder Web Services seperti yang terlihat pada gambar berikut ini:

Web Services Di Tampilan Project

Web Services Di Tampilan Project

Bila class PerhitunganWS di-buka, NetBeans memungkinkan pengguna untuk melihat dalam bentuk Source atau Design. Bila tampilan Design dipakai, maka layar editor akan terlihat seperti pada gambar berikut ini:

NetBeans Web Service Editor

NetBeans Web Service Editor

Untuk menambahkan sebuah operasi baru, saya melakukan langkah-langkah seperti berikut ini:

  1. Klik tombol Add Operation… Akan muncul sebuah dialog baru.
  2. Untuk menambah parameter, saya dapat men-klik tombol Add. Saya mengisi dialog tersebut seperti yang terlihat pada gambar berikut ini:

    Menambah Operasi Baru Di Web Service

    Menambah Operasi Baru Di Web Service

  3. Setelah itu, saya men-klik tombol OK.

Setelah ini, saya perlu menambahkan kode program yang berisi proses untuk operasi baru tersebut.   Saya men-klik Source di toolbar untuk beralih ke tampilan kode program.   Kemudian, saya mengubah satu-satunya baris di method tambah() menjadi return angka1 + angka2; seperti yang terlihat di gambar berikut ini:

Kode Program Operasi Di Web Service

Kode Program Operasi Di Web Service

Untuk menguji web service tersebut, klik kanan pada nama class PerhitunganWS, kemudian memilih Test Web Service seperti yang terlihat di gambar berikut ini:

Menguji Web Services

Menguji Web Service

NetBeans akan menjalankan browser yang berisi web service tester. Di halaman ini terdapat sebuah link bertuliskan WSDL File. URL disini nantinya akan dipakai oleh client web service. Di percobaan saya, nilai URL ini adalah http://localhost:8080/ServerWebService/PerhitunganWS?WSDL. Saya akan men-copy lokasi URL ini untuk dipakai di PHP nantinya.

Pada bagian methods, saya mencoba mengisi parameter dengan nilai 10 dan 20, kemudian setelah men-klik tombol tambah (nama method), akan muncul halaman tambah Method invocation. Pastikan pada halaman tersebut, terdapat tulisan Method returned int: “30″.

Sekarang server web service telah selesai dibuat. Saya tidak mematikan GlassFish server di NetBeans karena pada langkah berikutnya, saya akan memanggil web service ini di PHP.

Membuat Client Web Service dengan PHP

Sebelum mulai membuat client web service di PHP, saya memastikan apakah extension SOAP telah diaktifkan di PHP saya. Yang saya lakukan adalah membuat sebuah file PHP dengan nama info.php dimana isinya adalah <?php phpinfo(); ?>. Saat menampilkan halaman tersebut di browser, saya memastikan bahwa terdapat baris Soap Client dengan nilai Enabled.

Untuk membuat client web service, saya perlu membuat sebuah object dari class SoapClient seperti pada baris berikut ini:

$client = new SoapClient("http://localhost:8080/ServerWebService/PerhitunganWS?WSDL");

Nilai dari parameter constructur SoapClient adalah URL yang merujuk ke lokasi file WSDL. URL ini dapat dilihat di halaman web service tester pada saat saya menguji server web service di NetBeans.

Secara utuh, kode program PHP yang saya buat adalah:

<?php
function errorHandler($errno, $errstr, $errfile, $errline, array $errcontext) {
print "<h3>Terjadi kesalahan/peringatan:</h3>";
print "Baris $errline [$errstr]";
exit;
}

set_error_handler('errorHandler');

$client = new SoapClient("http://localhost:8080/ServerWebService/PerhitunganWS?WSDL");
$daftarOperasi = $client->__getFunctions();
print "<h3>Daftar Operasi Yang Tersedia Di Server WS:</h3>";
foreach ($daftarOperasi as $operasi) {
print "<p>$operasi</p>";
}
$hasil = $client->tambah(array('angka1'=>20, 'angka2'=>10));
print "<h3>Hasil operasi hitung(10,20): " . $hasil->return . "</h3>";
?>

<!--?php 

Pada kode program tersebut, saya menyertakan pemeriksaan kesalahan dengan set_error_handler(). Bagian tersebut dapat digantikan dengan menggunakan try/catch. Akan tetapi bila menggunakan try/catch, hanya pesan kesalahan yang ditampilkan, sementara pesan warning tidak akan ditampilkan. Bila pengaturan penampilan pesan kesalahan & warning secara otomatis tidak dimatikan (nilai display_errors di file konfigurasi adalah stdout), maka bagian ini tidak diperlukan.

Karena server web service di GlassFish menyediakan file WSDL, maka saya dapat menggunakan method __getFunctions() untuk melihat operasi apa saja yang disediakan oleh server web service tersebut.

Untuk memanggil salah satu operasi yang ada, saya cukup memanggil method dengan nama yang bersesuaian, diikuti dengan parameter yang diletakkan dalam associative array. Sebagai contoh, di kode program di atas, saya memanggil operasi tambah dengan nilai parameter angka1 berupa 20 dan nilai angka2 berupa 10. Hasil yang dikembalikan dari server web service adalah angka 30.

26 Mei 2012 at 2:54 PM Tinggalkan Komentar

Rectangular Selection Di NetBeans 7.1

Salah satu fitur baru yang menarik di editor NetBeans 7.1 adalah Rectangular Selection (shortcut CTRL+SHIFT+R).  Dengan fitur baru ini, programmer tidak lagi terikat untuk men-select kode program baris per baris.  Rectangular Selection sangat berguna untuk mengganti keyword yang berderet baris per baris tanpa mengganti keyword lain di setiap baris.   Sebagai contoh, terdapat deklarasi variabel seperti berikut ini:


private List<Kotak> lstOpen;
private List<Kotak> lstClose;
private Dunia dunia;
private Kotak curKotak;
private List<Kotak> lstHasil;

Lalu, programmer tiba-tiba memutuskan untuk mengganti keyword private pada seluruh baris di atas menjadi keyword public.

Ia dapat mulai dengan memilih keyword “private” yang ada dengan menggunakan Rectangular Selection tool seperti yang terlihat pada gambar berikut ini:

NetBeans 7.1 Rectangular Selection

NetBeans 7.1 Rectangular Selection

Kemudian, begitu mengetik “public” di keyword, seluruh kata “private” akan berubah menjadi “public“, seperti yang terlihat pada gambar berikut ini:

NetBeans 7.1 Rectangular Selection

NetBeans 7.1 Rectangular Selection

03 Februari 2012 at 11:47 PM Tinggalkan Komentar

Membuat Album Foto Dengan PrimeFace Di NetBeans 7

PrimeFaces adalah salah satu framework ‘tampilan’ yang kompatibel dengan Java Server Faces 2.0.  Framework ini sudah di-bundle di NetBeans 7 sehingga pengguna NetBeans tidak perlu lagi men-download sendiri.  Artikel ini akan menunjukkan bagaimana memakai PrimeFaces di NetBeans 7.  Artikel ini hanya menunjukkan pemakaian komponen <galleria>.  Seluruh komponen yang disediakan oleh PrimeFaces dapat dilihat di show case yang berada di http://www.primefaces.org/showcase/ui

Langkah pertama yang dilakukan adalah membuat sebuah project baru di NetBeans 7, dengan memilih menu File, New Project.  Kemudian pilih Java Web, Web Application, seperti yang terlihat di gambar berikut:

Klik tombol Next, isi informasi project seperti Project Name dan Project Location.  Klik tombol Next lagi untuk membuka halaman Server and Settings.  Pada halaman ini, pilih Server yang akan dipakai.

Setelah itu, klik tombol Next, halaman Frameworks akan muncul.  Beri tanda centang pada JavaServer Faces.  Kemudian pada tab Components, pilih PrimeFaces 2.2.1 di Components Suite seperti yang terlihat pada gambar berikut:

Memilih PrimeFaces Pada Saat Membuat Project Web Baru
Setelah itu, klik tombol Finish.  Sebuah facelet dengan nama index.xhtml akan dibuat.  Kalau diperhatikan, facelet tersebut secara otomatis akan menyertakan namespace PrimeFaces, seperti yang terlihat di bagian berikut:

<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:p="http://primefaces.prime.com.tr/ui"
xmlns:h="http://java.sun.com/jsf/html">

Web site yang akan dibuat pada artikel ini tidak menyediakan fungsi upload, sehingga diasumsikan gambar sudah berada di lokasi yang ditentukan.  Sebagai informasi, folder yang dipakai adalah folder dengan nama gambar.  Buat sebuah folder baru di Web Pages dengan klik kanan dan memilih New, Other… Pada dialog yang muncul, pilih Other, Folder. Pada Folder Name, isi dengan nama gambar.  Masukkan beberapa file gambar pada folder ini dengan cara copy-paste.

Langkah berikutnya, buat sebuah Managed Bean dengan memilih menu File, New File.  Kemudian pilih JavaServer Faces pada bagian Categories, dan pilih JSF Managed Bean pada bagian File Types.  Klik tombol Next.  Isi Class Name dengan FileAlbum.  Pada combobox Scope, isi dengan session.  Kemudian klik tombol Finish.

Kemudian ganti kode program pada FileAlbum.java yang dihasilkan oleh NetBeans menjadi seperti berikut:

package co.id.snake.mbean;

import java.io.IOException;
import java.net.URISyntaxException;
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.faces.application.Resource;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.servlet.ServletContext;

@ManagedBean
@SessionScoped
public class FileAlbum {

  private List<String> fileLocations;

  public FileAlbum() {
    fileLocations = new ArrayList<>();
    try {
      ServletContext sc = (ServletContext)FacesContext.getCurrentInstance().getExternalContext().getContext();
      Path dirGambar = Paths.get(sc.getRealPath("/gambar"));
      try (DirectoryStream<Path> dir = Files.newDirectoryStream(dirGambar)) {
        Iterator<Path> iter = dir.iterator();
        while (iter.hasNext()) {
          Path file = iter.next();
          fileLocations.add("/gambar/" + file.getFileName());
        }
      }
    } catch (IOException ex) {
      ex.printStackTrace();
    }
  }

  public List<String> getFileLocations() {
    return fileLocations;
  }
}

Kode program di atas memanfaatkan fitur baru di Java 7, sehingga hanya bisa dijalankan bila menggunakan JDK 7 ke atas.  Bila fitur baru belum dikenali oleh editor, klik kanan pada nama project, kemudian pilih Properties.  Pada bagian Source/Binary Format, pastikan JDK 7 sudah dipilih.

Setelah itu, lakukan modifikasi pada index.xhtml menjadi seperti berikut ini:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:p="http://primefaces.prime.com.tr/ui"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets">
<h:head>
   <title>Latihan PrimeFaces</title>
</h:head>
<h:body>
   <p:growl id="label" showDetail="true"/>
   <p:panel header="Album Foto">
     <p:galleria effect="slide" effectSpeed="1000">
       <ui:repeat value="#{fileAlbum.fileLocations}" var="fileLocation" >
         <p:graphicImage value="#{fileLocation}" />
       </ui:repeat>
     </p:galleria>
   </p:panel>
</h:body>
</html>

Tampilkan facelet tersebut di browser dengan memilih menu Run, Run File.  Berikut ini adalah contoh tampilan di browser:

Contoh Tampilan PrimeFaces

Video yang mempertunjukkan langkah demi langkah dari artikel ini dapat dilihat di http://www.screencast.com/t/C6KdmBmLCMn.

31 Oktober 2011 at 2:07 AM 2 komentar

Memakai J2ME Polish GUI

Setelah selesai melakukan konfigurasi, memakai J2ME Polish GUI sangatlah mudah.  Yang perlu dilakukan adalah membuat sebuah file polish.css di lokasi direktori resource yang telah ditentukan di build.xml.  Berikut ini adalah contoh sebuah MIDlet yang dibuat dengan menggunakan J2ME Polish GUI:

Contoh MIDlet Yang Memakai J2ME Polish GUI

Contoh MIDlet Yang Memakai J2ME Polish GUI

Berikut ini adalah isi file polish.css untuk menghasilkan output seperti gambar di atas:

.menuUtama {
	background {
		type: snowflakes;
		color: #cccccc;
		flake-color: white;
		max-flake-size: 20;
		number-of-flakes: 50;
	}
	layout: horizontal-expand | horizontal-center | vertical-center;
}

.pilihanMenu {
	layout: expand | center;
	font {
		face: proportional;
		size: large;
		color: black;
	}
}

.pilihanMenu:hover {
	layout: expand | center;
	font {
		size: large;
		color: #dddddd;
	}
	background {
		type: pulsating;
		start-color: #333333;
		end-color: #cccccc;
		back-and-forth: true;
		repeat: true;
	}
}

title {
	background {
		type: web20;
		color: #aaaaaa;
		circle-color: #cccccc;
		circle-anchor: bottom;
	}
	font {
		face: proportional;
		size: large;
		color: #333333;
	}
	text-effect: drop-shadow;
	layout: expand | center;
}

menu {
	background {
		type: horizontal-stripes;
		first-top-color: #aaaaaa;
		second-top-color: #777777;
		first-bottom-color: #dddddd;
		second-bottom-color: #aaaaaa;
	}
}

leftcommand {
	text-effect: shadow;
	text-shadow-color: #cccccc;

}

Isi MIDlet-nya sendiri sangatlah sederhana, dengan kode program yang sangat familiar bagi yang sudah terbiasa memakai LCDUI:

package co.id.jocki.latihan;

import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.List;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;

public class LatihanMIDlet extends MIDlet {

	private Display display;
	private List lstMenuUtama;

	public LatihanMIDlet() {

		display = Display.getDisplay(this);

		//#style menuUtama
		lstMenuUtama = new List("The Solid Snake", List.IMPLICIT);

		//#style pilihanMenu
		lstMenuUtama.append("New Game", null);
		//#style pilihanMenu
		lstMenuUtama.append("Load Game", null);
		//#style pilihanMenu
		lstMenuUtama.append("Options", null);
		//#style pilihanMenu
		lstMenuUtama.append("Exit", null);

	}

	protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
	}

	protected void pauseApp() {
	}

	protected void startApp() throws MIDletStateChangeException {
		display.setCurrent(lstMenuUtama);
	}

}

Yang membedakan hanyalah terdapat preprocessor #style (dalam bentuk comment) yang hanya akan dimengerti oleh J2ME Polish GUI, dan akan dipakai untuk melakukan translasi kode program nantinya.

Artikel ini juga dilengkapi dengan sebuah video tutorial yang dapat dilihat di sini.

19 Juli 2011 at 7:56 PM Tinggalkan Komentar

Konfigurasi J2ME Polish

Framework J2ME Polish menyertakan build.xml yang merupakan build file Apache Ant yang dipakai untuk men-compile dan menjalankan emulator.   Dengan demikian, pada dasarnya, J2ME Polish dapat dipakai pada IDE apa saja asalkan telah mendukung Apache Ant.  Salah satu pengecualian adalah pada IDE NetBeans karena IDE tersebut telah menggunakan Apache Ant untuk menjalankan tugas-tugas standar, sehingga programmer harus memakai file build-netbeans.xml yang akan meng-’extends‘ task bawaan NetBeans (yang terletak di lokasi nbproject/build-impl.xml).  Bila hal ini menyebabkan perilaku NetBeans menjadi aneh, sebaiknya jangan menggunakan plugin J2ME Polish untuk NetBeans!  Sebaliknya, jalankan build.xml secara manual atau terpisah dari IDE tersebut.  Pada IDE Eclipse, seseorang dapat memilih menu Window, Show View, Others.., kemudian memilih Ant, Ant.  Pada window yang muncul, klik kanan bagian kosong dan pilih Add Buildfiles…, kemudian pilih build.xml bawaan J2ME Polish yang telah di-copy ke folder project sebelumnya.

Tanpa menggunakan plugin, project dapat dibuat seperti membuat project Java ME biasanya.  Bedanya, file build.xml dan resources yang diperlukan harus di-copy secara manual ke folder project yang telah dibuat.  Setelah itu, buka file build.xml dan lakukan perubahan pada file tersebut.

Target <target name=”j2mepolish”> adalah bagian yang paling sering harus diubah.  Pada target ini dapat ditemukan tag <j2mepolish> yang di dalamnya terdapat sejumlah tag lagi, seperti <info>, <deviceRequirements>, <build>, dan <emulator>.

Tag <info> berisi informasi mengenai MIDlet, yang dapat diubah sesuai kebutuhan, misalnya:

<info
  name="Latihan MIDlet"
  version="1.0.0"
  description="Latihan pertama saya"
  vendorName="SolidSnake"
  infoUrl="http://thesolidsnake.wordpress.com"
  jarName="latihan.jar"
  jarUrl="${polish.jarName}"
  copyright="Copyright 2011 SolidSnake."
/>

Informasi yang ada di tag <info> nantinya akan mempengaruhi isi file JAD yang dihasilkan.  Sebagai catatan, file JAD adalah file teks yang berisi informasi mengenai aplikasi, yang akan di-download oleh pengguna sebelum men-download file JAR.

Tag <deviceRequirements> merupakan salah satu kelebihan memakai J2ME Polish!!  Dengan adanya tag ini, kita dapat menentukan target perangkat mobile dari aplikasi.  J2ME Polish memiliki sejumlah besar daftar perangkat yang tersimpan di file vendors.xml, devices.xml, dan capabilities.xml.  Ketiga file ini telah terdapat dalam file enough-j2mepolish-build.jar.  Untuk melihat ketiga file ini, buka file enough-j2mepolish-build.jar dengan program yang dapat membaca arsip zip.  Bila daftar yang ada dinilai masih kurang, seseorang dapat menambahkan perangkat baru di file custom-devices.xml.

Di dalam tag <deviceRequirements>, terdapat satu atau lebih tag <requirement>yang menjadi persyaratan bagi perangkat yang dapat menjalankan aplikasi ini.  Cara yang paling gampang adalah menyamakan Identifier dari perangkat, seperti yang terlihat di:

<deviceRequirements>
  <requirement name="Identifier" value="Generic/AnyMidp1Phone" />
</deviceRequirements>

Jika ingin platform yang lebih spesifik, nilai value pada Identifier dapat diganti menjadi seperti “Nokia/Series40E3″, “Sony-Ericsson/JavaPlatform7″, dan sebagainya.  Nilai ini harus sesuai dengan yang ada di vendors.xml dan devices.xml.

Lalu apa yang membuat <deviceRequirements> berguna?  Tag ini memiliki atribut if dan unless, sehingga seseorang bisa mengatur deviceRequirement apa saja yang aktif berdasarkan property Ant.  Misalnya, jika terdapat konfigurasi seperti:

<deviceRequirements if="untukNokiaS40Saja">
  <requirement name="Identifier" value="Nokia/Series40E3" />
</deviceRequirements>
<deviceRequirements if="untukSEJP7Saja">
  <requirement name="Identifier" value="Sony-Ericsson/JavaPlatform7" />
</deviceRequirements>

maka jika <property name=”untukNokiaS40″ value=”true” /> dipanggil sebelumnya, maka hanya deviceRequirements tersebut saja yang aktif.  Dengan demikian, seseorang bisa membuat target seperti “jalankanNokia“, “jalankanSonyEricson“, dan sebagainya, sehingga proses pengembangan aplikasi yang sama untuk banyak vendor berbeda menjadi mudah.

Tag <build> akan men-compile dan membuat file JAR dari kode program.  Tag ini memiliki sejumlah elemen seperti <midlet>, <variables>, <resources>, <obfuscator>, dan lainnya.  Yang harus diubah adalah tag <midlet> dimana programmer harus menentukan class MIDlet dan nama MIDlet.  Satu hal yang berguna dan tidak ditemui pada IDE standar adalah tag <midlet> juga mendukung atribut if.  Ini berarti seseorang dapat menentukan MIDlet apa saja yang akan menjadi bagian dari JAR berdasarkan kondisi tertentu!  Sementara pada IDE seperti NetBeans dan Eclipse, seluruh MIDlet dalam proyek yang sama akan di-bundle menjadi satu kesatuan, tanpa pengkondisian tertentu.

Terakhir, untuk menjalankan emulator, tambahkan tag <emulator>.  Tag ini sangat sederhana, hanya terdiri dari atribut seperti wait, securityDomain, enableProfiler, enableMemoryMonitor, dan sebagainya.  Perlu diingat bahwa programmer TIDAK menentukan secara manual emulator apa yang akan dijalankan.  J2ME Polish secara otomatis menentukan emulator yang akan dijalankan berdasarkan pengaturan di deviceRequirements.  Pada banyak kasus, J2ME Polish akan menjalankan MicroEmulator yang sudah ter-install bersama dengannya.  MicroEmulator adalah emulator JME yang berjalan pada Java Standard Edition.

Bila tidak ingin memakai MicroEmulator, melainkan emulator bawaan Java ME Platform SDK, gunakan Identifier seperti Generic/AnyMidp1Phone pada deviceRequirements.  Perlu diingat bahwa Java ME Platform SDK mungkin akan menolak menjalankan JAR yang telah mengandung file-file class J2ME Polish karena memiliki ukuran yang besar, di atas 1 MB.  Untuk mengatasi permasalahan ini, masuk ke direktori instalasi Java ME Platform SDK 3.0, kemudian buka direktori runtimes, lalu cldc-hi-javafx, dan kemudian buka direktori bin.  Edit file jwc_properties.ini yang terdapat pada direktori tersebut dengan notepad atau editor lainnya.  Gunakan fitur search untuk mencari tulisan system.jam_space, kemudian ganti nilai 1000000 menjadi nilai yang lebih besar.

Setelah itu, tutup device-manager.exe melalui icon di taskbar ataupun melaui task manager.  Jalankan kembali target Ant j2mepolish, dan kini emulator Java ME Platform SDK akan menampilkan MIDlet dengan lancar.  Tapi satu hal yang perlu diingat adalah pada kenyataannya, sama seperti emulator yang sebelumnya menolak, perangkat mobile lama mungkin juga tidak mendukung file JAR yang besar.

17 Juli 2011 at 12:35 AM Tinggalkan Komentar

Memakai J2ME Polish Di Dalam NetBeans

J2ME?  Sebuah nama yang masih mewakili generasi lama, karena Sun (kini dibeli Oracle) sudah lama mengganti nama Java 2 Micro Edition (J2ME)  menjadi Java Micro Edition (JME).  Dari sisi teknologi sendiri, kini sudah ada Java FX yang semakin didukung.  Lalu kenapa masih memakai J2ME Polish?

J2ME Polish adalah sebuah framework tambahan dari Enough Software dan bersifat open-source.  J2ME Polish terdiri atas beberapa komponen, seperti:

  • Lush,  untuk perancangan user interface.
  • Janus, untuk transcoding aplikasi Java Micro Edition ke BlackBerry atau Android.
  • Touch, untuk mempermudah pemograman networking.
  • Trunk, untuk menyederhanakan proses menyimpan dan membaca data.
  • Marjory, merupakan kumpulan database yang berisi informasi perangkat mobile, yang dihimpun bersama oleh komunitas.

Pada konotasi secara umum dan juga pada artikel ini, J2ME Polish sering dirujuk dengan komponen Lush-nya, sehingga asumsi-nya J2ME Polish adalah framework berbasis GUI.

Jika memang demikian, apa kelebihan framework user interface di J2ME Polish?  Pada beberapa framework lain, seperti Kuix (Kalmeo User Interface eXtensions), tampilan user interface digantikan sepenuhnya dengan menggunakan XML.  J2ME Polish mengambil pendekatan yang berbeda, dimana J2ME Polish tetap menggunakan class-class LCDUI seperti class Form dan turunan Item (TextField, StringItem, dsb).  Hal ini berarti untuk beralih dari proyek yang sudah ada ke J2ME Polish, programmer tidak perlu mengubah kode program yang sudah ada.  J2ME Polish tentu saja juga menyediakan class-class tambahan, seperti TabbedForm, TreeItem, dan sebagainya.  Setiap komponen tersebut dapat di-customize dengan membuat sebuah file teks yang menggunakan syntax CSS.

Kelemahan J2ME Polish, sama seperti framework lainnya yang bukan merupakan bagian dari standar Java, adalah ukuran JAR yang meningkat beberapa kilobyte.  Ini karena JAR harus menyertakan kode program J2ME Polish.

File JAR J2ME Polish dapat di-download di http://www.enough.de/products/j2me-polish/download.  File berukuran sekitar 52 MB tersebut merupakan sebuah aplikas Java Standard Edition yang berfungsi sebagai installer.  Ketik perintah berikut di command prompt untuk memulai proses instalasi:

java - jar j2mepolish-2.2.1.jar

Installer akan meminta beberapa informasi lokasi direktori, seperti lokasi instalasi NetBeans dan Java ME Platforms SDK.  Installer juga menawarkan untuk menyiapkan sebuah plugin bagi NetBeans sehingga NetBeans dapat langsung menjalankan MIDlet yang memakai framework J2ME Polish.

Salah satu hal yang perlu diperhatikan bila melakukan instalasi plugin J2ME Polish untuk  NetBeans 7  di Windows 7 adalah  jangan lupa menjalankan NetBeans 7 dengan hak akses administrator.  Bila pada saat melakukan update plugin, NetBeans 7 tidak memiliki hak akses administrator, ia akan terus me-restart dirinya sendiri walaupun aplikasinya sudah ditutup.   Solusinya, tutup NetBeans 7 melalui Task Manager, kemudian jalankan kembali NetBeans 7 dengan men-klik kanan icon-nya lalu memilih Run as administrator.

Bila plugin telah ter-install dengan benar, pengguna dapat segera membuat proyek baru dengan memilih menu File, New Project, Java ME, dan men-klik pada J2ME Polish Project.  Kotak dialog New Project yang muncul terlihat sedikit berbeda dari biasanya.  Misalnya, sekarang pengguna dapat menentukan lokasi ia men-install J2ME Polish.  Akan tetapi, halaman yang paling berubah dari biasanya adalah halaman Select Target Devices.  Pilihan device terlihat semakin banyak berkat komponen Marjory dari J2ME Polish.  Coba mulai dengan memilih Configuration “CLDC/1.1“, profiles “MIDP/2.1“, dan salah satu device Nokia seperti “Nokia E66″.

Halaman "Select Device Type"

Di NetBeans, J2ME Polish membuat turunan dari build-impl.xml milik NetBeans sehingga pada saat tombol “Run” ditekan, yang akan dikerjakan adalah Ant’s Task milik proyek J2ME Polish.  Untuk melihat Ant’s Task yang telah dimodifikasi tersebut, buka proyek melalui window Files, kemudian double-click pada build.xml.

Saya menemukan masalah pada saat akan menjalankan proyek, dimana window Output memunculkan kesalahan:

java.io.IOException: Cannot run program "jvisualvm": CreateProcess error=2, The system cannot find the file specified

Kesalahan ini terjadi karena pada saat menjalankan emulator, J2ME Polish juga menjalankan profiler, dalam hal ini adalah JVisualVM.  Akan tetapi cara pemanggilan JVisualVM tersebut tidak diikuti dengan lokasi path yang lengkap!  Hal ini menyebabkan ProcessBuilder tidak menemukan file yang akan dijalankan.

Solusi yang paling mudah adalah dengan meng-edit file build.xml untuk mematikan profiler.  Lagipula, bagi sebagian orang, menjalankan JVisualVM setiap kali program di-run adalah hal yang menganggu.  Pada bagian <target name=”j2mepolish”>, cari bagian yang bertanggung jawab untuk memanggil emulator, yang isinya seperti berikut ini:

<emulator wait="true" trace="class" securityDomain="trusted" enableProfiler="true" enableMemoryMonitor="false" enableNetworkMonitor="false" if="test and not debug" ></emulator>

Ganti nilai “true” pada atribut enableProfiler, enableMemoryMonitor, dan enableNetworkMonitor menjadi “false“.  Setelah itu, emulator J2ME Polish harusnya dapat berjalan dengan lancar, seperti pada tampilan berikut ini:

Tampilan J2ME Polish

Tampilan J2ME Polish

16 Juli 2011 at 1:29 AM Tinggalkan Komentar

Game API di Java Micro Edition

Sebentar lagi masa kuliah semester genap akan berakhir, saatnya untuk liburan panjang… Aku akui liburan panjang hingga bulan September mendatang menyebabkan hampir gaji tiga bulan menjadi ‘kosong’..  Tapi dari sisi lain, liburan ini berarti aku bisa berpesta ria dengan aneka kode program tanpa diganggu sedikit pun.  Bayangkan, waktu kerja kantoran dulu, jatah cuti hanya 12 hari selama setahun.. Dan sekarang, sebagai dosen, aku bisa cuti selama dua bulan!!!

Selama mengajar dua semester ini, aku lebih banyak menghabiskan waktu menulis materi di modul kuliah ketimbang menulis di blog.  Maklum, itu merupakan salah satu tugas seorang dosen..  Salah satu mata kuliah menarik yang harus aku ajarkan adalah pemograman mobile dengan Java Micro Edition..  Aku sudah sering bermain-main dengan Java Enterprise Edition & Java Standard Edition, tapi baru kali ini menyentuh JME..  Sebagai informasi, aplikasi Android juga diprogram dengan Java, tetapi bukan versi JME..  Aplikasi BlackBerry sendiri mendukung JME, tetapi juga punya pengembangan aplikasi berbasis Java-nya sendiri yang khas untuk BlackBerry.

Salah satu hal menarik yang dari JME adalah dukungan Game API bawaan.  Hal ini karena JME banyak dipakai untuk membuat aplikasi game, istilah gaulnya: “game java” sehingga ia disertai dengan peralatan yang sangat membantu dalam pembuatan game. Inti dari Game API di JME adalah class GameCanvas yang merupakan turunan dari class Canvas.

Class GameCanvas menyediakan method getGraphics() dan flushGraphics() untuk mendukung double buffering.  Programmer bisa mendapatkan sebuah Graphics dengan memanggil getGraphics(), kemudian menggambar dengan menggunakan context tersebut, baru setelah selesai menggambar dan ingin menampilkan ke layar, ia tinggal memanggil flushGraphics().

Class lain dalam Game API adalah class TiledLayer dan class Sprite.  Kedua class tersebut mewakili objek dalam game yang dapat digambar secara otomatis oleh class LayerManager.

Salah satu cara untuk memahami konsep Layer di Game API adalah dengan memanfaatkan Game Builder dari NetBeans IDE.  Game Builder bukanlah bagian dari spesifikasi JME, melainkan alat bantu yang ditawarkan oleh NetBeans IDE.  Versi terbaru dari NetBeans IDE, yaitu versi 7.0, dapat didownload di http://netbeans.org/community/releases/70/ .

Untuk membuat sebuah Game Builder baru, klik kanan pada nama package, kemudian pilih New, Game Builder…  Berikut ini adalah contoh tampilan sample Game Builder dari NetBeans:

Tampilan Game Builder

Tampilan Game Builder

Scenes mewakili apa yang akan ditampilkan di layar nantinya, terdiri atas satu atau lebih TiledLayer dan Sprite.

TiledLayer adalah sebuah layer yang terdiri atas kotak-kotak dimana setiap ‘kotak’ ini diisi dengan gambar tertentu.  Perancang game harus membuat sebuah file gambar yang merupakan gabungan dari seluruh elemen yang dapat di-isi-kan ke dalam TiledLayer tersebut.  Contoh file gambarnya seperti:

Contoh Gambar Untuk Game API

Contoh Gambar Untuk Game API

Game Builder menawarkan kemudahan untuk mengisi setiap kotak atau ’tile’ yang ada di gambar secara visual, seperti yang terlihat di gambar berikut:

Tiled Layer Editor

Tiled Layer Editor

Pembuat game dapat memisahkan setiap elemen interaksi yang berbeda ke dalam TiledLayer yang berbeda.  Misalnya sebuah TiledLayer untuk background game, dan sebuah TiledLayer lagi untuk mewakili bebatuan atau penghalang.  Dengan demikian, pada saat karakter utama bergerak, programmer dapat memanggil method collidesWith() untuk memeriksa apakah karakter bersinggungan dengan TiledLayer tertentu.

Karakter yang ada di game diwakili oleh class Sprite.  Game Builder menyediakan editor visual untuk merancang dan memutar animasi sebuah Sprite seperti pada contoh tampilan berikut ini:

Sprite Editor

Sprite Editor

Setelah selesai merancang TiledLayer dan Sprite, yang harus dilakukan berikutnya adalah menggambar mereka di layar dengan menggunakan method paint() dari LayerManager.  Jangan khawatir soal pergeseran layar karena programmer dapat memanggil method setViewWindow() milik LayerManager untuk mengkliping layar.

Berikut ini adalah contoh tampilan hasil game yang dibuat dengan Game Builder bila dijalankan menggunakan emulator bawaan JME:

Contoh Tampilan

Contoh Tampilan

03 Juni 2011 at 3:47 PM 2 komentar

Pengenalan SwingX

Akhirnya liburan semester tiba juga.. Tidak terasa sudah menjadi seorang dosen untuk satu semester.. Mendidik mahasiswa memang tidak mudah, sulit untuk membuat mereka aktif meneliti dan terus mencari pengetahuan dari berbagai sumber. Banyak yang hanya ingin meraih nilai tertinggi saja, sampai melupakan tujuan mereka belajar. Padahal dunia IT adalah dunia yang luas dan terus berkembang, sehingga tidak mungkin hanya mengandalkan orang lain untuk bisa tetap mengikuti perkembangan. Lagipula, waktu yang terbatas selama satu semester, membuat aku tidak sempat mengajarkan topik-topik tambahan.  Misalnya, di pemograman Java, aku mengajarkan Swing. Jika bosan dengan Swing, atau menginginkan fitur-fitur tambahan pada Swing, seorang programmer Java bisa menggunakan SwingX, salah satu ‘turunan‘ dari Swing yang dapat di-download terpisah di http://www.swinglabs.org/

Apa kelebihan SwingX?  SwingX menawarkan fitur-fitur ekstra yang tidak ditemui di Swing secara siap jadi. Sebagai contoh, ada yang disebut sebagai Highlighter, untuk memberi highlight (bisa berupa warna background berbeda dan sebagainya) pada sel tertentu di JXTable, JXList, JXTree, dan sebagainya.  Komponen yang diawali JX kebanyakan adalah turunan dari komponen Swing standar, misalnya JXTable adalah turunan dari JTable.  Demikian juga, JXComboBox adalah turunan dari JComboBoxJXComboBox sudah mendukung fitur highlight dengan adanya fungsi addHighlighter().  Jika kita ingin menampilkan nilai dibawah 50 dengan background merah di JXComboBox, kita dapat menggunakan ColorHighlighter, salah satu implementasi dari Highlighter, seperti pada contoh berikut ini:

import java.awt.Color;
import java.awt.Component;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import org.jdesktop.swingx.JXComboBox;
import org.jdesktop.swingx.decorator.ColorHighlighter;
import org.jdesktop.swingx.decorator.ComponentAdapter;
import org.jdesktop.swingx.decorator.HighlightPredicate;

public class App extends JFrame
{    
    private JXComboBox cboTest;
    
    
    public App() {
        super("Latihan SwingX");

        cboTest = new JXComboBox(new Integer[] {100, 50, 30, 80, 70, 45, 50, 60});    
        ColorHighlighter colorHighlight = new ColorHighlighter();
        colorHighlight.setBackground(Color.RED);
        colorHighlight.setForeground(Color.WHITE);        
        colorHighlight.setHighlightPredicate(new HighlightPredicate() {

            @Override
            public boolean isHighlighted(Component renderer, ComponentAdapter adapter) {
                if ((Integer)adapter.getValue() < 50) {
                    return true;
                } else {
                    return false;
                }
            }
            
        });
        
        cboTest.addHighlighter(colorHighlight);
                
        setLayout(new FlowLayout());        
        add(cboTest);
        add(new JButton("TEST"));
        
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(500,500);
        setVisible(true);
    }
    
    public static void main( String[] args )
    {
        new App();
    }
}

Hasil dari tampilan program di atas akan terlihat seperti:

ComboBox dengan ColorHighlighter

ComboBox dengan ColorHighlighter

Pada program di atas, fungsi setHighlightPredicate() di ColorHighlighter akan memeriksa apakah suatu nilai perlu di-highlight atau tidak (berdasarkan nilai kembalian true atau false).

Selain itu, SwingX juga menawarkan komponen baru, seperti JXDatePicker. Ini adalah contoh komponen yang sering dibutuhkan oleh aplikasi, tetapi tidak disediakan oleh Swing secara langsung.  Berikut ini adalah contoh tampilan JXDatePicker:

Contoh Tampilan JXDatePicker

Tampilan JXDatePicker

SwingX juga memiliki kotak dialog siap pakai, seperti JXTipOfTheDay, yang umum dipakai untuk menampilkan tips di program.  Berikut ini adalah contoh potongan kode program yang mempergunakan JXTipOfTheDay:

tipOfTheDay = new JXTipOfTheDay();
tipOfTheDay.setModel(new TipOfTheDayModel() {

    private Tip[] tips = {
       new Tip() {

           @Override
           public String getTipName() {
               return "Tips 1";
           }

           @Override
           public Object getTip() {
               return "Tahukah Anda SwingX menyediakan komponen siap jadi?";
           }
       },
                
       new Tip() {

          @Override
          public String getTipName() {
               return "Tip 2";
          }

          @Override
          public Object getTip() {
               return "Anda bisa membuat table dengan highlighter di SwingX";
          }
       } 
   };     
           
   @Override
   public int getTipCount() {
       return tips.length;
   }

   @Override
   public Tip getTipAt(int index) {                                
       return tips[index];
   }
});

tipOfTheDay.setCurrentTip(1);        
tipOfTheDay.showDialog(this);

Contoh tampilan program di atas akan terlihat seperti:

Contoh Tampilan JXTipOfTheDay

Tampilan JXTipOfTheDay

03 Februari 2011 at 2:35 PM 3 komentar

Quartz Scheduler: Memakai Ekspresi Cron

Beberapa job mungkin dapat dijadwalkan dengan trigger setiap selang waktu tertentu, misalnya setiap 30 menit, setiap jam, dan sebagainya. Tapi bagaimana dengan job yang harus dikerjakan setiap hari Senin sampai Jumat pada jam 17:30? Solusinya adalah memakai ekspresi yang mirip seperti yang dipakai oleh scheduler UNIX, cron. Untuk itu, Quartz menyediakan CronTrigger. Berikut ini adalah contoh kode program yang memakai CronTrigger:

CronTrigger cronDailyTrigger = new CronTrigger("Daily Trigger",
      Scheduler.DEFAULT_GROUP);
cronDailyTrigger.setCronExpression("0 10 18 ? * MON-FRI *");

Trigger di atas akan dikerjakan setiap jam 18:00 pada hari Senin hingga Jumat. Ekspresi cron pada Quartz lebih lengkap karena terdiri atas 7 bagian, dibandingkan dengan cron di UNIX yang hanya 5 bagian.

Secara berurutan dimulai dari kiri, ekspresi cron di Quartz terdiri atas nilai field yang dipisahkan oleh spasi, yaitu: detik, menit, jam, tanggal, bulan, hari, dan tahun.

Karekter “*” menunjukkan bahwa nilai pada field tersebut boleh bebas.

Karakter “?” hanya dapat dipakai di tanggal dan hari, menunjukkan bahwa kita tidak peduli pada nilai tersebut.

Perhatikan bahwa kita tidak boleh mengisi nilai untuk field tanggal dan field hari secara bersamaan, misalnya pada:
0 10 18 3 * MON *

Ekspresi di atas adalah ekspresi yang tidak valid, karena dapat bermakna ganda. Apakah yang dimaksud adalah tanggal 3 yang jatuh pada hari Senin setiap bulannya? Atau apakah yang dimaksud adalah pada tanggal 3 dan hari Senin setiap minggu? Quartz akan menghasilkan UnsupportedOperationException bila menemukan ekspresi seperti d atas.

Karakter “,” dapat dipakai untuk memisahkan sejumlah nilai untuk sebuah field, misalnya:
0 0 17,18,19 ? * * *
akan aktif setiap setiap jam 17, 18, dan 19.

Karakter “/” menandakan peningkatan, misalnya “0/15″ pada field detik menunjukkan aktif setiap 15 detik, dan “0/30″ pada menit menunjukkan aktif setiap 30 menit.

Karakter “-” dipakai untuk menunjukkan range/interval, misalnya “0-5″ berlaku untuk nilai 0, 1, 2, 3, 4, dan 5.

Karakter “?” menunjukkan nilai terakhir yang berlaku untuk field tersebut. Karakter ini hanya dapat dipakai pada field tanggal dan hari. Misalnya:
0 0 17 L * ? *
menunjukkan bahwa trigger akan aktif pada tanggal terakhir di setiap bulan (bisa saja tanggal 28, 29, 30, atau 31, tergantung pada bulannya), di jam 17:00.

Jika kita menginginkan trigger aktif pada hari Minggu terakhir di setiap bulan, ekspresinya adalah:
0 0 17 ? * 1L *

Karakter “W” hanya dapat dipakai di field tanggal. Nilai seperti 25W akan menunjukkan tanggal yang paling dekat dengan tanggal 25 yang masih merupakan hari kerja.

Karakter “#” hanya dapat dipakai di field hari. Nilai seperti 6#3 menunjukkan hari Sabtu yang ketiga kalinya di bulan tersebut.

26 Februari 2010 at 10:31 PM Tinggalkan Komentar

Quartz Scheduler: Melewatkan Nilai Ke Job

Jika ada beberapa job yang mengerjakan tugas yang hampir sama, kita dapat menggunakan sebuah class job yang sama, tetapi menerima parameter yang berbeda. Parameter ini nantinya akan di-baca oleh class job melalui getMergedJobDataMap() yang akan mengembalikan JobDataMap yang pada dasarnya adalah sebuah Map.

Sebagai contoh, berikut ini adalah job yang akan membaca parameter “PESAN” dan “SUMBER” dari JobDataMap:

public class TestJob implements Job {

  @Override
  public void execute(JobExecutionContext context)
    throws JobExecutionException {

     JobDataMap jobDataMap = context.getMergedJobDataMap();

     String pesan = jobDataMap.getString("PESAN");
     String sumber = jobDataMap.getString("SUMBER");
     System.out.format("SUMBER [%s] PESAN [%s]\n",
        pesan, sumber);
   }
}

Untuk memberikan nilai pada sebuah job, kita dapat menggunakan getJobDataMap().put() baik pada JobDetail maupun Trigger. Ini adalah contoh kode programnya:

// Membuat scheduler
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

// Membuat Job Pertama
JobDetail jobDetail1 = new JobDetail("JOB1",
    Scheduler.DEFAULT_GROUP, TestJob.class);
jobDetail1.getJobDataMap().put("SUMBER", "JOB1");
jobDetail1.getJobDataMap().put("PESAN", "Ini Job Pertama");

// Membuat Job Kedua
JobDetail jobDetail2 = new JobDetail("JOB2",
    Scheduler.DEFAULT_GROUP, TestJob.class);
jobDetail2.getJobDataMap().put("SUMBER", "JOB2");
jobDetail2.getJobDataMap().put("PESAN", "Ini Job Kedua");

// Membuat Trigger Setiap 10 Detik
Trigger trigger10 = TriggerUtils.makeSecondlyTrigger(10);
trigger10.setName("Trigger 10 detik");
trigger10.setStartTime(new Date());
trigger10.getJobDataMap().put("SUMBER", "TRIGGER 10 DETIK");

// Membuat Trigger Setiap 1 Detik
Trigger trigger2 = TriggerUtils.makeSecondlyTrigger(2);
trigger2.setName("Trigger 2 detik");
trigger2.setStartTime(new Date());

// Langkah 4: Menjadwalkan Job
scheduler.scheduleJob(jobDetail1, trigger10);
scheduler.scheduleJob(jobDetail2, trigger2);

// Langkah 5: menjalankan Scheduler
scheduler.start();

26 Februari 2010 at 10:29 PM Tinggalkan Komentar

Tulisan Lebih Lama


Arsip


Ikuti

Get every new post delivered to your Inbox.