Wilbert’s WebBlog

Java, Oracle, Serta Aktivitasku

Object Serialization

Kalau mendengar tentang serialisasi objek, banyak orang menganggap ini susah dan lebih parahnya lagi banyak orang juga menganggap ini tidak ada gunanya.. :)

Sebenarnya, dengan Object Serialization, lahirlah banyak teknologi seperti Persistence, Remote Method Invocation, sampai ke Enterprise Java Beans.. Lalu sebenarnya ini makanan apa sih? hehehe… :p

Begini, Object Serialization itu menyimpan objek ke dalam suatu file tertentu, sehingga suatu waktu jika ingin diambil kembali state-state nya, bisa dilakukan dengan mudah.. Ya gampangnya memahami begitu deh, daripada saya kasih pengertian yang “mbulet”, nanti pada ga bisa ngerti semua..

Ok, langsung aja yah, ini code nya..


package org.wilbert;

import java.io.Serializable;

public class Book implements Serializable
{
    private static final long serialVersionUID = -5066330228510894457L;
    private String title;
    private int page;
    private String author;
    private short rating;

    public Book() {}

    public Book(String title, int page, String author, short rating)
    {
        this.title = title;
        this.page = page;
        this.author = author;
        this.rating = rating;
    }

    public String getTitle()
    {
        return title;
    }
    public void setTitle(String title)
    {
        this.title = title;
    }
    public int getPage()
    {
        return page;
    }
    public void setPage(int page)
    {
        this.page = page;
    }
    public String getAuthor()
    {
        return author;
    }
    public void setAuthor(String author)
    {
        this.author = author;
    }
    public short getRating()
    {
        return rating;
    }
    public void setRating(short rating)
    {
        this.rating = rating;
    }
}

Itu tadi source sebuah POJO saja, dan sekarang ini class main nya..


package org.wilbert.main;

import java.io.*;
import org.wilbert.*;

public class Main
{
    public static void main(String[] args)
    {
        Book[] books = new Book[3];
        books[0] = new Book("Pintar Java Vol 1", 807, "Seseorang", (short) 5);
        books[1] = new Book("Java Server Pages", 230, "Orang Indonesia", (short) 5);
        books[2] = new Book("Enterprise Java", 1250, "Belum Ada", (short) 0);

        try
        {
            //object serialization
            ObjectOutputStream objWrite =
                new ObjectOutputStream(new FileOutputStream("objFile.wil"));

            objWrite.writeObject(books);
            objWrite.close();

            //object deserialization
            ObjectInputStream objRead =
                new ObjectInputStream(new FileInputStream("objFile.wil"));

            for(Book b : (Book[]) objRead.readObject())
            {
                System.out.println("Title    : " + b.getTitle());
                System.out.println("Page    : " + b.getPage());
                System.out.println("Author    : " + b.getAuthor());
                System.out.println("Rating    : " + b.getRating());
                System.out.println();
            }
            objRead.close();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
}

Di artikel berikutnya saya akan membuat pengembangan dari Object Serialization ini, yaitu dengan ide bahwa objek-objek sebenarnya bisa diletakkan di komputer yang berbeda tetapi terhubung dengan jaringan, dan objek-objek tersebut dapat berkomunikasi..

Tunggu ya artikel berikutnya tentang Remote Method Invocation (RMI)!

Yang terakhir, jika anda ingin mengunduh project nya, saya sediakan link di sini.. Project ini dapat dibuka melalui eclipse.. Selamat mencoba!

1-July-2008 Posted by | Java | 17 Comments

Logger Factory Mini Framework

Berawal dari ide gila untuk membuat sebuah framework kecil, akhirnya saya putuskan untuk membuat framework yang sebenarnya sangat kecil sekali.. Tidak tahu juga ini bisa dibilang framework atau bukan.. Kalau misal ada yang mau mengembangkan bersama, bisa kasih komentar di artikel saya ini.. :)

Langsung saja yah, framework ini digunakan untuk mencatat setiap error atau apapun juga yang berhubungan dengan konsep Logging.. Contoh, jika anda membuat aplikasi untuk mencatat dalam sehari siapa saja yang login di dalam web anda, framework ini akan mengerjakannya dengan mudah..

Tentu saja ini masih versi alpha, masih banyak yang perlu dibenahi terutama arsitekturnya..

Anda bisa mengunduh jar nya dari sini.. Lalu masukkan di CLASSPATH anda! Sesudah itu anda bisa membuat program seperti contoh yang saya buat berikut ini :


package test;

import org.wilbert.LoggerFactory;
import org.wilbert.Logger;

public class Main2
{

