25 Ağustos 2011 Perşembe
19 Ağustos 2011 Cuma
Junit ve Mockit ile Private ve Void Methodları Test Etme
Arkadaşlar Merhabalar,
Projeleri test ederken karşılaştığımız bir problem de private ve void methodların özel durumlarıdır. Private methoda erişemediğimizden, Void methodun da birşey döndürmediğinden bu sonuç ortaya çıkar. Void method için aslında yapılabilecek çok bir şey yok, kullandığı global değişkenleri Mockit kütüphanesinin getField() fonksiyonu ile kontrol edebiliriz.
String actual = getField(instance, "exportData");
actual : Kontrol edeceğimiz parametre
instance : Parametresini çekeceğimiz obje
exportData : Parametrenin adı
Bundan sonra assertEqual fonksiyonu ile karşılaştırma yapılabilir. Private methodları çağırmak için de aşağıdaki kodu kullanabiliriz.
Class c = Class.forName("com.layers.drivers.DataDriverImpl");
Method methodParse = c.getDeclaredMethod("parseDataToExportData", new Class[]{Collection.class,Collection.class}); // Fonksiyonun adı ve aldığı parametrelerin tipi
methodParse.setAccessible(true);
Object objParse = c.newInstance();
setField(objParse, "dataExportData", mockDataExportData); // Fonksiyonun kullandığı bir global parametreyi kendi parametremizle değiştirme
methodParse.invoke(objParse, new Object[] {albumModels,genreModels}); // Fonksiyonun aldığı parametreler
Bu konuda başka bir örneğin bulunduğu linki aşağıda veriyorum. Yalnız bu linkteki örnekteki kodu kullanmak için method.setAccessible(true) kodunu eklemeniz gerekiyor, çünkü private method çalıştırmak için önce accessible yapmamız gerekiyor.
http://www.java2s.com/Tutorial/Java/0125__Reflection/Callaclassmethodwith2arguments.htm
Şimdilik bu kadar. Kafanıza takılan soruları yazarsanız beraber çözüm bulmaya çalışırız.
Herkese sevgiler, saygılar.
Projeleri test ederken karşılaştığımız bir problem de private ve void methodların özel durumlarıdır. Private methoda erişemediğimizden, Void methodun da birşey döndürmediğinden bu sonuç ortaya çıkar. Void method için aslında yapılabilecek çok bir şey yok, kullandığı global değişkenleri Mockit kütüphanesinin getField() fonksiyonu ile kontrol edebiliriz.
String actual = getField(instance, "exportData");
actual : Kontrol edeceğimiz parametre
instance : Parametresini çekeceğimiz obje
exportData : Parametrenin adı
Bundan sonra assertEqual fonksiyonu ile karşılaştırma yapılabilir. Private methodları çağırmak için de aşağıdaki kodu kullanabiliriz.
...
...Class c = Class.forName("com.layers.drivers.DataDriverImpl");
Method methodParse = c.getDeclaredMethod("parseDataToExportData", new Class[]{Collection.class,Collection.class}); // Fonksiyonun adı ve aldığı parametrelerin tipi
methodParse.setAccessible(true);
Object objParse = c.newInstance();
setField(objParse, "dataExportData", mockDataExportData); // Fonksiyonun kullandığı bir global parametreyi kendi parametremizle değiştirme
methodParse.invoke(objParse, new Object[] {albumModels,genreModels}); // Fonksiyonun aldığı parametreler
...
...
Bu konuda başka bir örneğin bulunduğu linki aşağıda veriyorum. Yalnız bu linkteki örnekteki kodu kullanmak için method.setAccessible(true) kodunu eklemeniz gerekiyor, çünkü private method çalıştırmak için önce accessible yapmamız gerekiyor.
http://www.java2s.com/Tutorial/Java/0125__Reflection/Callaclassmethodwith2arguments.htm
Şimdilik bu kadar. Kafanıza takılan soruları yazarsanız beraber çözüm bulmaya çalışırız.
Herkese sevgiler, saygılar.
Java'da Junit ile Yazılım Testi
Arkadaşlar Merhabalar,
Birkaç haftadır yazı yazamıyorum. Bunun sebebi işyerinde bana verilen işlerin yoğunlaşmış olması. Bu hafta bir test projesi verildi bana. En son adamakıllı testi ÖSSde çözmüş olan ben :), test deyince kafamda birşey oluşmadı tabii. Ama bu bir haftadaki araştırmalarım gösterdi ki, testler yazılımlar için kritik bir rol oynuyorlar ve yazılmaları bazen test edeceğimiz koddan çok daha zor olabiliyor. Mesela ben 30-40 satır bir kod için yaklaşık 150 satır test kodu yazmak durumunda kaldım. Ama gözünüzü korkutmasın, bir öğrendiniz mi gerisi geliyor :)
Test için çeşitli kütüphaneler mevcut, ben Junit'i tercih ettim. Sitesinden son versiyonunu indirip projenizin "Build path" kısmına ekleyerek kullanmaya başlayabilirsiniz. Burada yardımcı olarak bir kütüphane daha kullanacağız, bu da Jmockit kütüphanesi. Kod kısmında bazen fonksiyonları kendi istediğimiz gibi yönlendirmemiz gerekebiliyor, mesela veritabanına bağlanarak veri çeken, ama testte veritabanına bağlanmadan verileri hazırlamak istediğimiz bir metodu test ederken, projenin DAO(Data Access Object) kısmında veriyi çeken metodu Mock ederek, yani bir şekilde Bypass diyebiliriz, bu işi halledebiliriz. Nasıl olacağını kod kısmında hepberaber görelim.
// Bu method test başlamadan önce çalışır, constructor ya da page_load fonksiyonları gibi düşünebiliriz
// Burada DataDriverImpl sınıfında bulunan mockDataDriverImpl fonksiyonunu Mock ediyoruz
// Bir sınıf için birden çok fonksiyonu mock edebiliyoruz
@Mock
Kısaca test işlemi buydu. Burada zor olan kısım test işleminden ziyade Mock işlemleri bence. Daha detaylı bilgileri junitin ve jmockitin sitelerinden ve google'den öğrenebilirsiniz. Ayrıca aşağıdaki linkte de çok değerli ve geniş bilgiler bulunmaktadır.
http://erhan.kesken.org/2011/03/jmockit-ile-ideal-birim-test.html
Herkese kolay gelsin.
Birkaç haftadır yazı yazamıyorum. Bunun sebebi işyerinde bana verilen işlerin yoğunlaşmış olması. Bu hafta bir test projesi verildi bana. En son adamakıllı testi ÖSSde çözmüş olan ben :), test deyince kafamda birşey oluşmadı tabii. Ama bu bir haftadaki araştırmalarım gösterdi ki, testler yazılımlar için kritik bir rol oynuyorlar ve yazılmaları bazen test edeceğimiz koddan çok daha zor olabiliyor. Mesela ben 30-40 satır bir kod için yaklaşık 150 satır test kodu yazmak durumunda kaldım. Ama gözünüzü korkutmasın, bir öğrendiniz mi gerisi geliyor :)
Test için çeşitli kütüphaneler mevcut, ben Junit'i tercih ettim. Sitesinden son versiyonunu indirip projenizin "Build path" kısmına ekleyerek kullanmaya başlayabilirsiniz. Burada yardımcı olarak bir kütüphane daha kullanacağız, bu da Jmockit kütüphanesi. Kod kısmında bazen fonksiyonları kendi istediğimiz gibi yönlendirmemiz gerekebiliyor, mesela veritabanına bağlanarak veri çeken, ama testte veritabanına bağlanmadan verileri hazırlamak istediğimiz bir metodu test ederken, projenin DAO(Data Access Object) kısmında veriyi çeken metodu Mock ederek, yani bir şekilde Bypass diyebiliriz, bu işi halledebiliriz. Nasıl olacağını kod kısmında hepberaber görelim.
// Bu method test başlamadan önce çalışır, constructor ya da page_load fonksiyonları gibi düşünebiliriz
@Before
public void setUp() throws Exception {
instance = new HafifmuzikDriverImpl();
}
// Bu method da test bittikten sonra çalışır, veritabanı bağlantısını vb. kesebileceğiniz yerdir. Hata yakalamadaki finally kısmına benzer. @After
public void tearDown() throws Exception {
}
// Burada DataDriverImpl sınıfında bulunan mockDataDriverImpl fonksiyonunu Mock ediyoruz
MockUp<DataDriverImpl> mockDataDriverImpl = new MockUp<DataDriverImpl>(){
@Mock
public String fillExportDataWith(){ return mockDataExportData;
}// Bir sınıf için birden çok fonksiyonu mock edebiliyoruz
@Mock
public DataLogger getLogger() {
return DataLoggerFactory.getLoggerInstance(this.getClass());
}
};
...
...
...
// Burada karşılaştırma işlemi yapılıyor, ilk parametre expected value, ikincisi actual value. assertEquals("12486564", fillExportDataWith());
Kısaca test işlemi buydu. Burada zor olan kısım test işleminden ziyade Mock işlemleri bence. Daha detaylı bilgileri junitin ve jmockitin sitelerinden ve google'den öğrenebilirsiniz. Ayrıca aşağıdaki linkte de çok değerli ve geniş bilgiler bulunmaktadır.
http://erhan.kesken.org/2011/03/jmockit-ile-ideal-birim-test.html
Herkese kolay gelsin.
9 Ağustos 2011 Salı
Hibernate - Annotation ile One-to-Many Mapping - 2
Herkese Merhabalar,
Kısa bir konudan bahsedeceğim yine. Hibernatede One-to-One ilişkide iki tablo arasında kurulan bağlantının ayrı bir Join tablosunda tutulmasını gerçekleştiren annotationlarımız kısaca aşağıdaki gibidir. Belki birileriinni işine yarar :)
Driver.Java
@Entity
@Table(name="DRIVER")
public class Driver {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="ID")
private int driverId;
@OneToOne(cascade=CascadeType.ALL)
@JoinTable(name="Driver_Vehicle",joinColumns={@JoinColumn(name="ID")},inverseJoinColumns={@JoinColumn(name="VID")})
private Vehicle vehicle;
...
...
}
Vehicle.Java
One-to-Many için de benzer kodlar geçerlidir. List ve ArrayList kullanımında bir değişikliğe gerek yok iken, HashMap kullanımında @MapKeyColumn annotationu kullanımı işe yarayacaktır.
Herkese kolay gelsin.
Kısa bir konudan bahsedeceğim yine. Hibernatede One-to-One ilişkide iki tablo arasında kurulan bağlantının ayrı bir Join tablosunda tutulmasını gerçekleştiren annotationlarımız kısaca aşağıdaki gibidir. Belki birileriinni işine yarar :)
Driver.Java
@Entity
@Table(name="DRIVER")
public class Driver {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="ID")
private int driverId;
@OneToOne(cascade=CascadeType.ALL)
@JoinTable(name="Driver_Vehicle",joinColumns={@JoinColumn(name="ID")},inverseJoinColumns={@JoinColumn(name="VID")})
private Vehicle vehicle;
...
...
}
Vehicle.Java
@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public abstract class Vehicle {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="VID")
private int id;
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public abstract class Vehicle {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="VID")
private int id;
...
...
}One-to-Many için de benzer kodlar geçerlidir. List ve ArrayList kullanımında bir değişikliğe gerek yok iken, HashMap kullanımında @MapKeyColumn annotationu kullanımı işe yarayacaktır.
Herkese kolay gelsin.
8 Ağustos 2011 Pazartesi
Hibernate ile Abstract Sınıfı Veritabanına Kaydetme - 2
Herkese Merhabalar,
Bugün yine Hibernate frameworku ile devam ediyoruz. Bu seferki problem oldukça karışık, benim için anlatması sizin için anlaması zor olacak sanırım ama deneyeceğiz bakalım :)
Elimizde bir adet abstract sınıf var, 2 tane de bundan türeyen POJO sınıf, bir tane de bu abstract sınıfla has-a-relation bağlantısı olan Java sınıfı. Şöyle düşünebilirsiniz, son bahsettiğim java sınıfı bir sürücü. Bir sürücü çeşitli araçlar sürebilir, traktör, kamyon vs. İşte bu sürdüğü arabayı temsilen içinde bir abstract sınıf var, taşıt oluyor bu da. 2 adet POJO sınıfımız da taşıt türleri oluyor, otobüs ve kamyon atıyorum. Bunlar abstract sınıfı extend ediyor daha önce dediğim gibi. Böylelikle bütün sürücüler için sürdüğü aracın türünü belirtmeden esnek bir şekilde tutabiliyoruz. Bun OOP olarak gerçekleştirmekte bir sorun yok ama, Hibernate ile veritabanına kaydedecekken biraz sorun çıkabiliyor. Bu da aslında daha önceki yazımda bahsettiğim @MappedSuperClass annotationu ile denemem sonucu oluştu sanırım. @MappedSuperClass annotationu verdiğimiz bir sınıfı başka bir sınıf içerisinde has-a-relation ilişkisiyle bulundurduğumuz zaman bir sorun çıkıyor. Burada bu annotationu @Entity ile değiştirmemiz gerekiyor. Aşağıda basitçe yazacağım kullanmamız gereken annotationları, umarım faydalı olur.
Bus.Java
Truck.Java
@Entity
@Table(name="TRUCK")
public class Truck extends Vehicle{
...
}
Driver.Java
@Entity
@Table(name="DRIVER")
public class Driver {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="ID")
private int driverId;
@OneToOne(cascade=CascadeType.ALL)
@JoinColumn(name="Vehicle_Id")
private Vehicle vehicle;
...
}
Vehicle.Java
Kafanıza takılan sorular olursa çekinmeden sorabilirsiniz. Herkese kolay gelsin.
Bugün yine Hibernate frameworku ile devam ediyoruz. Bu seferki problem oldukça karışık, benim için anlatması sizin için anlaması zor olacak sanırım ama deneyeceğiz bakalım :)
Elimizde bir adet abstract sınıf var, 2 tane de bundan türeyen POJO sınıf, bir tane de bu abstract sınıfla has-a-relation bağlantısı olan Java sınıfı. Şöyle düşünebilirsiniz, son bahsettiğim java sınıfı bir sürücü. Bir sürücü çeşitli araçlar sürebilir, traktör, kamyon vs. İşte bu sürdüğü arabayı temsilen içinde bir abstract sınıf var, taşıt oluyor bu da. 2 adet POJO sınıfımız da taşıt türleri oluyor, otobüs ve kamyon atıyorum. Bunlar abstract sınıfı extend ediyor daha önce dediğim gibi. Böylelikle bütün sürücüler için sürdüğü aracın türünü belirtmeden esnek bir şekilde tutabiliyoruz. Bun OOP olarak gerçekleştirmekte bir sorun yok ama, Hibernate ile veritabanına kaydedecekken biraz sorun çıkabiliyor. Bu da aslında daha önceki yazımda bahsettiğim @MappedSuperClass annotationu ile denemem sonucu oluştu sanırım. @MappedSuperClass annotationu verdiğimiz bir sınıfı başka bir sınıf içerisinde has-a-relation ilişkisiyle bulundurduğumuz zaman bir sorun çıkıyor. Burada bu annotationu @Entity ile değiştirmemiz gerekiyor. Aşağıda basitçe yazacağım kullanmamız gereken annotationları, umarım faydalı olur.
Bus.Java
@Entity
@Table(name="BUS")
public class Bus extends Vehicle{
@Table(name="BUS")
public class Bus extends Vehicle{
...
}Truck.Java
@Entity
@Table(name="TRUCK")
public class Truck extends Vehicle{
...
}
Driver.Java
@Entity
@Table(name="DRIVER")
public class Driver {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="ID")
private int driverId;
@OneToOne(cascade=CascadeType.ALL)
@JoinColumn(name="Vehicle_Id")
private Vehicle vehicle;
...
}
Vehicle.Java
@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public abstract class Vehicle {
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public abstract class Vehicle {
...
}Kafanıza takılan sorular olursa çekinmeden sorabilirsiniz. Herkese kolay gelsin.
5 Ağustos 2011 Cuma
Hibernate ile Abstract Sınıfı Veritabanına Kaydetme
Arkadaşlar Merhabalar,
Bugün size çok kısa ve yararlı bir bilgi vereceğim. Hibernate ile uğraşırken karşıma şu sorun çıktı, elimde 3 tane sınıf ve 1 tane abstract sınıf var. 3 sınıf da bu abstract sınıfı extend ediyor ve veritabanına kaydederken, bu sınıfların türüne göre kaydetmesini istiyorum. Örneğin,
AbstractClass a = new Class1();
session.save(a);
ise veritabanında Class1'in tablosuna kaydetmesini, Class2 ise başka bir tabloya kaydetmesini istiyorum. Bunun için, abstract sınıfın başındaki @Entity annotationunu silip aşağıdaki annotationu yazarız.
@MappedSuperclass
Böylelikle amacımıza ulaşmış olacağız. Umarım faydalı olur. Herkese kolay gelsin.
Bugün size çok kısa ve yararlı bir bilgi vereceğim. Hibernate ile uğraşırken karşıma şu sorun çıktı, elimde 3 tane sınıf ve 1 tane abstract sınıf var. 3 sınıf da bu abstract sınıfı extend ediyor ve veritabanına kaydederken, bu sınıfların türüne göre kaydetmesini istiyorum. Örneğin,
AbstractClass a = new Class1();
session.save(a);
ise veritabanında Class1'in tablosuna kaydetmesini, Class2 ise başka bir tabloya kaydetmesini istiyorum. Bunun için, abstract sınıfın başındaki @Entity annotationunu silip aşağıdaki annotationu yazarız.
@MappedSuperclass
Böylelikle amacımıza ulaşmış olacağız. Umarım faydalı olur. Herkese kolay gelsin.
4 Ağustos 2011 Perşembe
Hibernate için İnternetteki Faydalı Linkler
Merhabalar,
Sizlerle internette bulduğum Hibernate ile alakalı faydalı linkleri paylaşmak istiyorum. Hem sizler faydalanmış olursunuz, hem de ben unutmamış olurum :)
- http://www.vaannila.com/index.html (Hibernate dahil birçok öğrenilmesi gereken konuları çok güzel bir şekilde anlatmış)
- http://www.roseindia.net/hibernate/
- Ve tabii ki.. http://www.hibernate.org (Siteen indirebileceğiniz user manual'i dikkatle okumanızı tavsiye ederim, böylelikle ezbere gitmektense öğrenerek ilerlemiş olursunuz)
- http://www.hiberbook.com/
Aklıma geldikçe bu listeyi kabartacağım :) Herkese kolay gelsin.
Sizlerle internette bulduğum Hibernate ile alakalı faydalı linkleri paylaşmak istiyorum. Hem sizler faydalanmış olursunuz, hem de ben unutmamış olurum :)
- http://www.vaannila.com/index.html (Hibernate dahil birçok öğrenilmesi gereken konuları çok güzel bir şekilde anlatmış)
- http://www.roseindia.net/hibernate/
- Ve tabii ki.. http://www.hibernate.org (Siteen indirebileceğiniz user manual'i dikkatle okumanızı tavsiye ederim, böylelikle ezbere gitmektense öğrenerek ilerlemiş olursunuz)
- http://www.hiberbook.com/
Aklıma geldikçe bu listeyi kabartacağım :) Herkese kolay gelsin.
Hibernate - Annotation ile One-to-Many Mapping
Merhabalar,
Bugün Hibernate Framework'u ile one-to-many ilişkisi olan sınıfları veritabanımıza nasıl kaydeder ve çekeriz inceleyeceğiz.
Öncelikle, one-to-many nedir bunu inceleyelim. OOP terimlerinden olup, birden çoğa ilişki olarak Türkçeleştirilebilir. Bir örnekle açıklamak gerekirse, bir okulumuz var ve içinde öğrenciler var. Her öğrenciye ait bir veya daha fazla telefon numarası var. Bunu aşağıdaki şekilde gösterebiliriz.

