Makale Özeti

Bu yazımda C# platformuna java platformundan geçişi kolaylaştıran Java Language Conversion Assistant JLCA ile ilgili bilgiler vermeye çalışacağım.

Makale

Merhaba,

Bu yazımda C# platformuna java platformundan geçişi kolaylaştıran Java Language Conversion Assistant JLCA ile ilgili bilgiler vermeye çalışacağım.

Temel olarak hepimizin bildiği gibi C# .Net platformu için yeniden yaratılmış ve yapılandırılmış bir dil ama; syntax benzerliği ile daha önceleri web uygulaması yazmış olan çok kişinin tanıdık olduğu javascript veya java diline benzerliği çok kez dile getirildi, aslına bakarsanız temelde çok ciddi altyapı ve sistem farkları olmasına karşın bu benzerlik çoğu java, J++, javascript developerlarının işine yaramıştır diye düşünüyorum.

JLCA şu an 2.0 versiyonu ile kullanımda ama beta sürümü denemeleri yapılan 3.0 versiyonu ile çok yakında kullanıcıların pc lerinde daha iyi çevrimler yapacağını umuyorum.

Beta 3.0 denemek veya kullanmak isteyenler için:

http://msdn.microsoft.com/vstudio/downloads/tools/jlca/30beta/default.aspx

Bu çevrim asistanı temelde java dilinde yazılmış kodları C# platformuna taşıyor, yani, hedef tek ama kaynak birden fazla çeşide sahip.

Bu kaynaklar şunlar olabiliyor:

1) Microsoft Java Virtual Machine hedefleyen uygulamalar; Visual Java++ ile yazdığımız dosya halinde java classları veya proje halindeki uygulamalar. 2) JSP veya Servlet Projeleri
3) Herhangi bir folderda bulunan java dosyaları (MSJVM hedeflemesi gerekmiyor)

Öncelikle Visual Studio plug-in i şeklinde olan bu asistanı bilgisayarınıza indirmeniz ve kurmanız gerekiyor.

http://www.microsoft.com/downloads/details.aspx?FamilyId=46BEA47E-D47F-4349-9B4F-904B0A973174&displaylang=en

 

JLCA uygulamasının esas görevi elimizdeki java kodunun çalışabilir C# kopyasını üretmek, sonrasında ürettiği raporlar ve yeni eklediği ek kodlar ile projenin çalışır çevrilmiş kopyasını oluşturmak. Bu çevrim işlemi ile ilgili bazı istatistikler aşağıdaki gibi:

• Java kodunun %99 unu çevirebiliyor
• J2SE ve J2EE kodlarının %99 unu çevirebiliyor (v1.3 destekleniyor).
• Methodların %85 i .Net API lerine çevirilebiliyor.

Bu örnekte bir klasörde bulunan MS JVM için yazılmamış olan java classlarını kaynak olarak kullanacağız.

Örnek olarak aldığım java kodu her uygulamanın yaptığı ve en önemli ve basit işlemlerinden biri olan database sorgusunu yapıyor. Java nın database bağlantılarını sağlayan ortam olan JDBC üzerinden SQL server’a pubs database ine bağlanıp basit bir sorguyu konsola yazıyor.

Java JDBC Test Class

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
/** * Microsoft SQL Server JDBC test program */
public class Test { public Test() throws Exception
{
         // Get connection
       String strClass = "Class=com.microsoft.jdbc.sqlserver.SQLServerDriver";
       Class.forName(strClass);
       String strURL ="jdbc:microsoft:sqlserver://server:1433;DatabaseName=pubs";
       Connection con = DriverManager.getConnection(strURL, "username", "pwd");
       PreparedStatement pst = con.prepareStatement("select * from authors");
       ResultSet rs = pst.executeQuery();

       while (rs.next())
         {
              System.out.println(rs.getString(1) + "," + rs.getString(2) + "\n");
          }
con.close();
}
// Test
public static void main(String args[]) throws Exception
{
       Test test = new Test();
}
}