    public static void main(String[] args)
    {
        LoggerFactory<Integer> l = Logger.buildLogger("D:\\log.txt");
        l.storeIn(123456789);
        l.storeIn(987654321);
        l.storeIn(1);
        l.storeIn(3);
        l.commitIn();

        System.out.println("Isi Log Setelah dicommit :");
        System.out.println("=============================");
        System.out.println(l.commitOut());

        l.storeOut(3);
        l.commitIn();

        System.out.println("\nIsi Log setelah dibuang salah satu isinya :");
        System.out.println("=============================");
        System.out.println(l.commitOut());
    }

}

Hope you like it friend! :) Give me a feedback..

7-May-2008 Posted by | Java, My Framework | 6 Comments

View Untuk “Latest Article”

Hari ini hanya ngoding untuk article saja.. Kan semestinya yang boleh menulis article hanya user yang sudah terdaftar.., maka itu tidak saya buat terlebih dahulu.. Yang saya buat hanyalah view untuk mengambil article dari database dan khusus article terbaru..

Berikut yang saya buat.. Pertama, saya tambahkan ini di layout.jsp


<li><html:link action="articlelatest.do">Articles</html:link></li>

Setelah itu saya membuat satu page dan menambah baris file konfigurasi tiles menjadi seperti ini :


<%--
    Document   : article_latest
    Created on : May 5, 2008, 5:59:12 PM
    Author     : Wilbert
    Page yang digunakan untuk menampilkan artikel2 terbaru
--%>

<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>

<h2>Artikel Terbaru JUG Joglosemar</h2>
<logic:present name="latestArticle" scope="request">
    <logic:iterate id="artc" name="latestArticle" scope="request">
        <table>
            <tr class="rowH">
                <th><bean:write name="artc" property="title" /></th>
            </tr>
            <tr>
                <td><bean:write name="artc" property="detail" /></td>
            </tr>
            <tr>
                <td align="right">Author : <b><bean:write name="artc" property="author.realName" /></b></td>
            </tr>
        </table>
    </logic:iterate>
</logic:present>
<a href="#">Lihat Artikel Lainnya</a>


<definition name="article.latest" extends="base.definition">
        <put name="content" value="/page/article_latest.jsp" />
 </definition>

Dan yang terakhir saya membuat Action serta menambah konfigurasi struts nya


/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.jug.joglosemar.web.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForward;
import org.jug.joglosemar.dao.hbm.ArticleDAOImpl;

/**
 *
 * @author Wilbert
 * Action untuk artikel terbaru
 */
public class ArticleLatestAction extends org.apache.struts.action.Action {
   
    /* forward name="success" path="" */
    private final static String SUCCESS = "success";
   
    /**
     * This is the action called from the Struts framework.
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @throws java.lang.Exception
     * @return
     */
    public ActionForward execute(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
       
        request.setAttribute("latestArticle", new ArticleDAOImpl().getLastArticles());
        return mapping.findForward(SUCCESS);
       
    }
}


<action path="/articlelatest" type="org.jug.joglosemar.web.action.ArticleLatestAction">
            <forward name="success" path="article.latest" />
 </action>

Dan sourcecode tersebut dari 2 post sebelumnya juga sudah saya commit ke googlecode.. Bagi yang mau ikutan juga bisa checkout di http://jugjoglosemar.googlecode.com

Hasil dari view ini bisa dilihat di sini

6-May-2008 Posted by | Java, Proyek JUG-Joglosemar, Struts | 2 Comments

Hibernate Mapping dan Konfigurasi Untuk Entity “Article”

Malam ini saya ingin sekali menyelesaikan sedikit code yang semestinya kita kerjakan bersama.. :D Maklum, sudah tidak sabar untuk membuka netbeans.. :) Saya hanya membuat hibernate mapping nya saja, serta DAO + Implementasinya..

Selebihnya untuk Struts nya saya harus break dulu, takut nanti teman satu team saya malah tidak kebagian pekerjaan.. hehehe…

Langsung saja yah, ini belum saya commit koq, termasuk 1 post sebelumnya tentang perubahan di list jugers yang saya buat..

Pertama, saya buat hibernate mapping dan POJO nya untuk entity “Article”..

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.jug.joglosemar.entity;

/**
 *
 * @author Wilbert
 * Class ini melambangkan tabel Article di database
 * yang nantinya digunakan untuk menampilkan artikel-artikel
 */
public class Article 
{  
    private long id;
    private String title;
    private String detail;
    private long datePost;
    private Jugers author;

    public Article() {}

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getDetail() {
        return detail;
    }

    public void setDetail(String detail) {
        this.detail = detail;
    }

    public long getDatePost() {
        return datePost;
    }

    public void setDatePost(long datePost) {
        this.datePost = datePost;
    }

    public Jugers getAuthor() {
        return author;
    }

    public void setAuthor(Jugers author) {
        this.author = author;
    }
}

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class table="article" dynamic-insert="false" dynamic-update="false" mutable="true" name="org.jug.joglosemar.entity.Article" optimistic-lock="version" polymorphism="implicit" select-before-update="false">
        <id name="id" column="article_id">
            <generator class="native"/>
        </id>
        <property name="title" column="title" type="string" length="150"/>
        <property name="detail" column="detail" type="string" length="500"/>
        <property name="datePost" column="date_post" type="long"/>
        <many-to-one name="author" column="author" class="org.jug.joglosemar.entity.Jugers"/>
    </class>
