<$BlogRSDURL$>

ide4db 

Her veri tabanı, geliştiricilere kolaylık sağlamak için kendi araçlarını sunmaktadır. Fakat bu araç seti, o veri tabanı üreticisinin birincil hedefi olmadığı için daha çok veri tabanı yöneticilerini hedef almakta ve o veri tabanı için tercih edilen platformları desteklemektedirler.

Veri tabanı üreticisinin haricinde, 3. parti yazılımlar da mevcuttur. Fakat bunlar kapalı kodlu yazılımlar olup birincil hedefleri pazar payı büyük olan veri tabanları için işleri kolaylaştırmaktır.

Veri tabanı uygulaması geliştirme sırasında, tasarım, geliştirme ve bakım süreçlerinin hepsinin bir araç ile gerçekleştirilebilmesi programcı ve yöneticinin işlerini çok kolaylaştıracaktır.

IDE4DB projesinin hedefi de bu sorunlara çözüm sunacak, platform bağımsız, veri tabanı bağımsız, özgür bir araç seti sunmaktır.

Veri tabanı ve platform bağımsız olma hedefini sağlamak için Java teknolojileri kullanılacaktır.

Üç temel katmana sahip olması planlanmaktadır. Bunlar :

  1. Başka uygulamalar tarafından da kullanılabilecek veri tabanı işlemlerini kolaylaştıracak kütüphaneler hazırlamak.
  2. ANT ve benzeri araçlarla kullanılabilecek komut satırı uygulamaları geliştirmek. Özellikle toplu işlemler için gerekli olan uygulamaları hazırlamak ( DBDiff, DBCopy, I-SQL v.b. )
  3. Hem geliştiriciler hem de sistem yöneticilerin işini kolaylaştıracak veri tabanı tasarım, geliştirme ve yönetimi işlerini yapacak bir IDE. Bu IDE için NetBeans platformu kullanılması düşünülmektedir.
Henüz planlama aşamasında olan proje için geliştirme sürecine katkıda bulunmak isteyen herkesi projenin SourceForge'da ki sitesine bekleriz...

Commons - BeanUtils 

Uygulamanızın içerisinde basit bir betik sistemi yerleştirme ihtiyacı hissettik, örneğin bir metin dosyasında yazılı olan sınıf ve özellik ismini kullanarak değer okuyacağımız nesneyi elde etmek. Bunun için yapılacak iş nedir, gider bu metin dosyasını okuruz, diyelim ki bunu da kolaylaştırdık ve bu metin dostası bir java özellik dosyası ( .properities ) ve bunu Properties sınıfı içine okuttuk. Sonra da sınıf bilgisi üzerinde gerekli kontrolleri yaparak bu özelliği / metodu barındırıp barındırmadığını kontrol ettik ve ardından çalıştırdık. Yani hiç kontrol yapılmamış hali ile şöyle bir kod yazdık :

Object obj = ...; //dosyadan okuyup çalışma anında oluşturulmuş nesne.
String field = ...; //dosyadan okunmuş hangi özelliğin kullanılacak olduğu bilgisi.

String s = (String)obj.getClass().getMethod( "get" + field , null ).invoke( obj, null );
System.out.println( s );


Çokda zor değil gibi ama yapılması gereken kontroller üzerine bindiğinde ortalık biraz karışıyor. Özellik ismi JavaBean standartlarına uygun olacak, yani "alan" olarak almış oladuğunuz özellik ismini metod ismine dönüştürdüğümüzde "getAlan" olması lazım. Eğer okunan özellik Boolean tipinde ise metod "get" değil "is" ile başlayacak. Eğer istenilen metod yoksa? Ayrıca indeksli bir özellik ise bir de parametre kontrolü işin içine girecek.

Ya da çok daha kolay bir şey yaptık, Apache Jakarta Commons BeanUtils kütüphanesini indirdik, ve aşağıdakine benzer bir kodu çalıştırdık :

Object obj = ...; //dosyadan okuyup çalışma anında oluşturulmuş nesne.
String field = ...; //dosyadan okunmuş hangi özelliğin kullanılacak olduğu bilgisi.

String s = (String)PropertyUtils.getSimpleProperty( obj, field );
System.out.println( s );


BeanUtils kütüphanesinin temel amacı, Java Bean tanımına uyan sınıfları yönetmek için çeşitli araçlar sunmak. Kütüphane dört temel bölümden oluşuyor : PropertyUtils, DynaBean/DynaClass, ConvertUtils, Collections

