Memakai Tomcat 7 Dengan Cloud Foundry Integration For Eclipse


Cloud Foundry hingga pada saat tulisan ini dibuat masih memakai Tomcat 6.  Dan saya sekarang perlu melakukan migrasi proyek yang sudah ada ke Tomcat 7.  Apakah mungkin?    Hasil Google menunjukkan sebuah artikel berjudul Deploying Tomcat 7 Using the Standalone Framework.   Artikel tersebut menunjukkan bagaimana melakukan deployment ke Tomcat 7 dengan menggunakan perintah command line.  Saya berusaha menghindari penggunaan command line karena selama ini proyek saya sudah memakai Cloud Foundry Integration For Eclipse, sebuah plugin resmi yang mengintegrasikan Eclipse dan Cloud Foundry.

Lalu apakah Cloud Foundry Integration For Eclipse mendukung Standalone Framework (yang memungkinkan penggunaan Tomcat 7)?  Saya kembali melakukan Google dan menemukan sebuah tulisan berjudul Cloud Foundry Integration for Eclipse Now Supports Standalone Java Applications and Java 7.  Jadi Cloud Foundry Integration For Eclipse sudah mendukung Tomcat 7?  Jika saya membaca secara teliti artikel tersebut, yang didukung hanya Standalone Framework.  Plugin tersebut tetap akan mengambil hasil output dari proyek dan meletakkan di server Cloud Foundry.  Bila ingin Tomcat 7 ikut di-deploy di server, maka Tomcat 7 harus dimasukkan sebagai bagian dari output proyek dan hal ini bisa membuat proyek sangat berantakan.   Saya tidak ingin memodifikasi struktur proyek yang sudah ada.

Jadi, apa ada solusinya?  Akhirnya saya memutuskan untuk memodifikasi Cloud Foundry Integration For Eclipse karena plugin tersebut bersifat open-source.

Bagaimana bisa mengetahui sebuah proyek akan memakai Standalone Framework atau tidak?  Berdasarkan panduan yang ada, caranya adalah dengan men-klik kanan nama proyek, memilih Configure, Enable as Cloud Foundry Standalone App.  Hal ini akan menyebabkan kode program di class ConvertToStandaloneAction di CloudFoundryProjectExplorerMenuFactory.java dipanggil.  Apa yang dilakukan oleh Action ini pada dasarnya adalah menambahkan facet cloudfoundry.standalone.app pada proyek.  Manipulasi facet dilakukan dengan bantuan class StandaloneFacetHandler.

Keanehan saya jumpai saat dialog deployment ditampilkan.  Ada dua jenis dialog berbeda yang akan ditampilkan tergantung pada apakah proyek memakai Standalone Framework atau tidak.  Masalahnya, untuk menentukan apakah proyek memakai Standalone Framework atau tidak, kode program tidak memeriksa facet yang di-install sebelumnya saat Enable as Cloud Foundry Standalone App dipilih.  Hal ini menyebabkan beberapa jenis proyek tidak dikenali dengan baik, sehingga dialog Standalone Framework tidak akan muncul.  Untuk mengatasinya, saya menambahkan kode program berikut ini di method isStandaloneApp() milik class StandaloneHandler:

protected boolean isStandaloneApp() {
  ... // kode program diabaikan

  // Check project facet
  if (!isStandalone && module!=null) {
    try {
       IFacetedProject facetedProject = ProjectFacetsManager.create(module.getProject());
       if (facetedProject.getInstalledVersion(StandaloneFacetHandler.FACET)!=null) {
         isStandalone = true;
       }
    } catch (CoreException e) {
       // ignore this
    }
  }
}

Sekarang, saya perlu memodifikasi tampilan pada step 2 di dialog deployment agar terlihat seperti berikut ini:

Perubahan Di Dialog Deployment

Perubahan Di Dialog Deployment

Pada perubahan yang saya buat, container directory adalah direktori yang akan di-deploy sebagai bagian dari proyek.  Direktori ini tidak harus berada di dalam proyek, tetapi dapat berada di lokasi mana saja.  Deploy directory sendiri adalah sebuah direktori relatif yang berada di dalam container directory dimana output proyek (dalam bentuk file war) akan diletakkan.  Dengan demikian, dialog ini tidak hanya berlaku khusus untuk Tomcat 7 saja, tetapi juga untuk container lainnya.  Btw, kedua SWT Text tersebut lebih baik  bila  menyertakan directory chooser.

Untuk membuat tampilan di atas, saya perlu melakukan perubahan pada class CloudFoundryApplicationWizard dan CloudFoundryDeploymentWizardPage.  Secara garis besar, class yang terlibat pada dialog ini terlihat seperti:

UML Class Diagram Untuk Tampilan Wizard Deployment

UML Class Diagram Untuk Tampilan Wizard Deployment

Setelah melakukan modifikasi tampilan, saya perlu sebuah class untuk menampung nilai container directory dan deploy directory.  Untuk itu, saya membuat sebuah class baru dengan nama StandaloneWithContainer.  Posisi class baru ini akan terlihat seperti pada UML class diagram berikut ini:

UML Class Diagram Setelah Penambahan StandaloneWithContainer

UML Class Diagram Setelah Penambahan StandaloneWithContainer

Masih ada satu lagi yang perlu saya lakukan yaitu membuat sebuah class baru yang mewakili isi yang akan dikirim ke server.  Saya akan menamakan class ini sebagai StandaloneApplicationArchiveWithContainer, dimana posisi class ini ditunjukkan oleh UML class diagram berikut ini:

UML Class Diagram Yang Menggambarkan ApplicationArchive Yang Ada

UML Class Diagram Yang Menggambarkan ApplicationArchive Yang Ada

Secara garis besar, class StandaloneApplicationArchiveWithContainer adalah perpaduan antara ModuleResourceApplicationArchive dan DirectoryApplicationArchive.  Class ini akan membuat file WAR dari output proyek, meletakkan file WAR tersebut ke direktori dalam container yang ditentukan oleh deploy directory, baru kemudian mengirimkan seluruh isi container directory ke server Cloud Foundry.

Selama mengotak-atik di bagian ini, saya menemukan sebuah bug yang disebabkan oleh masalah multiplatform.  Berikut ini adalah kode program di DirectoryApplicationArchive.java di baris 75:

this.name = file.getAbsolutePath().substring(directory.getAbsolutePath().length()+1);
if (isDirectory()) {
  this.name = this.name + "/";
}

Karena server Cloud Foundry berbasiskan Linux, maka pemisah direktori yang dipakai adalah “/”.  Penggunaan getAbsolutePath() akan selalu mengembalikan pemisah direktori sesuai dengan platform pengguna.  Bila di Windows, ini adalah karakter “\”.  Oleh sebab itu, di StandaloneApplicationArchiveWithContainer, saya menggunakan pendekatan seperti berikut ini:

this.name = file.getAbsolutePath().replace(System.getProperty("file.separator", "/"), "/");

Setelah melakukan modifikasi pada Cloud Foundry Integration For Eclipse, saya bisa men-deploy aplikasi seperti biasa tanpa mengubah struktur proyek sama sekali!  Tomcat 7 secara otomatis akan di-“kirim” ke server, seperti yang terlihat pada gambar berikut ini:

Struktur Hasil Deployment Di Server Cloud Foundry

Struktur Hasil Deployment Di Server Cloud Foundry

Perihal Solid Snake
I'm nothing...

Apa komentar Anda?

Please log in using one of these methods to post your comment:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: