30 Mayıs 2011 Pazartesi

Apache Commons Lang Kütüphanesi-3: lang.time.* Paketi

Lang kütüphanesini incelemeye org.apache.commons.lang.time paketi ile devam ediyoruz.

Bu pakette bulunan sınıflar, zaman değerleriyle ilgili işlemler yapmak için daha pratik yöntemler sunar:

import org.apache.commons.lang.time.DateFormatUtils;
import org.apache.commons.lang.time.DateUtils;
import org.apache.commons.lang.time.StopWatch;

import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;

public class TimeTrial {
    public static void main(String[] args) {
        //Tarihi dd-MM-yyyy biçiminde göster
        System.out.println("1) dd-MM-yyyy >>>" +
            DateFormatUtils.format(new Date(), "dd-MM-yyyy"));

        //Tarihi SMTP_DATETIME_FORMAT biçiminde göster 
        System.out.println("2) SMTP_DATETIME_FORMAT >>>" +
            DateFormatUtils.SMTP_DATETIME_FORMAT.format(new Date()));

        //Tarihi ISO_DATE_FORMAT biçiminde göster 
        System.out.println("3) ISO_DATE_FORMAT >>>" +
            DateFormatUtils.ISO_DATE_FORMAT.format(new Date()));

        //Girilen milisaniye değerini tarih olarak göster
        System.out.println("4) MMM dd yy HH:mm >>>" +
            DateFormatUtils.format(System.currentTimeMillis(), "MMM dd yy HH:mm"));

        //Girilen milisaniye değerini UTC biçiminde tarih olarak göster
        System.out.println("5) MM/dd/yy HH:mm >>>" +
            DateFormatUtils.formatUTC(System.currentTimeMillis(),
                "MM/dd/yy HH:mm"));

        StopWatch stWatch = new StopWatch();

        //StopWatch'ı başlat
        stWatch.start();

        //Pazartesi'den başlamak üzere haftanın tüm günleri için iterator nesnesi al.
        Iterator itr = DateUtils.iterator(new Date(),
                DateUtils.RANGE_WEEK_MONDAY);

        while (itr.hasNext()) {
            Calendar gCal = (Calendar) itr.next();
            System.out.println(gCal.getTime());
        }

        //StopWatch'ı sonlandır
        stWatch.stop();
        System.out.println("Time Taken >>" + stWatch.getTime());
    }
}

Çıktısı:
1) dd-MM-yyyy >>>09-12-2003
2) SMTP_DATETIME_FORMAT >>>Tue, 09 Dec 2003 00:34:47 +0530
3) ISO_DATE_FORMAT >>>2003-12-09
4) MMM dd yy HH:mm >>>Dec 09 03 00:34
5) MM/dd/yy HH:mm >>>12/08/03 19:04
Mon Dec 08 00:00:00 GMT+05:30 2003
Tue Dec 09 00:00:00 GMT+05:30 2003
Wed Dec 10 00:00:00 GMT+05:30 2003
Thu Dec 11 00:00:00 GMT+05:30 2003
Fri Dec 12 00:00:00 GMT+05:30 2003
Sat Dec 13 00:00:00 GMT+05:30 2003
Sun Dec 14 00:00:00 GMT+05:30 2003
Time Taken >>31

Bu örneklerde tarih bilgisini biçimlendirmeye örnek vermek için SMTP_DATE_FORMAT ve ISO_DATE_FORMAT biçimleri kullanılmıştır. Bu ikisi dışında DateFormatUtils sınıfında 7 ayrı biçim daha vardır. Hiçbiri işinize yaramazsa kendi biçimlendirmenizi de tanımlayabilirsiniz.

StopWatch sınıfı da bir çeşit kronometre uygulamasıdır.

Kolay Gelsin.

Apache Commons Lang Kütüphanesi-3: lang.math.* Paketi

Lang kütüphanesini incelemeye org.apache.commons.lang.math paketi ile devam ediyoruz.

Bu pakette bulunan sınıflar java.math paketindekilere ek özellikler katar. İncelemeye değer en önemli sınıf NumberUtils'dir. Diğer sınıflar bu sınıfın kullandığı bazı tanımlamaları içerir.

import org.apache.commons.lang.math.NumberUtils;
import org.apache.commons.lang.math.RandomUtils;

import java.math.BigDecimal;

public class MathUtilsTrial {
    public static void main(String[] args) {
        //İki double değeri karşılaştır
        System.out.println("(FIRST > SECOND) >>> " +
            NumberUtils.compare(2.11, 1.11));
        System.out.println("(FIRST < SECOND) >>> " +
            NumberUtils.compare(1.11, 2.11));
        System.out.println("(FIRST == SECOND) >>> " +
            NumberUtils.compare(1.11, 1.11));

        //Karakter katarından bir BigDecimal oluştur
        BigDecimal bDecimal = NumberUtils.createBigDecimal("123456789");

        //Bir karakter katarının sadece sayılardan oluştuğunu doğrular
        System.out.println("Is Digits >>> " + NumberUtils.isDigits("123.123"));

        //Bir karakter katarının geçerli bir sayı ifade ettiğini doğrular
        System.out.println("Is Number >>> " + NumberUtils.isNumber("123.123"));

        //Dizinin en büyük elemanını döner
        System.out.println("MAX >>> " +
            NumberUtils.max(new double[] { 3.33, 8.88, 1.11 }));

        //Karakter katarını int değere çevirir. Çeviremezse öntanımlı değeri döner: 77
        System.out.println("String to Int >>> " +
            NumberUtils.toInt("ABCD", 77));

        //Rastgele sayıla üretir
        System.out.println("Random double >>> " + RandomUtils.nextDouble());
        System.out.println("Random float >>> " + RandomUtils.nextFloat());
        System.out.println("Random int >>> " + RandomUtils.nextInt());
    }
}