PropertyUtils

Bir Java Bean'ın özelliklerine erişmek için gerekli olan fonksiyonları içerir. Özellik tipi tanımlar :

1- Basit Özellik Erişimi
Adı üzerinde basittir.

Employee employee = ...;
String firstName = (String) PropertyUtils.getSimpleProperty(employee, "firstName");

//Değişiklikler...
PropertyUtils.setSimpleProperty(employee, "firstName", firstName);


2- Indeksli Özellik Erişimi
Birden fazla özelliğe tam sayı bir numara ile erişimi kolaylaştırır. Burda iki seçenek bulunmakta, ya indeksli değere erişecek bir betik hazırlanır ya da değer verilen fonksiyon kullanılır. Betik hazırlanan yöntem, özellik adı metin olarak aktarılacak ise kullanışlı olacağı açıktır.

Employee employee = ...;
int index = ...;
String name = "subordinate[" + index + "]";

Employee subordinate = (Employee) PropertyUtils.getIndexedProperty(employee, name);

Employee employee = ...;
int index = ...;
Employee subordinate = (Employee) PropertyUtils.getIndexedProperty(employee, "subordinate", index);


3- Eşlenmiş Özellik Erişimi
Bir anahtar kelimeye eşlenmiş değerleri almayı sağlar. İndeksli olandan en önemli farkı köşeli parantezler değil normal parantezler içerisinde metin bilgi veriliyor olmasıdır.

Employee employee = ...;
Address address = ...;
PropertyUtils.setMappedProperty(employee, "address(home)", address);

Employee employee = ...;
Address address = ...;
PropertyUtils.setMappedProperty(employee, "address", "home", address);


4- Yinelemeli Özellik Erişimi
Bir betik ile erişilen özellik üzerinden başka bir özelliğe erişimi kolaylaştırmayı sağlar.

String city = (String) PropertyUtils.getNestedProperty(employee, "address(home).city");



DynaBeans / DynaClass
BeanUtils kütüphanesinin asıl bölümünü oluştururlar. Çalışma anında sınıf oluşturmaya yarayan alt yapıyı sağlar. DynaBean ve DynaClass birer arayüzdür ve farklı farklı gerçeklemeleri bulunabilir.

Çalışma anında oluşturulan özellikler ile üretilmiş bir sınıf ve onun kullanımı sağlayan, en temel olan gerçekleştirme BasicDynaBean ve BasicDynaClass'ın kullanımı aşağıdaki gibidir.

DynaProperty[] props = new DynaProperty[]{
new DynaProperty("address", java.util.Map.class),
new DynaProperty("subordinate", mypackage.Employee[].class),
new DynaProperty("firstName", String.class),
new DynaProperty("lastName", String.class)
};
BasicDynaClass dynaClass = new BasicDynaClass("employee", null, props);

DynaBean employee = dynaClass.newInstance();
employee.set("address", new HashMap());
employee.set("subordinate", new mypackage.Employee[0]);
employee.set("firstName", "Fred");
employee.set("lastName", "Flintstone");


Hali hazırda BeanUtils kütüphanesi, JDBC sonuç kümesine erişimi kolaylaştıracak ResultSetDynaClass gibi farklı gerçeklemeleri de sunmaktadır.

ConvertUtils
Yukarıda fark edilebileceği üzere PropertyUtils ve diğer sınıflarda işlemler java indirgeme (cast) işlemi ile yapılmakta fakat ya verilerin çevrilmesi gerektiği durumlarda ne yapmalı. Örneğin verileriniz tamsayı olabilir fakat bir özellik dosyasından okunmuş durumda yani veri tipi olarak hepsi metin halde. ConvertUtils tam bu noktada devreye girip bu değerleri istenilen veri tiplerine çeviriyor. Bir çok çevirici bulunmakla birlikte ihtiyaç halinde özel çeviriciler de sisteme eklenebilmekte.

HttpServletRequest request = ...;
MyBean bean = ...;
HashMap map = new HashMap();
Enumeration names = request.getParameterNames();
while (names.hasMoreElements()) {
String name = (String) names.nextElement();
map.put(name, request.getParameterValues(name));
}
BeanUtils.populate(bean, map);


