Monday, October 27, 2014

Android developer : How to start activity for result.

Calling a second activity from the main activity by startActivityForResult. When second activity is finish, it will send back result (some data) to main activity.
How main activity get the result ?

From your FirstActivity call the SecondActivity using startActivityForResult() method

 Intent i = new Intent(this, SecondActivity.class);  
 startActivityForResult(i, 1);  

In your SecondActivity set the data which you want to return back to FirstActivity. If you don't want to return back, don't set any.
For example: In secondActivity if you want to send back data:
 Intent returnIntent = new Intent();  
 returnIntent.putExtra("result",result);  
 setResult(RESULT_OK,returnIntent);  
 finish();  

If you don't want to return data:

 Intent returnIntent = new Intent();  
 setResult(RESULT_CANCELED, returnIntent);  
 finish();  

Now in your FirstActivity class override onActivityResult() method. And process intent data by resultCode.
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
   if (requestCode == 1) {  
     if(resultCode == RESULT_OK){  
       String result=data.getStringExtra("result");  
     }  
     if (resultCode == RESULT_CANCELED) {  
       //Write your code if there's no result  
     }  
   }  
 }

reference : http://stackoverflow.com/questions/10407159/how-to-manage-start-activity-for-result-on-android

Monday, October 20, 2014

Android developer : how to cancel alarm

if your app create own alarm. how to cancel it ?
it's imposible to get alarm has been created (by name or by id).
this is a simple way to cancel alarm.
To cancel alarm you can use method AlarmManager.cancel(PENDING_INTENT)
Intent in create alarm and cancel alarm must be same.
there is some sample code.

when you create alarm :
 long nextAlarm = new Date().getTime();  
 Intent alarmIntent = new Intent(this, AlarmReceiver.class);  
 alarmIntent.putExtra(Constants.BundleKey.ALARM_TYPE_KEY, Constants.BundleKey.REPEAT_ALARM_VALUE);  
 PendingIntent pendingIntent = PendingIntent.getBroadcast(context,   
                               99, alarmIntent, PendingIntent.FLAG_CANCEL_CURRENT);  
 AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);  
 alarmManager.set(AlarmManager.RTC_WAKEUP, nextAlarm, pendingIntent);  

when you cancel alarm :
 long nextAlarm = new Date().getTime();   
 Intent alarmIntent = new Intent(this, AlarmReceiver.class);   
 alarmIntent.putExtra(Constants.BundleKey.ALARM_TYPE_KEY, Constants.BundleKey.REPEAT_ALARM_VALUE);   
 PendingIntent pendingIntent = PendingIntent.getBroadcast(context,    
                 99, alarmIntent, PendingIntent.FLAG_CANCEL_CURRENT);   
 AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);   
 alarmManager.cancel(pendingIntent);      

Intent in create and cancel alarm is same "Intent alarmIntent = new Intent(this, AlarmReceiver.class);"

Happy coding .
cheers :)

Sunday, October 19, 2014

My First Android App

This is my first android app on google play.
It is Football Reminder".  This app help you to see a timer when your favourite team playing, and give you and alarm if you're sleeping.

If you're like please download and give rating. :)

https://play.google.com/store/apps/details?id=com.andri.sasuke.footballreminder

Some screenshoots



 cheers :)


Thursday, January 2, 2014

Setting proxy di Maven

Bagaimana jika jaringan internet kita harus melewati sebuah proxy, di sisi lain kita harus menggunakan maven.
Maven tersebut harus mencari dependency library di internet.
Maka maven local kita harus melewati proxy juga.
Berikut ini cara setting proxy di maven.
Buka file : {MAVEN_HOME}/conf/settings.xml.

Un-comment <proxies> option di file setting.xml atau buat jika belum ada. Kemudian isikan detail proxy (<proxy>) yang dipakai.
Berikut ini detailnya :

 <proxies>  
   <!-- proxy  
    | Specification for one proxy, to be used in connecting to the network.   
    -->  
   <proxy>  
    <id>optional</id>  
    <active>true</active>  
    <protocol>http</protocol>  
    <username>proxyuser</</username>  
    <password>proxypassword</password>  
    <host>proxy.host.net</host>  
    <port>80</port>  
    <nonProxyHosts>local.net|some.host.com</nonProxyHosts>  
   </proxy>  
  </proxies>  

Selamat mencoba..

Show hidden file Mac OS X

Berikut ini adalah cara atau trik untuk menampilkan hidden file di Mac OS X.
Secara default mac os x tidak akan menampilkan hidden file atau folder kalau kita buka Finder.
Cara ini bisa dipakai di Mac OS X 10.7 ke atas.
yang saya pakai adalah versi 10.8.4

Berikut ini langkah-langkahnya :
  1. Buka Finder
  2. Buka terminal window
  3. Copy dan paste perintah berikut ini di terminal console:
    defaults write com.apple.Finder AppleShowAllFiles YES
     
    Tekan return atau enter
  4. Tekan tombol ‘alt’ dan klik kanan pada icon Finder icon di Dock launcer
  5. Pilih Relaunch