Çıktısı:
(FIRST > SECOND) >>> 1
(FIRST < SECOND) >>> -1
(FIRST == SECOND) >>> 0
Is Digits >>> false
Is Number >>> true
MAX >>> 8.88
String to Int >>> 77
Random double >>> 0.2720979622981403
Random float >>> 0.8221457
Random int >>> 738187848

compare() metodu, iki değer eşitse 0, ilk değer daha büyükse 1, ikinci değer daha büyükse -1 döner.

Dikkate değer bir diğer metod da createNumber()'dır. Bu metod bir karakter katarını  java.lang.Number 'ın alt tiplerinden uygun olan bir tanesine dönüştürür. Daha detaylı açıklarsak, bildiğiniz gibi Java'da bütün sayısal sarıcı sınıflar (Integer, Float, Double...) java.lang.Number'ın alt sınıfıdır.  createNumber() neredeyse bütün sayısal gösterimlerden anlar (int, float, double, hex, binary, octal, ...) ve bulduğu sayıyı uygun tipte döner.

Bu pakette ayrıca xxxRange kalıbında birkaç sınıf daha vardır. Bu sınıfları kullanarak double, float, int ve long tipleri için sayı aralıkları tanımlayabilir ve herhangi bir değerin bu aralıkta olup olmadığını kontrol edebilirsiniz.

Kolay Gelsin.

Apache Commons Lang Kütüphanesi-2: lang.builder.* Paketi

Lang kütüphanesini incelemeye org.apache.commons.lang.builder paketi ile devam ediyoruz.

Bu pakette kendi sınıflarınız için benzersiz olarak oluşturmanız gereken equals, toString, hashCode, ve compareTo metotlarını daha kolay üretebilmeniz için yardımcı birkaç sınıf bulunur. Şimdi bütün kayda değer metotların kullanıldığı bir örnek görelim ve hepsini teker teker açıklayalım:

import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;

public class BuilderTrial {
    private String name;
    private int age;

    public BuilderTrial(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {
        //Birkaç nesne oluşturalım.
        BuilderTrial one = new BuilderTrial("Becker", 35);
        BuilderTrial two = new BuilderTrial("Becker", 35);
        BuilderTrial three = new BuilderTrial("Agassi", 33);

        //one ve two farklı nesnelerde aynı verileri tutuyor.
        //three nesnesi ise farklı veri barındırıyor.
        System.out.println("One>>>" + one);
        System.out.println("Two>>>" + two);
        System.out.println("Three>>>" + three);

        System.out.println("one equals two? " + one.equals(two));
        System.out.println("one equals three? " + one.equals(three));

        //one ve two aynı verileri barındırdığı için, aynı hashcode dönülür.
        System.out.println("One HashCode>>> " + one.hashCode());
        System.out.println("Two HashCode>>> " + two.hashCode());
        System.out.println("Three HashCode>>> " + three.hashCode());
    }

    public boolean equals(Object objCompared) {
        if (!(objCompared instanceof BuilderTrial)) {
            return false;
        }

        BuilderTrial rhs = (BuilderTrial) objCompared;

        return new EqualsBuilder().append(name, rhs.name).append(age, rhs.age)
                                  .isEquals();
    }

    public String toString() {
        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE).append("Name",
            name).append("Age", age).toString();
    }

     public int compareTo(Object o) {
     BuilderTrial builderTrial = (BuilderTrial ) o;
     return new CompareToBuilder()
       .appendSuper(super.compareTo(o)
       .append(this.name, builderTrial.name)
       .append(this.age,  builderTrial.age)
       .toComparison();
    }

    public int hashCode() {
        return new HashCodeBuilder(15, 19).append(name).append(age).toHashCode();
    }
}


Çıktısı:
One>>>BuilderTrial@5[
  Name=Becker
  Age=35
]
Two>>>BuilderTrial@6[
  Name=Becker
  Age=35
]
Three>>>BuilderTrial@7[
  Name=Agassi
  Age=33
]
one equals two? true
one equals three? false
One HashCode>>> -923455822
Two HashCode>>> -923455822
Three HashCode>>> -1433293806


Bir sınıf için equals metodu yazmak, eğer çok fazla üyesi varsa, sayısız if ile boğuşmanızı gerektirebilir. EqualsBuilder sınıfı bu iş için size daha kolay bir yol sunar. Örneğini yukarıda da gördüğünüz gibi, tek yapmanız gereken EqualsBuilder'ın bir örneğinin oluşturup, bu nesne üzerinde, eşitlik kontrolü yapacağınız her alan için append() metodunu çağırmaktır. Tabi en son olarak da isEquals() metounu çağırmayı unutmayın.


ToStringBuilder sınfı toString() metodunun daha anlamlı ve okunabilir çıktılar üretmesini sağlamak için kullanılır. EqualsBuilder sınıfına benzer şekilde, ToStringBuilder'ın bir örneğini oluşturup, üretilecek çıktının biçimini belirtip sonra toString() metodunda olmasını istediğiniz detayları append() ile eklemeniz kafidir. Yine en son toString() metodunu çağırmayı unutmayın tabi.

ToStringBuilder'ı kullanırken çıktı biçimini belirtmek zorunlu değildir. Belirtilmezse DEFAULT_STYLE kullanılır. Diğer biçimler de şunlardır: MULTI_LINE_STYLE, NO_FIELD_NAMES_STYLE, SHORT_PREFIX_STYLE, SIMPLE_STYLE.

Eğer kendi çıktı biçiminizi tanımlamak isterseniz StandartToStringStyle sınıfını genişletebilirsiniz(extend).


HashCodeBuilder sınıfı hashCode() metodunu daha pratik yoldan üretmek için tasarlanmıştır. Diğer xxxBuilder sınıflarından farklı olarak, HashCodeBuilde'ın örneğini oluştururken, iki tane rastgele seçilmiş tek ve sıfırdan farklı sayı belirtirsiniz. Asal sayı kullanmanız tavsiye edilir! Sonra öncekiler gibi append() ile hashcode'da olmasını istediğiniz alanları ekler, toHashCode() ile hashcode'u oluşturursunuz.

HashCodeBuilde, EqualsBuilder ile ortak çalışır. Yani "equals() metodu true dönen iki nesne için hashcode'lar eşit olmalıdır" kuralına uyar.


CompareToBuilder da neredeyse aynıdır. Argüman olan Object referansını uygun tipe dönüştürdükten(cast) sonra CompareToBuilder'ın bir örneğini oluşturup, karşılaştırmak istediğiniz alanları append() ile ekleyip, sonra toComparison() metodunu çağırarak karşılaştırma işlemini gerçekleştirebilirsiniz. append() için sadece çalıştığınız sınıfın alanları ile sınırlı olmadığınıza dikkat edin. Örneğin biz burada appendSuper() ile bir üst sınıfın compareTo() metodunu da hesaplamamıza kattık.


Hepsinin Kısayolu
Bütün bu anlattığımız örneklerin Java Reflection API kullanan bariz bir şekilde daha kısa bir yolu var.

public boolean equals(Object obj) {
    return EqualsBuilder.reflectionEquals(this, obj);
}
public String toString() {
    return ToStringBuilder.reflectionToString(this
           , ToStringStyle.MULTI_LINE_STYLE);
}

public int hashCode() {
    return HashCodeBuilder.reflectionHashCode(this);
}

public int compareTo(Object o) {
   return CompareToBuilder.reflectionCompare(this, o);
}

Bu örneklerdeki kodda neredeyse herşey otomatikleştirilmiştir. Metodların içindeki tek satırlık kodlar, Java'nın Reflection özelliklerini kullanarak, ilgili sınıfın bütün alanlarına erişir ve karşılaştırma ve hesaplama işlemlerini bizim müdahalemize gerek kalmadan gerçekleştirir. Ancak bu yaklaşımın bir eksi yanı vardır. Diğer yönteme göre bariz şekilde yavaştır ve oluşturulan kod üzerinde çok daha az kontrolümüz vardır.

Kolay Gelsin.

27 Mayıs 2011 Cuma

Apache Commons Lang Kütüphanesi-1: lang.* Paketi

Apache Commons projesini incelemeye Lang kütüphanesi ile devam ediyoruz.

Lang kütüphanesi JDK'nın java.lang paketine bazı genel, çok sık kullanılan, her programcının işine yarayabilecek bileşenler ekler. Şimdi bunlardan en çok göze çarpanları inceleyelim. Açıklamaları yazarken zaman kaybetmemek için kodun içinde yapacağım.

CharsetUtils sınıfı karakterlerle alakalı işlemler için birkaç yardımcı statik metod barındırır. Not: Her ne kadar aşağıdaki kod örneklerinde aranacak karakterleri (ikinci parametre) String olarak belirtsek de, içindeki karakterlerin hepsi için tek tek kontrol yapılır.

import org.apache.commons.lang.CharSet;
import org.apache.commons.lang.CharSetUtils;
public class CharSetUtilsDeneme {
    public static void main(String[] args) {
        //Birinci parametredeki String'in içinde,
        //İkinci parametredeki karakterleri sayar.
        System.out.println("B and o count = " +
            CharSetUtils.count("BorisBecker", "Bo")); //3
        System.out.println("B,o,k,e and r count = " +
            CharSetUtils.count("BorisBecker", new String[] { "Bo", "ker" })); //8

        //Birinci parametredeki String'in içinden,
        //İkinci parametredeki karakterleri siler.
        System.out.println("Delete B and o = " +
            CharSetUtils.delete("BorisBecker", "Bo")); //risecker
        System.out.println("Delete B,o,k,e and r = " +
            CharSetUtils.delete("BorisBecker", new String[] { "Bo", "ker" })); //isc

        //Birinci parametredeki String'in içinde,
        //sadece ikinci parametredeki karakterleri tutar. Diğerlerini siler.
        System.out.println("Keep B and o = " +
            CharSetUtils.keep("BorisBecker", "Bo")); //BoB

        //Birinci parametredeki String'in içinden,
        //İkinci parametredeki karakterlerin tekrarlarını siler.
        System.out.println("Squeeze B and o = " +
            CharSetUtils.squeeze("BBoooorisbbbecker", "Bo")); //Borisbbbecker
    }
}

Çıktısı:
B and o count = 3
B,o,k,e and r count = 8
Delete B and o = risecker
Delete B,o,k,e and r = isc
Keep B and o = BoB
Squeeze B and o = Borisbbbecker

ObjectUtils sınıfı equals, toString gibi bütün sınıflar için ortak olan bazı metodların NullPointerException fırlatılmasına karşı daha güvenilir olan biçimlerini içerir. Bu metodları kullanarak örneğin null referanslı bir nesne için toString metodu çağırıldığında "null" yerine "" veya "Boş referans" gibi istediğiniz bir karakter katarının dönülmesini sağlayabilirsiniz.

import org.apache.commons.lang.ObjectUtils;

/**
 * Bu sınıfta kullanılan metodların hepsi NullPointerException'a
 * karşı güvenlidir. null veri girilse bile hata fırlatmaz
 */
public class ObjectUtilsTrial {
    public static void main(String[] args) {
        //ObjectUtilsTrial nesnelerini oluşturalım
        ObjectUtilsTrial one = new ObjectUtilsTrial();
        ObjectUtilsTrial two = one; //Aynı referans
        ObjectUtilsTrial three = new ObjectUtilsTrial(); //Yeni nesne
        ObjectUtilsTrial four = null;

        //birinci referans null ise ikinci nesneyi dön
        System.out.print("1) If null return DEFAULT >>>");
        System.out.println(ObjectUtils.defaultIfNull(four, three));

        //equals kontrolü
  //ikisi de aynı nesneyi refere ediyor.
        System.out.print("2) References to the same object >>>");
        System.out.println(ObjectUtils.equals(one, two));

  //equals kontrolü
        //farklı nesneleri refere ediyorlar.
        System.out.print("3) Check object references and not values >>>");
        System.out.println(ObjectUtils.equals(one, three));

        //toString methodu çağırılır
        System.out.print("4) toSring gets invoked >>>");
        System.out.println(one);

        //nesnenin detaylarını gösterir. toString metodu çağırılmaz
        System.out.print("5) Display object details >>>");
        System.out.println(ObjectUtils.identityToString(one));

        //toString'e null geçilse bile boş karakter katarı dönülür: ""
  //çıktı **** olacaktır
        System.out.print("6) Pass null and get back an Empty string >>>");
        System.out.println("**" + ObjectUtils.toString(null) + "**");
  
  //null verinin hashCode'u 0 olarak dönülür
  //çıktı **0** olacaktır
        System.out.print("6) Pass null and get back an Empty string >>>");
        System.out.println("**" + ObjectUtils.hashCode(null) + "**");
    }

