<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>J.a.i.m's Diary &#187; Java</title>
	<atom:link href="http://jaim.log.web.id/category/programming/java/feed/" rel="self" type="application/rss+xml" />
	<link>http://jaim.log.web.id</link>
	<description>J.a.i.m bukan berarti Jaga-Image, isi weblog ini cerita pengalaman yang bahkan jauh deh dari arti itu</description>
	<lastBuildDate>Wed, 31 Mar 2010 01:48:48 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>Interfacing Delphi dan Java</title>
		<link>http://jaim.log.web.id/2008/08/interfacing-delphi-dan-java/</link>
		<comments>http://jaim.log.web.id/2008/08/interfacing-delphi-dan-java/#comments</comments>
		<pubDate>Wed, 13 Aug 2008 02:55:47 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Delphi]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://jaim.log.web.id/2008/08/interfacing-delphi-dan-java/</guid>
		<description><![CDATA[Java sebagai bahasa pemrograman aplikasi bisnis enterprise menawarkan begitu banyak ragam alternatif solusi yang beberapa di antaranya sudah mencapai taraf kematangan yang cukup baik terutama untuk kebutuhan aplikasi berbasis multi-tier, sebut saja TopLink yang saat ini menjadi standar persistent API di java, kemudian Spring, Atomikos, dan begitu banyak lainnya yang tidak mungkin disebutkan satu persatu [...]]]></description>
			<content:encoded><![CDATA[<p>Java sebagai bahasa pemrograman aplikasi bisnis enterprise menawarkan begitu banyak ragam alternatif solusi yang beberapa di antaranya sudah mencapai taraf kematangan yang cukup baik terutama untuk kebutuhan aplikasi berbasis multi-tier, sebut saja <a href="http://www.oracle.com/technology/products/ias/toplink/index.html">TopLink</a> yang saat ini menjadi standar persistent API di java, kemudian <a href="http://www.springframework.org/">Spring</a>, <a href="http://www.atomikos.com/">Atomikos</a>, dan begitu banyak lainnya yang tidak mungkin disebutkan satu persatu dalam blog ini. Java juga menarik digunakan sebagai sarana pemasaran karena plethoria-nya yang begitu luas. Sementara itu Delphi, khususnya untuk digunakan sebagai bahasa pemrograman untuk middleware belum memiliki ragam pilihan seperti yang terdapat di Java, namun demikian, karena sifatnya sebagai native code, Delphi memungkinkan kita membuat middleware server yang memiliki performa dan stabilitas yang mengungguli middleware sejenis yang dibuat dengan menggunakan Java. </p>
<p>Ragam solusi yang terdapat di java sangat menarik dan terlalu sayang untuk tidak dimanfaatkan, namun permasalahannya, bagaimana jika kita sudah memiliki sebuah middleware server yang dibangun dengan delphi? Memportingnya ke java jelas bukanlah sebuah solusi yang mudah karena itu bisa berarti menulis ulang keseluruhan sistem dari awal. Solusi yang paling memungkinkan tentunya adalah menginterfacekan middleware server yang dibuat dengan delphi tersebut dengn Java, dengan kata lain meng-embbed java virtual machine ke dalam middleware server Delphi sehingga memungkinkan kita memanfaatkan java dalam sistem yang kita buat dengan menggunakan Delphi.<br />
<span id="more-89"></span><br />
<h3>Bagaimana Caranya?</h3>
<p>Cukup sederhana sebenarnya, komunitas delphi, meskipun tidak sebesar komunitas java, namun tidak pula sekecil yang kita pikirkan. Solusi untuk menginterfacekan Delphi dengan Java dengan memanfaatkan <abbr title="Java Native Interface">JNI</abbr> telah tersedia dan bisa dimanfaatkan untuk kebutuhan kita. <a href="http://www.pacifier.com/~mmead/">Matthew Mead</a> telah membuat translasi <a href="http://www.pacifier.com/~mmead/jni/delphi/index.html">Java Native Interface Wrapper</a> yang memungkinkan Delphi bisa melakukan interfacing dengan kode-kode yang ditulis dengan java. Yang kita butuhkankan hanyalah mendownload wrapper tersebut.<br />
&nbsp;&nbsp;&nbsp;
<ul>
<li><a href="http://www.pacifier.com/~mmead/jni/delphi/files/jni_pas.zip">Download Java Native Interface Wrapper</a></li>
</ul>
<p>Kita perlu sedikit melakukan modifikasi pada file JNI.pas, mulai pada baris 89 dengan kode berikut:</p>
<pre class="sourcecode"><code class="Delphi">
  JNI_VERSION_1_5 = JInt($00010005);
  {$EXTERNALSYM JNI_VERSION_1_5}
  JNI_VERSION_1_6 = JInt($00010006);
  {$EXTERNALSYM JNI_VERSION_1_6}

{$DEFINE DYNAMIC_LINKING}
</code></pre>
<p>Strukturisasi class yang terdapat dalam wrapper tersebut bisa dikatakan cukup baik, kita hanya perlu memastikan hanya ada satu instance class TJavaVM dalam keseluruhan aplikasi kita. Barangkali akan timbul pertanyaan, middleware umumnya berbasis multithread, dan menggunakan single instance seperti itu tentunya akan beresiko tinggi, atau setidaknya menurunkan performa karena harus melakukan locking dan sinkronisasi setiap akan menggunakannya. Kita tidak perlu kuatir untuk hal ini karena kita tidak akan menggunakan object instance dari TJavaVM secara langsung, melainkan untuk tiap-tiap thread kita membuat satu instance dari class TJNIEnv dengan menggunakan TJavaVM sebagai referer. </p>
<h3>Inisialisasi JavaVM</h3>
<p>Mari kita lanjutkan dengan membuat inisialisasi TJavaVM pada class utama aplikasi, bisa main class, atau main server object class, bergantung pada bagaimana struktur class yang terdapat dalam middleware yang dibuat.</p>
<pre class="sourcecode"><code class="Delphi">
type
  TServerManager = class(TAbstractLifeCycle)
  ...
  private
    FJavaVM: TJavaVM;
    procedure InitializeVM(FEngine: TJavaVM);
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;

    property JavaVM: TJavaVM read FJavaVM;
  end;

...
const
  CJVM_Path = 'C:\Java\jdk1.6.0_04\jre\bin\client\jvm.dll';

constructor TServerManager.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  ...
  FJavaVM := TJavaVM.Create(JNI_VERSION_1_6, CJVM_Path);
end;

destructor TServerManager.Destroy;
begin
  FJavaVM.Free;
  ...
  inherited Destroy;
end;

procedure TServerManager.InitializeVM(FEngine: TJavaVM);
var
  Options: array [0..4] of JavaVMOption;
  VM_args: JavaVMInitArgs;
  Errcode: Integer;
begin
  Options[0].optionString := '-Djava.class.path=.'; // tambahkan library lain pada classpath jika diperlukan
  VM_args.version := JNI_VERSION_1_6;
  VM_args.options := @Options;
  VM_args.nOptions := 1;
  Errcode := FEngine.LoadVM(VM_args);
  if Errcode &lt; 0 then
    Raise Exception.Create(Format('Error loading JavaVM, error code = %d', [Errcode]));
end;
</code></pre>
<p>Pastikan method InitializeVM dipanggil hanya sekali setelah object class utama itu di-create, namun jangan menggabungkannya pada constructor TServerEngine karena bisa menyebabkan memory leakage jika penanganan atas itu keliru.</p>
<pre class="sourcecode"><code class="Delphi">
begin
  FServerManager := TServerManager.Create(Self)
  FServerManager.InitializeVM(FServerManager.JavaVM);
end;
</code></pre>
<p>Seperti yang telah disebutkan sebelumnya, sebelum kita mulai melakukan invoking method java dari delphi, kita harus membuat terlebih dulu satu buah instance dari class TJNIEnv untuk tiap-tiap process thread dari middleware tersebut dengan menggunakan object instance TJavaVM sebagai referer.</p>
<pre class="sourcecode"><code class="Delphi">
type
  TServerCommandHandler = class(TBaseCommandHandler)
  ...
  private
    FJNIEnv: TJNIEnv;
    FServerManager: TServerManager;

    procedure SetServerManager(AValue: TServerManager);
  public   

    property JNIEnv: TJNIEnv read FJNIEnv;
    property Servermanager: TServerManager read FServerManager write SetServerManager;
  end;

procedure TServerCommandHandler.SetServerManager(AValue: TServerManager);
begin
   if AValue = FServerManager then
      exit;
   if AValue = nil then
   begin
      if Assigned(FJNIEnv) then
          FreeAndNil(FJNIEnv);
   end else
   begin
      if Assigned(FJNIEnv) then
          FreeAndNil(FJNIEnv);
      FJNIEnv := TJNIEnv.Create(AValue.JavaVM.Env);
   end;
   FServerManager := AValue;
end;
</code></pre>
<h3>Invoking Java Method dari Delphi</h3>
<p>Untuk melakukan pemanggilan atas method Java melalui delphi dari process thread tersebut, kita tinggal menggunakan object instance TJNIEnv yang telah dibuat sebelumnya. Implementasi pada bagian ini sangat beragam, dan bisa menjadi sangat kompleks bergantung pada tipikal task yang dikerjakan di sisi middleware yang dibuat, namun contoh yang paling sederhananya adalah sebagai berikut:</p>
<pre class="sourcecode"><code class="Delphi">
var
  Cls: JClass;
  Mid: JMethodID;
  JStr: JString;
begin
  Cls := FJNIEnv.FindClass('FunctionTest');
  if Cls = nil then
    LogAndRaise('Can''t find class: FunctionTest');
  Mid := FJNIEnv.GetStaticMethodID(Cls, 'sayHello', '(Ljava/lang/String;)Ljava/lang/String;');
  if Mid = nil then
    LogAndRaise('Can''t find method: sayHello');

   // Call the static method
  JStr := FJNIEnv.CallStaticObjectMethod(Cls, Mid, ['Hello World']);

  // Convert the returned JString to a Delphi string
  DataMessage.Reply(FJNIEnv.JStringToString(JStr));
end;
</code></pre>
<p>Kode java yang akan dipanggil dalam hal ini adalah sebagai berikut:</p>
<pre class="sourcecode"><code class="Java">
public class FunctionTest{

  public static String sayHello(String inputHello)
  {
    String hello = "Hello World";
    return hello;
  }
}
</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://jaim.log.web.id/2008/08/interfacing-delphi-dan-java/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Jython 2.5 alpha dirilis</title>
		<link>http://jaim.log.web.id/2008/07/jython-25-alpha-dirilis/</link>
		<comments>http://jaim.log.web.id/2008/07/jython-25-alpha-dirilis/#comments</comments>
		<pubDate>Fri, 18 Jul 2008 04:59:35 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://jaim.log.web.id/2008/07/jython-25-alpha-di-rilis/</guid>
		<description><![CDATA[Berita pagi ini juga cukup menarik, kabar terbaru yang saya dapatkan Jython merilis versi alpha atas python language yang kompatible dengan CPython 2.5. Meski masih dalam taraf alpha, namun rilis ini menarik untuk dieksplorasi sejauh mana kompatibilitas bahasa yang ditawarkan Jython yang tentunya pula akan berdampak pada besar kecilnya probabilitas Jython untuk dapat diintegrasikan dengan [...]]]></description>
			<content:encoded><![CDATA[<p>Berita pagi ini juga cukup menarik, kabar terbaru yang saya dapatkan <a href="http://www.jython.org/">Jython</a> merilis versi alpha atas python language yang kompatible dengan CPython 2.5. Meski masih dalam taraf alpha, namun rilis ini menarik untuk dieksplorasi sejauh mana kompatibilitas bahasa yang ditawarkan Jython yang tentunya pula akan berdampak pada besar kecilnya probabilitas Jython untuk dapat diintegrasikan dengan library-library yang menggunakan CPython sebagai basis seperti SQLAlchemy, dll.</p>
<p>Seberapa begitu menarikkah Jython ini dibanding CPython? Perlu diketahui, CPython saat ini memiliki kelemahan jika digunakan dalam mesin-mesin berbasis multi-core karena keberadaan <abbr title="Global Interpreter Lock">GIL</abbr> membuatnya secara internal hanya satu thread yang aktif dieksekusi (meski sebenarnya ada beberapa thread yang berjalan bersamaan), akibatnya tentu saja hanya 1 CPU yang bisa termanfaatkan. Sebenarnya hal ini bisa sedikit banyak diminimalisir dengan memporting kode-kode yang bersifat kritikal ke dalam extenstion module yang dibuat dengan native language, namun besar kecilnya manfaat sangat bergantung pada bagaimana model kerja kode dalam python yang dieksekusi, begitu juga dengan membuat process instance, dan beberapa solusi lainnya. Saya tidak ingin panjang lebar membahas lebih jauh tentang ini, <a href="http://www.artima.com/weblogs/index.jsp?blogger=guido">Guido</a> punya alasan yang kuat dan benar yang mendasari kenapa <abbr title="Global Interpreter Lock">GIL</abbr> tetap harus dipertahankan setidaknya di Python300 nanti.</p>
<p><span id="more-16"></span><br />
Jython dalam hal ini menawarkan fitur yang menjadi keterbatasan CPython saat ini, mendukung multithread dengan memanfaatkan fitur threading dalam <abbr title="Java Virtual Machine">JVM</abbr> dan mentransformasi python code menjadi java byte code sehingga secara logika tingkat performanya lebih kurang setara seperti halnya kode Java aslinya. Namun demikian, tidak berarti Jython berada di atas segala-galanya atas CPython, karena dikembangkan dengan menggunakan Java sebagai basis, otomatis memiliki kelemahan atas kompatibilitas dengan extension module yang banyak menggunakan native language sebagai pendukungnya.</p>
<p>Sejauh ini implementasi yang saya gunakan dengan memanfaatkan CPython sudah cukup memuaskan, skalabilitas implementasi masih bisa dieksplorasi secara lebih jauh seiring dengan masih adanya opsi-opsi yang bisa dipilih terkait dengan isue ini, namun demikian Jython tetap menarik untuk dieksplorasi, sebagai alternatif paling akhir apabila memang tidak ada lagi pilihan untuk itu guna meningkatkan skalabilitas platform system yang ada saat ini.</p>
]]></content:encoded>
			<wfw:commentRss>http://jaim.log.web.id/2008/07/jython-25-alpha-dirilis/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
