Tuesday, September 16, 2014

REST Web Service Client menggunakan RestTemplate

Bagaimana untuk request ke sebuah Rest API dan mendapatkan hasilnya ?
Kalau di Java pada umumnya untuk memanggil ke Rest API digunakan class http client.

Misalnya ada Rest API seperti ini : http://host-01:8099/customer/271650
Return value berupa JSON seperti berikut ini :
 {  
 id: 271650,  
 name: "derp",  
 phone: "085635231",  
 email: "derp@herp.co.id",  
 corporateId: null,  
 voucherBalance: 0  
 }  

Nah, bagaimana caranya untuk mendapatkan data JSON tersebut agar bisa diolah lebih lanjut di class class lainnya.

Salah satu caranya kita bisa menggunakan class HttpURLConnection().
Berikut ini contohnya :
 package com.nostratech.app;  
 import java.io.BufferedReader;  
 import java.io.IOException;  
 import java.io.InputStreamReader;  
 import java.net.HttpURLConnection;  
 import java.net.MalformedURLException;  
 import java.net.URL;  
 public class SampleHttpClient {  
      public static void main(String[] args) {  
           try {  
                URL url = new URL(  
                          "http://host-01:8099/customer/271650/");  
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();  
                conn.setRequestMethod("GET");  
                conn.setRequestProperty("Accept", "application/json");  
                if (conn.getResponseCode() != 302 && conn.getResponseCode() != 200) {  
                     throw new RuntimeException("Failed : HTTP error code : "  
                               + conn.getResponseCode() + conn.getResponseMessage());  
                }  
                BufferedReader br = new BufferedReader(new InputStreamReader(  
                          (conn.getInputStream())));  
                String output;  
                System.out.println("JSON response : \n");  
                while ((output = br.readLine()) != null) {  
                     System.out.println(output);  
                }  
                conn.disconnect();  
           } catch (MalformedURLException e) {  
                e.printStackTrace();  
           } catch (IOException e) {  
                e.printStackTrace();  
           }  
      }  
 }  

Responsenya akan berupa string JSON, yang seperti ini.


Kemudian string json ini harus kita parsing manual satu per satu agar kita olah lagi.
Tentu hal ini akan terasa lebih rumit dan agak memakan waktu.

Salah satu cara untuk mempermudah request dan parsing json dari Rest API, adalah menggunakan library tambahan RestTemplate dari Spring Framework. Sebenarnya library ini digunakan di android project, tetapi bisa juga digunakan di Java project lainnya.

RestTemplate ini sudah mensupport hampir semua Http Method yang biasa digunakan di Rest API (POST, PUT, DELETE, GET dan lain-lain).

Langkahnya sangat mudah.
Tinggal tambahkan library (spring web dan core) ini ke java project kita (bisa didownload di sini ) :
spring-core-4.0.7.RELEASE.jar
spring-web-4.0.7.RELEASE.jar

Jangan lupa tambahkan juga library Jackson (download di sini). digunakan untuk parsing atau marshalling json resultnya.
jackson-annotations-2.3.2.jar (link)
jackson-core-2.3.2.jar (link)
jackson-mapper-asl-1.9.13.jar (link)

tambahkan class common-logging : commons-logging-1.1.3.jar (link)

Kita harus tahu dulu bagaimana format json responsenya. Kemudian dibuat class mappingnya (contohnya class : Customer) yang digunakan sebagai object hasil mapping json resultnya.
Atribut atributnya disamakan dengan json response, karena akan digunakan sebagai mapping
 package com.nostratech.app;  
 import java.math.BigDecimal;  
 public class Customer {  
      private Integer id;  
      private String name;  
      private String phone;  
      private String email;  
      private Integer corporateId;  
      private BigDecimal voucherBalance;  
      public Integer getId() {  
           return id;  
      }  
      public void setId(Integer id) {  
           this.id = id;  
      }  
      public String getName() {  
           return name;  
      }  
      public void setName(String name) {  
           this.name = name;  
      }  
      public String getPhone() {  
           return phone;  
      }  
      public void setPhone(String phone) {  
           this.phone = phone;  
      }  
      public String getEmail() {  
           return email;  
      }  
      public void setEmail(String email) {  
           this.email = email;  
      }  
      public Integer getCorporateId() {  
           return corporateId;  
      }  
      public void setCorporateId(Integer corporateId) {  
           this.corporateId = corporateId;  
      }  
      public BigDecimal getVoucherBalance() {  
           return voucherBalance;  
      }  
      public void setVoucherBalance(BigDecimal voucherBalance) {  
           this.voucherBalance = voucherBalance;  
      }  
      @Override  
      public String toString() {  
           return "Customer [id=" + id + ", name=" + name + ", phone=" + phone  
                     + ", email=" + email + ", corporateId=" + corporateId  
                     + ", voucherBalance=" + voucherBalance + "]";  
      }  
 }  

Kemudian kita buat class sample rest client.
Ditambahkan juga MessageConverter untuk convert dari json string ke object.
Kita gunakan MappingJackson2HttpMessageConverter() sebagai converternya.
 package com.nostratech.app;  
 import java.util.ArrayList;  
 import java.util.List;  
 import org.springframework.web.client.RestTemplate;  
 import org.springframework.http.converter.HttpMessageConverter;  
 import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;  
 public class SampleRestClient {  
      public static void main(String[] args) {  
           String url = "http://host-01:8099/customer/271650";  
           RestTemplate restTemplate = new RestTemplate();  
           List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();  
           messageConverters.add(new MappingJackson2HttpMessageConverter());  
           restTemplate.getMessageConverters().addAll(messageConverters);  
           Customer customer = restTemplate.getForObject(url, Customer.class);  
           System.out.println("Result customer : "+customer);  
      }  
 }  

Hasilnya kurang lebih akan seperti ini setelah di running.
Ouput json sudah menjadi object Customer.


Terima kasih, semoga membantu.

Selamat mencoba.



RESTful Web-Service dengan JAX-RS

REST (Representational State Transfer) merupakan gaya arsitektur web service berbasis protokol HTTP. Pertama kali diutarakan oleh Roy Fielding pada tesis nya di tahun 2000. REST di gunakan sebagai prinsip dasar untuk transfer data secara stateless pada data yang dapat di akses menggunakan protokol HTTP.

Pada arsitektur REST, data merupakan resource yang dapat di akses melalui metode-metode standar HTTP seperti GET, POST, PUT, DELETE. Masing-masing metode HTTP ini di gunakan untuk mendapatkan (retrieve) ataupun memanipulasi resource. GET digunakan untuk mengambil resource, PUT untuk menambah (insert) resource, POST digunakan untuk memodifikasi (update) resource, dan DELETE untuk membuang resource.

Tidak seperti SOAP yang mengharuskan memakai XML sebagai format data, dan memiliki struktur format yang tetap (fixed), setiap data pada REST dapat di representasikan dalam berbagai format, antara lain teks, XML, JSON, dll. Namun begitu JSON adalah format data yang paling sering di pakai pada implementasi web service menggunakan REST.

Beberapa keuntungan REST dibandingkan dengan SOAP adalah:
Lebih sederhana, hanya memakai protokol HTTP biasa, tidak memerlukan struktur data khusus.
Lebih Performa dan Scalable, hanya data saja yang di transfer tidak ada overhead seperti pada SOAP.

Hal ini tidaklah menjadikan REST lebih baik dari SOAP, dalam beberapa kasus, di mana komunikasi antar web service adalah stateful dan di haruskan berada dalam satu transaksi, SOAP lebih tepat untuk di gunakan karena sudah menyediakan fitur-fitur untuk meng-implementasikannya dengan mudah. Namun, jika anda ingin sekedar berbagi data secara sederhana atau membuat CRUD service (Create, Read, Update, Delete), maka REST merupakan pilihan yang lebih tepat.

Java men-support REST melalui JSR-311, yang di namakan JAX-RS (Java API for RESTful Web Services). Adapun reference implementation dari JAX-RS sendiri adalah Jersey. Beberapa implementasi lainnya adalah:
- Apache CXF
- RESTEasy (JBoss)
- Restlet

Saya akan menjelaskan cara membuat REST service sederhana menggunakan JAX-RS dengan bantuan Eclipse IDE dan Maven. Aplikasi yang di buat dengan JAX-RS dapat berjalan pada JavaEE application server maupun servlet container biasa, oleh karena itu, pembahasan langkah-langkah pembuatan di bagi berdasarkan konteks deployment nya. Sebagai contoh saya menggunakan Glassfish 3.1 dan Tomcat 7.

Persiapan

Eclipse IDE

Jika Eclipse IDE anda belum mempunyai Maven support, maka anda harus terlebih dahulu meng-install plugin m2e dan m2e-wtp, jika anda memakai Eclipse Juno seperti saya maka anda dapat memakai update site berikut:

m2e: http://download.eclipse.org/technology/m2e/releases
m2e-wtp: http://download.eclipse.org/m2e-wtp/releases/juno


Glassfish

Anda dapat mengunduh glassfish disini dan menginstall nya secara manual. Atau jika anda pengguna linux dapat menginstall melalui package manager sesuai distro masing-masing.

Install juga GlassFish Tools for Eclipse agar dapat menjalankan dan men-deploy aplikasi ke dari Eclipse. Untuk panduan instalasi bisa cek disini.

Tomcat

Anda dapat mengunduh tomcat disini dan menginstall nya secara manual. Atau jika anda pengguna linux dapat menginstall melalui package manager sesuai distro masing-masing.

Eclipse sudah men-support Tomcat out of the box jadi anda tidak perlu menginstall plugin khusus.

1. JavaEE Application Server - Glassfish

Seperti yang sudah di jelaskan di atas, Jersey adalah reference implementation dari JAX-RS. Jika anda menggunakan glassfish, maka Jersey sudah tersedia, karena JAX-RS merupakan bagian dari Java Enterprise Edition (JavaEE), dan glassfish adalah application server yang men-support penuh JavaEE dan menggunakan Jersey sebagai implementasi JAX-RS nya.

Pastikan plugin Maven untuk Eclipse & Glassfish sudah ter-install, jika belum ikuti tahap Persiapan di atas. Buat project maven baru dengan Eclipse:

File -> New -> Other -> Maven Project. Ketik "webapp" pada filter. Pilih maven-archtype-webapp pada hasil pencarian yang muncul di bawah nya.


Isi parameter project pada halaman selanjutnya dan klik Finish.


Tambahkan dependency ke JAX-RS API di pom.xml

<dependencies>
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
<version>2.0.1</version>
<scope>provided</scope>
</dependency>
<dependencies>


Agar glassfish mengenali aplikasi kita sebagai aplikasi JAX-RS maka kita harus mambuat subclass yang meng-extend javax.ws.rs.core.Application serta meng-anotasi kan nya dengan @ApplicationPath


Untuk itu disini saya membuat class HelloApplication.java, yang saya berikan anotasi @ApplicationPath dengan parameter "/rest" di mana ini akan menjadi base url dari aplikasi

Tahap selanjutnya adalah membuat resource (dalam terminologi REST), yang merupakan service endpoint.

Buat class baru bernama HelloResource dengan isi sebagai berikut

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("/hello")
public class HelloResource {

@GET
@Produces(MediaType.TEXT_PLAIN)
@Path("/{name}")
public String sayHello(@PathParam("name") String name) {
return "Hello, " + name;
}


}

Class ini memiliki method sayHello yang di berikan anotasi-anotasi JAX-RS. @GET berarti method ini akan me-respon pada get request. @PathParam & @Param merupakan satu kesatuan, nama parameter yang di berikan pada @PathParam harus persis sama dengan yang di letakkan pada @Path di dalam kurung-kurawal. @PathParam mengharapkan request yang datang memiliki parameter pada request path nya. Contoh, ketika client melakukan request ke "/rest/hello/world", "world" akan menjadi parameter untuk method sayHello@Produces menginstruksikan JAX-RS untuk membuat representasi sesuai format data yang di berikan, dalam kasus ini "plain text" atau teks biasa.


Yupz!, selesai sudah aplikasi JAX-RS kita yang sangat sederhana ini. Untuk men-deploy-nya ke glassfish klik kanan pada project -> Run As -> Run On Server -> Pilih Glassfish (Jika tidak terdapat pilihan seperti pada gambar maka anda harus membuatnya terlebih dahulu, dengan memilih "Manually define a new server")


Tampilan saat di jalankan:


2. Servlet Container - Tomcat

Jersey juga dapat bekerja sebagai servlet yang berjalan pada servlet container seperti Tomcat. Jersey akan meng-scan semua class yang sudah di definisikan sebagai RESTful resource, menganalisa HTTP request yang datang dan memilih class yang tepat untuk membuat response.

Pastikan plugin Maven untuk Eclipse & Tomcat sudah ter-install, jika belum ikuti tahap Persiapan di atas. Buat project maven baru dengan Eclipse:

File -> New -> Other -> Maven Project. Ketik "webapp" pada filter. Pilih maven-archtype-webapp pada hasil pencarian yang muncul di bawah nya.


Isi parameter project pada halaman selanjutnya dan klik Finish.


Tambahkan dependency ke Jersey Container Servlet di pom.xml

<dependencies>
    <dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet-core</artifactId>
<version>2.12</version>
<scope>compile</scope>

    </dependency>
</dependencies>

Setup Jersey sebagai servlet di web.xml

<servlet>
        <servlet-name>MyApplication</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
    <param-value>org.hello.rest</param-value>