    public String toString() {
        return "toString Output";
    }
}


Bu paketteki bir başka yardımcı sınıf da SerializationUtils'dir. Java'da en basit dosyaya okuma işlemi için bile bir ton sınıfla uğraşmanız gerekir. Bu sınıf serileştirme işlemini tek bir metod çağrısına kadar indirger. Tek yapmanız gereken serileştirmek istediğiniz veriyi ve çıktıyı vereceğiniz akışı belirmektir. Örneğin;

//File to serialize object to
String fileName = "testSerialization.ser";

//New file output stream for the file
FileOutputStream fos = new FileOutputStream(fileName);

//Serialize String
SerializationUtils.serialize("SERIALIZE THIS", fos);
fos.close();

//Open FileInputStream to the file
FileInputStream fis = new FileInputStream(fileName);

//Deserialize and cast into String
String ser = (String) SerializationUtils.deserialize(fis);
System.out.println(ser);
fis.close();

StringUtils sınıfı belki de bu pakette en çok kullanacağız sınıf olacak. İçinde 100'den fazla statik metod bulunur. Bu metodlar java.lan.String sınıfınının karakter katarı işlemede yetersiz kaldığı durumlardaki boşluğu doldurur. Ayrıca hepsi NullPointerException'a karşı güvenilirdir. Şimdi bu metodlardan bazıları iş başında görelim:

import org.apache.commons.lang.StringUtils;

public class StringUtilsTrial {
    public static void main(String[] args) {
        //12 karakter kısalt
        System.out.println("1) Abbreviate Once upon a time >>>" +
            StringUtils.abbreviate("Once upon a time ", 12));

        //İki karakter katarının benzerliklerinin bittiği yerin indexini döner.
        System.out.println(
            "2) Index Of Difference between ABCXYZ and ABCPQR >>>" +
            StringUtils.indexOfDifference("ABCXYZ", "ABCPQR"));

        //Karakter katarının sonundan, ikinci argümandaki katarı çıkar.
        System.out.println("3) Chomp END >>>" +
            StringUtils.chomp("A test String END", "END"));

        //İlk argümanın sadece ikinci argümandaki karakterleri içerdiğini doğrular
        System.out.println("4) Check if 643287460 contains only 0123456789 >>>" +
            StringUtils.containsOnly("643287460", "0123456789"));

        //İki argümanı karşılaştırır, farklı oldukları kısmı döner.
        System.out.println("5) Compare ABCDEFG and ABCdefg >>>" +
            StringUtils.difference("ABCDEFG", "ABCdefg"));

        //Girilen nesne referansı null ise, "" dönülür.
        //ObjectUtils.toString() ile aynıdır.
        System.out.println("6) Return default string >>>" + "**" +
            StringUtils.defaultString(null) + "**");

        //Dizideki bütün karakter katarlarını araya "$#$" koyarak bir katara yerleştirir
        System.out.println("7) Join Strings using separator >>>" +
            StringUtils.join(new String[] { "AB", "CD", "EF" }, "$#$"));

        //SubString
        System.out.println("8) Substring >>>" +
            StringUtils.substring("SUBSTRING", 1, 5));

        //Katarı ters çevirir.
        System.out.println("9) Reverse >>>" + StringUtils.reverse("REVERSE"));

        //Katardaki boşlukları budar. null ise "" döner.
        System.out.println("10) Trim String. No NullPointerException >>>" +
            StringUtils.trim(null));

        //Katardaki boşlukları budar. null ise "" döner.
        System.out.println("11) Empty String >>>" +
            StringUtils.trimToEmpty(null) + "<<<");

        //Equals kontrolu yapar. NullPointerException fırlatmaz!
        System.out.println("12) Comapre null and null >>>" +
            StringUtils.equals(null, null));

        //Baştaki ve sondaki boşlukları budar
        //null ise "" döner.
        System.out.println("13) Strip whitespace >>>" +
            StringUtils.stripToEmpty("     ABCD      "));

        //İlk argümandaki katarın "!@#$%^&*" karakterlerini içermediğini doğrular
        System.out.println("14) Check that ABCD contains none of !@#$%^&* >>>" +
            StringUtils.containsNone("ABCD", "!@#$%^&*"));
    }
}

SystemUtils sistem değişkenlerini okur ve uygun değerleri döner. Örneğin programınızın çalışacağı sistemin Java'nın en az 1.3 sürümünü desteklemesinin istiyorsanız: SystemUtils.isJavaVersionAtLeast(1.3f)); metodunu kullanabilirsiniz. Örnek kullanım:

import org.apache.commons.lang.SystemUtils;

public class SystemUtilsTrial {
    public static void main(String[] args) {
        System.out.println("1) FILE_SEPARATOR =" + SystemUtils.FILE_SEPARATOR);
        System.out.println("2) JAVA_EXT_DIRS =" + SystemUtils.JAVA_EXT_DIRS);
        System.out.println("3) JAVA_HOME =" + SystemUtils.JAVA_HOME);
        System.out.println("4) Is 1.3 + =" +
            SystemUtils.isJavaVersionAtLeast(1.3f));
        System.out.println("5) JAVA_EXT_DIRS =" + SystemUtils.JAVA_EXT_DIRS);
        System.out.println("6) JAVA_VENDOR =" + SystemUtils.JAVA_VENDOR);
        System.out.println("7) OS_NAME =" + SystemUtils.OS_NAME);
    }
}

Çıktısı:
1) FILE_SEPARATOR =\
2) JAVA_EXT_DIRS =C:\JDeveloper\jdk\jre\lib\ext
3) JAVA_HOME =C:\JDeveloper\jdk\jre
4) Is 1.3 + =true
5) JAVA_EXT_DIRS =C:\JDeveloper\jdk\jre\lib\ext
6) JAVA_VENDOR =Sun Microsystems Inc.
7) OS_NAME =Windows 2000

