Test classlarının Application servera deploy edilmesini engellemek

29 June, 2009 (04:54) | Programming | By: selcuk

Siz aksini belirtmediğiniz sürece Eclipse’in WTP toolu, EJB projenizin içindeki JUnit test classlarını sunucuya deploy eder.

Hatta test classlarının yanısıra başka test resourcelarınız var ise, jndi.properties, persistence.xml vs. gibi bu resourcelarda otomatik olarak containera deploy edilir. Geliştirme sürecinde göz ardı etseniz de bazen bu resourcelar problem yaratabilirler.

Bunu engellemenin iki yolu var.
Projenizin dizinindeki .settings/org.eclipse.wst.common.component dosyasını text editör ile açın. Test folderları gözünüze hemen çarpacaktır, o satırları silmeniz yeterli.

<?xml version="1.0" encoding="UTF-8"?>
<project-modules id="moduleCoreId" project-version="1.5.0">
    <wb-module deploy-name="my-ejb">
        <wb-resource deploy-path="/" source-path="/src/main/resources"/>
        <wb-resource deploy-path="/" source-path="/src/main/java"/>
        <wb-resource deploy-path="/" source-path="/src/test/resources"/> <!--Deploy etmek istemediğiniz bir folder, dolayısıyla bu line silinmeli-->
        <wb-resource deploy-path="/" source-path="/src/test/java"/><!--Silinecek-->
        <property name="java-output-path"/>
    </wb-module>
</project-modules>
<?xml version="1.0" encoding="UTF-8"?>
<project-modules id="moduleCoreId" project-version="1.5.0">
    <wb-module deploy-name="my-ejb">
        <wb-resource deploy-path="/" source-path="/src/main/resources"/>
        <wb-resource deploy-path="/" source-path="/src/main/java"/>
        <property name="java-output-path"/>
    </wb-module>
</project-modules>

Diğer bir yöntem de bu folderları class path den çıkarmak. Test resourcelarınızı project properties/Java build path/Source kısmından exclude edebilirsiniz.

Her iki yöntem için de test resoucelarınızın ayrı bir folder içinde olmaları gerekir. Project context menüsünden New/Source Folder komutu ile ayrı bir source folderı açarak, test resourcelarınızı buraya atabilirsiniz.

Kolay gelsin.

MySql + JPA + JBoss + Eclipse Türkçe karakterter sorunu var mı yok mu?

28 June, 2009 (04:49) | Programming | By: selcuk

Default bir kurulumda evet sorunlar var. Fakat bir kaç düzenleme ile bertaraf edilebilir.

Hemen karşımıza çıkan sorun şu, JUnit testinde bir Entity nizin bazı fieldlarına Tükçe karakter içeren değerler atarsanız geçersiz karakterlerle ilgili exception almanız muhtemel.

Burada bir çok noktada veri encode edilip decode ediliyor. Herşeyden önce kodumuzu yazdığımız yer bir text editör ve onun bir encodingi var. Onu şimdiye kadar yapmadıysanız hemen UTF-8 yapmakla işe başlayabilirsiniz. Bunu workspace bazında UTF-8 yapmak için Window/Preferences/Workspace/Text file encoding kısmını kulanabilirsiniz. Proje bazlı yapmak isterseniz, Project/Properties/Resource/text file encoding seçeneğini kullanabilirsiniz.

Maven kullananlar için bunu pom.xml den yapmak da mümkün.

<project>
...
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>

JPA kısmında da bir düzenleme yapmak gerekiyor. persistence.xml de connection url imizde kullandığımız encodingin ne olduğunu bildirmeliyiz.

<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/uzman?autoReconnect=true&amp;useUnicode=true&amp;characterEncoding=utf8"/>

MySQL tarafında,MySQL’i kendi konfigurasyon toolu ile konfigure ederek, utf-8 ‘in default encoding olarak tercih ettiğimizi belirtmeliyiz.

Yalnız eğer veritabanızı daha önce açtıysanız, default ayarları değiştirmeniz problemimizi çözmeye yetmeyecektir. Var olan veritabanımızın da encodingini değiştirmemiz gerekir. Bunun için de

ALTER DATABASE mydatabase CHARACTER SET 'utf8' COLLATE  utf8_turkish_ci

komutunu MySQL Query browser da çalıştırmalısınız.