</hibernate-mapping>

Lalu setelah itu, saya tambahkan mapping tersebut ke dalam file konfigurasi hibernate.., yaitu di file hibernate.cfg.xml.. Berikut isi filenya :


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory name="session">
   <!-- <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/joglosemar</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password"/>-->
   
    <!-- we use datasource -->
        <property name="hibernate.connection.datasource">java:/comp/env/jdbc/joglosemar
        </property>
        <property name="dialect">org.hibernate.dialect.MySQLDialect
        </property>
        <property name="current_session_context_class">thread
        </property>
        <property name="show_sql">true
        </property>
        <property name="hbm2ddl.auto">create
        </property>
        <mapping resource="org/jug/joglosemar/entity/Jugers.hbm.xml"/>
        <mapping resource="org/jug/joglosemar/entity/News.hbm.xml"/>
        <mapping resource="org/jug/joglosemar/entity/Event.hbm.xml"/>
        <mapping resource="org/jug/joglosemar/entity/Article.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

Dan langkah yang terakhir adalah membuat DAO + Implementasinya.. Berikut ini saya akan tampilkan DAO + Implementasi yang sudah saya buat..


/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.jug.joglosemar.dao;

import java.util.List;
import org.jug.joglosemar.entity.Article;

/**
 *
 * @author Wilbert
 */
public interface ArticleDAO
{
    public void insert(Article artc) throws Exception;
    public void delete(Article artc) throws Exception;
    public void update(Article artc) throws Exception;
    public Article load(long id) throws Exception;
    public List<Article> getAllArticles() throws Exception;
    public List<Article> getLastArticles() throws Exception;
}


/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.jug.joglosemar.dao.hbm;

import java.util.ArrayList;
import java.util.List;
import org.hibernate.Session;
import org.jug.joglosemar.dao.ArticleDAO;
import org.jug.joglosemar.entity.Article;
import org.jug.joglosemar.util.HibernateUtil;

/**
 *
 * @author Wilbert
 * Implementasi DAO untuk query ke database
 */
public class ArticleDAOImpl implements ArticleDAO
{
    public void insert(Article artc) throws Exception {
        HibernateUtil.beginTransaction();
        Session session = HibernateUtil.getSession();
        try{
            session.save(artc);
        }catch(Exception ex){
            throw ex;
        }
    }

    public void delete(Article artc) throws Exception {
        HibernateUtil.beginTransaction();
        Session session = HibernateUtil.getSession();
        try{
            session.delete(artc);
        }catch(Exception ex){
            throw ex;
        }
    }

    public void update(Article artc) throws Exception {
        HibernateUtil.beginTransaction();
        Session session = HibernateUtil.getSession();
        try{
            session.update(artc);
        }catch(Exception ex){
            throw ex;
        }
    }

    public Article load(long id) throws Exception {
        HibernateUtil.beginTransaction();
        Session session = HibernateUtil.getSession();
        Article artc = null;
        try{
            artc = (Article)session.load(Article.class,id);
        }catch(Exception ex){
            throw ex;
        }
        return artc;
    }

    public List<Article> getAllArticles() throws Exception {
        HibernateUtil.beginTransaction();
        Session session = HibernateUtil.getSession();
        List<Article> list = new ArrayList<Article>();
        try{
            list = session.createQuery("from Article").list();
        }catch(Exception ex){
            throw ex;
        }
        return list;
    }

    public List<Article> getLastArticles() throws Exception {
        HibernateUtil.beginTransaction();
        Session session = HibernateUtil.getSession();
        List<Article> list = new ArrayList<Article>();
        try{
            list = session.createQuery("from Article order by date_post desc limit 0,10").list();
        }catch(Exception ex){
            throw ex;
        }
        return list;
    }
}

Selesai sudah untuk pembuatan entitynya.. Perlu diperhatikan juga (bagi yang merasa team saya), kita bermain dengan 2 framework, yaitu Struts dan Hibernate.. Maka harus dipastikan kita bisa membedakan keduanya.. Jangan dicampur adukkan..! Sekarang kita coding dulu Hibernate nya, setelah itu baru kita bermain Struts nya..

Saya rasa kalau satu per satu cara memikirkannya malah lebih bagus, karena ada kerangka berpikir yang terstruktur, yaitu Struts dan Hibernate..

Mari kita membuat Struts nya hari Selasa nanti! :)

5-May-2008 Posted by | Java, Proyek JUG-Joglosemar | 5 Comments

Penambahan Fitur Kecil di Project Web Joglosemar

Sebelum commit, saya akan mencoba menerangkan sedikit apa yang sudah saya buat.. Ini hanya perubahan kecil saja, jadi singkat saja akan saya jelaskan..

