Membuat Laporan yang Multi-Database dan Multi-Persistence Menggunakan JasperReport


Sudah tau tentang JasperReport kan?

Jika belum itu tandanya anda kurang pergaulan πŸ™‚ , sudah pasti setiap developer Java mengetahui tentang JasperReport, khususnya yang bercimpung di dunia Sistem Informasi. Kenapa? Karena dimana ada Sistem Informasi, disitu pula pasti ada yang namanya Laporan, yup bagi yang belum tau, JasperReport adalah framework untuk membuat laporan di Java.

Saat ini kebanyakan orang menggunakan SQL dan teman-temannya dalam membuat laporan, kenapa? Karena memang mudah πŸ˜€

Tapi tahukan Anda kalo banyak sekali perbedaan perintah SQL setiap Sistem Basis Data? Misal di MySQL memiliki perintah LIMIT untuk membatasi banyak record yang ditemukan, sedangkan di ORACLE tidak ada perintah LIMIT 😦

Hal ini bisa berakibat kita perlu membuat ulang laporan yang sudah dibuat jika kita akan melakukan migrasi dari satu Sistem Basis Data ke Sistem Basis Data yang lainnya 😦 #capedeh

Tapi tenang saja, setelah membaca tutorial ini Anda tidak perlu khawatir lagi soal gonta-ganti SQL di laporan yang anda buat πŸ˜€ Baca lebih lanjut

Membangun Aplikasi Zip-Maker Menggunakan Java


Pernah menggunakan Winzip? Winrar? atau 7Zip? Pastinya! Apalagi jika kita menggunakan sistem operasi Windows. Kalo di linux Gnome mungkin biasa pake File Roller. Aplikasi-aplikasi tersebut digunakan untuk melakukan proses kompresi file-file menjadi sebuah file yang berupa arsip yang telah dikompresi.

Latar Belakang

Saat ini kebutuhan data sangat besar, dari mulai Hardisk sampai Flashdisk sekarang sudah semakin membesar kapasitas penyimpanannya. Dari Hardisk berkapasitas 40GB sampai 1TB, semakin hari semakin banyak produk-produk media penyimpanan yang berkapasitas semakin membesar. Kenapa? Hal ini dikarenakan kebutuhan data semakin hari, semakin besar. Saat ini, bisa dipastikan terdapat banyak sekali data yang kita miliki, dari dokumen, ebook, musik sampai video dan semakin hari, semakin bertambah banyak, tentunya semakin besar pula πŸ˜€

Salah satu solusi untuk mengecilkan ukuran file adalah dengan mengkompresi file-file tersebut. Yup! Salah satunya kita bisa menggunakan aplikasi WinZip, WinRar ataupun 7Zip. Lantas pertanyaannya bagaimanakah cara membuat aplikasi kompresi sendiri? Mudahkah membangun aplikasi kompresi di Java?

Membangun Aplikasi Zip-Maker

Saat ini, file Zip sudah bisa dibilang salah satu format file kompresi yang menjadi standar kompresi dimana pun. Hampir setiap aplikasi kompresi dapat membuat file dengan format Zip. Dan yang sangat menggembirakan adalah, format kompresi Zip ternyata sudah di support di Java. Hal ini memungkinkan kita dapat membuat aplikasi yang melibatkan kompresi format Zip menjadi lebih mudah.

Pertama saya buatkan Form untuk aplikasi yang akan kita bangun, misalkan saya membuat Form dengan tampilan dibawah ini :

Zip-Maker

Tampilan Aplikasi Zip-Maker

Sourcecode nya seperti dibawah ini (Saya sarankan menggunakan NetBeans agar lebih mudah membuat aplikasi GUI nya) :

package khannedy.blogging.zipmaker.view;

import java.io.File;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JList;
import javax.swing.JTextField;
import khannedy.blogging.zipmaker.action.AddFilesAction;
import khannedy.blogging.zipmaker.action.CreateAction;
import khannedy.blogging.zipmaker.action.RemoveFilesAction;
import khannedy.blogging.zipmaker.action.SaveToAction;

/**
 *
 * @author Eko Kurniawan Khannedy
 */
public class Form extends javax.swing.JFrame {

    private File fileSaveTo;
    private DefaultListModel listModel;

    /** Creates new form Form */
    public Form() {
	initComponents();

	listModel = new DefaultListModel();
	listFiles.setModel(listModel);

	buttonAddFiles.addActionListener(new AddFilesAction(this));
	buttonCreate.addActionListener(new CreateAction(this));
	buttonRemoveFiles.addActionListener(new RemoveFilesAction(this));
	buttonSaveTo.addActionListener(new SaveToAction(this));
    }

    public File getFileSaveTo() {
	return fileSaveTo;
    }

    public void setFileSaveTo(File fileSaveTo) {
	this.fileSaveTo = fileSaveTo;
	if (fileSaveTo == null) {
	    textLocation.setText("");
	} else {
	    textLocation.setText(fileSaveTo.getPath());
	}
    }