Kolay gelsin.

Swing exceptionlarını yakalamak.

28 June, 2009 (04:04) | Programming | By: selcuk

Swing EDT (Event dispatch thread) threadi içerisinde bir exception çıktığında bu exceptionı kendi threadinizde yakalamanız mümkün olmaz.

Exceptionlar stack ile alakalı olduklarından fırlatıldıklarında kendi stacklerinde handle edilebilirler.

EDT Nedir ?

Swing ve AWT nin kendi eventlerini, boyama işlerini yönettiği bir thread vardır. Bu threade Event dispatch thread (EDT) olarak isimlendirilmiştir.

Swing libraryden herhanbir class kullanıldığında mutlaka bu thread içerisinde oluşturmak ve kullanmak gerekmektedir. Main threadden EDT içerisine girmek için bir kaç yol var, fakat en çok tercih edileni, SwingUtilities.invokeLater metodudur.  Daha yeni ve daha yakışıklı bir metod daha incelenmek istenirse, JSR 296: Swing Application Framework specinde tanıtılmıştır. Fakat EDT exception konusunu tamamlamak için biz şimdilik SwingUtilities.invokeLater kullanmaya devam edelim.

public static void main(String[] args) {

	SwingUtilities.invokeLater(new Runnable() {
	    @Override
	    public void run() {
		/*
		 * Devam eden satirlar EDT içerisinde çalışmaktadır.
		 */
		JFrame frame = new JFrame("Pencere başlığı");
		frame.setSize(new Dimension(320, 240));
		frame.setVisible(true);
		throw new RuntimeException("EDT içerisinde bir exception fırlatıldı.");
	    }
	});

}

Yukarıdaki örneğimizde JFrame’, event dispatch thread içerisinde kullanmış olduk.

Bu thread içerisinde bir runtime exception fırlatıldığında bunu yakalayıp kullanıcıya göstermek istersek nasil bir yöntem izleyebiliriz.

Benzer şekilde JSR296 ile tanıtılan SwingWorker lar içerisinde de runtime exceptionlar fırlatılmış olabilir. Bunları da yakalayıp kullanıcıy bilgilendirmek isteyebiliriz.

Dolayısıyla bizim ihtiyacımız olan şey, deyim yerinde ise threadler üstü bir exception yakalama mekanizmasıdır.

Thread.setDefaultUncaughtExceptionHandler

Thread sınıfının static bir metodu “setDefaultUncaughtExceptionHandler”,  zaten isminden de anlaşılacağı gibi, tüm threadlerde herhangibir catch bloğunda yakalanarak yutulmayan exceptionların handle edilmesini sağlıyor. Bunun için Thread.UncaughtExceptionHandler interface inin bir implemantasyonunu motoda geçmeniz gerekir.

Anonymous bir şekinde implement ederek tanıtacak olursak kodumuz aşağıdaki gibi olacaktır.

import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;

public class AppClient {

    public static void main(String[] args) {

	Thread
		.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
		    public void uncaughtException(Thread t, final Throwable e) {
			SwingUtilities.invokeLater(new Runnable() {
			    @Override
			    public void run() {
				/*
				 * JOptionPane bir swing sınıfı olduğundan,
				 * SwingUtilities.invokeLater ile kullanılıyor.
				 */
				JOptionPane.showMessageDialog(null, e
					.getMessage());
			    }
			});
		    }
		});

	SwingUtilities.invokeLater(new Runnable() {
	    @Override
	    public void run() {
		/*
		 * Devam eden satirlar EDT içerisinde çalışmaktadır.
		 */
		JFrame frame = new JFrame("Pencere başlığı");
		frame.setSize(new Dimension(320, 240));
		frame.setVisible(true);
		throw new RuntimeException(
			"EDT içerisinde bir exception fırlatıldı.");
	    }
	});
    }
}

Artık ister EDT ister Swingworkerlar içerisinde olsun, herhanbiri exception yakalanmadığı takdirde mutlaka tanıtmış olduğumuz Thread.UncaughtExceptionHandler tarafından handle edilmiş olacaktır.

Son olarak delphicilere bir not, bu şekilde global exception handler tanıtmış olduk. Delphi deki default exception handler mekanizması ile aynı sonucu elde etmiş oluruz. Delphi de siz hiç bir şey yapmasanız da bir exception oluştuğunda mutlaka ekranda bir messagebox ile gösterililir. Bu şekilde Java Swing uygulamasında da benzer bir davranışı elde etmiş olduk.