Karena berhubung team untuk pembuatan modul article dan event belum bisa berkumpul, maka saya berinisiatif untuk membuatkan fitur kecil supaya paling tidak sudah ada anggota jug-joglosemar yang mengerjakan proyek ini..

Pertama, saya membuat satu file jugers_list.jsp baru yang isinya adalah sebagai berikut :

<%--
    Document   : jugers_list
    Created on : May 4, 2008, 1:16:09 PM
    Author     : Wilbert
    Page yang digunakan sebagai view untuk menampilkan list jugers
--%>

<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>

<h2>Jugers List JUG Joglosemar</h2>
<logic:present name="jugersList" scope="request">
    <logic:iterate name="jugersList" id="juger" scope="request">
        <table>
            <tr class="rowH">
                <th colspan="2"><bean:write name="juger" property="id" />. <bean:write name="juger" property="realName" /></th>
            </tr>
            <tr class="rowA">
                <td rowspan="3" width="100">
                    <img src="<bean:write name='juger' property='imagePath' />" />
                </td>
                <td>
                    Universitas : <bean:write name="juger" property="universitas" />
                </td>
            </tr>
            <tr class="rowA">
                <td>
                    Email : <a href="mailto:<bean:write name='juger' property='email' />"><bean:write name="juger" property="email" /></a>
                </td>
            </tr>
            <tr class="rowA">
                <td>
                    Profile : <bean:write name="juger" property="profile" />
                </td>
            </tr>
        </table>
    </logic:iterate>
</logic:present>

Jelas setelah itu saya tambahkan konfigurasi tiles-defs.xml seperti ini :

<definition name="jugers.list" extends="base.definition">
    <put name="content" value="/page/jugers_list.jsp" />
</definition>

Supaya page yang sudah saya buat bisa diakses, maka saya sedikit mengubah file layout.jsp menjadi seperti ini :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<%@ taglib uri="/WEB-INF/struts-tiles.tld" prefix="tiles" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="content-type" content="text/html; charset=utf-8" />
        <title><tiles:getAsString name="title" ignore="true"/> </title>
        <link href="./default.css" rel="stylesheet" type="text/css" />
    </head>

    <body>
        <div id="outer">
            <div id="header">
                <h1><a href="#">JUG JOGLOSEMAR</a></h1>
                <h2>Komunitas Pengguna Java di Jogja, Solo, Semarang dan sekitarnya</h2>
            </div>
            <tiles:insert attribute="header"/>
            <div id="content">
                <div id="tertiaryContent">
                    <tiles:insert attribute="login"/>
                    <h3>Jugers Database</h3>
                    <ul>
                        <li><html:link action="jugersnew.do">Registrasi</html:link></li>
                        <li><html:link action="jugerslist.do">Jugers List</html:link></li>
                    </ul>

                    <div class="xbg"></div>
                </div>
                <div id="primaryContentContainer">
                    <div id="primaryContent">
                        <tiles:insert attribute="content"/>
                    </div>
                </div>
                <div id="secondaryContent">
                    <h3>Tentang Kami</h3>
                    <ul>
                        <li><a href="#">Visi</a></li>
                        <li><a href="#">Misi</a></li>
                    </ul>

                    <h3>Dari Jugers</h3>
                    <ul>
                        <li><a href="#">News</a></li>
                        <li><a href="#">Events</a></li>
                        <li><a href="#">Articles</a></li>
                        <li><a href="#">Gallery</a></li>
                        <li><a href="#">Download</a></li>
                    </ul>

                    <h3>Partner</h3>

                </div>
                <div class="clear"></div>
            </div>
            <div id="footer">
                <p>Copyright &copy; 2008 JUG Joglosemar</p>
            </div>
        </div>
    </body>
</html>

Langkah berikutnya adalah membuat Action untuk JugersList.. Berikut ini code nya :

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.jug.joglosemar.web.action;

import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForward;
import org.jug.joglosemar.dao.hbm.JugersDAOImpl;

/**
 *
 * @author Wilbert
 * Action untuk menampilkan list jugers
 */
public class JugersListAction extends org.apache.struts.action.Action {

    /* forward name="success" path="" */
    private final static String SUCCESS = "success";

    /**
     * This is the action called from the Struts framework.
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @throws java.lang.Exception
     * @return
     */
    public ActionForward execute(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        request.setAttribute("jugersList", new JugersDAOImpl().getAllJugers());
        return mapping.findForward(SUCCESS);
    }
}

Akhirnya file struts-config.xml tersisipi code baru seperti ini :

<action path="/jugerslist" type="org.jug.joglosemar.web.action.JugersListAction">
    <forward name="success" path="jugers.list" />
</action>

Dan perubahan yang terakhir adalah saya hanya membuat suatu direktori bernama “photos” yang ditujukan untuk menyimpan file foto dari jugers yang nantinya akan ditampilkan juga pada jugers_list..