ClassUtils sınıfı Java Reflection API'yi kullanmadan sınıflarınız hakkında daha detaylı bilgiye sahip olmanızı sağlar. Ancak bu metodları kullanırken iki kere düşünün. Çünkü çoğu durumda böyle bir özelliği kullanmanız yazılımınızın tasarımının kötü olduğu anlamına gelir.

import org.apache.commons.lang.ClassUtils;

public class ClassUtilsTrial {
    public static void main(String[] args) {
        System.out.println("1) Interfaces implemented by java.lang.String >>> " +
            ClassUtils.getAllInterfaces(String.class));
        System.out.println("2) SuperClasses of java.lang.String >>> " +
            ClassUtils.getAllSuperclasses(String.class));
        System.out.println("3) PackageName of a string >>> " +
            ClassUtils.getPackageName("A String", "IfNull"));
        System.out.println("4) Every String is an Object = " +
            ClassUtils.isAssignable(String.class, Object.class));
        System.out.println("5) Every Object is an String = " +
            ClassUtils.isAssignable(Object.class, String.class));
    }
}

Çıktısı:
1) Interfaces implemented by java.lang.String >>> [interface java.io.Serializable
, interface java.lang.Comparable, interface java.lang.CharSequence]
2) SuperClasses of java.lang.String >>> [class java.lang.Object]
3) PackageName of a string >>> java.lang
4) Every String is an Object = true
5) Every Object is an String = false