Yukarıdaki uygulamada server, username ve pwd yerine kendi databae bilgilerimiz yazmamız gerekiyor bu java kodunu çalıştırabilmek için.
VS.Net 2003 File menüsünden Open ve Convert seçtikten sonra karşımıza gelen Java Language Conversion Assistant seçeneğini seçtikten sonra 2-3 basit seçim daha yapmamız gerekiyor.
Sonraki adım kaynak java kodlarımızın olduğu klasörü seçmek. Daha öncede belirttiğim gibi bir folderda bulunan ve proje halinde olmayan java kaynak kodlarını örnek olarak kullanacağız.
Son olarakta hedef projemiz için bir proje ismi, bir klasör ve proje tipi seçmemiz gerekiyor. Örneğimizde uygulama tipi olarak konsol uygulamasını seçiyoruz.
Kısa bir süre sonra belirlediğimiz folderda C# ile yazılmış olan kodlarile beraber en önemli çıktı olan çevrim raporuna ulaşıyoruz. Bu raporda kod tokenları ile birlikte kullanılan önemli 3 adet uyarı çeşidi yer alıyor.
Uyarı Tipi Açıklama
UPGRADE_TODO Çevrimi yapılamamış kod
UPGRADE_WARNING Problem oluşturma ihtimali olan kod
UPGRADE_NOTE Beklenenden farklı davranabilecek olan kod.

Bizim dikkat etmemiz gereken en önemli uyarı tipi TODO tokenları olmalıdır, her ne kadar yüksek oranlı ve başarılı bir çeviride yapsa, her durumda mutlaka üretilen raporu ve tokenları dikkatle incelemek gereklidir.

Bizim örnek kodumuz için çıkan rapora bir göz atalım:

Gördüğünüz gibi 3 adet önemli olan TODO uyarımız var;

1) Database bağlantısı için kullanılan balantı cümlesi java ve .Net de farklı olduğu için bunu düzeltmemiz gerekiyor.

2) Java resultset objesini reader objesini çevirdiği ve farklı davranışta olabileceğini belirten bir uyarımız daha var ama bu uygulamada farklı özelliklerini kullanmadığımız için bu uyarı bize problem yaratmayacaktır.

3) String conversion ile ilgili son uyarıda bu örnek için problem teşkil etmiyor.

Eğer help dosyalarını yüklediyseniz raporda her item bir help sayfasına linkli olduğu için bu uyarılarla ile ilgili yardım almanız da mümkün.

Database bağlantısı için gerekli olan ayarları yaptıktan sonra uygulamamız aşağıdaki şekle dönüşüyor.
C# Converted Class

using System;
/// Microsoft SQL Server JDBC test program
public class Test
   {
      public Test() { 
      // Get connection
      System.String strClass = "Class=com.microsoft.jdbc.sqlserver.SQLServerDriver";
      //UPGRADE_TODO: Format of parameters of method java.lang.Class.forName are different in the equivalent in .NET. ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="jlca1092"
      System.Type.GetType(strClass);
      System.String strURL = "Provider=SQLOLEDB.1;Password=sa;User ID=sa;Initial Catalog=pubs;Data Source=OGUZXP";

      System.Data.OleDb.OleDbConnection temp_Connection;

      //UPGRADE_TODO: Change connection string to .NET format. ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="jlca1063"

      temp_Connection = new System.Data.OleDb.OleDbConnection(strURL);
      temp_Connection.Open();

      System.Data.OleDb.OleDbConnection con = temp_Connection; 
      System.Data.OleDb.OleDbCommand pst = SupportClass.TransactionManager.manager.PrepareStatement(con, "select * from authors");

      //UPGRADE_TODO: Interface java.sql.ResultSet was converted to System.Data.OleDb.OleDbDataReader which has a different behavior. ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="jlca1073_javasqlResultSet"

     System.Data.OleDb.OleDbDataReader rs = pst.ExecuteReader();

    while (rs.Read())
       {
          System.Console.Out.WriteLine(System.Convert.ToString(rs[1 - 1]) + "," + System.Convert.ToString(rs[2 - 1]) + "\n");
       }

con.Close();

}
    // Test
    [STAThread]
    public static void Main(System.String[] args)
    {
      Test test = new Test();
    }
}

Ortaya çıkan konsol çıktısı ise aşağıdaki gibi olacaktır.

Uygulamanın örnek kodları için tıklayınız.

Hepinize iyi çalışmalar dilerim.

Oğuz Küçükbarak
MVP, MCT, MSDN.NET, MCSD, MCAD, MCDBA

Yazının Özlü Sözü: Kimseye birşey öğretemezsin, yalnızca cevabı kendi içinde bulmasına yardımcı olursunuz. Galileo