Maka otomatis hidden file atau folder akan tampil di window Finder.
Kalau ingin mengembalikan ke kondisi awal, ulangi langkah di atas. Tapi perintah yang dijalankan di terminal :
defaults write com.apple.Finder AppleShowAllFiles NO

Selamat mencoba..  :)

referensi : http://www.mikesel.info/show-hidden-files-mac-os-x-10-7-lion/

Wednesday, January 1, 2014

Membuat ComboBox group di ADF

Pada tulisan kali ini saya akan membahas tentang cara pembuatan group-option combo box (select item) di web application ADF.

Group option combobox maksudnya, combo box atau select item tetapi isi itemnya dikelompokkan berdasarkan kategori tertentu.
Kalau di HTML menggunakan tag <optgroup>

Berikut ini contohnya di code HTML :

 <select id="selectTypeProduct" size="1" name="selectTypeProduct">  
 <optgroup label="Computer">  
 <option value="1">Intel</option>  
 <option value="2">AMD</option>  
 </optgroup>  
 <optgroup label="Smartphone">  
 <option value="3">Samsung</option>  
 <option value="4">Iphone</option>  
 <option value="5">Sony</option>  
 <option value="6">Motorola</option>  
 </optgroup>  
 <optgroup label="Game">  
 <option value="7">Xbox</option>  
 <option value="8">PS4</option>  
 </optgroup>  
 </select>  















Nah bagaimana kalau kita membuatnya di aplikasi ADF.
Kita buat dulu projectnya. Buka IDE Jdeveloper.
Pilih new Application -> Fusion Web Application (ADF).
Kemudian kita buat halaman JSF dan class Backing bean nya.

Kemudian dari tab source kita drag element : SelectOneMenu dari component pallete. Ingat component yang kita pilih harus component JSF.












Berikut ini contoh source nya :

 <af:form id="f1" binding="#{backingBeanScope.backing_sample.f1}">  
     <af:outputText value="SAMPLE"  
             binding="#{backingBeanScope.backing_sample.txtTitle}"  
             id="txtTitle"/>  
     <af:panelLabelAndMessage label="Type Product : "  
                  binding="#{backingBeanScope.backing_sample.plam1}"  
                  id="plam1">  
     <h:selectOneMenu label="Type"  
              binding="#{backingBeanScope.backing_sample.selectTypeProduct}"  
              id="selectTypeProduct">  
      <f:selectItems value="#{backingBeanScope.backing_sample.optionsNamaProduct}"  
              binding="#{backingBeanScope.backing_sample.selectItemTypeProduct}"  
              id="selectItemTypeProduct"/>  
     </h:selectOneMenu>  
     </af:panelLabelAndMessage>  
    </af:form>  
   </af:document>  

di class backing bean nya kita buat property List<SelectItem>, tetapi jangan lupa dibuat juga getter nya.
 ............  
 private List<SelectItem> optionsNamaProduct;  
   public List<SelectItem> getOptionsNamaProduct() {  
     return optionsNamaProduct;  
   }  
 .............  

Kemudian di Constructor backing beannya kita akan mengisi List selectItem nya :

 public SampleComboBox(){  
     this.optionsNamaProduct = new ArrayList<SelectItem>();  
     SelectItemGroup groupComputer = new SelectItemGroup("Computer");  
     SelectItem[] itemComputers = new SelectItem[]{  
         new SelectItem(1,"Intel") ,  
         new SelectItem(2,"AMD") };  
     groupComputer.setSelectItems(itemComputers);  
     SelectItemGroup groupPhone = new SelectItemGroup("Smartphone");  
     SelectItem[] itemPhones = new SelectItem[]{  
         new SelectItem(3,"Samsung") ,  
         new SelectItem(4,"Iphone"),  
         new SelectItem(5,"Sony") ,  
         new SelectItem(6,"Motorola") };  
     groupPhone.setSelectItems(itemPhones);  
     SelectItemGroup groupGame = new SelectItemGroup("Game");  
     SelectItem[] itemGames = new SelectItem[]{  
         new SelectItem(7,"Xbox") ,  
         new SelectItem(8,"PS4") };  
     groupGame.setSelectItems(itemGames);  
     this.optionsNamaProduct.add(groupComputer);  
     this.optionsNamaProduct.add(groupPhone);  
     this.optionsNamaProduct.add(groupGame);  
   }  

List<SelectItem> diisi dengan SelectItemGroup yang dibuat berdasarkan kategori name nya.
Setiap SelectItemGroup diisi array SelectItem yang merupakan list item dari masing masing kategori.

<f:selectItems valuenya kita binding dengan List<SelectItem> tadi.
<f:selectItems value="#{backingBeanScope.backing_sample.optionsNamaProduct}" ..
       