StringEscapeUtils sınıfı da yeri geldiğinde çok işinize yarayacak bir sınıftır. Program yazarken bazen Java sözdizimi ile  HTML, JavaScript, SQL gibi dillerin söz dizimleri karışabilir. Örneğin; bir servlet'in <p>MyName<p> metnini ekrana basmasını isteyip doğrudan sayfaya yazdırırsanız, web sunucusu bunu HTML olarak olarak yorumlayıp <p><p> etiketlerini kaldıracaktır: MyName. Bu hatadan kurtulmak için StringEscapeUtils'in sağladığı metodları kullanabilirsiniz. StringEscapeUtils HTML'den başka birçok dili daha desteklemekte:

import org.apache.commons.lang.StringEscapeUtils;

public class StringEscapeUtilsTrial {
    public static void main(String[] args) {
        String strHTMLInput = "<p>MyName<p>";
        String strEscapeHTML = StringEscapeUtils.escapeHtml(strHTMLInput);
        String strUnEscapeHTML = StringEscapeUtils.unescapeHtml(strEscapeHTML);
        System.out.println("Escaped HTML >>> " + strEscapeHTML);
        System.out.println("UnEscaped HTML >>> " + strUnEscapeHTML);
    }
}


ArrayUtils sınıfı da onlarca metod ve bunların bütün ilkel tipler ve java.lang.Object için aşırı yüklenmiş hallerini içerir. Ayrıca yine aşağıdaki xxx kısaltması bütün ilkel tipler ve Object sınıfı için kullanılmıştır. Sizin de tahmin edebileceğiz gibi bu metodlar dizi tipindeki değişkenler üzerinde yapılan çeşitli işleri kolaylaştırır.
  • add(xxx[], xxx) bir diziye yeni bir eleman ekler. Dizinin boyutunu büyüterek tabii ki
  • clone(xxx[]) dizinin kopyasını döner.
  • contains(xxx[], xxx)dizide bir eleman arar.
  • getLength(Object) dizinin eleman sayısını döner. Geçirilen referans dizi değilse, IllegalArgumentException fırlatılır.
  • hashCode(Object), equals(Object, Object), toString(Object)
  • daha önce tanıttığım metodların diziler üstünde çalışanı.
  • indexOf(xxx[], xxx) and indexOf(xxx[], xxx, int) String sınıfındaki metodlarla aynı işeve sahiptirler. Ancak diziler üzerinde çalışırlar. Ayrıca a lastIndexOf metodu da vardır.
  • isEmpty(xxx[]) dizinin boş veya null kontrolünü yapar.
  • isSameLength(xxx[], xxx[]) argümanlarındaki dizilerin aynı uzunluğa sahip olup olmadığını kontrol eder.
  • add() metodunun yanında iki tip remove metodu da vardır. İlki verilen indexteki elemanı, remove(xxx[], int), belirtilen elemanı siler, remove(xxx[], xxx).
  • reverse(xxx[]) diziyi ters çevirir.
  • subarray(xxx[], int, int) dizinin belirtilen aralıklardan bir alt dizisini oluşturup döner.
  • toObject(xxx[]) ve toPrimitive(Xxx[]) metodları ilkel tipler ile bunların sarıcıları arasında dönüşüm yapar 