Hasil dari fitur kecil ini bisa dilihat di gambar berikut..

Bagaimana, bisa masuk googlecode?

4-May-2008 Posted by | Java, Proyek JUG-Joglosemar | 4 Comments

Parameter Array Sejak Java SE 5

Menanggapi komentar-komentar dari “Bunga”, saya terkesan dengan kata-katanya.. Ia menyebutkan bahwa saya (dan termasuk kita) jangan bosan dengan hal-hal yang mendasar di dalam pemrograman Java khususnya..

Tentu itu mengundang saya juga untuk menulis sesuatu yang berbau dasar, tapi mungkin belum semua orang tahu tentang hal tersebut.. Hari ini sebelum saya tidur, saya mau menulis terlebih dahulu tentang Array Parameter..

“Maksudnya Apa Sih Mas?? Saya tidak mengerti…”

Begini ceritanya, kalau kita ingin menulis sebuah parameter di dalam method (parameter formal), biasanya kita akan mencantumkan tipe data lalu diikuti dengan nama variabelnya.. Nah, kalau kita ingin mencantumkan array? Pasti tanda yang tidak mungkin ketinggalan adalah kurung siku ([])..

Sejak Java SE 5.0, untuk menuliskan / mencantumkan paramter yang berupa array, kita tidak perlu lagi menulis dengan cara mengikutsertakan kurung siku tersebut..

Lebih detailnya silahkan lihat kode program di bawah ini.. Jangan kaget, mungkin ini style baru bagi anda, tapi saya sudah membiasakan dengan penulisan seperti ini.. :D Atau mungkin tulisan saya ini sudah lama anda ketahui? Ya maklum saja, saya sedang ingin menulis yang dasar-dasar menanggapi komentar “Bunga”..


public class Coba
{
    public static void main(String... args) //bisa dibuat seperti ini karena array
    {
        Coba c = new Coba();
        c.testNilai(10, 11, 2, 3, 54, 3);
        System.out.println("\n");
        for(int a : c.cobaAh())
            System.out.println("Dari coba AH " + a);
    }

    public void testNilai(int ... nilai) //parameter bisa menggunakan int... dan direpresentasikan sebagai array
    {
        int i = 1;
        for(int a : nilai)
            System.out.println("Nilai ke - " + (i++) + " : " + a);
    }

    public int[] cobaAh() //return type tidak bisa menggunakan int...
    {
        int[] a = {1,2,3,4,5};
        return a;
    }
}

Dan perlu diperhatikan bahwa penulisan seperti ini tidak berlaku pada return type yang berupa void atau tidak. Anda tidak bisa mereturn array dengan cara penulisan seperti di atas..

Dalam waktu dekat juga mungkin saya akan menulis tentang konsep boxing dan unboxing, serta autoboxing.., dan macam-macam hal dasar lainnya.. Kalau dirasa banyak permintaan ya saya akan menulis hal tersebut.. :D

3-May-2008 Posted by | Java | 2 Comments

Abstract Factory Pattern di Java

Setelah menghilang dari peredaran beberapa hari ini, sekarang saya post deh tentang design pattern yang satu ini.. Buat anda yang belum begitu paham atau sama sekali tidak tahu tentang design pattern, bisa langsung ke alamat ini http://en.wikipedia.org/wiki/Design_pattern

Nah, sekarang ini yang akan saya bahas adalah Abstract Factory di Java.. Saya tidak tahu apakah pattern ini juga digunakan di bahasa pemrograman lainnya.., tetapi jelas ini sangat penting di Java.. :D

Lalu apa keunggulannya dan kapan pattern ini digunakan? Saya mengambil langsung dari sumber yang terpercaya, yaitu sebuah buku tentang design pattern (lupa pengarangnya siapa) :P .. Berikut ulasannya :

  • Creates families of related or dependent objects like Kit.
  • Provides a class library of products, exposing interface not implementation.
  • Needs to isolate concrete classes from their super classes.
  • A system needs independent of how its products are created, composed, and represented.
  • Try to enforce a constraint.
  • An alternative to Facade to hide platform-specific classes
  • Easily extensible to a system or a family
Nah, itu tadi ulasan sedikit tentang design pattern ini, sekarang mari saya beri contoh code nya.. Tenang, tidak begitu susah dan anda dapat menjalankannya melalui command prompt atau terminal di Linux
package com.pattern;

public interface Local
{
    void loadData();
}

package com.pattern;

public interface Remote extends Local
{
    void connectRemote(String url);
}

package com.pattern;

public class LocalImplementation implements Local
{
    public void loadData()
    {
        System.out.println("Load data from local area");
    }
}

package com.pattern;

public class RemoteImplementation implements Remote
{
    public void connectRemote(String url)
    {
        System.out.println("Connect to a remote site");
    }