Collections
Diyelim ki bir JTable modeli hazırladınız ve verileri bir List nesnesinden sağlıyorsunuz. Bu verileri filtreleme ihtiyacı hissettiğinizde ne yaparsınız. Bir döngü içerisinde istediğiniz kotrolleri yapar, verileri filtreler ve yeni bir List hazırlarsınız. Eğer bu filtre bilgileri diyelimki bir metin dosyasından dinamik olarak okunuyorsa? BeanUtils Collection tam burda imdadınıza yetişiyor.

BeanPropertyValueEqualsPredicate predicate = new BeanPropertyValueEqualsPredicate( "activeEmployee", Boolean.FALSE );

// filter the Collection
CollectionUtils.filter( peopleCollection, predicate );


Seçimlik olan bu parça, commons-collections'ın üzerine kurulmuştur ve sistemde bu kütüphaneninde olmasını gerektirir.

Bağlar
Daha fazla bilgi için : Jakarta Commons BeanUtils
Örnek kodlar, commons-beanutils javadoc'u içerisinden alınmıştır.

Ayar Sistemi 

İster masaüstü ister web uygulaması hatta gömülü mobil uygulamalar olsun, yazılan her uygulamanın bir şekilde ayar bilgileri barındırması gerekir. Bu ayar bilgilerinin saklanacağı ortamlar çeşitli olabilir. En basit yöntem bir metin dosyasında tutmak ya da günümüz modası olarak bir XML'de saklamak olabilir. Uygulamanın türününe göre bu değerler veri tabanı ya da LDAP üzerinde de saklıyor olabilir. Hatta çoğu zaman olduğu gibi bunların hepsi birden kullanılıyor olabilir.

Apache Jakarta Commons Configuration, bütün bu sorunlara çözüm sunmak için geliştirilmiş bir kütüphane. Uygulamanın ihtiyaç duyduğu ayar bilgilerini çeşitli kaynaklardan okuyup, bunları genel bir arayüz ile uygulama programcısına sunmakta.

Double double = config.getDouble("number");
Integer integer = config.getInteger("number");

Olası tüm ayar kanaklarını desteklemekte. Bunların yeterli gelmediği yerler için de özel ayar okuyucular hazırlanıp modüler bir şekilde sisteme eklenebilirler. Hali hazırda desteklenen ayar kaynakları :


Yukarıda sayılan ayar kaynakları bir arada kullanılabilirler. Yani bir uygulamanın bazı ayar bilgileri yerel bir özellik dosyasında, bazı ayar bilgileri uzak bir XML dosyasında, bazıları ise bir LDAP sunucusunda bulunabilir ve bu ayar kaynaklarının hepsi bir arada kullanılabilir. Ayar sistemini kullanmak için iki alternatif yöntemden biri seçilebilir.

CompositeConfiguration

Bu yöntem de uygulama ayar kaynaklarının neler olduğunun kontrolünü kendisi yapar. Özel ayar kaynakları olan sistemler için önerilecek olan sistemdir.
Configuration defaults = new PropertiesConfiguration(fileToDefaults);
Configuration otherProperties = new PropertiesConfiguration(fileToOtherProperties);
CompositeConfiguration cc = new CompositeConfiguration();
cc.addConfiguration(otherProperties);
cc.addDefaults(fileToDefaults);


ConfigurationFactory

Bu yöntemde ise sistem ayar bilgileri, bir XML dosyasına yerleştirilir. Böylece hangi ayar kaynaklarının kullanılacağı da bir ayar dosyasına yazılmış olur.


<?xml version="1.0" encoding="ISO-8859-1" ?>

<configuration>
<properties fileName="usergui.properties"/>
</configuration>

Kullanmak için de aşağıdaki gibi bir kod ile bu dosyaya erişmek yeterli olacaktır.

ConfigurationFactory factory = new ConfigurationFactory();
URL configURL = new File("config.xml").toURL();
factory.setConfigurationFileName(configURL.toString());
Configuration config = factory.getConfiguration();

Commons Configuration, ASL ile yayınlanmaktadır. Çalışmak için duruma göre Commons Collection gibi başka jakarta commons bileşenlerine gereksinim duymaktadır. İndirmek ve nasıl kullanıldığına dair daha fazla için tıklayınız.

Cevze, Java yazılım geliştirme ortamı ile ilgili konuları içeren bir Hakan Uygun weblogudur. Yapımında Blogger-Templates'den şablon kullanımıştır. Ayrıca Cezve resmi de mehmetefendi.com'dan alınmıştır.