Kemudian run halaman jspx nya dengan integrated weblogic di JDev.
Tampilannya kurang lebih seperti ini.
















Selamat mencoba :)

Thursday, December 19, 2013

Create webservice proxy dengan wsimport

Berikut ini adalah contoh membuat webservice proxy dengan perintah wsimport tanpa mengunakan IDE apapun.

wsimport adalah tool bawaan dari java untuk import webservice ke dalam bentuk class java.
wsimport otomatis tersedia jika kita sudah menginstall java jdk.

misal kita akan mengimport webservice : http://192.168.56.101:8888/reports/rwwebservice?wsdl

kita buat dulu direktori tempat kita mengimport webservice nya.

kemudian jalankan perintah wsimport dari command line :

$ wsimport -keep http://192.168.56.101:8888/reports/rwwebservice?wsdl



parameter -keep ini bersifat optional, untuk generate file *.java dan *.class juga.
jika kita tidak mencantumkan parameter ini maka yang digenerate hanya *.class saja.

Selanjutnya kita akan mempackage file-file hasil hasil import tadi menjadi sebuah library jar.
sehingga jar ini bisa kita reusable atau kita dapat gunakan dimanapun.

dengan perintah :

$ jar cfv nama_jar.jar -C directory_generated_wsdl/ .


selamat mencoba. :)

Invoke SOAP Webservice dari java class

Berikut ini adalah contoh memanggil SOAP webservice dari sebuah class java tanpa menggunakan webservice proxy.

kita akan menggunakan wsdl : http://graphical.weather.gov/xml/SOAP_server/ndfdXMLserver.php?wsdl sebagai contohnya.

kita akan memanggil method operation "LatLonListZipCode"

kemudian kita definisikan dulu SOAP message nya.

 <soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ndf="http://graphical.weather.gov/xml/DWMLgen/wsdl/ndfdXML.wsdl">  
   <soapenv:Header/>  
   <soapenv:Body>  
    <ndf:LatLonListZipCode soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">  
      <zipCodeList xsi:type="xsd:string">19110</zipCodeList>  
    </ndf:LatLonListZipCode>  
   </soapenv:Body>  
 </soapenv:Envelope>  

Selanjutnya kita buat sample java class sebagai client nya.

 import java.io.ByteArrayInputStream;  
 import java.io.ByteArrayOutputStream;  
 import javax.xml.namespace.QName;  
 import javax.xml.transform.Source;  
 import javax.xml.transform.Transformer;  
 import javax.xml.transform.TransformerConfigurationException;  
 import javax.xml.transform.TransformerException;  
 import javax.xml.transform.TransformerFactory;  
 import javax.xml.transform.TransformerFactoryConfigurationError;  
 import javax.xml.transform.stream.StreamResult;  
 import javax.xml.transform.stream.StreamSource;  
 import javax.xml.ws.Dispatch;  
 import javax.xml.ws.Service;  
 import javax.xml.ws.soap.SOAPBinding;  
 import javax.xml.ws.soap.SOAPFaultException;  
 public class JAXWSClient {  
   final String WSDL_ENDPOINT_URL = "http://graphical.weather.gov/xml/SOAP_server/ndfdXMLserver.php?wsdl";  
   String targetNS = "http://graphical.weather.gov/xml/DWMLgen/wsdl/ndfdXML.wsdl";  
   QName operationName = new QName(targetNS, "ndfdXML");  
   QName portQName = new QName(targetNS, "ndfdXMLPort");  
   public String invokeWebService(String inputMsg){  
     String responseStr=null;  
     try {  
       /**  
        * Define the service.  
        */  
       Service svc = Service.create(operationName);  
       svc.addPort(portQName,SOAPBinding.SOAP11HTTP_BINDING,WSDL_ENDPOINT_URL);  
       /**  
        * Create the dynamic invocation object from this service.  
        */  
       Dispatch<Source> dispatch = svc.createDispatch(portQName,Source.class,Service.Mode.MESSAGE);  
       ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(inputMsg.getBytes());  
       Source input = new StreamSource(byteArrayInputStream);  
       /**  
        * call WebService  
        */  
       Source response = dispatch.invoke(input);  
       /**  
       * get the  webservice response.  
       */  
       StreamResult result = new StreamResult(new ByteArrayOutputStream());  
       Transformer trans = TransformerFactory.newInstance().newTransformer();  
       trans.transform(response, result);  
       ByteArrayOutputStream baos = (ByteArrayOutputStream) result.getOutputStream();  
       /**  
       * Write out the response content to string.  
       */  
       responseStr = new String(baos.toByteArray());  
       System.out.println("XML Response : "+responseStr);   
     }catch (SOAPFaultException e) {  
       System.out.println("SOAPFaultException: " + e.getFault().getFaultString());  
     } catch (TransformerConfigurationException e) {  
       e.printStackTrace();  
     } catch (TransformerFactoryConfigurationError e) {  
       e.printStackTrace();  
     } catch (TransformerException e) {  
       e.printStackTrace();  
     }   
     return responseStr;  
   }  
   public static void main(String[] args) {  
     try {     
       String xmlRequest = " <soapenv:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ndf=\"http://graphical.weather.gov/xml/DWMLgen/wsdl/ndfdXML.wsdl\"> " +   
       "  <soapenv:Header/> " +   
       "  <soapenv:Body> " +   
       "   <ndf:LatLonListZipCode soapenv:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\"> " +   
       "     <zipCodeList xsi:type=\"xsd:string\">19110</zipCodeList> " +   
       "   </ndf:LatLonListZipCode> " +   
       "  </soapenv:Body> " +   
       "</soapenv:Envelope> ";  
      JAXWSClient jax_ws_client=new JAXWSClient();  
      String response=jax_ws_client.invokeWebService(xmlRequest);  
      //System.out.println("----- Response ----->:"+response);  
     }  
     catch (Exception t) {  
       t.printStackTrace();  
     }  
   }  
 }  