    public DefaultListModel getListModel() {
	return listModel;
    }

    public JButton getButtonAddFiles() {
	return buttonAddFiles;
    }

    public JButton getButtonCreate() {
	return buttonCreate;
    }

    public JButton getButtonRemoveFiles() {
	return buttonRemoveFiles;
    }

    public JButton getButtonSaveTo() {
	return buttonSaveTo;
    }

    public JList getListFiles() {
	return listFiles;
    }

    public JTextField getTextLocation() {
	return textLocation;
    }

    /** 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.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        listFiles = new javax.swing.JList();
        textLocation = new javax.swing.JTextField();
        buttonSaveTo = new javax.swing.JButton();
        buttonAddFiles = new javax.swing.JButton();
        buttonRemoveFiles = new javax.swing.JButton();
        buttonCreate = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Zip-Maker");

        jScrollPane1.setViewportView(listFiles);

        textLocation.setEditable(false);

        buttonSaveTo.setText("Save To");

        buttonAddFiles.setText("Add Files");

        buttonRemoveFiles.setText("Remove Files");

        buttonCreate.setText("CREATE");

        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.TRAILING)
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 428, Short.MAX_VALUE)
                    .addComponent(textLocation, javax.swing.GroupLayout.DEFAULT_SIZE, 428, Short.MAX_VALUE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                    .addComponent(buttonCreate, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 134, Short.MAX_VALUE)
                    .addComponent(buttonSaveTo, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 134, Short.MAX_VALUE)
                    .addComponent(buttonAddFiles, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 134, Short.MAX_VALUE)
                    .addComponent(buttonRemoveFiles, javax.swing.GroupLayout.DEFAULT_SIZE, 134, Short.MAX_VALUE))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(textLocation, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(buttonSaveTo))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(buttonAddFiles)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(buttonRemoveFiles)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 218, Short.MAX_VALUE)
                        .addComponent(buttonCreate))
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 305, Short.MAX_VALUE))
                .addContainerGap())
        );

        pack();
    }// </editor-fold>
    // Variables declaration - do not modify
    private javax.swing.JButton buttonAddFiles;
    private javax.swing.JButton buttonCreate;
    private javax.swing.JButton buttonRemoveFiles;
    private javax.swing.JButton buttonSaveTo;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JList listFiles;
    private javax.swing.JTextField textLocation;
    // End of variables declaration
}

Tidak usah diketik sourcecode diatas , anda bisa download sourcecodenya di-link yang tertera di bagian akhir artikel ini :D.

Setelah itu tambah aksi tombol Save To dengan aksi yang tertera pada sourcecode dibawah ini. Aksi ini berisikan aksi untuk menyimpan lokasi file zip tempat kompresi :

package khannedy.blogging.zipmaker.action;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import javax.swing.JFileChooser;
import khannedy.blogging.zipmaker.view.Form;

/**
 *
 * @author Eko Kurniawan Khannedy
 */
public class SaveToAction implements ActionListener {

    private Form form;
    private JFileChooser chooser;

    public SaveToAction(Form form) {
	this.form = form;

	chooser = new JFileChooser();
	chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
	chooser.setMultiSelectionEnabled(false);
    }

    public void actionPerformed(ActionEvent e) {
	if (chooser.showSaveDialog(form) == JFileChooser.APPROVE_OPTION) {
	    File file = chooser.getSelectedFile();
	    if (!chooser.getSelectedFile().getName().toLowerCase().endsWith(".zip")) {
		file = new File(file.getPath() + ".zip");
	    }
	    form.setFileSaveTo(file);
	}
    }
}

Tambahkan aksi untuk tombol Add Files. Aksinya berupa aksi menambah file yang akan dikompresi, seperti terlihat pada sourcecode dibawah ini :

package khannedy.blogging.zipmaker.action;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import javax.swing.DefaultListModel;
import javax.swing.JFileChooser;
import khannedy.blogging.zipmaker.view.Form;

/**
 *
 * @author Eko Kurniawan Khannedy
 */
public class AddFilesAction implements ActionListener {

    private Form form;
    private JFileChooser chooser;

    public AddFilesAction(Form form) {
	this.form = form;

	chooser = new JFileChooser();
	chooser.setMultiSelectionEnabled(true);
	chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
    }

    public void actionPerformed(ActionEvent e) {
	if (chooser.showOpenDialog(form) == JFileChooser.APPROVE_OPTION) {
	    File[] files = chooser.getSelectedFiles();
	    for (File file : files) {
		DefaultListModel model = form.getListModel();
		model.addElement(file);
	    }
	}
    }
}

Setelah itu tambahkan aksi tombol Remove Files, aksinya berisikan aksi menghapus file yang tertera pada list, aksi ini untuk membatalkan file-file yang akan dikompresi :

package khannedy.blogging.zipmaker.action;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.DefaultListModel;
import khannedy.blogging.zipmaker.view.Form;

/**
 *
 * @author Eko Kurniawan Khannedy
 */
public class RemoveFilesAction implements ActionListener {

