<$BlogRSDURL$>

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.

0 Yorum:

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.