ArrayUtils.toMap(Object[]) iki boyutlu dizilerden Map nesnesi oluşturur. Örneğin;

    Map colorMap = MapUtils.toMap(new String[][] {{
               {"RED", "#FF0000"},
               {"GREEN", "#00FF00"},
               {"BLUE", "#0000FF"}
    });
    

    Kolay Gelsin

    24 Mayıs 2011 Salı

    Takip Ettiğiniz Kişi Facebook Chat'te Çevrimiçi Olunca Haber Veren Program

    O kadar lazım çok olur mu bilmem ama bana lazım oldu ve çözümü şöyle buldum. Daha farklı da yapılabilir tabi.

    Ön Bilgi: Facebook Chat servisi XMPP/Jabber protokolü üzerinde çalışıyor. Bu protokolün belirtimlerine(specification) göre, ne zaman bir arkadaşınız FB Chat'te durumunu değiştirirse (Çevrimiçi, Dışarıda, Çevrimdışı) protokol istemcilerini bilgilendirir. MSN gibi yani.

    Benim yöntemim bu protokolü kullanarak FB'a bağlanıp gelen uyarılar içinden istediğiniz kişiyi süzmekten oluşuyor.

    Bunun için öncelikle bir FB Chat istemcisine ihtiyacımız var. Açık Kaynak Yazılım felsefesi sağolsun burada imdadımıza yetişiyor. SourceForge'da JFBChat adında işimizi görecek küçük bir program var. Kaynak kodlarını SVN'den indirebilirsiniz.



    İşin zor kısmı programın FB'den gelen uyarıları dinleyen kısmı bulmakta. Kodu biraz deştiğinizde jfbchat.listeners.MyRosterListener sınıfının bu işi yaptığını fark edebilirsiniz. Gerisi artık sadece bir if kontrolüne kalıyor. Aşağıdaki ilk satır bir kullanıcı durumunu değiştirdiğinde konsola bir debug mesajı basıyor.

    new DMessage(contact.getUser() + " has changed status and he is now " + contact.getPresence().toString() + ".").println();
    

    contact.getUser()

    Çağrısı ile kullanıcının FB'taki tam adına erişebilirsiniz.
    Debug mesajından sonra şöyle basit bir if ile istediğiniz kullanıcıyı süzebilir, çevrimiçi olduğunda, sınırları hayalleriniz ve programcılık yeteneklerinizle belirlenmek üzere istediğiniz uyarıyı verdirebilirsiniz.

    if (contact.getUser().indexOf("KULLANICI-ADI")!=-1)
    {
    System.out.println("Kahvenin Hatırı'nın debug çağrısı");
    new MP3("C:\\PolisFilmTheme.mp3").play();
    }
    

    Netbeans projesi de burada.
    Kolay gelsin.

    22 Mayıs 2011 Pazar

    Apache Commons IO Kütüphanesi

    Apache Yazılım Derneği'nin Java'da sık karşılaşılan, JDK tarafından sağlanan sınıflarla yaparsanız "bin dereden su getirmeye" benzeyen görevleri, daha kolay biçimde gerçekleştirmenizi sağlayan araçları bir araya getirdiği Commons adında bir projesi var.

    Bu yazıda bu projenin giriş çıkış işlemleri üzerine yoğunlaşan IO kütüphanesini inceliyoruz.Kütüphaneyi buradan indirebilirsiniz. commons-io-2.0.1.jar dosyasını projenizin classpath'ına eklemeniz yeterli.

    Bu jar'ın içindeki bazı önemli sınıfları inceleyelim.

    IOUtils sınıfı okuma, yazma ve kopyalama işlemleri için bazı yardımcı metodlar barındırır. Bu metodlar InputStream, OutputStream, Reader ve Writer nesneleri üzerinde çalışır.

    Örneğin çok sık karşılaşılan bir işlem olan "herhangi bir InputStream'dan gelen verilere String formatında erişme" yi JDK sınıflarıyla şu şekilde gerçeklersiniz:

    InputStream in = new URL( "URL-HERE" ).openStream();
     try {
       InputStreamReader inR = new InputStreamReader( in );
       BufferedReader buf = new BufferedReader( inR );
       String line;
       while ( ( line = buf.readLine() ) != null ) {
         System.out.println( line );
       }
     } finally {
       in.close();
     }
    

    Ancak IOUtils sınıfını kullanarak, bu işlemi çok daha basit bir şekilde halledebilirsiniz:

    InputStream in = new URL( "URL-HERE" ).openStream();
     try {
       System.out.println( IOUtils.toString( in ) );
     } finally {
       IOUtils.closeQuietly(in);
     }
    


    Buradaki
    IOUtils.toString( in );

    metodu herhangi bir InputStream'i String olarak döner. Biz burada URL'den gelen bir akış(stream) kullandık. Ama sadece bununla sınırlı değilsiniz. InputStream dönen herhangi bir kaynak kullanabilirsiniz. Örneğin; File nesneleri, BufferedReader'lar...

    FileUtils sınıfı File nesneleriyle birlikte kullanabileceğiniz çeşitli metodlar içerir. Bu metodları kullanarak dosyalarla okuma, yazma, kopyalama ve karşılaştırma işlemlerini çok daha kolay yapabilirsiniz. Örneğin; bir dosyayı satır satır okumak için şu kod parçasını kullanabilirsiniz.

    File file = new File("/commons/io/project.properties");
    List lines = FileUtils.readLines(file, "UTF-8");
    

    FilenameUtils sınıfı da File nesneleri kullanma zorunluluğunu ortadan kaldırarak, dosya adlarıyla uğraşmanın daha basit yollarını sunar. Bu sınıf genelde Linux/Windows sistemler arası uyumluluğu sağlamak için kullanılır. Örneğin bir dosya adındaki çift noktaları kaldırmak için şu kodu kullanabilirsiniz.

    String filename = "C:/commons/io/../lang/project.xml";
    String normalized = FilenameUtils.normalize(filename);
    // çıktı: "C:/commons/lang/project.xml"
    

    FileSystemUtils sınıfı işletim sistemindeki dosya sistemi yapısı ilgili işlemler yapmak için JDK'da bulunmayan bazı yardımcı metodlar içerir. Örneğin: C diskindeki boş alan miktarını öğrenmek için;

    long freeSpace = FileSystemUtils.freeSpace("C:/");
    

    LineIterator sınıfıyla metin tabanlı bir dosyanın satırlarına kolayca tek tek ulaşabilirsiniz. LineIterator kurucu ile oluşturulabileceği gibi IOUtils ve FileUtils sınıfları üzerinden fabrika meodlarıyla da oluşturulabilir. Örnek kullanımı:

    LineIterator it = FileUtils.lineIterator(file, "UTF-8");
     try {
       while (it.hasNext()) {
         String line = it.nextLine();
         /// do something with line
       }
     } finally {
       LineIterator.closeQuietly(iterator);
     }
    

    Hazır Dosya Filtreleri
    org.apache.commons.io.filefilter paketinde JDK'nın java.io.FileFilter ve java.io.FilenameFilter. interface'lerini birleştirip, bunlara daha gelişmiş ek özellikler katan IOFileFilter interface'i bulunur. Pakette ayrıca bu interface'in hazır örnekleri de mevcuttur. Bu filtreleri örneğin bir FileDialog nesnesinde sadece belli tür dosyaları göstermek için kullanabilirsiniz. Hazır filtrelerden bazıları şunlardır. Not: Sınıf isimleri yeterince açıklayıcı olduğu için, ayrıca açıklamalarını yazmadım.


    DirectoryFilter, PrefixFileFilter, SuffixFileFilter, NameFileFilter, WildcardFileFilter, AgeFileFilter, SizeFileFilter, TrueFileFilter, FalseFileFilter, NotFileFilter, AndFileFilter, OrFileFilter

    Örneğin, geçerli dizindeki, dizin olmayan, "A" ile başlayıp,  ".java" veya ".class" ile biten dosyaları listelemek için:

    File dir = new File(".");
      String[] files = dir.list( 
        new AndFileFilter(
          new AndFileFilter(
            new PrefixFileFilter("A"),
            new OrFileFilter(
              new SuffixFileFilter(".class"),
              new SuffixFileFilter(".java")
            )
          ),
          new NotFileFilter(
            new DirectoryFileFilter()
          )
        )
      );
      for ( int i=0; i<files.length; i++ ) {
        System.out.println(files[i]);
      }
    


    Bu pakette ayrıca FileFilterUtils sınıfı da mevcuttur. Bu sınıf az önce saydığın filtre sınıflarını import etmeden statik alanlar üzerinden çok daha kolay çağırmayı sağlar. Az önceki örnek bu sınıf yardımıyla tekrar yazılırsa şu hale dönüşür:

    File dir = new File(".");
      String[] files = dir.list( 
        FileFilterUtils.andFileFilter(
          FileFilterUtils.andFileFilter(
            FileFilterUtils.prefixFileFilter("A"),
            FileFilterUtils.orFileFilter(
              FileFilterUtils.suffixFileFilter(".class"),
              FileFilterUtils.suffixFileFilter(".java")
            )
          ),
          FileFilterUtils.notFileFilter(
            FileFilterUtils.directoryFileFilter()
          )
        )
      );
      for ( int i=0; i<files.length; i++ ) {
        System.out.println(files[i]);
      }
    

    Dosya Karşılaştırıcıları
    org.apache.commons.io.comparator paketi java.io.File sınıfı için java.util.Comparator interface'inin birkaç hazır örneğini içerir. Bu karşılaştırıcılar dosya listelerini veya dizilerini sıralamak için kullanılabilir.

    Bütün karşılaştırıcılar kendi özelliklerine göre uygun sort(File...) ve sort(List) metodlarını içerir. Örneğin, bir dizindeki dosyaları dosya adına göre sıralamak için;

    File[] files = dir.listFiles();
    NameFileComparator.NAME_COMPARATOR.sort(files);
    

    Aynı işlemi tek satırda da yapabilirsiniz:

    File[] files = NameFileComparator.NAME_COMPARATOR.sort(dir.listFiles());
      

    CompositeFileComparator sınıfı karşılaştırma ve sıralama işlemini birkaç karşılaştırıcıyı birleştirerek yapabilir. Örneğin dosyaları önce türüne sonra da adına göre sıralamak için;

    CompositeFileComparator comparator =new CompositeFileComparator(
    DirectoryFileComparator.DIRECTORY_COMPARATOR,NameFileComparator.NAME_COMPARATOR);
    File[] files = dir.listFiles();
    comparator.sort(files); 


    Akışlar(Stream)
    org.apache.commons.io.input ve org.apache.commons.io.output paketleri akışların kullanışlı birkaç örneğini içerir. Bazıları;

    • Null output stream - Kendisine gönderilen bütün veriyi emer (yok eder).
    • Tee output stream - Çıktıyı tek akış yerine iki akışa yönlendirir.
    • Byte array output stream - JDK'daki abisinin daha hızlısı
    • Counting streams - Aldığı veriyi byte olarak sayan akış
    • Proxy streams - Proxy tasarım desenini uygular ve akışı uygun metoda yönlendirir.
    • Lockable writer
    Bu yazıda Apache Commons'un IO kütüphanesini tanıtmaya çalıştım. Sınıflar ve kullanımları hakkında daha detaylı bilgiyi kütüphanenin Javadoc'unda bulabilirsiniz.

    14 Mayıs 2011 Cumartesi

    Basit Bir Anlık Mesajlaşma Yazılımı

    Şimdi farkettim 2 sene olmuş İşletim Sistemleri dersinden ödev olarak basit bir MSN Messenger yapalı.

    Proje hakkında bilgiyi aşağıdaki sunumda bulabilirsiniz:



    İndirme bağlantısı da burada.

    Pulp Fiction Duvar Kağıdı

    Türkçesi: "İntikamımı aldığımda..."



    Polis Filmi Duvar Kağıdı

    Polis en sevdiğim filmdir. Bir zamanlar en önemli sahnelerinden biri için bir duvar kağıdı yapmıştım. Buyrun:

    13 Mayıs 2011 Cuma

    SCJP Sticker'ı

    SCJP sınavını geçince şöyle bir sticker hazırlamıştım.





















    Beğenip de kullanmak isteyen olursa buyursun.
    Tasarımı Paint.Net 'te yapmıştım. Bu da kaynak dosyası.

    12 Mayıs 2011 Perşembe

    Dosya Paylaşımı İçin Box.net'e Geçtim

    Blog'umdan dosya paylaşımı daha rahat yapabilmek için box.net kullanmaya karar verdim. Daha önce paylaştığım Maven Rehberi'ne buradan ulaşabilirsiniz.

    MAVEN-REHBER.pdf