    private Form form;

    public RemoveFilesAction(Form form) {
	this.form = form;
    }

    public void actionPerformed(ActionEvent event) {
	Object[] selecteds = form.getListFiles().getSelectedValues();
	if (selecteds.length != 0) {
	    DefaultListModel model = form.getListModel();
	    for (Object e : selecteds) {
		model.removeElement(e);
	    }
	}
    }
}

Terakhir tambahkan aksi untuk tombol Create, aksinya berukan aksi mengkompresi semua file yang telah ditambahkan (yang tertera di list) ke lokasi file yang telah dibuat pada tombol Save To :

package khannedy.blogging.zipmaker.action;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import javax.swing.JOptionPane;
import khannedy.blogging.zipmaker.view.Form;

/**
 *
 * @author Eko Kurniawan Khannedy
 */
public class CreateAction implements ActionListener {

    private Form form;

    public CreateAction(Form form) {
	this.form = form;
    }

    public void actionPerformed(ActionEvent e) {
	if (form.getFileSaveTo() == null) {
	    showMessage("'Save File To' is Empty");
	} else if (form.getListModel().getSize() == 0) {
	    showMessage("Files is Empty");
	} else {
	    ZipOutputStream zipOutputStream = null;
	    FileOutputStream fileOutputStream = null;
	    try {
		fileOutputStream = new FileOutputStream(form.getFileSaveTo());
		zipOutputStream = new ZipOutputStream(fileOutputStream);

		byte[] buffer = new byte[1024];

		Enumeration<File> enumeration = (Enumeration<File>) form.getListModel().elements();
		while (enumeration.hasMoreElements()) {

		    File file = enumeration.nextElement();
		    FileInputStream stream = null;

		    try {

			stream = new FileInputStream(file);
			ZipEntry entry = new ZipEntry(file.getName());
			zipOutputStream.putNextEntry(entry);

			for (int i = stream.read(buffer); i != -1; i = stream.read(buffer)) {
			    zipOutputStream.write(buffer, 0, i);
			}

			zipOutputStream.closeEntry();

		    } catch (IOException exception) {
		    } finally {
			if (stream != null) {
			    stream.close();
			}
		    }
		}

	    } catch (IOException exception) {
	    } finally {
		if (zipOutputStream != null) {
		    try {
			zipOutputStream.close();
		    } catch (IOException ex) {
		    }
		}
		resetData();
	    }
	}
    }

    public void showMessage(String message) {
	JOptionPane.showMessageDialog(form, message);
    }

    private void resetData() {
	form.setFileSaveTo(null);
	form.getListModel().removeAllElements();
    }
}

Sekarang, aplikasi Zip-Maker selesai dibuat, tinggal test uji coba πŸ˜€

Referensi

Download SourceCode

http://swing-usu.googlecode.com/files/zip-maker.zip

Membuat TableModel yang Dinamis


Kalo temen-temen anggota Jug-Bandung, pasti sudah tau ini, soalnya kemaren dah di bahas di milis Jug-Bandung, kalo blon tau silahkan kunjungi disini :

http://groups.google.co.id/group/jug-bandung/t/a6a2717fca2a32ed

Sekalian juga yang belum join, silahkan join πŸ˜€

Ceritanya gini, biasanya kalo kita bikin table, maka kita juga bikin tablemodel, misal tabel mahasiswa, maka kita bikin tablemodel mahasiswa, trus kalo tabel anggota, maka bikin tablemodel anggota juga, dan seterusnya πŸ˜€ Bayangkan jika di aplikasi kita ada 50 table, berarti kita biki 50 tablemodel juga 😦 capedeh…

Nah gimana caranya kita bikin 1 tablemodel, dan bisa digunakan oleh semuany? Baca lebih lanjut

Menjalankan Google Chrome OS di VirtualBox


VirtualBox

VirtualBox

Tulisan kali ini saya akan membahas tentang menjalankan Google Chrome OS di VirtualBox. Sebelumnya mungkin ada yang belum tau tentang apa itu Google Chrome OS dan VirtualBox.

Google Chrome OS meruapakn sistem operasi Linux yang didalamnya hanya terdapat Google Chrome. Artinya segala aktifitasnya berjalan Online. Jadi jika ofline, otomatis tidak bisa menjalankan Chome OS πŸ˜€ . Dan VirtualBox merupakan aplikasi virtual PC. artinya kita dapat menjalankan sistem operasi menggunakan VirtualBox, tanpa harus melakukan instalasi ke komputer nyata. Sehingga dengan menggunakan VirtualBox, kita bisa mencoba Google Chrome OS tanpa menginstallnya di komputer. Baca lebih lanjut