</init-param>
    </servlet>

    <servlet-mapping>
        <servlet-name>MyApplication</servlet-name>
        <url-pattern>/rest/*</url-pattern>

    </servlet-mapping>

Jika anda perhatikan saya memberikan init parameter dengan nama jersey.config.server.provider.packages, dan memberikan value berupa package di mana class resource berada. Jersey akan melakukan scanning pada package ini dan me-register semua resource yang di dapat secara otomatis.


Lakukan langkah untuk membuat class resource HelloResource seperti yang terdapat pada langkah sebelumnya.

Aplikasi sudah siap untuk di deploy di Tomcat:



Saat anda jalankan anda akan mendapati hasil yang sama dengan saat menjalankannya di Glassfish:


Data dengan format JSON


Untuk membuat response dengan format data JSON di perlukan JAXB (Jaxa API for XML Binding).

Tambahkan dependency ke JAXB API di pom.xml

<dependency>
    <groupId>javax.xml</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.1</version>
    <scope>provided</scope>
</dependency>

Sebagai contoh anda dapat membuat resource class dengan isi sebagai berikut:

@Path("/fruits")
public class FruitResource {

private final List<Fruit> fruits;

public FruitResource() {
fruits = new ArrayList<Fruit>();
fruits.add(new Fruit("Apple", 10.25));
fruits.add(new Fruit("Orange", 7.11));
fruits.add(new Fruit("Grape", 9.37));
}

@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/list")
public List<Fruit> listFruits() {
return fruits;
}

@XmlRootElement()
static class Fruit {
String name;
double price;

public Fruit(){}

public Fruit(String name, double price){
this.name = name;
this.price = price;
}

public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
}

Hasilnya saat di jalankan:


Sangat mudah bukan membuat RESTful service dengan JAX-RS :)

Demikian, semoga bermanfaat !

Spring Boot


Pada tutorial kali ini kita akan membahas tentang Spring-Boot. Spring boot digunakan untuk membuat standalone application berbasis Spring Framework.
Kelebihan spring boot antara lain :
  • Dapat membuat aplikasi spring secara cepat.
  • Tidak perlu menggunakan XML configuration.  Konfigurasi dapat langsung diinject di java class nya. Konfigurasi cukup dilakukan di pom.xml saja
  • Tidak perlu menggunakan server (seperti Tomcat atau jetty). Running menggunakan file jar hasil packing

Sekarang akan kita coba membuat contoh aplikasi Spring MVC menggunakan spring-boot.
Untuk mempermudah compiling dan packaging dapat menggunakan Maven atau Gradle.
Karena saya lebih familiar, maka digunakan maven saja.

di pom.xml tambahkan dependency spring-boot
 <parent>  
   <groupId>org.springframework.boot</groupId>  
   <artifactId>spring-boot-starter-parent</artifactId>  
   <version>1.1.6.RELEASE</version>  
 </parent>  
 <dependencies>  
   <dependency>  
     <groupId>org.springframework.boot</groupId>  
     <artifactId>spring-boot-starter-web</artifactId>  
   </dependency>  
 </dependencies>  

Kemudian tambahkan dependency actuator module. Modul ini berisi embbeded tomcat/jetty.
     <dependency>  
       <groupId>org.springframework.boot</groupId>  
       <artifactId>spring-boot-starter-actuator</artifactId>  
     </dependency>  

Seperti biasa di spring mvc pattern kita buat class class berikut (model, service, controller).

Model
 package com.nostratech.app;  
 import java.io.Serializable;  
 public class Person implements Serializable {  
   private Integer id;  
   private String name;  
   private String address;  
   public Person() {}  
   public Person(Integer id, String name, String address) {  
     this.id = id;  
     this.name = name;  
     this.address = address;  
   }  
   public Integer getId() {  
     return id;  
   }  
   public void setId(Integer id) {  
     this.id = id;  
   }  
   public String getName() {  
     return name;  
   }  
   public void setName(String name) {  
     this.name = name;  
   }  
   public String getAddress() {  
     return address;  
   }  
   public void setAddress(String address) {  
     this.address = address;  
   }  
   @Override  
   public String toString() {  
     final StringBuffer sb = new StringBuffer("Person{");  
     sb.append("id=").append(id);  
     sb.append(", name='").append(name).append('\'');  
     sb.append(", address='").append(address).append('\'');  
     sb.append('}');  
     return sb.toString();  
   }  
 }  

Service
 package com.nostratech.app;  
 import org.springframework.stereotype.Service;  
 import java.util.ArrayList;  
 import java.util.List;  
 @Service  
 public class PersonService {  
   private List<Person> personList;  
   public PersonService(){  
     if(personList == null) personList = new ArrayList<Person>();  
     personList.add(new Person(1, "andri", "jakarta"));  
     personList.add(new Person(2, "budi", "bandung"));  
   }  
   public Integer getId(){  
     return 10;  
   }  
   public List<Person> findAllPerson(){  
     return personList;  
   }  
 }  

Controller
 package com.nostratech.app;  
 import org.springframework.beans.factory.annotation.Autowired;  
 import org.springframework.stereotype.Controller;  
 import org.springframework.web.bind.annotation.RestController;  
 import org.springframework.web.bind.annotation.RequestMapping;  
 @RestController  
 @RequestMapping(value = "/persons")  
 public class PersonController {  
   @Autowired  
   private PersonService personService;  
   @RequestMapping("/")  
   public String index() {  
     return "hello person controlller "+personService.getId();  
   }  
   @RequestMapping("/findAll")  
   public String findAll() {  
     return "Find all person : \n"+personService.findAllPerson();  
   }  
 }  

Kemudian buat class Application.
Untuk running aplikasi spring nya class ini harus memanggil SpringApplication.run().
 package com.nostratech.app;  
 import java.util.Arrays;  
 import org.springframework.boot.SpringApplication;  
 import org.springframework.boot.autoconfigure.EnableAutoConfiguration;  
 import org.springframework.context.ApplicationContext;  
 import org.springframework.context.annotation.ComponentScan;  
 import org.springframework.context.annotation.Configuration;  
 @Configuration  
 @EnableAutoConfiguration  
 @ComponentScan  
 public class Application {  
   public static void main(String[] args) {  
     ApplicationContext ctx = SpringApplication.run(Application.class, args);  
   }  
 }  

Tambahkan tag berikut :
@Configuration : menunjukkan bahwa class tersebut didefinisikan di application context.
@EnabledAutoConfiguration : meload semua bean bean yang sudah didefinisikan
@ComponentScan : scan semua component, configuration, service yang berada dalam satu package

tambahkan definisi class tersebut di pom.xml
 <properties>  
     <start-class>com.nostratech.app.Application</start-class>  
   </properties>  
class Application ini yang akan otomatis distart ketika aplikasi spring nya sudah running.

Compile aplikasinya dengan menjalankan : mvn clean install
semua class dan library akan dipackaging dalam satu file jar.

Sekarang jalankan aplikasinya lewat command java -jar
java -jar target/sample-spring-boot-1.0.0.jar
Berikut ini tampilan di Console ketika start aplikasi

Begitu spring boot sudah distart maka embeded tomcat akan otomatis running. default port 8080
Kemudian kita coba panggil controllernya localhost:8080/persons (panggil controller person)



Sekian tutorial dari saya.

Terima kasih




Tutorial iOS Part 2

Di blog sebelumnya, kita membahas sekilas iOS Programming dengan membuat program HelloWorld. Sekarang kita akan mencoba menggunakan beberapa componen standart iOS Programming, seperti :

  • UITextField
  • UIStepper
  • UISlider
  • UISegmentedControl
  • UISwitch
  • UIActivity

Untuk tampilan User Interface di Simulator iOS adalah sebagai berikut :

Skenario dari program ini adalah :
  1. Saat user memasukkan tulisan di Text Field dan user menekan tombol Press, apapun tulisannya akan di tampilkan di Label.
  2. Saat user menekan Stepper +, nilai dari stepper akan bertambah dan di tampilkan di Label. Jika user menakan Stepper -, nilai akan berkurang. Iterasi yang digunakan adalah 1.
  3. Begitu juga dengan Slidder. Nilai akan di tampilkan di Label dengan iterasi 0.5.
  4. Untuk Segmented Control, yang tampil di Label adalah nilai dari indexnya.
  5. Sedangkan komponen Swicth akan menjalankan animasi proses. Animasi akan mulai saat switcher on dan berhenti saat switcher off.
Tanpa berlama-lama lagi, mari kita buat project dengan nama HelloUIKit.

Selanjutkan kita buat IBOutlet dan IBAction-nya di ViewController.h


Untuk Design Interface-nya adalah sebagai berikut :

Jangan lupa untuk membuat koneksi antara file xib (Main.storyboard) dengan source code-nya.

Dan yang terakhir adalah membuat implementasinya di ViewController.m

Sedangkan untuk method IBAction-nya adalah

Source code dapat di download disini. Untuk compile dan testing cukup dengan shortcut cmd + R.

Sekali lagi begitu mudahnya membuat program di iOS. Semoga tutorial ini bermafaat dan menambah wawasan kita bersama. Tunggu tutorial iOS selanjutnya di blog ini ya...

JavaFX : Konsep MVC

Konsep MVC
MVC singkatan dari Model-View-Controller, konsep ini bertujuan untuk memudahkan pemrograman dengan mengelompokan source code berdasarkan fungsinya.

Model
Biasanya untuk source code yang berfungsi untuk menampung data-data saat aplikasi sedang berjalan.

View
Biasanya untuk source code yang berfungsi untuk menangani tampilan (user interface) pada aplikasi.

Controller
Biasanya untuk source code yang berfungsi untuk mengatur fungsi-fungsi yang ada pada tampilan (user interface) dengan menggunakan Model sebagai penampung datanya.

JavaFX 
Untuk tahu lebih banyak tentang JavaFX bisa melihat di http://www.oracle.com/technetwork/java/javase/overview/javafx-overview-2158620.html.

Singkat kata JavaFX merupakan pengganti Swing untuk pemrograman Java pada aplikasi desktop, yang katanya juga bisa berjalan diatas Android OS dan iOS.

Kemudian saya mencoba menerapkan konsep MVC pada pemrograman dengan JavaFX dengan bantuan Maven.

Berikut merupakan screen capture untuk mengelompokan source code sesuai dengan konsep MVC :

Mengelompokan Model pada 1 package

Mengelompokan Controller pada 1 package

Mengelompokan View (FXML) pada 1 folder
Untuk source code-nya bisa didownload di https://bitbucket.org/agus3winarno/blog.

Class Model
Model diimplementasi dengan POJO. seperti class User yang digunakan pada

public class User implements Serializable {

    private Integer id;
    private String username;
    private String password;
    private String keterangan;
    private String email;

    public User() {
    }

    //fungsi setter & getter


Desain UI pada JavaFX
Untuk mendesain UI bisa menggunakan Scene Builder dari http://www.oracle.com/technetwork/java/javase/downloads/javafxscenebuilder-info-2157684.html. Saat ini saya masih menggunakan versi 1.1.

Scene Builder 1.1

Integrasi dengan IDE
Saat ini saya menggunakan IntelliJ IDEA, untuk mengintegrasikan dengan Scene Builder dapat mengikuti screen capture dengan membuka Preferences -> IDE Settings :
Integrasi dengan IntelliJ IDEA
Setelah terintegrasi, akan muncul menu saat klik kanan pada file UI (FXML) :
Menu klik kanan Scene Builder
Untuk menghubungkan antara UI (FXML) dengan Controller tambahkan attribute
fx:controller
pada file FXML-nya. Contohnya untuk menghubungkan UI userManagement.fxml tambahkan attribute
fx:controller="org.controller.UserManagementController"

Class Controller
Controller diimplementasikan dengan contoh sbb :
public class UserManagementController extends BaseController {

    @FXML
    private TableView<User> userTable;
    @FXML
    private TableColumn<User,String> userName;
    @FXML
    private TableColumn<User,String> email;
    @FXML
    private TableColumn<User,String> keterangan;

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        super.initialize(url, rb);

        userName.setCellValueFactory(new PropertyValueFactory<User,String>("username"));
        email.setCellValueFactory(new PropertyValueFactory<User,String>("email"));
        keterangan.setCellValueFactory(new PropertyValueFactory<User,String>("keterangan"));

        // Auto resize columns
        userTable.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);

    }

    @Override
    protected void init() {
        super.init();
        userTable.setItems(UserService.getInstance().findAllEntity());
    }

    @Override
    public void setApp(Main application) {
        super.setApp(application);
    }

    public void create(ActionEvent actionEvent) {
        getApplication().addPageParameter(Constants.Parameter.ACTION, Constants.Parameter.ACTION_NEW);
        getApplication().translateToWithDefaultScreen(Layout.INPUT_PROFILE);
    }

    public void edit(ActionEvent actionEvent) {

        if(userTable.getSelectionModel().getSelectedItem() == null){
            Dialogs.showInformationDialog(getApplication().getStage(), "Belum ada data yang dipilih");
            return;
        }

        getApplication().addPageParameter(Constants.Parameter.ACTION, Constants.Parameter.ACTION_EDIT);
        getApplication().addPageParameter(Constants.Parameter.OBJECT, userTable.getSelectionModel().getSelectedItem());
        getApplication().translateToWithDefaultScreen(Layout.INPUT_PROFILE);
    }

    public void delete(ActionEvent actionEvent) {

        if(userTable.getSelectionModel().getSelectedItem() == null){
            Dialogs.showInformationDialog(getApplication().getStage(), "Belum ada data yang dipilih");
            return;
        }

        Integer id = userTable.getSelectionModel().getSelectedItem().getId();
        UserService.getInstance().remove(id);
        init();
        Dialogs.showInformationDialog(getApplication().getStage(), "Hapus data berhasil");
    }

    public void close(ActionEvent actionEvent) {
        getApplication().translateToWithDefaultScreen(Layout.MAIN);
    }

}


Untuk setiap property yang memiliki @FXML akan di-binding dengan komponen yang ada pada file FXML sesuai dengan fx:id nya.

Dan untuk setiap method action dari button yang ada pada file FXML akan di-binding menggunakan attribute onAction="#{nama_method}".

Ok. sekian dulu javafx-nya. semoga bermanfaat.

Tutorial iOS Part 1

Begitu banyak blog yang membahas tentang android. Tapi masih sedikit pembahasan tentang iOS Programming. Di dalam blog ini kita memulai belajar pemrograman iOS dari dasar. Seperti Hello World... (he.. he.. he..)

Sebelum kita memulai ada beberapa tools yang harus di siapkan, seperti :
  1. Apple ID, yang digunakan untuk download Xcode dari apps store.
  2. Xcode, tools yang digunakan untuk pembuatan program baik iOS ataupun OS X.
  3. Pengetahuan dasar tentang Objective C, krn dasar pemrograman iOS adalah Objective C.
Mari kita mulai tutorial ini :
  • Buka IDE Xcode, tekan cmd + spasi untuk membuka spotlight lalu ketik xcode dan jangan lupa tekan enter.
  • Selanjutkan kita membuat New Project - Single View Application, dengan menggunakan shortcut shift + cmd + N lalu pilih Single View Application dan jangan lupa klik tombol Next. Pastikan pilihan anda pada iOS Application.
  • Isi bagian:
    • Product Name: HelloWorld
    • Organization Name: Yuki Buwana 
    • Company Identifier: id.co.yukibuwana
    • Class Prefix: YBZ
    • Device: iPhone
  • Setelah klik tombol Next, saatnya kita menentukan dimana file project akan disimpan.
  • Jangan lupa klik tombol Create, untuk memulai pembuatan program.



Langkah selanjutnya adalah Design Interface. Berikut langkah-langkahnya :

  • Klik Main.storyboard pada Project Navigator.

  • Drag Label dari Object Library ke View Controller.
  • Drag Button dari Object Library ke View Controller.
  • Set Label Text menjadi Hello World pada Attribute Inspector.
  • Set Button Title menjadi Press Me pada Attribute Inspector.

Setelah kita membuat User Interface, selanjutkan kita membuat IBOutlet dan IBAction.

  • IBOutlet adalah metode yang digunakan untuk menghubungkan komponen pada XIB (main.storyboard) dengan source code.
  • IBAction adalah metode yang digunakan untuk menghubungkan event pada XIB (main.storyboard) dengan source code.
Cara adalah membuat IBOutlet dan IBAction di ViewController.h
Sekarang saatnya membuat koneksi antara User Interface dengan source code.

  • Klik Main.storyboard pada Project Navigator.
  • Expand View Controller Scene
  • Klik View Controller
  • Klik Connector Inspector


  • Drag lingkaran putih pada bagian labelHello ke komponen label.
  • Drag lingkaran putih pada bagian pressMe ke komponen button.

Langkah terakhir sebelum program di jalankan adalah membuat implemantasinya. Buka file ViewController.m dan ketik program di bawah ini :
Nah, sekarang saatnya menjalankan program di iOS Simulator. Sebelumnya pastikan bahwa kita sudah memilih iOS Simulator bukan iOS Device, krn deployment di iOS Device harus terdaftar sebagai iOS Developer dahulu. Dimana biaya pendaftarannya sebesar $99. Proses compile cukup menekan shortcut cmd + R. Tunggu beberapa saat hingga muncul seperti ini di iOS Simulator


Saat kita menekan tombol Press Me, Label berubah menjadi Hello Dunia dan saat kita menekan tombol Press Me lagi, Label berubah menjadi Hello World. Begitu seterusnya.

Lihat begitu mudahnya kita membuat program di iOS. Semoga tutorial ini bermanfaat bagi kita semua dan untuk source code dapat di download di sini.

Convert SOAP ke REST & REST ke SOAP Menggunakan OSB Part 2

Lanjutan dari part 1...

  1. Sebelum melanjutkan proses, kita akan terlebih dahulu membuat XSLT script yang akan digunakan nanti pada proses transforming di dalam OSB. Buat XSLT dan beri nama xslt_1 & xslt_2 & xslt_add_namespace. Berikut code untuk xslt_1 :

    <xsl:stylesheet
    version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" >
    <xsl:copy>
    <xsl:output indent="yes" /> <xsl:template match="@* | node()">
    <xsl:template match="soapenv:*">
    <xsl:apply-templates select="@* | node()" /> </xsl:copy> </xsl:template>
    </xsl:stylesheet>
    <xsl:apply-templates select="@* | node()" />
    </xsl:template>

    Berikut code untuk xslt_2 :

    <?xml version="1.0" encoding="UTF-8" ?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="*"> <xsl:element name="{local-name()}">
    </xsl:template>
    <xsl:apply-templates select="@* | node()" /> </xsl:element> <xsl:template match="@*">
    </xsl:template>
    <xsl:attribute name="{local-name()}"> <xsl:value-of select="." /> </xsl:attribute>
    </xsl:stylesheet>
    <xsl:template match="text() | comment() | processing-instruction()"> <xsl:copy />
    </xsl:template>

    Berikut code untuk xslt_add_namespace :

    <?xml version="1.0" encoding="UTF-8" ?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="node()|@*"> <xsl:copy>
    </xsl:template>
    <xsl:apply-templates select="node()|@*" /> </xsl:copy> <xsl:template match="*">
    <xsl:apply-templates select="node()|@*" />
    <xsl:element name="inq:{local-name()}" namespace="www.nostratech.com/xsd/inquiry"> </xsl:element> </xsl:template>
    </xsl:stylesheet>

    Sedikit penjelasan, untuk melakukan convert dari SOAP ke REST kita harus terlebih dahulu membuang soap envelope & namespace yang ada dalam body SOAP menggunakan xslt_1 & xslt_2 sehingga hanya tersisa xml body yang diperlukan sebagai payload input untuk REST xml kita. Sedangkan untuk proses convert dari REST ke SOAP, kita memerlukan xslt_add_namespace untuk menambahkan namespace sebelum di passing kembali ke SOAP body.

  2. Langkah selanjutnya kita akan melakukan Routing & Transform pada Proxy Service yang telah kita buat. Klik Edit Message Flow, kemudian tambahkan pipeline air.


    Tambahkan Stage dimasing masing Request & Response Pipeline.


  3. Langkah selanjutnya ialah mengedit Stage yang ada dibagian Request terlebih dahulu. Klik edit stage. Tambahkan Assign sebanyak 2 buah.




  4. Jika sudah, pada Assign pertama, klik Expression, kemudian pilih XSLT Resource, pilih xslt_1 yang telah kita buat tadi. Pada bagian Input Document isi dengan :

     $body/inq:accountInquiryRequest  
    

    Kemudian klik Save. Setelah itu isi input variable nya dengan var1. Tujuan nya adalah menyimpan proses hasil xslt_1 yang diambil dari $body/inq:accountInquiryRequest ke var1.


  5. Pada Assign kedua, klik Expression, kemudian pilih XSLT Resource, pilih xslt_2 yang telah kita buat tadi. Pada bagian Input Document isi dengan :

     $var1  
    

    Kemudian klik Save. Setelah itu isi input variable dengan var2.


  6. Tambahkan Action dengan Service Callout.

    Klik Service, kemudian pilih Business Service yang telah kita buat tadi. Jika sudah maka tampilan nya akan seperti berikut :
    Pada bagian Request Document Variable isi dengan var2, dan pada bagian Response Document Variable isi dengan var3. Jika sudah Klik Save.


  7. Langkah selanjutnya ialah mengedit Stage yang ada dibagian Response. Klik Edit Stage. Tambahkan Assign sebanyak 2 buah.


  8. Pada Assign pertama, Klik Expression, kemudian pilih XSLT Resource, pilih xslt_1 yang telah kita buat tadi. Pada bagian Input Document isi dengan :

     $var3  
    

    Kemudian klik Save.

    Setelah itu isi input variablenya dengan var4.
  9. Pada Assign kedua, Klik Expression, kemudian pilih XSLT Resource, pilih xslt_add_namespace yang telah kita buat tadi. Pada bagian Input Document isi dengan :

     $var4  
    

    Kemudian klik Save.

    Setelah itu isi input variable nya dengan var5.
  10. Tambahkan Action Replace. Kemudian pada bagian XPath isi dengan :

     .  
    

    Kemudian Save.
    Pada bagian in Variable di isi dengan :

     body  
    

    Pada bagian with, di isi dengan :

     $var5  
    

    Kemudian pilih Replace Node Content.
    Jika sudah klik Save.

    Commit Session, kemudian bisa kita test.
  11. Ketika Test, bisa memakai contoh payload sebagai berikut :

     <inq:accountInquiryRequest xmlns:inq="http://www.nostratech.com/xsd/inquiry">  
       <inq:bankCode>123</inq:bankCode>  
       <inq:accountNo>1234567890</inq:accountNo>  
       <inq:accountCurrency>IDR</inq:accountCurrency>  
       <inq:messageId>1234567890</inq:messageId>  
       <inq:rqDatetime>2008-09-29T08:49:45</inq:rqDatetime>  
     </inq:accountInquiryRequest>  
    

    Kira kira hasilnya akan sepertinya ini.

     <soapenv:Envelope      xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">  
          <soap:Header      xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">  
          </soap:Header>  
          <soapenv:Body>  
               <inq:accountInquiryRequest      xmlns:inq="www.nostratech.com/xsd/inquiry">  
                    <inq:bankCode>123</inq:bankCode>  
                    <inq:accountNo>1234567890</inq:accountNo>  
                    <inq:accountCurrency>IDR</inq:accountCurrency>  
                    <inq:messageId>1234567890</inq:messageId>  
                    <inq:rqDatetime>2008-09-29T08:49:45</inq:rqDatetime>  
               </inq:accountInquiryRequest>  
          </soapenv:Body>  
     </soapenv:Envelope>  
    

     
    Demikianlah cara untuk menconvert dari SOAP service ke REST & Menggembalikan REST ke SOAP. Semoga bermanfaat !!