Outputnya menjadi :

 XML Response :   
 <?xml version = '1.0' encoding = 'UTF-8'?>  
 <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">  
 <SOAP-ENV:Header/>  
 <SOAP-ENV:Body>  
 <ns1:LatLonListZipCodeResponse xmlns:ns1="http://graphical.weather.gov/xml/DWMLgen/wsdl/ndfdXML.wsdl">  
 <listLatLonOut xsi:type="xsd:string">&lt;?xml version='1.0'?>&lt;dwml version='1.0' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:noNamespaceSchemaLocation='http://graphical.weather.gov/xml/DWMLgen/schema/DWML.xsd'>&lt;latLonList>39.9525,-75.1657&lt;/latLonList>&lt;/dwml></listLatLonOut>  
 </ns1:LatLonListZipCodeResponse>  
 </SOAP-ENV:Body>  
 </SOAP-ENV:Envelope>  

Sekarang kita coba dari SOAP-UI



Hasilnya sama kan.

setelah kita dapatkan XML response nya, kita tinggal mengolah atau memparsing sesuai dengan kebutuhan.

selamat mencoba. :)




Sunday, December 1, 2013

Deploy otomatis aplikasi maven ke Tomcat7

Untuk melakukan deployment otomatis aplikasi ke server tomcat. Ada beberapa hal yg harus dilakukan.
Aplikasi kita harus menggunakan struktur maven.
Tomcat yg digunakan disini adalah Tomcat7.

1.       1.  Tambahkan nama server di file setting.xml di MAVEN_HOME
  <servers>  
  <server>  
         <id>TomcatServer</id>  
         <username>admin</username>  
         <password>admin</password>  
 </server>  
 </servers>  

Username dan password harus sama dengan user di tomcat target

2.      2.  Tambahkan user di tomcat  configurasi user (tomcat-users.xml) -> di TOMCAT_HOME/conf/tomcat-users.xml
 <tomcat-users>  
 <user name="admin" password="admin" roles="admin-gui,manager-gui,manager-script,manager-jmx" />  
 </tomcat-users>  

3.      3.  Tambahkan tomcat7-maven-plugin di pom.xml aplikasi kita

 <plugin>  
        <groupId>org.apache.tomcat.maven</groupId>  
        <artifactId>tomcat7-maven-plugin</artifactId>  
        <version>2.1</version>  
        <configuration>  
             <url>http://localhost:8083/manager/text</url>  
             <server>TomcatServer</server>  
             <path>/context</path>  
             </configuration>  
 </plugin>  


Nama server  ‘TomcatServer’ harus sama dengan server yg didefiniskan di setting.xml maven

4.      4.  Compile aplikasi kita lewat mvn console :
 $ mvn clean install  

5.       5.  Deploy aplikasi ke tomcat

 $ mvn tomcat:deploy  

      atau

 $ mvn tomcat:redeploy  

Untuk redeploy aplikasi

Otomatis aplikasi maven kita akan terdeploy otomatis di server Tomcat


Selamat mencoba. J

Sunday, October 6, 2013

Resize root.disk wubi pada linux ubuntu 13.04

Untuk menginstall linux ubuntu 13.04 didalam windows, bisa dengan cara mengunakan suatu program installer bernama Wubi
Tapi ada satu masalah, yakni maksimum ukuran disk adalah 30GB yang nanti akan digunakan sebagai root.disk. 
Tentu ukuran 30GB bisa jadi kurang jika nanti di linux ubuntu kita mau menginstall banyak software. Bisa jadi space disk nya bisa cepat habis dengan ukuran yg hanya 30GB.

Tapi ada satu triknya untuk meresize root disknya.

Tetap lanjutkan instalasi ubuntu nya. Biarkan root disk nya tetap 30GB.

Setelah instalasi ubuntu berhasil matikan laptop.