Bu gibi bir durumu gerçeklemek için yazacağımız annotationları aşağıya kısaca yazıyorum, kodları koymak hayli uzun süreceği için.
List ve ArrayList objeleri için de yapmak için @MapKeyColumn kısmını çıkartmak yeterli olacaktır. şimdilik bu kadar.
Kolay gelsin.
Bugün Hibernate Framework'u ile one-to-many ilişkisi olan sınıfları veritabanımıza nasıl kaydeder ve çekeriz inceleyeceğiz.
Öncelikle, one-to-many nedir bunu inceleyelim. OOP terimlerinden olup, birden çoğa ilişki olarak Türkçeleştirilebilir. Bir örnekle açıklamak gerekirse, bir okulumuz var ve içinde öğrenciler var. Her öğrenciye ait bir veya daha fazla telefon numarası var. Bunu aşağıdaki şekilde gösterebiliriz.
Bu gibi bir durumu gerçeklemek için yazacağımız annotationları aşağıya kısaca yazıyorum, kodları koymak hayli uzun süreceği için.
@OneToMany(fetch = FetchType.EAGER, cascade = { CascadeType.ALL })
@JoinTable(name="CAR_CITY",joinColumns={@JoinColumn(name="ID")},inverseJoinColumns={@JoinColumn(name="CITY_ID")})
@MapKeyColumn(name="carkey")
@JoinTable(name="CAR_CITY",joinColumns={@JoinColumn(name="ID")},inverseJoinColumns={@JoinColumn(name="CITY_ID")})
@MapKeyColumn(name="carkey")
private Map<String, City> cityMap = new HashMap<String, City>();
Kolay gelsin.
3 Ağustos 2011 Çarşamba
Hibernate ile Java Projesi Geliştirme ve Inner Join Sorgusunu Gerçekleme
Herkese merhabalar,
Castor üzerinde uzunca bir süre çalıştıktan sonra, artık sıra popüler framework Hibernate'yi öğrenmeye gelmişti. Bu hafta başında çalışmaya başladığım Hibernate'de güzel tecrübeler elde ettim. Aşağıda Hibernate ile geliştirilmiş bir Java projesi var, bunu inceleyelim. Burada ilk gerçeklediğim örneklerden ziyade, son olarak yaptığım projeyi koymayı uygun gördüm, basitten değil de zordan başlamayı denemek lazım bir sefer de :)
Hibernate iyidir hoştur, basit select, insert, update ve delete querylerimizi çalıştırır sağolsun da, işim içine obje ilişkileri girdi mi biraz durum farklılaşıyor. Mesela iki adet tablonuz var ve bunlar arasında bir ilişki kurarak bir sorgu hazırlayacaksınız(mesela select * from t1 inner join t2 ... gibi). Bunu gerçeklerken öncekilerden farklı olarak SQL querysini olduğu gibi Java kodları arasına yazmamız gerekiyor, diğer türlü bu işlem gerçekleşmiyor. Query sınıfıyla yapınca inner join ... on ... kalıbını tanımıyor, bilmiyorum bu konuyu çözmek adına birşey yaptılar mı, dolayısıyla bu sorunu SQLQuery sınıfıyla çözüyoruz. Aşağıda daha net biçimde görülebilir.
Bu projede kullanılan kütüphaneleri de yazmakta fayda var, zira bazen eski ve yeni versiyon kütüphaneler bir arada çalışırken sıkıntı olabiliyor, doğru kütüphaneleri kullanmak burada önem kazanıyor.
- antlr-2.7.6.jar
- commons-collections-3.1.jar
- dom4j-1.6.1.jar
- hibernate-jpa-2.0-api-1.0.0.Final.jar
- hibernate3.jar
- javassist-3.9.0.GA.jar
- jta-1.1.jar
- ojdbc14.jar(Kullandığım veritabanı Oracle olduğu için bunu kullanıyorum, diğer veritabanları için farklı kütüphaneleri Google'dan bulabilirsiniz.)
- slf4j-api-1.5.8.jar
- slf4j-simple-1.5.8.jar
Şimdi gelelim kodlara.
Car.Java
package com.emre.model;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
/**
* @author gozenem
*
*/
@Entity
@Table(name="CAR")
public class Car {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="ID")
private int id;
@Column(name="BRAND", nullable=false)
private String brand;
@Column(name="MODEL")
private String model;
@Column(name="PRODUCTIONDATE")
private Date productionDate;
@Column(name="AMOUNT")
private int amount;
public Car(String brand, String model, Date productionDate, int amount) {
super();
this.brand = brand;
this.model = model;
this.productionDate = productionDate;
this.amount = amount;
}
public Car() {
super();
// TODO Auto-generated constructor stub
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
public Date getProductionDate() {
return productionDate;
}
public void setProductionDate(Date productionDate) {
this.productionDate = productionDate;
}
public int getAmount() {
return amount;
}
public void setAmount(int amount) {
this.amount = amount;
}
public void setId(int id) {
this.id = id;
}
public int getId() {
return id;
}
public void updateCar(Car car){
this.amount = car.amount;
this.brand = car.brand;
this.model = car.model;
this.productionDate = car.productionDate;
}
}
City.Java
package com.emre.model;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="CITY")
public class City { private long id;
private String name;
public City(String name) {
super();
this.name = name;
}
public City() {}
@Id
@GeneratedValue
@Column(name="CITY_ID")
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
@Column(name="CITY_NAME", nullable=false)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
CarDAO.Java
package com.emre.dao;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.PropertyValueException;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import com.emre.model.Car;
import com.emre.model.City;
import com.emre.util.HibernateUtil;
public class CarDAO {
private Session session;
public void addCar(Car car){
try {
session = HibernateUtil.getSessionFactory().openSession();
session.getTransaction().begin();
session.save(car);
session.getTransaction().commit();
}
catch(PropertyValueException ex){
System.out.println("Marka boş olamaz !");
}
catch(HibernateException ex){
session.getTransaction().rollback();
ex.printStackTrace();
}
finally{
session.close();
}
}
public void deleteCar(int id){
try {
session = HibernateUtil.getSessionFactory().openSession();
session.getTransaction().begin();
Car car = (Car) session.get(Car.class, id);
session.delete(car);
session.getTransaction().commit();
session.flush();
session.close();
} catch (HibernateException e) {
// TODO Auto-generated catch block
session.getTransaction().rollback();
e.printStackTrace();
}
}
public void updateCar(int id, Car newCar){
try {
session = HibernateUtil.getSessionFactory().openSession();
session.getTransaction().begin();
Car car = (Car) session.get(Car.class, id);
car.updateCar(newCar);
session.getTransaction().commit();
session.flush();
session.close();
}
catch(PropertyValueException ex){
System.out.println("Marka boş olamaz !");
}
catch (HibernateException e) {
// TODO Auto-generated catch block
session.getTransaction().rollback();
e.printStackTrace();
}
}
@SuppressWarnings("finally")
public Car searchCar(int id){
Car car = null;
try {
session = HibernateUtil.getSessionFactory().openSession();
session.getTransaction().begin();
car = (Car) session.get(Car.class, id);
session.getTransaction().commit();
session.flush();
session.close();
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally{
return car;
}
}
@SuppressWarnings({ "unchecked", "finally" })
public ArrayList<Object[]> searchCarList(){
ArrayList<Object[]> cars = null;
try {
session = HibernateUtil.getSessionFactory().openSession();
session.getTransaction().begin();
SQLQuery query = session.createSQLQuery("Select * from Car c inner join City ci on c.Id = ci.City_Id");
query.addEntity(Car.class);
query.addEntity(City.class);
cars = (ArrayList<Object[]>) query.list();
session.getTransaction().commit();
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally{
session.close();
return cars;
}
}
}
HibernateUtil.Java
package com.emre.util;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import com.emre.model.Car;
import com.emre.model.City;
public class HibernateUtil {
private static final SessionFactory sessionFactory;
static {
try {
sessionFactory = new AnnotationConfiguration()
.configure()
.addPackage("com.emre.model")
.addAnnotatedClass(Car.class)
.addAnnotatedClass(City.class)
.buildSessionFactory();
} catch (Throwable ex) {
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
hibernate.cfg.xml
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="hibernate.connection.url">URLniz</property>
<property name="hibernate.connection.username">Kullanıcı Adınız</property>
<property name="hibernate.connection.password">Şifreniz</property>
<property name="hibernate.connection.pool_size">10</property>
<property name="show_sql">true</property>
<property name="dialect">org.hibernate.dialect.OracleDialect</property>
<property name="hibernate.hbm2ddl.auto">update</property> <!-- Otomatik tablo olusturma -->
<!-- Mapping files -->
<!-- <mapping class="Student" /> -->
</session-factory>
</hibernate-configuration>
Main.Java
package com.emre.main;
import java.util.ArrayList;
import java.util.Date;
import java.util.List
import com.emre.dao.CarDAO;
import com.emre.model.Car;
import com.emre.model.City;
public class Main {
public static void main(String[] args) {
CarDAO cDao = new CarDAO();
ArrayList<Object[]> cars = cDao.searchCarList();
}
}
Annotations ile ilgili güzel bir link aşağıda.
http://www.jumpingbean.co.za/blogs/mark/hibernate_hql_inner_join_on_clause
Ayrıca, yukarıdaki projeyi geliştiriken faydalandığım linki de vermeden geçmek olmaz.
http://loianegroner.com/2010/06/hibernate-3-annotations-tutorial/
Kafanıza takılan birşeyler olursa sorabilirsiniz. Herkese kolay gelsin.
Castor üzerinde uzunca bir süre çalıştıktan sonra, artık sıra popüler framework Hibernate'yi öğrenmeye gelmişti. Bu hafta başında çalışmaya başladığım Hibernate'de güzel tecrübeler elde ettim. Aşağıda Hibernate ile geliştirilmiş bir Java projesi var, bunu inceleyelim. Burada ilk gerçeklediğim örneklerden ziyade, son olarak yaptığım projeyi koymayı uygun gördüm, basitten değil de zordan başlamayı denemek lazım bir sefer de :)
Hibernate iyidir hoştur, basit select, insert, update ve delete querylerimizi çalıştırır sağolsun da, işim içine obje ilişkileri girdi mi biraz durum farklılaşıyor. Mesela iki adet tablonuz var ve bunlar arasında bir ilişki kurarak bir sorgu hazırlayacaksınız(mesela select * from t1 inner join t2 ... gibi). Bunu gerçeklerken öncekilerden farklı olarak SQL querysini olduğu gibi Java kodları arasına yazmamız gerekiyor, diğer türlü bu işlem gerçekleşmiyor. Query sınıfıyla yapınca inner join ... on ... kalıbını tanımıyor, bilmiyorum bu konuyu çözmek adına birşey yaptılar mı, dolayısıyla bu sorunu SQLQuery sınıfıyla çözüyoruz. Aşağıda daha net biçimde görülebilir.
Bu projede kullanılan kütüphaneleri de yazmakta fayda var, zira bazen eski ve yeni versiyon kütüphaneler bir arada çalışırken sıkıntı olabiliyor, doğru kütüphaneleri kullanmak burada önem kazanıyor.
- antlr-2.7.6.jar
- commons-collections-3.1.jar
- dom4j-1.6.1.jar
- hibernate-jpa-2.0-api-1.0.0.Final.jar
- hibernate3.jar
- javassist-3.9.0.GA.jar
- jta-1.1.jar
- ojdbc14.jar(Kullandığım veritabanı Oracle olduğu için bunu kullanıyorum, diğer veritabanları için farklı kütüphaneleri Google'dan bulabilirsiniz.)
- slf4j-api-1.5.8.jar
- slf4j-simple-1.5.8.jar
Şimdi gelelim kodlara.
Car.Java
package com.emre.model;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
/**
* @author gozenem
*
*/
@Entity
@Table(name="CAR")
public class Car {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="ID")
private int id;
@Column(name="BRAND", nullable=false)
private String brand;
@Column(name="MODEL")
private String model;
@Column(name="PRODUCTIONDATE")
private Date productionDate;
@Column(name="AMOUNT")
private int amount;
public Car(String brand, String model, Date productionDate, int amount) {
super();
this.brand = brand;
this.model = model;
this.productionDate = productionDate;
this.amount = amount;
}
public Car() {
super();
// TODO Auto-generated constructor stub
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
public Date getProductionDate() {
return productionDate;
}
public void setProductionDate(Date productionDate) {
this.productionDate = productionDate;
}
public int getAmount() {
return amount;
}
public void setAmount(int amount) {
this.amount = amount;
}
public void setId(int id) {
this.id = id;
}
public int getId() {
return id;
}
public void updateCar(Car car){
this.amount = car.amount;
this.brand = car.brand;
this.model = car.model;
this.productionDate = car.productionDate;
}
}
City.Java
package com.emre.model;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="CITY")
public class City { private long id;
private String name;
public City(String name) {
super();
this.name = name;
}
public City() {}
@Id
@GeneratedValue
@Column(name="CITY_ID")
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
@Column(name="CITY_NAME", nullable=false)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
CarDAO.Java
package com.emre.dao;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.PropertyValueException;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import com.emre.model.Car;
import com.emre.model.City;
import com.emre.util.HibernateUtil;
public class CarDAO {
private Session session;
public void addCar(Car car){
try {
session = HibernateUtil.getSessionFactory().openSession();
session.getTransaction().begin();
session.save(car);
session.getTransaction().commit();
}
catch(PropertyValueException ex){
System.out.println("Marka boş olamaz !");
}
catch(HibernateException ex){
session.getTransaction().rollback();
ex.printStackTrace();
}
finally{
session.close();
}
}
public void deleteCar(int id){
try {
session = HibernateUtil.getSessionFactory().openSession();
session.getTransaction().begin();
Car car = (Car) session.get(Car.class, id);
session.delete(car);
session.getTransaction().commit();
session.flush();
session.close();
} catch (HibernateException e) {
// TODO Auto-generated catch block
session.getTransaction().rollback();
e.printStackTrace();
}
}
public void updateCar(int id, Car newCar){
try {
session = HibernateUtil.getSessionFactory().openSession();
session.getTransaction().begin();
Car car = (Car) session.get(Car.class, id);
car.updateCar(newCar);
session.getTransaction().commit();
session.flush();
session.close();
}
catch(PropertyValueException ex){
System.out.println("Marka boş olamaz !");
}
catch (HibernateException e) {
// TODO Auto-generated catch block
session.getTransaction().rollback();
e.printStackTrace();
}
}
@SuppressWarnings("finally")
public Car searchCar(int id){
Car car = null;
try {
session = HibernateUtil.getSessionFactory().openSession();
session.getTransaction().begin();
car = (Car) session.get(Car.class, id);
session.getTransaction().commit();
session.flush();
session.close();
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally{
return car;
}
}
@SuppressWarnings({ "unchecked", "finally" })
public ArrayList<Object[]> searchCarList(){
ArrayList<Object[]> cars = null;
try {
session = HibernateUtil.getSessionFactory().openSession();
session.getTransaction().begin();
SQLQuery query = session.createSQLQuery("Select * from Car c inner join City ci on c.Id = ci.City_Id");
query.addEntity(Car.class);
query.addEntity(City.class);
cars = (ArrayList<Object[]>) query.list();
session.getTransaction().commit();
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally{
session.close();
return cars;
}
}
}
HibernateUtil.Java
package com.emre.util;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import com.emre.model.Car;
import com.emre.model.City;
public class HibernateUtil {
private static final SessionFactory sessionFactory;
static {
try {
sessionFactory = new AnnotationConfiguration()
.configure()
.addPackage("com.emre.model")
.addAnnotatedClass(Car.class)
.addAnnotatedClass(City.class)
.buildSessionFactory();
} catch (Throwable ex) {
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
hibernate.cfg.xml
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="hibernate.connection.url">URLniz</property>
<property name="hibernate.connection.username">Kullanıcı Adınız</property>
<property name="hibernate.connection.password">Şifreniz</property>
<property name="hibernate.connection.pool_size">10</property>
<property name="show_sql">true</property>
<property name="dialect">org.hibernate.dialect.OracleDialect</property>
<property name="hibernate.hbm2ddl.auto">update</property> <!-- Otomatik tablo olusturma -->
<!-- Mapping files -->
<!-- <mapping class="Student" /> -->
</session-factory>
</hibernate-configuration>
Main.Java
package com.emre.main;
import java.util.ArrayList;
import java.util.Date;
import java.util.List
import com.emre.dao.CarDAO;
import com.emre.model.Car;
import com.emre.model.City;
public class Main {
public static void main(String[] args) {
CarDAO cDao = new CarDAO();
ArrayList<Object[]> cars = cDao.searchCarList();
}
}
Annotations ile ilgili güzel bir link aşağıda.
http://www.jumpingbean.co.za/blogs/mark/hibernate_hql_inner_join_on_clause
Ayrıca, yukarıdaki projeyi geliştiriken faydalandığım linki de vermeden geçmek olmaz.
http://loianegroner.com/2010/06/hibernate-3-annotations-tutorial/
Kafanıza takılan birşeyler olursa sorabilirsiniz. Herkese kolay gelsin.
29 Temmuz 2011 Cuma
Castor ile HashMap objesini XML'e Çevirme ve Geri Oluşturma
Merhabalar,
Bugün Castor ile projelere devam ettim. Bu sefer önümdeki problem sınıfın içinde başka bir sınıf objelerini tutan hashmap objesini nasıl XML'e aktarırım ve oradan geri nasıl okurum(marshalling ve unmarshalling) oldu. Bunu küçük bir araştırma ve denemelerden sonra çözdüm. Burada olayı nested class olarak çözmeye çalışmamız gerekiyor. mapping.xml i aşağıya koyuyorum daha anlaşılır olacaktır.
mapping.xml
<?xml version="1.0"?>
<mapping>
<class name="HeadQuarter">
<map-to xml="HQ"></map-to>
<field name="name" type="string">
<bind-xml name="Name" node="attribute" />
</field>
<field name="size" type="integer">
<bind-xml name="Size" node="attribute" />
</field>
<field name="rooms" type="string" collection="arraylist">
<bind-xml name="Rooms" node="element"></bind-xml>
</field>
<field name="floors" type="string" collection="vector">
<bind-xml name="Floors" node="element"></bind-xml>
</field>
<field name="dob" type="date">
<bind-xml name="building-date" node="element"></bind-xml>
</field>
<field name="branchName" type="string">
<bind-xml name="branch_name" node="attribute"></bind-xml>
</field>
<field name="numberOfWorkers" type="integer">
<bind-xml name="number_of_workers" node="element"></bind-xml>
</field>
<field name="map" collection="map"> <!-- Birinci map java kısmındaki HashMap objesinin adı, ikincisi ise collection tipi(Yani bildiğimiz java.util.Hashmap'ın kısaltması) -->
<bind-xml name="mappp" node="element">
<class name="org.exolab.castor.mapping.MapItem"> <!-- içiçe sınıf -->
<field name="key" type="java.lang.String"> <!-- hashmap key'i -->
<bind-xml name="key"/>
</field>
<field name="value" type="Branch"/> <!-- Hashmap'ta tutulan obje -->
</class>
</bind-xml>
</field>
</class>
<class name="Branch"> <!-- Branch sınıfı tanımlaması -->
<map-to xml="Branch"></map-to>
<field name="branchName" type="string">
<bind-xml name="branch_name" node="element"></bind-xml>
</field>
<field name="numberOfWorkers" type="integer">
<bind-xml name="number_of_workers" node="element"></bind-xml>
</field>
</class>
</mapping>
Kodları koymuyorum fakat aklınıza takılan herhangi birşey olursa sorabilirsiniz. Şimdilik bu kadar, kolay gelsin.
Bugün Castor ile projelere devam ettim. Bu sefer önümdeki problem sınıfın içinde başka bir sınıf objelerini tutan hashmap objesini nasıl XML'e aktarırım ve oradan geri nasıl okurum(marshalling ve unmarshalling) oldu. Bunu küçük bir araştırma ve denemelerden sonra çözdüm. Burada olayı nested class olarak çözmeye çalışmamız gerekiyor. mapping.xml i aşağıya koyuyorum daha anlaşılır olacaktır.
mapping.xml
<?xml version="1.0"?>
<mapping>
<class name="HeadQuarter">
<map-to xml="HQ"></map-to>
<field name="name" type="string">
<bind-xml name="Name" node="attribute" />
</field>
<field name="size" type="integer">
<bind-xml name="Size" node="attribute" />
</field>
<field name="rooms" type="string" collection="arraylist">
<bind-xml name="Rooms" node="element"></bind-xml>
</field>
<field name="floors" type="string" collection="vector">
<bind-xml name="Floors" node="element"></bind-xml>
</field>
<field name="dob" type="date">
<bind-xml name="building-date" node="element"></bind-xml>
</field>
<field name="branchName" type="string">
<bind-xml name="branch_name" node="attribute"></bind-xml>
</field>
<field name="numberOfWorkers" type="integer">
<bind-xml name="number_of_workers" node="element"></bind-xml>
</field>
<field name="map" collection="map"> <!-- Birinci map java kısmındaki HashMap objesinin adı, ikincisi ise collection tipi(Yani bildiğimiz java.util.Hashmap'ın kısaltması) -->
<bind-xml name="mappp" node="element">
<class name="org.exolab.castor.mapping.MapItem"> <!-- içiçe sınıf -->
<field name="key" type="java.lang.String"> <!-- hashmap key'i -->
<bind-xml name="key"/>
</field>
<field name="value" type="Branch"/> <!-- Hashmap'ta tutulan obje -->
</class>
</bind-xml>
</field>
</class>
<class name="Branch"> <!-- Branch sınıfı tanımlaması -->
<map-to xml="Branch"></map-to>
<field name="branchName" type="string">
<bind-xml name="branch_name" node="element"></bind-xml>
</field>
<field name="numberOfWorkers" type="integer">
<bind-xml name="number_of_workers" node="element"></bind-xml>
</field>
</class>
</mapping>
Kodları koymuyorum fakat aklınıza takılan herhangi birşey olursa sorabilirsiniz. Şimdilik bu kadar, kolay gelsin.
Castor ile Mapping Kullanarak XML Veri Dönüştürme
Merhabalar,
Çalışmalara Castor ile devam ediyorum. Dün mapping dosyası olmadan Castor ile nasıl XML verisini dönüştürebileceğimizi araştırmıştım. Bugün de mapping dosyası ile bu iş nasıl oluyor onu araştırdım ve güzel deneyimler elde ettim. Projede dünkünden farklı sınıflar kullanarak öğrenme seviyemi yükselmiş bulunuyorum :)
Sınıflardan biraz bahsetmek gerekirse, HeadQuarter ve Branch sınıflarında çeşitli değişkenler var, aşağıdaki kodda daha iyi görülebilir, ve bu sınıflar arasında "has a relationship" bağlantısı bulunmakta. Ayrıca main metodumuzun bulunduğu Main sınıfımız da her zamanki yerinde duruyor. Şimdi kodlara geçelim.
HeadQuarter.Java
import java.util.ArrayList;
import java.util.Date;
import java.util.Vector;
public class HeadQuarter{
private String name = "";
private int size = 0;
private ArrayList<String> rooms = new ArrayList<String>();
private Vector<String> floors = new Vector<String>();
private Date dob = new Date();
private ArrayList<Branch> branch = new ArrayList<Branch>();
public HeadQuarter(String name, int size, ArrayList<String> rooms,
Vector<String> floors, Date dob, ArrayList<Branch> branch) {
super();
this.name = name;
this.size = size;
this.rooms = rooms;
this.floors = floors;
this.dob = dob;
this.branch = branch;
}
public ArrayList<Branch> getBranch() {
return branch;
}
public void setBranch(ArrayList<Branch> branch) {
this.branch = branch;
}
public Date getDob() {
return dob;
}
public void setDob(Date dob) {
this.dob = dob;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
public ArrayList<String> getRooms() {
return rooms;
}
public void setRooms(ArrayList<String> rooms) {
this.rooms = rooms;
}
public Vector<String> getFloors() {
return floors;
}
public void setFloors(Vector<String> floors) {
this.floors = floors;
}
public HeadQuarter(){}
}
Branch.java
public class Branch {
private String branchName = "";
private int numberOfWorkers = 0;
public String getBranchName() {
return branchName;
}
public void setBranchName(String branchName) {
this.branchName = branchName;
}
public int getNumberOfWorkers() {
return numberOfWorkers;
}
public void setNumberOfWorkers(int numberOfWorkers) {
this.numberOfWorkers = numberOfWorkers;
}
public Branch(String branchName, int numberOfWorkers) {
super();
this.branchName = branchName;
this.numberOfWorkers = numberOfWorkers;
}
public Branch(){}
}
mapping.xml
<?xml version="1.0"?>
<mapping>
<class name="HeadQuarter">
<map-to xml="HQ"></map-to>
<field name="name" type="string">
<bind-xml name="Name" node="attribute" />
</field>
<field name="size" type="integer">
<bind-xml name="Size" node="attribute" />
</field>
<field name="rooms" type="string" collection="arraylist">
<bind-xml name="Rooms" node="element"></bind-xml>
</field>
<field name="floors" type="string" collection="vector">
<bind-xml name="Floors" node="element"></bind-xml>
</field>
<field name="dob" type="date">
<bind-xml name="building-date" node="element"></bind-xml>
</field>
<field name="branch" type="Branch" collection="arraylist">
<bind-xml name="Branches" node="element"></bind-xml>
</field>
</class>
<class name="Branch">
<map-to xml="Branches"></map-to>
<field name="branchName" type="string">
<bind-xml name="branch_name" node="attribute"></bind-xml>
</field>
<field name="numberOfWorkers" type="integer">
<bind-xml name="number_of_workers" node="element"></bind-xml>
</field>
</class>
</mapping>
Main.Java
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.Vector;
import org.apache.xml.serialize.OutputFormat;
import org.apache.xml.serialize.XMLSerializer;
import org.exolab.castor.mapping.FieldHandler;
import org.exolab.castor.mapping.Mapping;
import org.exolab.castor.mapping.MappingException;
import org.exolab.castor.mapping.loader.FieldHandlerImpl;
import org.exolab.castor.xml.MarshalException;
import org.exolab.castor.xml.Marshaller;
import org.exolab.castor.xml.Unmarshaller;
import org.exolab.castor.xml.ValidationException;
import org.exolab.castor.xml.XMLContext;
public class Main {
/**
* @param args
* @throws IOException
* @throws ValidationException
* @throws MarshalException
* @throws MappingException
*/
@SuppressWarnings("deprecation")
public static void main(String[] args) throws IOException, MarshalException, ValidationException, MappingException {
// TODO Auto-generated method stub
ArrayList<String> rooms1 = new ArrayList<String>();
rooms1.add("firstroom");
rooms1.add("secondroom");
rooms1.add("thirdroom");
Vector<String> floors1 = new Vector<String>();
floors1.add("firstfloor");
floors1.add("secondfloor");
Date dob = new Date(2011,12,22);
ArrayList<Branch> branch = new ArrayList<Branch>();
branch.add(new Branch("Umraniye", 500));
branch.add(new Branch("Maslak", 275));
HeadQuarter hq = new HeadQuarter("hq1",3,rooms1,floors1,dob,branch);
// Marshalling Starts
Mapping mapping = new Mapping();
mapping.loadMapping("mapping.xml");
XMLContext context = new XMLContext();
context.addMapping(mapping);
FileWriter writer = new FileWriter("output.xml");
OutputFormat format = new OutputFormat();
format.setIndenting(true);
format.setIndent(4);
XMLSerializer serializer = new XMLSerializer(writer, format);
Marshaller marshaller = context.createMarshaller();
marshaller.setSuppressXSIType(true);
marshaller.setWriter(writer);
marshaller.setDocumentHandler(serializer.asDocumentHandler());
marshaller.marshal(hq);
// Marshalling ends
// Unmarshalling Starts
FileReader reader = new FileReader("output.xml");
Unmarshaller unmarshaller = context.createUnmarshaller();
unmarshaller.setMapping(mapping);
unmarshaller.setClass(HeadQuarter.class);
HeadQuarter hq2 = (HeadQuarter) unmarshaller.unmarshal(reader);
// Unmarshalling ends
}
}
Burada kafaları karıştıracak olan kısmın mapping.xml olacağını düşünüyorum. Bunun nasıl ve hangi kurallara göre yazılacağını Castorun sitesindeki dökümanı zaten çok güzel anlatıyor olduğu için bir daha yazmıyorum ancak yine de kafanıza takılan bir yer olursa yardımcı olmaya çalışırım elbette. Zaten projeyi çalıştırdıktan sonra alacağınız çıktıyı da inceleyerek neyi nerede ve ne için kullandığımı daha iyi anlayabilirsiniz. Ayrıca, bu projeyi çalıştırmak için gerekli olan jar dosyalarını bir kez daha aşağıya yazıyorum, bunlar olmadan çalışmıyor ne yazık ki :)
- castor-1.3.2-core.jar
- castor-1.3.2-xml.jar
- commons-lang-2.6.jar
- commons-logging-1.1.1.jar
- xercesImpl.jar
Şimdilik bu kadar. Esen kalın.,
Çalışmalara Castor ile devam ediyorum. Dün mapping dosyası olmadan Castor ile nasıl XML verisini dönüştürebileceğimizi araştırmıştım. Bugün de mapping dosyası ile bu iş nasıl oluyor onu araştırdım ve güzel deneyimler elde ettim. Projede dünkünden farklı sınıflar kullanarak öğrenme seviyemi yükselmiş bulunuyorum :)
Sınıflardan biraz bahsetmek gerekirse, HeadQuarter ve Branch sınıflarında çeşitli değişkenler var, aşağıdaki kodda daha iyi görülebilir, ve bu sınıflar arasında "has a relationship" bağlantısı bulunmakta. Ayrıca main metodumuzun bulunduğu Main sınıfımız da her zamanki yerinde duruyor. Şimdi kodlara geçelim.
HeadQuarter.Java
import java.util.ArrayList;
import java.util.Date;
import java.util.Vector;
public class HeadQuarter{
private String name = "";
private int size = 0;
private ArrayList<String> rooms = new ArrayList<String>();
private Vector<String> floors = new Vector<String>();
private Date dob = new Date();
private ArrayList<Branch> branch = new ArrayList<Branch>();
public HeadQuarter(String name, int size, ArrayList<String> rooms,
Vector<String> floors, Date dob, ArrayList<Branch> branch) {
super();
this.name = name;
this.size = size;
this.rooms = rooms;
this.floors = floors;
this.dob = dob;
this.branch = branch;
}
public ArrayList<Branch> getBranch() {
return branch;
}
public void setBranch(ArrayList<Branch> branch) {
this.branch = branch;
}
public Date getDob() {
return dob;
}
public void setDob(Date dob) {
this.dob = dob;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
public ArrayList<String> getRooms() {
return rooms;
}
public void setRooms(ArrayList<String> rooms) {
this.rooms = rooms;
}
public Vector<String> getFloors() {
return floors;
}
public void setFloors(Vector<String> floors) {
this.floors = floors;
}
public HeadQuarter(){}
}
Branch.java
public class Branch {
private String branchName = "";
private int numberOfWorkers = 0;
public String getBranchName() {
return branchName;
}
public void setBranchName(String branchName) {
this.branchName = branchName;
}
public int getNumberOfWorkers() {
return numberOfWorkers;
}
public void setNumberOfWorkers(int numberOfWorkers) {
this.numberOfWorkers = numberOfWorkers;
}
public Branch(String branchName, int numberOfWorkers) {
super();
this.branchName = branchName;
this.numberOfWorkers = numberOfWorkers;
}
public Branch(){}
}
mapping.xml
<?xml version="1.0"?>
<mapping>
<class name="HeadQuarter">
<map-to xml="HQ"></map-to>
<field name="name" type="string">
<bind-xml name="Name" node="attribute" />
</field>
<field name="size" type="integer">
<bind-xml name="Size" node="attribute" />
</field>
<field name="rooms" type="string" collection="arraylist">
<bind-xml name="Rooms" node="element"></bind-xml>
</field>
<field name="floors" type="string" collection="vector">
<bind-xml name="Floors" node="element"></bind-xml>
</field>
<field name="dob" type="date">
<bind-xml name="building-date" node="element"></bind-xml>
</field>
<field name="branch" type="Branch" collection="arraylist">
<bind-xml name="Branches" node="element"></bind-xml>
</field>
</class>
<class name="Branch">
<map-to xml="Branches"></map-to>
<field name="branchName" type="string">
<bind-xml name="branch_name" node="attribute"></bind-xml>
</field>
<field name="numberOfWorkers" type="integer">
<bind-xml name="number_of_workers" node="element"></bind-xml>
</field>
</class>
</mapping>
Main.Java
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.Vector;
import org.apache.xml.serialize.OutputFormat;
import org.apache.xml.serialize.XMLSerializer;
import org.exolab.castor.mapping.FieldHandler;
import org.exolab.castor.mapping.Mapping;
import org.exolab.castor.mapping.MappingException;
import org.exolab.castor.mapping.loader.FieldHandlerImpl;
import org.exolab.castor.xml.MarshalException;
import org.exolab.castor.xml.Marshaller;
import org.exolab.castor.xml.Unmarshaller;
import org.exolab.castor.xml.ValidationException;
import org.exolab.castor.xml.XMLContext;
public class Main {
/**
* @param args
* @throws IOException
* @throws ValidationException
* @throws MarshalException
* @throws MappingException
*/
@SuppressWarnings("deprecation")
public static void main(String[] args) throws IOException, MarshalException, ValidationException, MappingException {
// TODO Auto-generated method stub
ArrayList<String> rooms1 = new ArrayList<String>();
rooms1.add("firstroom");
rooms1.add("secondroom");
rooms1.add("thirdroom");
Vector<String> floors1 = new Vector<String>();
floors1.add("firstfloor");
floors1.add("secondfloor");
Date dob = new Date(2011,12,22);
ArrayList<Branch> branch = new ArrayList<Branch>();
branch.add(new Branch("Umraniye", 500));
branch.add(new Branch("Maslak", 275));
HeadQuarter hq = new HeadQuarter("hq1",3,rooms1,floors1,dob,branch);
// Marshalling Starts
Mapping mapping = new Mapping();
mapping.loadMapping("mapping.xml");
XMLContext context = new XMLContext();
context.addMapping(mapping);
FileWriter writer = new FileWriter("output.xml");
OutputFormat format = new OutputFormat();
format.setIndenting(true);
format.setIndent(4);
XMLSerializer serializer = new XMLSerializer(writer, format);
Marshaller marshaller = context.createMarshaller();
marshaller.setSuppressXSIType(true);
marshaller.setWriter(writer);
marshaller.setDocumentHandler(serializer.asDocumentHandler());
marshaller.marshal(hq);
// Marshalling ends
// Unmarshalling Starts
FileReader reader = new FileReader("output.xml");
Unmarshaller unmarshaller = context.createUnmarshaller();
unmarshaller.setMapping(mapping);
unmarshaller.setClass(HeadQuarter.class);
HeadQuarter hq2 = (HeadQuarter) unmarshaller.unmarshal(reader);
// Unmarshalling ends
}
}
Burada kafaları karıştıracak olan kısmın mapping.xml olacağını düşünüyorum. Bunun nasıl ve hangi kurallara göre yazılacağını Castorun sitesindeki dökümanı zaten çok güzel anlatıyor olduğu için bir daha yazmıyorum ancak yine de kafanıza takılan bir yer olursa yardımcı olmaya çalışırım elbette. Zaten projeyi çalıştırdıktan sonra alacağınız çıktıyı da inceleyerek neyi nerede ve ne için kullandığımı daha iyi anlayabilirsiniz. Ayrıca, bu projeyi çalıştırmak için gerekli olan jar dosyalarını bir kez daha aşağıya yazıyorum, bunlar olmadan çalışmıyor ne yazık ki :)
- castor-1.3.2-core.jar
- castor-1.3.2-xml.jar
- commons-lang-2.6.jar
- commons-logging-1.1.1.jar
- xercesImpl.jar
Şimdilik bu kadar. Esen kalın.,
28 Temmuz 2011 Perşembe
Mapping Dosyası Olmadan Castor Unmarshalling Operasyonu
Arkadaşlar Merhaba,
Staj yaptığım yer olan Kartaca Bilişimde Castor frameworkunu incelemeye devam ediyorum halen. Bugün karşılaştığım ve çözmek için baya uğraştığım bir durumu yazacağım. Daha önceki yazımda Castor ile XML marshalling ve unmarshalling operasyonlarının nasıl yapıldığını yazmıştım. O yazıda bu işlemleri mapping.xml adında bir dosya ile gerçekleştiriyordum. Bu dosya, Castor'a XML i nasıl parçalayacağı hakkında bilgi veriyordu. Ancak bazen büyük projelerde mevcut dosyaların içine yeni bir tane XML dosyası eklemek istenilmeyen birşey olabiliyor. Böyle bir durum için, XML dosyası olmadan nasıl yapılabilir bu işler onu araştırdım.
Aslında parçalayacağımız XML dosyasında 1 tane kayıt varsa işimiz kolay, fakat burada 1den fazla kayıt olduğu durumlarda marshalling işleminde XMLe bilgileri kaydederken hiyerarşi icabı başına ekstra tag koyarak kaydediyor. Yani şunun gibi,
<anonymous-tag>
<person>...</person>
<person>...</person>
</anonymous-tag>
Bu durumda da bu XMLi unmarshal ederken problem çıkıyor. Bunu, person listemizi ayrı bir sınıfa koyarak çözüyoruz.Yazılanlar havada kalmış olabilir, o yüzden kodlara geçelim.
Person.Java
import java.util.Date;
public class Person{
private String name = null;
private Date dob = null;
public Person() {
super();
}
public Person(String name) {
this.setName(name);
}
public Person(String name, Date dob) {
this.setName(name);
this.setDob(dob);
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setDob(Date dob) {
this.dob = dob;
}
public Date getDob() {
return dob;
}
public String toString(){
return "Name: "+this.getName()+"\nDate of Birth: "+this.getDob();
}
}
PersonList.Java
public class PersonList {
public PersonList(int number) {
super();
this.person = new Person[number];
}
public PersonList() {
super();
}
private Person[] person;
public Person[] getPerson() {
return person;
}
public void setPerson(Person[] person) {
this.person = person;
}
}
Main.Java
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Date;
import org.exolab.castor.mapping.MappingException;
import org.exolab.castor.xml.MarshalException;
import org.exolab.castor.xml.Marshaller;
import org.exolab.castor.xml.Unmarshaller;
import org.exolab.castor.xml.ValidationException;
import org.exolab.castor.xml.XMLContext;
public class Main {
@SuppressWarnings("deprecation")
public static void main(String[] args) throws IOException,
MappingException, MarshalException, ValidationException {
// Yeni Person objesi
Person person = new Person("Emre Gözen");
person.setDob(new Date(1999, 06, 29, 12, 20));
// Yeni Person objesi
Person person2 = new Person("Emre Gözen1234564");
person2.setDob(new Date(1999, 06, 29, 12, 20));
PersonList personList = new PersonList(2);
personList.getPerson()[0]=person;
personList.getPerson()[1]=person2;
// Marshalling için Writer objesi
FileWriter writer = new FileWriter("test.xml");
XMLContext context = new XMLContext();
// Marshaller objesi
Marshaller marshaller = context.createMarshaller();
marshaller.setWriter(writer);
marshaller.setSuppressXSIType(true);
// Marshalling işlemi
marshaller.marshal(personList);
// Unmarshalling için Reader
FileReader reader = new FileReader("test.xml");
XMLContext context2 = new XMLContext();
// Unmarshaller objesi
Unmarshaller unmarshaller =
context2.createUnmarshaller();
unmarshaller.setClass(PersonList.class);
// Unmarshalling işlemi
PersonList personList2 = (PersonList) unmarshaller.unmarshal(reader);
// Sonucu ekrana yazdırma
for (int i = 0; i < 2; i++) {
System.out.println(personList2.getPerson()[i].getName() + "\n\n");
}
}
}
Takıldığınız yer olursa beraber inceleyebiliriz. Şimdilik bu kadar.
Herkese iyi günler.
Staj yaptığım yer olan Kartaca Bilişimde Castor frameworkunu incelemeye devam ediyorum halen. Bugün karşılaştığım ve çözmek için baya uğraştığım bir durumu yazacağım. Daha önceki yazımda Castor ile XML marshalling ve unmarshalling operasyonlarının nasıl yapıldığını yazmıştım. O yazıda bu işlemleri mapping.xml adında bir dosya ile gerçekleştiriyordum. Bu dosya, Castor'a XML i nasıl parçalayacağı hakkında bilgi veriyordu. Ancak bazen büyük projelerde mevcut dosyaların içine yeni bir tane XML dosyası eklemek istenilmeyen birşey olabiliyor. Böyle bir durum için, XML dosyası olmadan nasıl yapılabilir bu işler onu araştırdım.
Aslında parçalayacağımız XML dosyasında 1 tane kayıt varsa işimiz kolay, fakat burada 1den fazla kayıt olduğu durumlarda marshalling işleminde XMLe bilgileri kaydederken hiyerarşi icabı başına ekstra tag koyarak kaydediyor. Yani şunun gibi,
<anonymous-tag>
<person>...</person>
<person>...</person>
</anonymous-tag>
Bu durumda da bu XMLi unmarshal ederken problem çıkıyor. Bunu, person listemizi ayrı bir sınıfa koyarak çözüyoruz.Yazılanlar havada kalmış olabilir, o yüzden kodlara geçelim.
Person.Java
import java.util.Date;
public class Person{
private String name = null;
private Date dob = null;
public Person() {
super();
}
public Person(String name) {
this.setName(name);
}
public Person(String name, Date dob) {
this.setName(name);
this.setDob(dob);
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setDob(Date dob) {
this.dob = dob;
}
public Date getDob() {
return dob;
}
public String toString(){
return "Name: "+this.getName()+"\nDate of Birth: "+this.getDob();
}
}
PersonList.Java
public class PersonList {
public PersonList(int number) {
super();
this.person = new Person[number];
}
public PersonList() {
super();
}
private Person[] person;
public Person[] getPerson() {
return person;
}
public void setPerson(Person[] person) {
this.person = person;
}
}
Main.Java
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Date;
import org.exolab.castor.mapping.MappingException;
import org.exolab.castor.xml.MarshalException;
import org.exolab.castor.xml.Marshaller;
import org.exolab.castor.xml.Unmarshaller;
import org.exolab.castor.xml.ValidationException;
import org.exolab.castor.xml.XMLContext;
public class Main {
@SuppressWarnings("deprecation")
public static void main(String[] args) throws IOException,
MappingException, MarshalException, ValidationException {
// Yeni Person objesi
Person person = new Person("Emre Gözen");
person.setDob(new Date(1999, 06, 29, 12, 20));
// Yeni Person objesi
Person person2 = new Person("Emre Gözen1234564");
person2.setDob(new Date(1999, 06, 29, 12, 20));
PersonList personList = new PersonList(2);
personList.getPerson()[0]=person;
personList.getPerson()[1]=person2;
// Marshalling için Writer objesi
FileWriter writer = new FileWriter("test.xml");
XMLContext context = new XMLContext();
// Marshaller objesi
Marshaller marshaller = context.createMarshaller();
marshaller.setWriter(writer);
marshaller.setSuppressXSIType(true);
// Marshalling işlemi
marshaller.marshal(personList);
// Unmarshalling için Reader
FileReader reader = new FileReader("test.xml");
XMLContext context2 = new XMLContext();
// Unmarshaller objesi
Unmarshaller unmarshaller =
context2.createUnmarshaller();
unmarshaller.setClass(PersonList.class);
// Unmarshalling işlemi
PersonList personList2 = (PersonList) unmarshaller.unmarshal(reader);
// Sonucu ekrana yazdırma
for (int i = 0; i < 2; i++) {
System.out.println(personList2.getPerson()[i].getName() + "\n\n");
}
}
}
Takıldığınız yer olursa beraber inceleyebiliriz. Şimdilik bu kadar.
Herkese iyi günler.
27 Temmuz 2011 Çarşamba
Castor Framework Kullanımı (XML Veri Dönüştürme)
Merhabalar,
Uzun süredir yazı yazamıyordum, bugün öğrendiğim önemli bir konuyu yazıya dökmek istedim. Bilindiği üzere, XML, veri aktarma ve depolamada kullanılabilen oldukça yararlı bir format. Bu formatı Javada nesne yönelimli programlamaya uygun olarak kullanmak için ise çeşitlli frameworkler mevcut. Bunlardan biri de Castor dur. Bu frameworkle beraber elimizde bulunan objeleri XML'e aktarıp, daha sonradan bu XML dosyasından geri objeler oluşturabileceğiz.
Castor'un resmi sayfasında hoş bir dökümantasyonu var, bu işle ilgilenecek arkadaşlara tavsiyem bunu da mutlaka okumalarıdır.
Şimdi örnek kodlarda biraz daha ayrıntıya inelim.
Projemizde iki ayrı sınıf olacak, birincisi "Person" sınıfı, kişinin ismini, işini ve favori araba markalarını tutacak, diğeri ise main fonksiyonumuzu barındıran "Main" sınıfı. Bunların yanında, projemizin çalışabilmesi için bazı jar dosyalarını projemize eklememiz gerekiyor. İsimlerini aşağıya yazıyorum, googlede aratıp indirebilirsiniz.
- castor-1.3.2-core.jar
- castor-1.3.2-xml.jar
- commons-lang-2.6.jar
- commons-logging-1.1.1.jar
- xercesImpl.jar
Şimdide kodlar:
Öncelikle mapping işlemimiz için gerekli olan mapping.xml
Burada oluşacak xml'in yapısına karar veriliyor.
mapping.xml
<?xml version="1.0"?>
<mapping>
<class name="Person">
<map-to xml="Person" />
<field name="name" type="java.lang.String">
<bind-xml name="name" node="attribute" />
</field>
<field name="dob" type="java.util.Date">
<bind-xml name="dob" node="element" />
</field>
<field name="certificates" type="java.lang.String" collection="arraylist">
<bind-xml name="certificates" node="element" />
</field>
</class>
</mapping>
Person.java
import java.util.ArrayList;
public class Person {
public Person(){}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
public ArrayList<String> getFavorites() {
return favorites;
}
public void setFavorites(ArrayList<String> favorites) {
this.favorites = favorites;
}
private String name;
private String job;
private ArrayList<String> favorites;
public Person(String name,String job,ArrayList<String> favorites){
this.name = name;
this.job = job;
this.favorites = favorites;
}
/**
* @return the String representation of the Person
*/
public String toString(){
return "Name: "+this.getName()+"\nJob: "+this.getJob()+"\nFavorites:"+this.getFavorites();
}
}
Main.java
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import org.apache.xml.serialize.OutputFormat;
import org.apache.xml.serialize.XMLSerializer;
import org.exolab.castor.mapping.Mapping;
import org.exolab.castor.mapping.MappingException;
import org.exolab.castor.xml.MarshalException;
import org.exolab.castor.xml.Marshaller;
import org.exolab.castor.xml.Unmarshaller;
import org.exolab.castor.xml.ValidationException;
public class Main {
/**
* @param args
* @throws MappingException
* @throws IOException
* @throws ValidationException
* @throws MarshalException
*/
@SuppressWarnings("deprecation")
public static void main(String[] args) throws IOException, MappingException, MarshalException, ValidationException {
// TODO Auto-generated method stub
ArrayList<String> favorites1 = new ArrayList<String>();
ArrayList<String> favorites2 = new ArrayList<String>();
ArrayList<String> favorites3 = new ArrayList<String>();
favorites1.add("Audi");
favorites2.add("BMW");
favorites2.add("Mercedes");
favorites3.add("VW");
favorites3.add("Ford");
favorites3.add("Audi");
ArrayList<Person> personList = new ArrayList<Person>();
personList.add(new Person("Ahmet","Engineer",favorites1));
personList.add(new Person("Mehmet","Doctor",favorites2));
personList.add(new Person("Celil","Teacher",favorites3));
// mapping.xml dosyası tanımlaması
final String MAPPING_FILE = "file:///home/gozenem/workspace/mycastor/mapping.xml";
// Mapping oluşturma
Mapping mapping = new Mapping();
mapping.loadMapping(MAPPING_FILE);
// -------- Marshalling Başlangıcı --------
// mashhal için Writer oluşturma
FileWriter writer = new FileWriter("test.xml");
// formatlama için Serializer oluşturma
OutputFormat format = new OutputFormat();
format.setIndenting(true);
format.setIndent(4);
XMLSerializer serializer = new XMLSerializer(writer, format);
// Marshaller oluşturma
Marshaller marshaller = new Marshaller();
marshaller.setMapping(mapping);
marshaller.setSuppressXSIType(true);
marshaller.setWriter(writer);
marshaller.setDocumentHandler(serializer.asDocumentHandler());
// person objesini marshalla
marshaller.marshal(personList);
// -------- Marshalling bitti --------
// -------- Unmarshalling Başlangıcı --------
// unmarshalling için reader oluşturma
ArrayList<Person> personList2 = new ArrayList<Person>();
FileReader reader = new FileReader("test.xml");
// Unmarshaller oluşturma
Unmarshaller unmarshaller = new Unmarshaller(ArrayList.class);
unmarshaller.setMapping(mapping);
personList2 = (ArrayList<Person>) unmarshaller.unmarshal(reader);
// -------- Unmarshalling Bitti --------
// Bilgileri ekrana yazdırma
for (int i = 0; i < 3; i++) {
System.out.println(personList2.get(i).toString());
}
}
}
Bu yazıdaki büyük katkısı için Murat Sayılgan arkadaşıma teşekkür ederim. Kolay gelsin.
Uzun süredir yazı yazamıyordum, bugün öğrendiğim önemli bir konuyu yazıya dökmek istedim. Bilindiği üzere, XML, veri aktarma ve depolamada kullanılabilen oldukça yararlı bir format. Bu formatı Javada nesne yönelimli programlamaya uygun olarak kullanmak için ise çeşitlli frameworkler mevcut. Bunlardan biri de Castor dur. Bu frameworkle beraber elimizde bulunan objeleri XML'e aktarıp, daha sonradan bu XML dosyasından geri objeler oluşturabileceğiz.
Castor'un resmi sayfasında hoş bir dökümantasyonu var, bu işle ilgilenecek arkadaşlara tavsiyem bunu da mutlaka okumalarıdır.
Şimdi örnek kodlarda biraz daha ayrıntıya inelim.
Projemizde iki ayrı sınıf olacak, birincisi "Person" sınıfı, kişinin ismini, işini ve favori araba markalarını tutacak, diğeri ise main fonksiyonumuzu barındıran "Main" sınıfı. Bunların yanında, projemizin çalışabilmesi için bazı jar dosyalarını projemize eklememiz gerekiyor. İsimlerini aşağıya yazıyorum, googlede aratıp indirebilirsiniz.
- castor-1.3.2-core.jar
- castor-1.3.2-xml.jar
- commons-lang-2.6.jar
- commons-logging-1.1.1.jar
- xercesImpl.jar
Şimdide kodlar:
Öncelikle mapping işlemimiz için gerekli olan mapping.xml
Burada oluşacak xml'in yapısına karar veriliyor.
mapping.xml
<?xml version="1.0"?>
<mapping>
<class name="Person">
<map-to xml="Person" />
<field name="name" type="java.lang.String">
<bind-xml name="name" node="attribute" />
</field>
<field name="dob" type="java.util.Date">
<bind-xml name="dob" node="element" />
</field>
<field name="certificates" type="java.lang.String" collection="arraylist">
<bind-xml name="certificates" node="element" />
</field>
</class>
</mapping>
Person.java
import java.util.ArrayList;
public class Person {
public Person(){}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
public ArrayList<String> getFavorites() {
return favorites;
}
public void setFavorites(ArrayList<String> favorites) {
this.favorites = favorites;
}
private String name;
private String job;
private ArrayList<String> favorites;
public Person(String name,String job,ArrayList<String> favorites){
this.name = name;
this.job = job;
this.favorites = favorites;
}
/**
* @return the String representation of the Person
*/
public String toString(){
return "Name: "+this.getName()+"\nJob: "+this.getJob()+"\nFavorites:"+this.getFavorites();
}
}
Main.java
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import org.apache.xml.serialize.OutputFormat;
import org.apache.xml.serialize.XMLSerializer;
import org.exolab.castor.mapping.Mapping;
import org.exolab.castor.mapping.MappingException;
import org.exolab.castor.xml.MarshalException;
import org.exolab.castor.xml.Marshaller;
import org.exolab.castor.xml.Unmarshaller;
import org.exolab.castor.xml.ValidationException;
public class Main {
/**
* @param args
* @throws MappingException
* @throws IOException
* @throws ValidationException
* @throws MarshalException
*/
@SuppressWarnings("deprecation")
public static void main(String[] args) throws IOException, MappingException, MarshalException, ValidationException {
// TODO Auto-generated method stub
ArrayList<String> favorites1 = new ArrayList<String>();
ArrayList<String> favorites2 = new ArrayList<String>();
ArrayList<String> favorites3 = new ArrayList<String>();
favorites1.add("Audi");
favorites2.add("BMW");
favorites2.add("Mercedes");
favorites3.add("VW");
favorites3.add("Ford");
favorites3.add("Audi");
ArrayList<Person> personList = new ArrayList<Person>();
personList.add(new Person("Ahmet","Engineer",favorites1));
personList.add(new Person("Mehmet","Doctor",favorites2));
personList.add(new Person("Celil","Teacher",favorites3));
// mapping.xml dosyası tanımlaması
final String MAPPING_FILE = "file:///home/gozenem/workspace/mycastor/mapping.xml";
// Mapping oluşturma
Mapping mapping = new Mapping();
mapping.loadMapping(MAPPING_FILE);
// -------- Marshalling Başlangıcı --------
// mashhal için Writer oluşturma
FileWriter writer = new FileWriter("test.xml");
// formatlama için Serializer oluşturma
OutputFormat format = new OutputFormat();
format.setIndenting(true);
format.setIndent(4);
XMLSerializer serializer = new XMLSerializer(writer, format);
// Marshaller oluşturma
Marshaller marshaller = new Marshaller();
marshaller.setMapping(mapping);
marshaller.setSuppressXSIType(true);
marshaller.setWriter(writer);
marshaller.setDocumentHandler(serializer.asDocumentHandler());
// person objesini marshalla
marshaller.marshal(personList);
// -------- Marshalling bitti --------
// -------- Unmarshalling Başlangıcı --------
// unmarshalling için reader oluşturma
ArrayList<Person> personList2 = new ArrayList<Person>();
FileReader reader = new FileReader("test.xml");
// Unmarshaller oluşturma
Unmarshaller unmarshaller = new Unmarshaller(ArrayList.class);
unmarshaller.setMapping(mapping);
personList2 = (ArrayList<Person>) unmarshaller.unmarshal(reader);
// -------- Unmarshalling Bitti --------
// Bilgileri ekrana yazdırma
for (int i = 0; i < 3; i++) {
System.out.println(personList2.get(i).toString());
}
}
}
Bu yazıdaki büyük katkısı için Murat Sayılgan arkadaşıma teşekkür ederim. Kolay gelsin.
11 Mart 2011 Cuma
JSF Rendered,Oncomplete ya da Disabled Gibi Özelliklere Çoklu Koşul Belirtme
Sizlere kodlamanızda işinize yarayacak küçük bir bilgi vermek istiyorum. JSF 2.0'da rendered,oncomplete gibi özelliğine birden çok koşul eklemek için, koşullar arasına "and" sözcüğünü koymamız yeterli oluyor.Örnek vermek gerekirse,
disabled="#{mybean.isApproved eq true and mybean.id ne 0}
Umarım işinize yarar, kolay gelsin.
disabled="#{mybean.isApproved eq true and mybean.id ne 0}
Umarım işinize yarar, kolay gelsin.
26 Şubat 2011 Cumartesi
JSF Projesinde SSL Kullanımı
Arkadaşlar Merhabalar,
Bu yazıda sizlerle bir JSF projesinde SSL nasıl kulanılır inceleyeceğiz. Doğrusu, benim biraz vaktimi aldı bunu gerçeklemek, çünkü Türkçe kaynak çok fazla yok bu konu hakkında, İngilizce olanların ise hepsi doğru bilgiler içermiyor. Ancak sonunda çözdük ve hizmetinize sunuyoruz :)
Şimdi nasıl yapılır hep beraber görelim.
İlk olarak, keytool umuzu oluşturacağız. Bunun için, komut satırına(Başlat->Çalıştır->cmd),
Düzeltme: Aşağıdaki resimde %JAVA_HOME% yazmayı unutmuşum, aşağıdaki gibi eklerseniz iyi olur.
%JAVA_HOME%\bin\keytool -genkey -alias tomcat -keyalg RSA
yazarak çalıştırıyoruz. Bundan sonra sistem bizden 6 karakter veya daha uzun olan bir şifre isteyecektir. Bunu girdikten sonra, aşağıdaki resimdeki gibi bilgilerimizi alacaktır.
Bunları da girdikten sonra, artık sertifikamız hazır hale gelmiş olacaktır. Sistem sertifikayı Belgelerim klasöründe, yani, C:\Users\"kullanıcı adı"\ ya da ${user.home}\ klasöründe oluşturacaktır. Oluşan dosyanın ismi .keystore dur.
Şimdi, Tomcat kısmındaki ayarlamaları yapacağız. Öncelikle Tomcat bilgisayarımızda nerede kuruluysa o klasöre giriyoruz. Daha sonra conf klasörünün altındaki server.xml dosyasını açıyoruz. Bunun içine aşağıdaki satırları ekliyoruz. Burada dikkat edilmesi gereken şey, password kısmına, komut satırında hangi şifreyi verdiysek onu yazmamız gerektiğidir.
<Connector port="8443" maxThreads="200" scheme="https" secure="true" SSLEnabled="true" keystoreFile="${user.home}/.keystore"
keystorePass="hangi sifreyi verdiyseniz onu yazın" clientAuth="false" sslProtocol="TLS"/>
Şimdi, projemizde yapacağımız ayarlara gelelim. Proje klasörümüzün içinde
Web Contents-> WEB-INF -> web.xml
dosyasına çift tıklayarak açıyoruz. Bunun içinde herhangi bir yere, mesela en alt satırın
bir üstüne aşağıdaki kodları ekliyoruz.
<security-constraint> <web-resource-collection> <web-resource-name>securedapp</web-resource-name> <url-pattern>/*</url-pattern> </web-resource-collection> <user-data-constraint> <transport-guarantee>CONFIDENTIAL</transport-guarantee> </user-data-constraint> </security-constraint>
Artık tüm ayarlarımız hazır duruma geldi. Projemizdeki herhangi bir sayfayı açtığımız zaman,
https://localhost:8443/... gibi bir link ile açıldığını göreceğiz. Bu, işlemleri başarıyla
gerçekleştirdiğimiz manasına gelir. Eğer herhangi bir yerinde sıkıntı çekerseniz bana mesaj
atabilirsiniz, elimden geldiğince yardımcı olmaya çalışacağım.
Daha ayrıntılı bilgiler için aşağıdaki linke de göz atabilirsiniz.
http://tomcat.apache.org/tomcat-6.0-doc/ssl-howto.html
Hepinize başarılar dilerim, esen kalın.
16 Şubat 2011 Çarşamba
Tübitak Bilgem Dergisi Çıktı !
Tübitak UEKAE(Ulusal Elektronik ve Kriptoloji Araştırma Enstitüsü) ve BTE(Bilişim Teknolojileri Enstitüsü)'nin BİLGEM(Bilişim ve Bilgi Güvenliği İleri Teknolojiler Araştırma Merkezi) çatısı altında çıkardığı Bilgem Dergisi'nin yeni sayısı çıktı. Derginin bu sayısını özellikle kriptoloji ve güvenlik konularına ilgi duyanlara tavsiye ederim. Okumak isteyenler için linki veriyorum.
http://www.uekae.tubitak.gov.tr/uekae_content_files/flash/UEKAE_dergi_sayfa_flash/sayi_5/Default.html
http://www.uekae.tubitak.gov.tr/uekae_content_files/flash/UEKAE_dergi_sayfa_flash/sayi_5/Default.html
15 Şubat 2011 Salı
Eclipse'de Mercurial Kurulumu - Windows
Arkadaşlar Merhaba,
Bugün sizlerle Eclipse IDE için Mercurial kurulumuna adım adım gerçekleyeceğiz.
Adım 1) Eclipse -> Help -> Install New Software yolunu izliyoruz.
Adım 2) http://cbes.javaforge.com/update linkini resimde görülen boşluğa giriyoruz ve Add butonuna tıklıyoruz. Bundan sonra yüklenecek elemanlar aşağıda listelenecektir. Bunları seçip ilerliyoruz.
Adım 3) İlerliyoruz.
Adım 4) Burada "I accept the terms of...." seçeneğini seçip Finish butonuna tıklıyoruz. Bundan sonra bir yükleme ekranı çıkacak ve yükleme işlemi gerçekleştirilecektir. Yükleme bittikten sonra, Eclipse'yi yeniden başlatmamızı isteyecektir. Yeniden başlattıktan sonra Mercuriali kullanmaya başlayabiliriz.
Herkese kolay gelsin !
Bugün sizlerle Eclipse IDE için Mercurial kurulumuna adım adım gerçekleyeceğiz.
Adım 1) Eclipse -> Help -> Install New Software yolunu izliyoruz.
Adım 2) http://cbes.javaforge.com/update linkini resimde görülen boşluğa giriyoruz ve Add butonuna tıklıyoruz. Bundan sonra yüklenecek elemanlar aşağıda listelenecektir. Bunları seçip ilerliyoruz.
Adım 3) İlerliyoruz.
Adım 4) Burada "I accept the terms of...." seçeneğini seçip Finish butonuna tıklıyoruz. Bundan sonra bir yükleme ekranı çıkacak ve yükleme işlemi gerçekleştirilecektir. Yükleme bittikten sonra, Eclipse'yi yeniden başlatmamızı isteyecektir. Yeniden başlattıktan sonra Mercuriali kullanmaya başlayabiliriz.
Herkese kolay gelsin !
14 Şubat 2011 Pazartesi
Eclipse'de JSF Projesi Oluşturmak
Arkadaşlar Merhabalar,
Bu yazıda, son günlerde beni oldukça zorlayan, ama aslında kolay olan, Türkçe kaynak olsaydı ne de güzel olurdu diye dert yakındığım temel bir konudan bahsedeceğim, Eclipse IDE üzerinde JSF projesi oluşturmak.
1) Eclipse IDE'yi açtıktan sonra, File->New->Other yolunu izleyin.
2) Daha sonra, Dynamic Web Project seçeneğini tıklayarak ilerleriz.
3) Aşağıdaki gibi seçimlerimizi yaptıktan sonra ilerleriz. Burada, eğer Tomcat kullanacaksanız ve JSF 2.0 da proje geliştirecekseniz, Tomcat'ın 7.0 versiyonunu kullanmak zorundasınız, eski versiyonları JSF 2.0'ı desteklememektedir.
4)
5) Burada, Generate web.xml... seçeneğini seçerseniz, Web-Inf klasörünün altında web.xml dosyasını oluşturacaktır, ben seçili olmasını tercih ediyorum, seçilmeyebilir de.
6) Burada bir kütüphane seçmemiz gerekiyor. Aşağıda görülen 2 seçenekten herhangi birini seçmemiz işimizi görecektir. Eğer daha fazla kütüphane indirmeniz gerekiyorsa, seçeneklerin sağ tarafında altta bulunan butona tıklayarak indirebilirsiniz.
7) Projemiz artık hazır. Şimdi xhtml sayfası ekliyoruz.
8) Burada, sayfanın ismini verirken uzantıyı .xhtml yapmaya özen göstermeliyiz.
9) Burada da html seçeneklerinden en üstte olanı(New Facelet Composition Page) seçerek sayfamızı ekliyoruz.
10) Çalıştığını göstermek adına basitçe bir kod yazdım.
11) Ve işte sayfamız hazır.
Hepinizin kandilinizi kutlarım, esen kalın !
Bu yazıda, son günlerde beni oldukça zorlayan, ama aslında kolay olan, Türkçe kaynak olsaydı ne de güzel olurdu diye dert yakındığım temel bir konudan bahsedeceğim, Eclipse IDE üzerinde JSF projesi oluşturmak.
1) Eclipse IDE'yi açtıktan sonra, File->New->Other yolunu izleyin.
2) Daha sonra, Dynamic Web Project seçeneğini tıklayarak ilerleriz.
3) Aşağıdaki gibi seçimlerimizi yaptıktan sonra ilerleriz. Burada, eğer Tomcat kullanacaksanız ve JSF 2.0 da proje geliştirecekseniz, Tomcat'ın 7.0 versiyonunu kullanmak zorundasınız, eski versiyonları JSF 2.0'ı desteklememektedir.
4)
5) Burada, Generate web.xml... seçeneğini seçerseniz, Web-Inf klasörünün altında web.xml dosyasını oluşturacaktır, ben seçili olmasını tercih ediyorum, seçilmeyebilir de.
6) Burada bir kütüphane seçmemiz gerekiyor. Aşağıda görülen 2 seçenekten herhangi birini seçmemiz işimizi görecektir. Eğer daha fazla kütüphane indirmeniz gerekiyorsa, seçeneklerin sağ tarafında altta bulunan butona tıklayarak indirebilirsiniz.
7) Projemiz artık hazır. Şimdi xhtml sayfası ekliyoruz.
8) Burada, sayfanın ismini verirken uzantıyı .xhtml yapmaya özen göstermeliyiz.
9) Burada da html seçeneklerinden en üstte olanı(New Facelet Composition Page) seçerek sayfamızı ekliyoruz.
10) Çalıştığını göstermek adına basitçe bir kod yazdım.
11) Ve işte sayfamız hazır.
Hepinizin kandilinizi kutlarım, esen kalın !
1 Şubat 2011 Salı
JSF de İlk Uygulama !
Arkadaşlar merhabalar,
Kısa bir aradan sonra tekrar birlikteyiz. Bu yazıda basit bir JSF uygulaması geliştireceğiz.İlk önce kullanıcıdan bir isim istenecek, ve girilen isim için diğer sayfada bir hoşgeldiniz mesajı gösterilecektir. Şimdi kodlara geçelim.
1) Öncelikle IDE' mizde yeni bir proje açıyoruz.(Bu işlemi uzun uzadıya anlatan başka bir yazı blogda mevcuttur, merak edenler inceleyebilir.)Ben projeye myFirstJSFApp ismini verdim.
2) Daha sonra, Web Pages klasörünün altındaki index.xhtml yi açıyoruz. Burada bir inputText ve button koyuyoruz. inputText in required özelliğiyle, eğer kullanıcı bir isim girmezse hata verdiriyoruz.
...
<h:body>
<h:form>
</h:form></h:body>
<div>
Lutfen isminizi giriniz :
<h:inputtext required="true" requiredmessage="Bos bırakmayınız !" value="#{firstbean.name}"></h:inputtext></div>
<h:commandbutton action="showName" value="TAMAM"></h:commandbutton>
...
3) Şimdi yeni bir java sınıfı ve xhtml sayfası daha oluşturuyoruz. Java sınıfı na herhangi bir isim veriyoruz ve başağıdaki kodu sınıf tanımından önce yazıyoruz. Bu kod, sınıfın JSF sayfası tarafından görülmesini sağlayacaktır.
@ManagedBean(name="firstbean")
@SessionScoped
Daha sonra "name" stringi için getter & setter oluşturuyoruz ve yeni sınıfımız için bir yapıcı(constructor) yazıyoruz.
private String name;
public myFirstBean(){
name="";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
XHTML sayfasına ise aşağıdaki kodları yazarak karşılama mesajını gösteriyoruz.
...
<h:body>
<h:form>
</h:form></h:body>
<div style="font-weight: bold;">
Hosgeldin <h:outputtext value="#{firstbean.name}"></h:outputtext> !!!</div>
...
Örnek proje linktedir, eğer link ölüyse mesaj yazarak beni uyarabilirsiniz, linkleri yenileyebilirim.
UYGULAMAYI İNDİR
Bir sonraki yazıda görüşme dileğiyle. Hoşçakalın.
Kısa bir aradan sonra tekrar birlikteyiz. Bu yazıda basit bir JSF uygulaması geliştireceğiz.İlk önce kullanıcıdan bir isim istenecek, ve girilen isim için diğer sayfada bir hoşgeldiniz mesajı gösterilecektir. Şimdi kodlara geçelim.
1) Öncelikle IDE' mizde yeni bir proje açıyoruz.(Bu işlemi uzun uzadıya anlatan başka bir yazı blogda mevcuttur, merak edenler inceleyebilir.)Ben projeye myFirstJSFApp ismini verdim.
2) Daha sonra, Web Pages klasörünün altındaki index.xhtml yi açıyoruz. Burada bir inputText ve button koyuyoruz. inputText in required özelliğiyle, eğer kullanıcı bir isim girmezse hata verdiriyoruz.
...
<h:body>
<h:form>
</h:form></h:body>
<div>
Lutfen isminizi giriniz :
<h:inputtext required="true" requiredmessage="Bos bırakmayınız !" value="#{firstbean.name}"></h:inputtext></div>
<h:commandbutton action="showName" value="TAMAM"></h:commandbutton>
...
3) Şimdi yeni bir java sınıfı ve xhtml sayfası daha oluşturuyoruz. Java sınıfı na herhangi bir isim veriyoruz ve başağıdaki kodu sınıf tanımından önce yazıyoruz. Bu kod, sınıfın JSF sayfası tarafından görülmesini sağlayacaktır.
@ManagedBean(name="firstbean")
@SessionScoped
Daha sonra "name" stringi için getter & setter oluşturuyoruz ve yeni sınıfımız için bir yapıcı(constructor) yazıyoruz.
private String name;
public myFirstBean(){
name="";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
XHTML sayfasına ise aşağıdaki kodları yazarak karşılama mesajını gösteriyoruz.
...
<h:body>
<h:form>
</h:form></h:body>
<div style="font-weight: bold;">
Hosgeldin <h:outputtext value="#{firstbean.name}"></h:outputtext> !!!</div>
...
Örnek proje linktedir, eğer link ölüyse mesaj yazarak beni uyarabilirsiniz, linkleri yenileyebilirim.
UYGULAMAYI İNDİR
Bir sonraki yazıda görüşme dileğiyle. Hoşçakalın.
Kaydol:
Kayıtlar (Atom)