    public void loadData()
    {
        System.out.println("Load data from a remote area");
    }
}

package com.connection.factory;

import com.pattern.Local;
import com.pattern.Remote;

public interface ConnectionFactory
{
    Local getLocalConnection();
    Remote getRemoteConnection();
}

package com.connection.factory;

import com.pattern.Local;
import com.pattern.Remote;
import com.pattern.LocalImplementation;
import com.pattern.RemoteImplementation;

public class DataManager implements ConnectionFactory
{
    public Local getLocalConnection()
    {
        return new LocalImplementation();
    }

    public Remote getRemoteConnection()
    {
        return new RemoteImplementation();
    }

    public void load(String mode)
    {
        if(mode.equalsIgnoreCase("local"))
        {
            Local l = getLocalConnection();
            l.loadData();
        }
        else
        {
            Remote r = getRemoteConnection();
            r.connectRemote("http://wilbertjava.wordpress.com");
            r.loadData();
        }
    }
}

package com.main;

import com.connection.factory.DataManager;
import java.util.Scanner;
import java.util.Random;

public class Main
{
    public static void main(String[] args)
    {
        Scanner s = new Scanner(System.in);
        DataManager dm = new DataManager();

        System.out.println("Data Connection\n======================================");
        System.out.print("Enter a valid connection (local or remote) : ");

        dm.load(s.nextLine());

        Thread t = new Thread(new Routine());
        t.start();
    }

    private static final class Routine implements Runnable
    {
        public void run()
        {
            Random r = new Random();
            System.out.println("Please Wait... :::");
            for(int i = 0; i <= 100; i += r.nextInt(20))
            {
                try
                {
                    System.out.print("=====");
                    Thread.sleep(r.nextInt(500));
                }
                catch(InterruptedException e) {}
            }

            System.out.println(" : 100%!\nData Loaded");
        }
    }
}

Sepintas tadi adalah sourcecode yang sudah saya buat.. Mungkin anda ingin dalam bentuk projectnya? Ok, saya kasih archive nya dan bisa diunduh dari sini

30-April-2008 Posted by | Java | 6 Comments

Object Collection Dengan ArrayList

Langsung saja yah, tidak tahu kenapa hari-hari ini jadi sering nulis blog, ya supaya reader semua ga kecewa deh kalau masuk blog saya… :) Kan biasa banyak keluhan tuh, “Koq blognya ga diupdate mas?”

Ok, hari ini saya akan nulis tentang Object Collection.. Apa sih Object Collection itu? Ini adalah struktur data yang lagi gencar dipakai karena kemudahannya dibandingkan dengan array.. Kalau kita belum terbiasa menggunakan Collection, pasti kita sendiri akan kesusahan untuk memahaminya.. Ya kuncinya jika anda ingin menguasai ini, banyaklah berlatih menggunakan Collection ini..

“Lalu apa bedanya dengan array? Katanya lebih mudah?”

Ya, perbedaannya antara lain, array adalah suatu mekanisme struktur data yang digunakan untuk menyimpan nilai (bisa primitive data type atau reference data type yang biasa kita sebut objek) yang sama typenya.. Sehingga jika anda membuat suatu array bertipe String, seluruh indeksnya hanya bisa berisi String, tidak bisa berisi tipe data lain…

Berbeda dengan Collection, mekanisme struktur data ini memungkinkan kita untuk mengisi satu atau lebih tipe data di dalamnya.. Misal di indeks pertama kita mengisi data bertipe integer, di indeks yang lainnya bisa juga data yang bertipe boolean dsb..

Berikut contoh code yang saya buat, semoga memberi kita pemahaman lebih tentang Collection..



public class HandPhone 
{
    private String number;
    private String simCard;
    private String merk;
    
    public String getNumber() 
    {
        return number;
    }
    
    public void setNumber(String number) 
    {
        this.number = number;
    }
    
    public String getSimCard() 
    {
        return simCard;
    }
    
    public void setSimCard(String simCard) 
    {
        this.simCard = simCard;
    }
    
    public String getMerk() 
    {
        return merk;
    }
    
    public void setMerk(String merk) 
    {
        this.merk = merk;
    }
}

class N70 extends HandPhone
{
    private int jmlFitur;

    public int getJmlFitur() 
    {
        return jmlFitur;
    }

    public void setJmlFitur(int jmlFitur) 
    {
        this.jmlFitur = jmlFitur;
    }
    
}



import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;


public class Main 
{
    public static void main(String[] args) throws IOException
    {
        List<N70> hp = new ArrayList<N70>();
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        
        for(int i = 1; i <= 3; i++)
        {
            N70 za = new N70();
            System.out.print("Merk HP : ");
            za.setMerk(reader.readLine());
            System.out.print("No HP : ");
            za.setNumber(reader.readLine());
            System.out.print("Sim Card : ");
            za.setSimCard(reader.readLine());
            System.out.print("Jumlah Fitur : ");
            za.setJmlFitur(Integer.parseInt(reader.readLine()));
            hp.add(za);
        }
        
        for(N70 h : hp)
            System.out.println(h.getMerk() + " " + h.getNumber() + " " + h.getSimCard() + " " + h.getJmlFitur());
    }
}