Booting laptop menggunakan live-cd Ubuntu 13.04. Bisa menggunakan DVD atau USB flash disk.
Setelah masuk ke live-cd ubuntu.

Buka file manager dan mount lokasi dari root disk ubuntu yang sudah kita install tadi, misalnya : /media/andri/01CE8E8077C01C40/ubuntu/disks/

Buka terminal console jalankan perintah fsck pada root disk .

fsck -f /media/andri/01CE8E8077C01C40/ubuntu/disks/root.disk

Setelah fsck disk selesai jalankan perintah resize nya :

resize2fs /media/andri/01CE8E8077C01C40/ubuntu/disks/root.disk 70G

70G ada ukurun disk setelah diresize artinya 70 GigaByte.
ukuran ini tentu harus sesuaikan dengan ukuran partisi tempat kita menginstall ubuntu. Tentu tidak boleh melebihi ukuran partisi.

Proses ini akan memakan waktu beberapa menit.

Setelah proses resize selesai, restart komputer. masuk booting ke Ubuntu yg sudah kita install tadi
Maka ukaran disk akan berubah sesuai dengan yg kita set tadi. Bisa dilihat pake program Disk Usage milik Ubuntu.

Selamat mencoba :)

Fix Screen Brightness Ubuntu 13.04


Ada suatu masalah soal screen brightness atau tingkat kecerahan layar monitor, ketika saya menginstall
linux ubuntu 13.04 di laptop saya Lenovo G400S.
Dimana setiap kali laptop dimatikan atau restart dan masuk ke OS linux. Screen brightness nya tiba-tiba menjadi 0. Sehingga layar laptop saya jadi gelap. Untuk menaikkan brightnees nya harus tekan tombol F12.
Hal ini selalu berulang ulang, setiap restart atau abis turn on.

Setelah googling sekian lama, akhirnya saya menemukan caranya untuk lock screen brightness nya.
Caranya adalah seperti ini :

1. Buka Terminal console. Jalankan perintah ini.

  sudo gedit /etc/rc.local

    atau

  sudo vi /etc/rc.local

     maka akan terbuka file rc.local.

2. Tambahkan setting : echo 4 > /sys/class/backlight/acpi_video0/brightness
     di dlm file rc.local sebelum baris terakhir sebelum tulisan exit.

     Angka 4 adalah contoh level tingkat kecerahan layar. Kita bisa menset nya sesuai dgn kenyamanan kita.        Maximum adalah level 20.

 #!/bin/sh -e  
 #  
 # rc.local  
 #  
 # This script is executed at the end of each multiuser runlevel.  
 # Make sure that the script will "exit 0" on success or any other  
 # value on error.  
 #  
 # In order to enable or disable this script just change the execution  
 # bits.  
 #  
 # By default this script does nothing.  
 echo 5 > /sys/class/backlight/acpi_video0/brightness  
 exit 0  

3. Restart komputer, maka otomatis brightness layar kita tidak akan berubah berubah lagi.

Selamat mencoba :)

Thursday, September 26, 2013

Create Simple REST web service dengan Spring MVC + Maven


Sekilas tentang REST
REST, singkatan bahasa Inggris dari representational state transfer atau transfer keadaan representasi, adalah suatu gaya arsitektur perangkat lunak untuk untuk pendistibusian sistem hipermedia seperti WWW. Istilah ini diperkenalkan pertama kali pada tahun 2000 pada disertasi doktoral Roy Fielding, salah seorang penulis utama spesifikasi HTTP. Istilah ini selanjutnya dipergunakan secara luas pada komunitas jaringan.
REST secara spesifik merujuk pada suatu koleksi prinsip-prinsip arsitektur jaringan yang menggariskan pendefinisian dan pengalamatan sumber daya. Istilah ini sering digunakan dengan longgar untuk mendeskripsikan semua antarmuka sederhana yang menyampaikan data dalam domain spesifik melalui HTTP tanpa tambahan lapisan pesan seperti SOAP atau pelacakan sesimenggunakan cookie HTTP. Dua pengertian ini dapat menimbulkan konflik dan juga tumpang tindih. Dimungkinkan untuk merancang suatu sistem perangkat lunak besar sesuai dengan gaya arsitektur REST Fielding tanpa menggunakan HTTP dan tanpa berinteraksi dengan WWW. Juga dimungkinkan untuk merancang antarmuka XML+HTTP sederhana yang tidak mengikuti prinsip-prinsip REST, tapi sebaliknya mengikuti model dari RPC (remote procedure call). Perbedaan penggunaan istilah REST ini cukup menyebabkan permasalahan dalam diskusi-diskusi teknis.
Sistem yang mengikuti prinsip REST Fielding sering disebut sebagai "RESTful".
REST pada dasarnya setiap URL unik adalah representasi dari beberapa objek. Kita dapat memperoleh konten-konten objek tersebut menggunakan HTTP GET, untuk menghapusnya, kita dapat menggunakan POST, PUT, atau DELETE untuk memodifikasi objek (dalam praktiknya, kebanyakan service menggunakan POST untuk ini).
Kunci metodologi REST adalah untuk menulis web service menggunakan antarmuka yang sudah tersedia dan banyak digunakan: URI. Sebagai contoh, service/layanan untuk mengkonversi mata uang, yang mana seorang user memasukkan simbol mata uang untuk mengembalikan harga mata uang secara real-time, dapat dilakukan semudah membuat script yang dapat diakses melalui web server seperti URI:  http://www.ExampleCurrencyBrokerage.com/convert?=us-dollar&value=100&target=pound.
Aplikasi client atau server dengan dukungan HTTP dapat dengan mudah memanggil service tersebut dengan command HTTP GET. Berdasar pada bagaimana cara penyedia service menulis script, hasil respons HTTP kan menjadi lebih simpel seperti beberapa header standar dan string teks yang mengandung harga terkini untuk symbol yang diberikan. Atau, dapat berupa dokumen XML.
(dikutip dari Wikipedia  )