Kolay gelsin.

Directory Synchronizer

3 May, 2009 (10:53) | Program Önerileri | By: selcuk

Ücretsiz bir masaüstü aracı. İki veya daha fazla klasörü içeriklerini kopyalayarak birbirine eşitliyor. Peryodik yedek almak, çalışmalarınızı dizüstü bilgisayarınıza yada taşınabilir diskinize atmak için kullanabilirsiniz.

Detaylı bilgi için: http://sites.atay.org/directory-synchronizer

Download etmek için: https://directorysynchronizer.dev.java.net/servlets/ProjectDocumentList

Kenai - açık kaynak platformu

27 April, 2009 (09:22) | Programming | By: selcuk

Kenai - açık kaynak platformu

Yeni bir open source platformu açıldı.

Kenai.com, java.net gibi SUN ın desteklediği bir open source platformu.  Açık kaynak projenize bir yer açıp, ücretsiz sunulan bir çok hizmeti buradan alabiliyorsunuz.

Yeni açılmış olmasına rağmen bir anda bir ton proje açıldı. Büyük bir hızla güzel bir communtiy oluşuyor. 

Bu platformda, JTable cell editors isminde bir open source proje de biz açtık. Vakit buldukça swing JTable ına cell editorler oluşturuyoruz. 

Platformun sourceforge ve java.netten bir kaç artısı göze çarpıyor.  Tümleşik bir wiki, source control management, issue tracking system (jira veya bugzilla ikisinden birini tercih edebiliyorsunuz.),Forum, mailing list, dokuman ve downloadlarınızı yönetebileceğiniz bir arabirim sunuyor.  Ayrıca eğer Netbeans kullanıyorsanız, harika bir entegrasyon yapılmış. Hem issue trackerla hem de SCM ile entegre olabiliyor.

http://www.kenai.com

Java Swing ile ve JTable ile ilgili iseniz bizim projemize de bir göz atın lütfen.

http://kenai.com/projects/celleditorlibrary

Mp3 indirme programı

27 April, 2009 (05:10) | Program Önerileri | By: selcuk

Bilgisayarınızdan müzik dinlemek gibi bir alışkanlığınız var ise kullanabileceğiniz fevkalade başarılı bir araç var.
Bu bir kaç KB lik bir program. http://www.mp3indirmeprogrami.com den indiriyorsunuz, masaüstünüze atıyorsunuz, çalıştırdığınızda minicik bir pencere açılıyor, oraya yazdığınız kelimelere göre mp3 leri internetten arıyor. Dilerseniz sonuçları seçip dinleyebiliyorsunuz yada direk download edip, taşınabilir mp3 çalarınıza atabiliyorsunuz.

Yaptığı şey bilindik search enginlerini kullanarak mp3 leri arayıp bulmak ve sahte linkleri elemek. Sizi arama motorlarının sonuçlarını taramaktan kurtarıyor, sonuçların içerisindeki mp3 leri bulup listeliyor.

Property Based Object Comparer

10 February, 2009 (02:09) | Programming | By: selcuk

Today i need to get two different type of objects compared by their property values.

Problem was those objects are not supporting IComparable interface. Yet they might be different type of objects. Basicly they are plain objects, POJO’s.  Google’ed to find a class that compares two objects by looking their property values but couldn’t find any simple implementation.

So I had to code it right away and I wanted to share.


namespace Sample.Data
{
public class PropertyBasedComparer
{

public bool AreEqual(Object obj1, Object obj2)
{
if (obj1 == null) throw new ArgumentNullException();
if (obj2 == null) throw new ArgumentNullException();

PropertyInfo[] properties = obj1.GetType().GetProperties();
foreach (PropertyInfo p in properties)
{
if (obj2.GetType().GetProperty(p.Name)==null)
continue;

if (p.PropertyType.IsValueType)
{
if (p.GetValue(obj1, null) != p.GetValue(obj2, null))
return false;
continue;
}

if (p.PropertyType == typeof(string))
{
if (!p.GetValue(obj1, null).ToString().Equals(p.GetValue(obj2, null).ToString()))
return false;
}
}
return true;
}
}
}