Sekian dari saya untuk hari ini tentang Object Collection.. Mungkin ada yang mau request tutorial? Kalau tidak ada ya saya tidak nulis nih… hehehe!! Happy Programming with Java.. :)

23-April-2008 Posted by | Java | 4 Comments

Latihan Progress Bar Dengan Swing

Bagi anda yang mungkin baru pertama kali merasakan pemrograman GUI di Java, kebingungan itu pasti ada.. Salah satu contoh nyatanya adalah ini, “mengapa di Java tidak ada Timer seperti di .NET ya” ?

Jawabannya tentu saja ada..! :) Tetapi ada beberapa opsi dimana kita bisa membuat “Timer” dengan Threading, atau menggunakan kelas yang sudah dibuat oleh Java dan khusus untuk penggunaan Timer..

Dalam tutorial singkat ini, saya menggunakan Threading supaya kita mengerti dasar tentang bagaimana Timer itu bisa dibuat..

Singkat saja, ini code nya :



import java.awt.event.KeyEvent;

/*
 * Main.java
 *
 * Created on January 7, 2008, 2:26 AM
 */



/**
 *
 * @author  Wilbert
 */
public class Main extends javax.swing.JFrame {
    
    /** Creates new form Main */
    public Main() {
        initComponents();
        java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
        setBounds((screenSize.width-425)/2, (screenSize.height-307)/2, 425, 307);
    }
    
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jLabel1 = new javax.swing.JLabel();
        jTextField1 = new javax.swing.JTextField();
        jButton1 = new javax.swing.JButton();
        jButton2 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Latihan Progress");
        setResizable(false);

        jLabel1.setText("Nama");

        jTextField1.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                jTextField1KeyPressed(evt);
            }
        });

        jButton1.setText("Proses");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });
        jButton1.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                jButton1KeyPressed(evt);
            }
        });

        jButton2.setText("Keluar");
        jButton2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton2ActionPerformed(evt);
            }
        });
        jButton2.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                jButton2KeyPressed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(62, 62, 62)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jButton1)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jButton2))
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jLabel1)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 247, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(111, Short.MAX_VALUE))
        );

        layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {jButton1, jButton2});

        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(49, 49, 49)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel1))
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jButton1)
                    .addComponent(jButton2))
                .addContainerGap(232, Short.MAX_VALUE))
        );

        layout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {jButton1, jButton2});

        pack();
    }// </editor-fold>                        

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // TODO add your handling code here:
        System.exit(0);
    }                                        

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        newForm();
    }                                        

    private void jTextField1KeyPressed(java.awt.event.KeyEvent evt) {                                       
        // TODO add your handling code here:
        if(evt.getKeyCode() == KeyEvent.VK_ENTER)
            newForm();
    }                                      

    private void jButton1KeyPressed(java.awt.event.KeyEvent evt) {                                    
        // TODO add your handling code here:
        if(evt.getKeyCode() == KeyEvent.VK_ENTER)
            newForm();
    }                                   

    private void jButton2KeyPressed(java.awt.event.KeyEvent evt) {                                    
        // TODO add your handling code here:
        if(evt.getKeyCode() == KeyEvent.VK_ENTER)
            System.exit(0);
    }                                   
    
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Main().setVisible(true);
            }
        });
    }
    
    // Variables declaration - do not modify                     
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JTextField jTextField1;
    // End of variables declaration                   

    private void newForm() {
        // TODO add your handling code here:
        Progress p = new Progress();
        p.setVisible(true);
        p.setNama(jTextField1.getText());
        p.setTitle("Processing");
        
        jTextField1.setEditable(false);
        jButton1.setEnabled(false);
    }
    
    public void closeProg()
    {
        jTextField1.setEditable(true);
        jButton1.setEnabled(true);
    }
    
}




import java.awt.event.KeyEvent;
import java.util.Random;

/*
 * Progress.java
 *
 * Created on January 7, 2008, 2:32 AM
 */



/**
 *
 * @author  Wilbert
 */
public class Progress extends javax.swing.JFrame {
    