Pada tulisan kali ini akan kita coba membuat REST webservice menggunakan framework Spring MCV dan Maven.
IDE yang digunakan adalah Spring Tools Suite. Jika belum ada dapat didownload disini …link.
IDE ini memudahkan kita membuat aplikasi Spring MVC karena sudah tersedia plugin nya dan kita tidak perlu susah dalam mengimport library spring yang akan digunakan. IDE ini akan mencreate pom.xml sudah lengkap dengan dependency library dari spring mvc. Dependency library akan otomatis didownload begitu project di create.

Langkah pertama, buat spring mvc project dari spring tools suite. Pilih New -> Spring Project.



Maka otomatis akan tercreate project dengan struktur maven seperti dibawah ini.


Pom.xml akan otomatis tercreate lengkap dengan dependency nya.

 <?xml version="1.0" encoding="UTF-8"?>  
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">  
      <modelVersion>4.0.0</modelVersion>  
      <groupId>com.sample</groupId>  
      <artifactId>springmvc</artifactId>  
      <name>sample-spring-mvc-rest</name>  
      <packaging>war</packaging>  
      <version>1.0.0-BUILD-SNAPSHOT</version>  
      <properties>  
           <java-version>1.6</java-version>  
           <org.springframework-version>3.2.0.RELEASE</org.springframework-version>  
           <org.aspectj-version>1.6.10</org.aspectj-version>  
           <org.slf4j-version>1.6.6</org.slf4j-version>  
      </properties>  
      <dependencies>  
           <!-- Spring -->  
           <dependency>  
                <groupId>org.springframework</groupId>  
                <artifactId>spring-context</artifactId>  
                <version>${org.springframework-version}</version>  
                <exclusions>  
                     <!-- Exclude Commons Logging in favor of SLF4j -->  
                     <exclusion>  
                          <groupId>commons-logging</groupId>  
                          <artifactId>commons-logging</artifactId>  
                      </exclusion>  
                </exclusions>  
           </dependency>  
           <dependency>  
                <groupId>org.springframework</groupId>  
                <artifactId>spring-webmvc</artifactId>  
                <version>${org.springframework-version}</version>  
           </dependency>  
           <!-- AspectJ -->  
           <dependency>  
                <groupId>org.aspectj</groupId>  
                <artifactId>aspectjrt</artifactId>  
                <version>${org.aspectj-version}</version>  
           </dependency>       
           <!-- Logging -->  
           <dependency>  
                <groupId>org.slf4j</groupId>  
                <artifactId>slf4j-api</artifactId>  
                <version>${org.slf4j-version}</version>  
           </dependency>  
           <dependency>  
                <groupId>org.slf4j</groupId>  
                <artifactId>jcl-over-slf4j</artifactId>  
                <version>${org.slf4j-version}</version>  
                <scope>runtime</scope>  
           </dependency>  
           <dependency>  
                <groupId>org.slf4j</groupId>  
                <artifactId>slf4j-log4j12</artifactId>  
                <version>${org.slf4j-version}</version>  
                <scope>runtime</scope>  
           </dependency>  
           <dependency>  
                <groupId>log4j</groupId>  
                <artifactId>log4j</artifactId>  
                <version>1.2.15</version>  
                <exclusions>  
                     <exclusion>  
                          <groupId>javax.mail</groupId>  
                          <artifactId>mail</artifactId>  
                     </exclusion>  
                     <exclusion>  
                          <groupId>javax.jms</groupId>  
                          <artifactId>jms</artifactId>  
                     </exclusion>  
                     <exclusion>  
                          <groupId>com.sun.jdmk</groupId>  
                          <artifactId>jmxtools</artifactId>  
                     </exclusion>  
                     <exclusion>  
                          <groupId>com.sun.jmx</groupId>  
                          <artifactId>jmxri</artifactId>  
                     </exclusion>  
                </exclusions>  
                <scope>runtime</scope>  
           </dependency>  
           <!-- @Inject -->  
           <dependency>  
                <groupId>javax.inject</groupId>  
                <artifactId>javax.inject</artifactId>  
                <version>1</version>  
           </dependency>  
           <!-- Servlet -->  
           <dependency>  
                <groupId>javax.servlet</groupId>  
                <artifactId>servlet-api</artifactId>  
                <version>2.5</version>  
                <scope>provided</scope>  
           </dependency>  
           <dependency>  
                <groupId>javax.servlet.jsp</groupId>  
                <artifactId>jsp-api</artifactId>  
                <version>2.1</version>  
                <scope>provided</scope>  
           </dependency>  
           <dependency>  
                <groupId>javax.servlet</groupId>  
                <artifactId>jstl</artifactId>  
                <version>1.2</version>  
           </dependency>  
           <!-- Test -->  
           <dependency>  
                <groupId>junit</groupId>  
                <artifactId>junit</artifactId>  
                <version>4.7</version>  
                <scope>test</scope>  
           </dependency>      
      </dependencies>  
   <build>  
     <plugins>  
       <plugin>  
         <artifactId>maven-eclipse-plugin</artifactId>  
         <version>2.9</version>  
         <configuration>  
           <additionalProjectnatures>  
             <projectnature>org.springframework.ide.eclipse.core.springnature</projectnature>  
           </additionalProjectnatures>  
           <additionalBuildcommands>  
             <buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand>  
           </additionalBuildcommands>  
           <downloadSources>true</downloadSources>  
           <downloadJavadocs>true</downloadJavadocs>  
         </configuration>  
       </plugin>  
       <plugin>  
         <groupId>org.apache.maven.plugins</groupId>  
         <artifactId>maven-compiler-plugin</artifactId>  
         <version>2.5.1</version>  
         <configuration>  
           <source>1.6</source>  
           <target>1.6</target>  
           <compilerArgument>-Xlint:all</compilerArgument>  
           <showWarnings>true</showWarnings>  
           <showDeprecation>true</showDeprecation>  
         </configuration>  
       </plugin>  
       <plugin>  
         <groupId>org.codehaus.mojo</groupId>  
         <artifactId>exec-maven-plugin</artifactId>  
         <version>1.2.1</version>  
         <configuration>  
           <mainClass>org.test.int1.Main</mainClass>  
         </configuration>  
       </plugin>  
     </plugins>  
   </build>  
 </project>  

Kemudian kita buat dulu class entity yang nantinya kita pakai sebagai contoh data akan dimanipulasi oleh REST yang nanti kita buat.
Misalnya kita buat entity Student.

 public class Student {  
      private Integer id ;  
      private String firstName;  
      private String lastName;  
      private String address;  
      public Student(){  
      }  
      public Student(Integer id, String firstName, String lastName, String address) {  
           super();  
           this.id = id;  
           this.firstName = firstName;  
           this.lastName = lastName;  
           this.address = address;  
      }  
      // setter getter  

Selanjutnya kita buat class controller yang digunakan untuk menampung method method operation dari Rest.
Misalnya kita buat StudentController.

 @Controller  
 @RequestMapping("/student")  
 public class StudentController {  
      private List<Student> students = new ArrayList<Student>();  
      /**  
       * initial sample data student  
       */  
      private void initialStudent(){  
           students.add(new Student(1, "andri", "sasuke", "alamat 1"));  
           students.add(new Student(2, "susi", "susanti", "alamat 2"));  
           students.add(new Student(3, "budi", "setiawan", "alamat 3"));  
      }  
      /**  
       * sample update student  
       */  
      private void updateStudent(Student student){  
           students.get(student.getId()).setFirstName(student.getFirstName());  
           students.get(student.getId()).setLastName(student.getLastName());  
           students.get(student.getId()).setAddress(student.getAddress());  
      }  

Spring MVC menyediakan baberapa annotation untuk mengatur komunikasi Http

@Controller : Deklarasi Spring MVC Controller
@RequestMapping("/student") --> Map URI dengan controller atau method
@PathVariable --> membaca variable di Url dan mengirimkan nilainya ke class java
@RequestBody --> Deklarasi Pojo (entity) yang akan dikirim ke controller  
@ResponseBody --> Deklarasi Pojo (entity) untuk generate Json content yg akan dikirim ke http client

Kita tambahkan dulu dependency JSON mapper di pom.xml untuk generate JSON

 <dependency>  
    <groupId>org.codehaus.jackson</groupId>  
   <artifactId>jackson-mapper-asl</artifactId>  
   <version>1.7.1</version>  
 </dependency>  

Kita akan coba buat operasi Rest untuk Get, insert, update, delete data di StudentController.

1.       Method Get data
Menggunakan RequestMethod GET
 @RequestMapping(value="/findAll",method = RequestMethod.GET)  
      public @ResponseBody List<Student> getAllStudent(){  
           return students;  
      }  

2.       Method Insert
Menggunakan RequestMethod POST
 @RequestMapping(value="/add",method = RequestMethod.POST)  
      public @ResponseBody void addStudent(@RequestBody Student student){  
           // do something to add student  
           students.add(student);  
      }  

3.       Method Update
Menggunakan RequestMethod PUT
 @RequestMapping(value="/edit",method = RequestMethod.PUT)  
      public @ResponseBody void editStudent(@RequestBody Student student){  
           // do something to update student  
           updateStudent(student);  
      }  

 Method Delete
Menggunakan RequestMethod DELETE
 @RequestMapping(value="/delete/{id}",method = RequestMethod.DELETE)  
      public @ResponseBody void deleteStudent(@PathVariable(value="id") int id){  
           // do something to delete student  
           students.remove(id);  
      }  

Dengan demikian sample Rest web service kita sudah selesai, tinggal mengetesnya saja.

Test method Rest
Run terlebih dulu aplikasi yang sudah kita buat dengan menggunakan jetty -> mvn jetty:run 
Untuk melakukan testing pada Rest yang sudah kita buat bisa menggunakan addOns dari firefox : RestClient. (https://addons.mozilla.org/en-US/firefox/addon/restclient/)

Untuk method GET bisa juga kita coba langsung di browser bisa dengan mengakses Url nya.
Misalnya untuk menampilkan semua Student (http://localhost:8087/student/findAll)

Maka akan tampil output seperti dibawah ini
 [{"id":1,"firstName":"andri","lastName":"sasuke","address":"alamat 1"},{"id":2,"firstName":"susi","lastName":"susanti","address":"alamat 2"},{"id":3,"firstName":"budi","lastName":"setiawan","address":"alamat 3"}]  

Tapi untuk method POST atau PUT harus menggunakan RestClient atau semacamnya.
Untuk test POST data lewat RestClient kita set dulu parameter Content-Type:application/json.
Pilih Method : POST


Kemudian kita masukkan data student dalam format JSON di form Body.
 {"id":4,"firstName":"orang ke 4","lastName":"last name ke 4","address":"alamat 4"}  


Kita test lagi GET data, maka data student akan bertambah
 [{"id":1,"firstName":"andri","lastName":"sasuke","address":"alamat 1"},{"id":2,"firstName":"susi","lastName":"susanti","address":"alamat 2"},{"id":3,"firstName":"budi","lastName":"setiawan","address":"alamat 3"},{"id":4,"firstName":"orang ke 4","lastName":"last name ke 4","address":"alamat 4"}]  

Untuk PUT data prosesnya juga sama. Pilih Method : POST

Kemudian kita masukkan data student yang akan diupdate dalam format JSON di form Body.

 {"id":1,"firstName":"edit first name1","lastName":"edit last name ke 1","address":"alamat 1"}  


Kalau kita GET lagi maka data student akan berubah.

 [{"id":1,"firstName":"andri","lastName":"sasuke","address":"alamat 1"},{"id":2,"firstName":"edit first name1","lastName":"edit last name ke 1","address":"alamat 1"},{"id":3,"firstName":"budi","lastName":"setiawan","address":"alamat 3"},{"id":4,"firstName":"orang ke 4","lastName":"last name ke 4","address":"alamat 4"}]  

Untuk delete data kita menggunakan @PathVariable untuk mengambil value dari Url misalnya id




Kita GET data lagi maka data dengan index ke-1 akan terdelete

 [{"id":1,"firstName":"andri","lastName":"sasuke","address":"alamat 1"},{"id":3,"firstName":"budi","lastName":"setiawan","address":"alamat 3"},{"id":4,"firstName":"orang ke 4","lastName":"last name ke 4","address":"alamat 4"}]  

Sekian dulu. Mudah dan simple kan buat Rest web service itu. 
Selamat mencoba 
Thanks :)


Hitung radius antar 2 Latitutude dan Longitude di SQL query posgresql


Untuk menghitung jarak atau radius 2 lokasi Latitude dan Longitude dalam kilometer (km) di postgresql dapat menggunakan query berikut ini :

 SELECT ( 6371 * acos( cos( radians( LAT1 ) ) * cos( radians( LAT2 ) ) * cos( radians( LONG@ )   
 - radians(LAT1) ) + sin( radians( LONG1 ) ) * sin( radians( LAT2 ) ) ) ) as KM ;  

Misalnya kita punya 2 lokasi:
1. lat/lng ( 5.207654 / 96.695329 )
2. lat/lng ( -6.32479/ 107.322441)

 SELECT ( 6371 * acos( cos( radians( 5.207654 ) ) * cos( radians( -6.32479 ) ) * cos( radians( 107.322441 )   
 - radians(96.695329) ) + sin( radians(5.207654) ) * sin( radians( -6.32479 ) ) ) ) as KM ;  

Maka hasil radius yang didapat adalah :

1742,39355699897 km

Selamat mencoba. :)