    private String nama;
    /** Creates new form Progress */
    public Progress() {
        initComponents();
        java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
        setBounds((screenSize.width-300)/2, (screenSize.height-120)/2, 300, 120);
    }
    
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jProgressBar1 = new javax.swing.JProgressBar();
        jLabel1 = new javax.swing.JLabel();
        jButton1 = new javax.swing.JButton();
        jLabel2 = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setResizable(false);
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowActivated(java.awt.event.WindowEvent evt) {
                formWindowActivated(evt);
            }
        });

        jLabel1.setText("Completed : 0%");

        jButton1.setText("Cancel");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });
        jButton1.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                jButton1KeyPressed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jLabel1)
                    .addComponent(jProgressBar1, javax.swing.GroupLayout.DEFAULT_SIZE, 253, Short.MAX_VALUE)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 147, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 26, Short.MAX_VALUE)
                        .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 80, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jLabel1)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jProgressBar1, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(86, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>                        

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // TODO add your handling code here:
        this.dispose();
    }                                        

    private void formWindowActivated(java.awt.event.WindowEvent evt) {                                     
        // TODO add your handling code here:
        Thread t = new Thread(new pro());
        t.start();
    }                                    

    private void jButton1KeyPressed(java.awt.event.KeyEvent evt) {                                    
        // TODO add your handling code here:
        if(evt.getKeyCode() == KeyEvent.VK_ENTER)
            this.dispose();
    }                                   
    
    /**
     * @param args the command line arguments
     */
   private class pro implements Runnable
   {
        public void run()
        {
            Random rnd = new Random();
            while(jProgressBar1.getValue() != 100)
            {
                jProgressBar1.setValue(jProgressBar1.getValue() + rnd.nextInt(10));
                jLabel1.setText("Completed : " + jProgressBar1.getValue() + "%");
                setTitle("Completed : " + jProgressBar1.getValue() + "%");
                try
                {
                    Thread.sleep(300);
                }
                catch(InterruptedException ex){}
            }
            jLabel2.setText("Nama anda : " + nama);
            setTitle("Done");
        }
   }
   
   public void setNama(String nama)
   {
        this.nama = nama;
   }
    
    // Variables declaration - do not modify                     
    private javax.swing.JButton jButton1;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JProgressBar jProgressBar1;
    // End of variables declaration                   
    
}

22-April-2008 Posted by | Java | 6 Comments

Project Inventory System

Sebenarnya nih project sudah lama sekali, cuma karena saya migrasi blog dari blogger, maka project ini baru sempat saya publish ke publik sekarang..

Ya ini sih project kecil-kecilan, lebih tepatnya ini adalah project pribadi dimana saya ingin melatih sejauh mana saya sudah mengerti implementasi Java SE jika kita ingin membuat sebuah program GUI yang handal.. Studi kasusnya mudah saja, saya terinspirasi sewaktu saya pergi ke sebuah rental persewaan, saya melihat sistem yang dibuat memakai VB (asumsi saya), dan kesannya wah banget… :)

Setelah itu barulah saya memutuskan untuk membuat project ini.. Teknologi yang saya gunakan (termasuk database servernya) adalah sebagai berikut :

  • Swing
  • Derby

Hanya 2 teknologi itu yang saya gunakan, saya mendevelop menggunakan NetBeans 6.0 (waktu itu)… Ok, saya kasih list sedikit untuk source nya, nanti project nya saya upload saja supaya bisa diunduh langsung, karena agak banyak sih source nya..

Ini table model ku.. :


package org.wilbert;

import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.Vector;
import javax.swing.table.AbstractTableModel;

/**
 *
 * @author root(Wilbert)
 */
public class TableModel extends AbstractTableModel
{
    private String[] columnNames = new String[0];
    private Vector<String[]> dataRows = new Vector<String[]>();
    
    public void setResultSet(ResultSet results)
    {
        try 
        {
            ResultSetMetaData metadata = results.getMetaData();
            int columns = metadata.getColumnCount();      
            columnNames = new String[columns];            

            for(int i = 0; i < columns; i++)
              columnNames[i] = metadata.getColumnLabel(i+1);
            
            dataRows.clear();                           
            String[] rowData;                          
            
            while(results.next()) 
            {                    
              rowData = new String[columns];            
              for(int i = 0; i < columns; i++)        
                 rowData[i] = results.getString(i+1); 
              dataRows.addElement(rowData);             
            }
            
            fireTableChanged(null);            
        }
        catch (SQLException sqle) 
        {
            System.err.println(sqle);
        }

    }
    
    public int getColumnCount()
    {
        return columnNames.length;
    }

    public int getRowCount() 
    {
        return dataRows == null ? 0 : dataRows.size();
    }

    public String getValueAt(int row, int column) 
    {
        return dataRows.elementAt(row)[column];
    }
    
    @Override
    public String getColumnName(int column)
    {
        return columnNames[column] == null ? "No Name" : columnNames[column];
    }
}


File project nya bisa diunduh dari sini :

Saya tidak menyertakan file .sql nya, supaya anda juga ikut berpartisipasi membuat database nya.. hehehe :) Dan anda bebas mau menggunakan mysql atau derby sebagai database server.. Defaultnya adalah Derby, tetapi jika anda ingin menggantinya, maka anda juga harus mengganti source program..

Happy programming! :)

21-April-2008 Posted by | Java | 2 Comments

Follow

Get every new post delivered to your Inbox.