<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	>

<channel>
	<title>atay.org</title>
	<atom:link href="http://www.atay.org/feed" rel="self" type="application/rss+xml" />
	<link>http://www.atay.org</link>
	<description></description>
	<pubDate>Tue, 01 Sep 2009 07:07:07 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Java reflection proxy sınıfı</title>
		<link>http://www.atay.org/java-reflection-proxy-sinifi</link>
		<comments>http://www.atay.org/java-reflection-proxy-sinifi#comments</comments>
		<pubDate>Wed, 26 Aug 2009 13:40:07 +0000</pubDate>
		<dc:creator>selcuk</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<category><![CDATA[AOP]]></category>

		<category><![CDATA[CGLIB]]></category>

		<category><![CDATA[Java]]></category>

		<category><![CDATA[Proxy]]></category>

		<category><![CDATA[Reflection]]></category>

		<guid isPermaLink="false">http://www.atay.org/?p=126</guid>
		<description><![CDATA[Proxyleri kullarak kendi AOP frameworkünüzü oluşturabilirsiniz. İster trace almak, ister performans ölçmek maksatlı olsun, belirli bir classınızın bütün method çağrılarını yakalayabilirsiniz. Hem de bunu classınızı modifiye etmeden, runtime da yaparsınız.
Proxyler loglama amacı ile de kullanılabilir, fakat bütün bir trace&#8217;i loglamaktansa sadece loglanması gereken şeyleri loglamak, logların okunabilirliği ve performansı için daha uygun olacaktır.
Java runtime ile [...]]]></description>
			<content:encoded><![CDATA[<p>Proxyleri kullarak kendi AOP frameworkünüzü oluşturabilirsiniz. İster trace almak, ister performans ölçmek maksatlı olsun, belirli bir classınızın bütün method çağrılarını yakalayabilirsiniz. Hem de bunu classınızı modifiye etmeden, runtime da yaparsınız.</p>
<p>Proxyler loglama amacı ile de kullanılabilir, fakat bütün bir trace&#8217;i loglamaktansa sadece loglanması gereken şeyleri loglamak, logların okunabilirliği ve performansı için daha uygun olacaktır.</p>
<p>Java runtime ile gelen Proxy classı sizin parametre olarak vereceğiniz interface&#8217;i run time da implement eden bir class generate eder.</p>
<p>Ve aslında runtime da oluşan bu sınıf,  basitçe yapılan bütün method callarını sizin vereceğiniz bir InvokeHandler&#8217;a yönlendirir. InvokeHandler&#8217;ın imzası</p>
<p><em><strong>public Object invoke(Object proxy, Method method, Object[] args)</strong></em> şeklinde olan bir metodu vardır. Bu metod sizin proxy nesnenize yapacağınız method call&#8217;larının düşeceği metoddur.</p>
<p>Örnek</p>
<pre class="brush: java;">
public interface OrderList {
public double calculateSummary();
}
</pre>
<p>Şeklinde tek metodlu bir interfaceimiz olsun.<br />
Şimdi bu interface&#8217;i bir proxy implemantasyon ile sarıp tek metodumuz calculateSummary çağrılarını yakalayalım.</p>
<pre class="brush: java;">
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
* Java reflection.proxy sınıfı örnek kullanımı.
*
* @author selcuk
*
*/
public class AppClient implements InvocationHandler {
/**
*
* Proxy'nin her bir methodu call edildiğinde buraya düşer.&lt;br&gt;&lt;hr&gt;
* {@inheritDoc}
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(method.getName() + &quot; called.&quot;);
return 1234d;
}

public static void main(String[] args) {
OrderList proxiedOrder = (OrderList) Proxy.newProxyInstance(OrderList.class.getClassLoader(), new Class&lt;?&gt;[] { OrderList.class }, new AppClient());
System.out.println(proxiedOrder.calculateSummary());
}

}
</pre>
<p>Çalıştırdığımızda</p>
<p>calculateSummary called.<br />
1234.0</p>
<p>çıktısını alırız.</p>
<p>En basit şekli ile <span id="main" style="visibility: visible;"><span id="search" style="visibility: visible;">Cephe <em>Yönelimli Programlama</em> (Aspect Oriented Programming) temel aldığı yapıya bir örnek vermiş olduk. AOP frameworkleri de proxyler aracılığı ile classlarınızı sararlar ve belirttiğini &#8220;advice&#8221;</span></span> ları çalıştırırlar. Advice metod giriş ve/veya çıkışlarında çalıştırılan kodun AOP terminolojisindeki adıdır.</p>
<p><span id="main" style="visibility: visible;"><span id="search" style="visibility: visible;">Bundan sonraki aşamada, invoke metodunda OrderList arayüzünün gerçek bir implementasyonunun metodlarını çağırmak gerekecektir.</span></span></p>
<pre class="brush: java;">
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println(method.getName() + &quot; begins...&quot;);
Object invoke = method.invoke(this.target, args);
System.out.println(method.getName() + &quot; ends...&quot;);
return invoke;
}
</pre>
<p><span style="visibility: visible;"><span style="visibility: visible;">this.target, InvokeHandler implementasyonumuza constructor&#8217;ı aracılığı ile yada bir setter metodu ile sağlanmış olmalıdır.</span></span></p>
<p>java.lang.reflect.Proxy&#8217; sınıfının bir kısıtından bahsedilebilir, o da orijinal sınıfınıza proxy almak için mutlaka bir interface kullanmış olmanızdır. Eğer proxy almak istediğiniz class hiç bir sınıfı implement etmiyor ise, bu durumda cglib kullanmanız gerekecektir.</p>
<p>CGLIB http://cglib.sourceforge.net/ adresinden elde edebileceğiniz open source bir kütüphane. Kaba bir tarifle proxy alma işini cglib byte code generate ederek yapiyor. Orijinal classınızdan extend eden bir classı runtimeda generate ediyor.</p>
<p>Kolay gelsin.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.atay.org/java-reflection-proxy-sinifi/feed</wfw:commentRss>
		</item>
		<item>
		<title>Migrene bire bir Miglayout.</title>
		<link>http://www.atay.org/java-swing-miglayout</link>
		<comments>http://www.atay.org/java-swing-miglayout#comments</comments>
		<pubDate>Mon, 06 Jul 2009 15:00:12 +0000</pubDate>
		<dc:creator>selcuk</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<category><![CDATA[Eclipse]]></category>

		<category><![CDATA[Java]]></category>

		<category><![CDATA[Miglayout]]></category>

		<category><![CDATA[Swing]]></category>

		<guid isPermaLink="false">http://www.atay.org/?p=114</guid>
		<description><![CDATA[Swing frame tasarımını yapmak bazen çok acı veren bir tecrübeye dönüşebiliyor. Visual Studio&#8217;nun yada Delphinin form tasarım kaabiliyetlerine kıyasla,  Swing&#8217;in standart layoutlar o kadar çelimsiz ve kullanışsız ki&#8230;
Netbeans ve grouplayout ile bu problem bir hayli çözülmüş görünse de,  Eclipse&#8217;inizi terk edemiyorsanız, standart layoutlar ile frame&#8217;inizi kodlamak zorundasınız. Fakat maalesef standart layoutlar gerçekten şaka gibi. Basit [...]]]></description>
			<content:encoded><![CDATA[<p>Swing frame tasarımını yapmak bazen çok acı veren bir tecrübeye dönüşebiliyor. Visual Studio&#8217;nun yada Delphinin form tasarım kaabiliyetlerine kıyasla,  Swing&#8217;in standart layoutlar o kadar çelimsiz ve kullanışsız ki&#8230;</p>
<p>Netbeans ve grouplayout ile bu problem bir hayli çözülmüş görünse de,  Eclipse&#8217;inizi terk edemiyorsanız, standart layoutlar ile frame&#8217;inizi kodlamak zorundasınız. Fakat maalesef standart layoutlar gerçekten şaka gibi. Basit bir frame için saatlerce vakit harcamanız işten bile değil. Bu noktada yardımınıza Miglayout koşuyor. Bir &#8220;Mig&#8221; pilotu olan Mikael Grev tarafından open source  geliştirilmiş.  Miglayout muhtemelen Java 7 de standart layoutlarla birlikte Java SE içerisine koyulacak.</p>
<p>Bir kaç örnek ile bakalım.</p>
<p>Miglayout&#8217;un kullanılarak yapılan güzel bir liste frame&#8217;i yapalım.</p>
<pre class="brush: java;">
package com.devx.miglayout.swing;

import java.awt.Dimension;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

import net.miginfocom.swing.MigLayout;

/**
*
* Miglayout kullanımı gösteren bir örnek. Bir liste frame'i.
*
* @author selcuk
*
*/
public class AppClient {

public static void main(String[] args) {

SwingUtilities.invokeLater(new Runnable() {

@Override
public void run() {
JFrame f = new JFrame(&quot;Deneme&quot;);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setLayout(new MigLayout(&quot;&quot;, &quot;[fill,grow][]&quot;));

f.add(new JButton(&quot;BİRİNCİ&quot;), &quot;wrap,span&quot;);
f.add(new JButton(&quot;İKİNCİ&quot;));
f.add(new JButton(&quot;İKİNCİ.1&quot;), &quot;wrap, growx 0&quot;);
f.add(new JButton(&quot;ÜÇÜNCÜ&quot;), &quot;growy,pushy,wrap,span&quot;);
f.add(new JButton(&quot;DÖRDÜNCÜ&quot;), &quot;wrap,span&quot;);
f.add(new JButton(&quot;BEŞİNCİ&quot;), &quot;span&quot;);

f.setVisible(true);

f.setSize(new Dimension(500, 500));
f.setLocationRelativeTo(null);
}
});

}
}
</pre>
<p>Sonuç:</p>
<p><img class="alignnone size-medium wp-image-117" title="miglayout" src="http://www.atay.org/images/2009/07/miglayout-300x300.png" alt="miglayout" width="300" height="300" /></p>
<p>Yukarıda gördüğünüz gibi, &#8220;ÜCÜNCÜ&#8221; component, boşta kalan bütün alanı kaplayacak şekilde genişliyor. Diğer satırların yükseliği değişmiyor. Bunu sağlayan growy,pushy belirteçleridir.</p>
<p>Yine &#8220;İKİNCİ&#8221; ve &#8220;İKİNCİ.1&#8243; den oluşan satırda, bütün genişliği &#8220;İKİNCİ&#8221; component almaktadır. Frame&#8217;ı genişletseniz bile bütün genişlik &#8220;İKİNCİ&#8221; component&#8217;a aktarılacaktır.</p>
<p>Buna yakın bir formu bir liste gösterme ve o liste üzerinde filitreleme frame&#8217;i olarak kullanıyoruz.</p>
<p>Bir başka Miglayout örneği de edit frameleri için oluşturalim;</p>
<pre class="brush: java;">
package com.devx.miglayout.swing;

import java.awt.Dimension;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JSeparator;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.UnsupportedLookAndFeelException;

import net.miginfocom.swing.MigLayout;

/**
*
* Miglayout kullanımı gösteren bir örnek. Edit işlemi için tasarlanmış bir frame.
*
* @author selcuk
*
*/
public class AppClient2 {

public static void main(String[] args) throws ClassNotFoundException,
InstantiationException, IllegalAccessException,
UnsupportedLookAndFeelException {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame f = new JFrame(&quot;Deneme&quot;);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setLayout(new MigLayout(&quot;wrap 2&quot;, &quot;[right][left]&quot;));

f.add(new JLabel(&quot;Adı:&quot;));
f.add(new JTextField(), &quot;pushx,growx&quot;);

f.add(new JLabel(&quot;Soyadı:&quot;));
f.add(new JTextField(), &quot;pushx,growx&quot;);

f.add(new JLabel(&quot;Web adresi:&quot;));
f.add(new JTextField(), &quot;pushx,growx&quot;);

f.add(new JLabel(&quot;e-posta :&quot;));
f.add(new JTextField(), &quot;pushx,growx&quot;);

f.add(new JSeparator(JSeparator.HORIZONTAL), &quot;span,growx&quot;);

f.add(new JButton(&quot;Kaydet&quot;), &quot;span, split 4&quot;);
f.add(new JButton(&quot;Vazgeç&quot;), &quot;span, split 4&quot;);

f.setVisible(true);

f.setSize(new Dimension(500, 240));
f.setLocationRelativeTo(null);
}
});

}
}
</pre>
<div id="attachment_119" class="wp-caption alignnone" style="width: 510px"><img class="size-full wp-image-119" title="miglayout-sample2" src="http://www.atay.org/images/2009/07/miglayout-sample2.png" alt="Miglayout edit frame-sample2" width="500" height="240" /><p class="wp-caption-text">Miglayout edit frame-sample2</p></div>
<p>Java 7 ye koyulup koyulmaması ile ilgili oylaması devam ediyor.</p>
<p><a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6530906">http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6530906</a></p>
<p>Miglayout &#8216;un web sitesi</p>
<p><a href="http://www.miglayout.com">http://www.miglayout.com</a></p>
<p>Kolay gelsin.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.atay.org/java-swing-miglayout/feed</wfw:commentRss>
		</item>
		<item>
		<title>Test classlarının Application servera deploy edilmesini engellemek</title>
		<link>http://www.atay.org/test-classlarinin-application-servera-deploy-edilmesini-engellemek</link>
		<comments>http://www.atay.org/test-classlarinin-application-servera-deploy-edilmesini-engellemek#comments</comments>
		<pubDate>Mon, 29 Jun 2009 10:54:12 +0000</pubDate>
		<dc:creator>selcuk</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<category><![CDATA[EJB]]></category>

		<category><![CDATA[Java]]></category>

		<category><![CDATA[JUnit]]></category>

		<guid isPermaLink="false">http://www.atay.org/?p=109</guid>
		<description><![CDATA[Siz aksini belirtmediğiniz sürece Eclipse&#8217;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ı [...]]]></description>
			<content:encoded><![CDATA[<p>Siz aksini belirtmediğiniz sürece Eclipse&#8217;in WTP toolu,  EJB projenizin içindeki JUnit test classlarını sunucuya deploy eder.</p>
<p>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.</p>
<p>Bunu engellemenin iki yolu var.<br />
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.</p>
<pre class="brush: xml;">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;project-modules id=&quot;moduleCoreId&quot; project-version=&quot;1.5.0&quot;&gt;
    &lt;wb-module deploy-name=&quot;my-ejb&quot;&gt;
        &lt;wb-resource deploy-path=&quot;/&quot; source-path=&quot;/src/main/resources&quot;/&gt;
        &lt;wb-resource deploy-path=&quot;/&quot; source-path=&quot;/src/main/java&quot;/&gt;
        &lt;wb-resource deploy-path=&quot;/&quot; source-path=&quot;/src/test/resources&quot;/&gt; &lt;!--Deploy etmek istemediğiniz bir folder, dolayısıyla bu line silinmeli--&gt;
        &lt;wb-resource deploy-path=&quot;/&quot; source-path=&quot;/src/test/java&quot;/&gt;&lt;!--Silinecek--&gt;
        &lt;property name=&quot;java-output-path&quot;/&gt;
    &lt;/wb-module&gt;
&lt;/project-modules&gt;
</pre>
<pre class="brush: xml;">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;project-modules id=&quot;moduleCoreId&quot; project-version=&quot;1.5.0&quot;&gt;
    &lt;wb-module deploy-name=&quot;my-ejb&quot;&gt;
        &lt;wb-resource deploy-path=&quot;/&quot; source-path=&quot;/src/main/resources&quot;/&gt;
        &lt;wb-resource deploy-path=&quot;/&quot; source-path=&quot;/src/main/java&quot;/&gt;
        &lt;property name=&quot;java-output-path&quot;/&gt;
    &lt;/wb-module&gt;
&lt;/project-modules&gt;
</pre>
<p>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.  </p>
<p>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.</p>
<p>Kolay gelsin.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.atay.org/test-classlarinin-application-servera-deploy-edilmesini-engellemek/feed</wfw:commentRss>
		</item>
		<item>
		<title>MySql + JPA + JBoss + Eclipse Türkçe karakterter sorunu var mı yok mu?</title>
		<link>http://www.atay.org/mysql-jpa-jboss-eclipse-turkce-karakterter-sorunu-var-mi-yok-mu</link>
		<comments>http://www.atay.org/mysql-jpa-jboss-eclipse-turkce-karakterter-sorunu-var-mi-yok-mu#comments</comments>
		<pubDate>Sun, 28 Jun 2009 10:49:01 +0000</pubDate>
		<dc:creator>selcuk</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<category><![CDATA[Java]]></category>

		<category><![CDATA[JUnit]]></category>

		<category><![CDATA[MySQL]]></category>

		<category><![CDATA[Türkçe karakter]]></category>

		<category><![CDATA[utf-8]]></category>

		<guid isPermaLink="false">http://www.atay.org/?p=99</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p>Default bir kurulumda evet sorunlar var. Fakat bir kaç düzenleme ile bertaraf edilebilir.</p>
<p>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.</p>
<p>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.</p>
<p>Maven kullananlar için bunu pom.xml den yapmak da mümkün.</p>
<pre class="brush: xml;">
&lt;project&gt;
...
&lt;properties&gt;
&lt;project.build.sourceEncoding&gt;UTF-8&lt;/project.build.sourceEncoding&gt;
&lt;/properties&gt;
&lt;/project&gt;
</pre>
<p>JPA kısmında da bir düzenleme yapmak gerekiyor. persistence.xml de connection url imizde kullandığımız encodingin ne olduğunu bildirmeliyiz.</p>
<pre class="brush: xml;">
&lt;property name=&quot;hibernate.connection.url&quot; value=&quot;jdbc:mysql://localhost:3306/uzman?autoReconnect=true&amp;amp;useUnicode=true&amp;amp;characterEncoding=utf8&quot;/&gt;
</pre>
<p>MySQL tarafında,MySQL&#8217;i kendi konfigurasyon toolu ile konfigure ederek, utf-8 &#8216;in default encoding olarak tercih ettiğimizi belirtmeliyiz.</p>
<p>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</p>
<pre class="brush: sql;">
ALTER DATABASE mydatabase CHARACTER SET 'utf8' COLLATE  utf8_turkish_ci
</pre>
<p>komutunu MySQL Query browser da çalıştırmalısınız.</p>
<p>Kolay gelsin.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.atay.org/mysql-jpa-jboss-eclipse-turkce-karakterter-sorunu-var-mi-yok-mu/feed</wfw:commentRss>
		</item>
		<item>
		<title>Swing exceptionlarını yakalamak.</title>
		<link>http://www.atay.org/swing-exceptionlarini-yakalamak</link>
		<comments>http://www.atay.org/swing-exceptionlarini-yakalamak#comments</comments>
		<pubDate>Sun, 28 Jun 2009 10:04:20 +0000</pubDate>
		<dc:creator>selcuk</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<category><![CDATA[Java]]></category>

		<category><![CDATA[Swing]]></category>

		<guid isPermaLink="false">http://www.atay.org/?p=92</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p>Swing EDT (Event dispatch thread) threadi içerisinde bir exception çıktığında bu exceptionı kendi threadinizde yakalamanız mümkün olmaz.</p>
<p>Exceptionlar stack ile alakalı olduklarından fırlatıldıklarında kendi stacklerinde handle edilebilirler.</p>
<h4>EDT Nedir ?</h4>
<p>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.</p>
<p>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, J<em>SR 296</em>: Swing Application Framework specinde tanıtılmıştır. Fakat EDT exception konusunu tamamlamak için biz şimdilik SwingUtilities.invokeLater kullanmaya devam edelim.</p>
<pre class="brush: java;">
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(&quot;Pencere başlığı&quot;);
		frame.setSize(new Dimension(320, 240));
		frame.setVisible(true);
		throw new RuntimeException(&quot;EDT içerisinde bir exception fırlatıldı.&quot;);
	    }
	});

}
</pre>
<p>Yukarıdaki örneğimizde JFrame&#8217;, event dispatch thread içerisinde kullanmış olduk.</p>
<p>Bu thread içerisinde bir runtime exception fırlatıldığında bunu yakalayıp kullanıcıya göstermek istersek nasil bir yöntem izleye<em>biliriz.</em></p>
<p><em>Benzer şekilde JSR296 ile tanıtılan SwingWorker</em> lar içerisinde de runtime exceptionlar fırlatılmış olabilir. Bunları da yakalayıp kullanıcıy bilgilendirmek isteyebiliriz.</p>
<p>Dolayısıyla bizim ihtiyacımız olan şey, deyim yerinde ise threadler üstü bir exception yakalama mekanizmasıdır.</p>
<h4>Thread.setDefaultUncaughtExceptionHandler</h4>
<p>Thread sınıfının static bir metodu &#8220;setDefaultUncaughtExceptionHandler&#8221;,  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.</p>
<p>Anonymous bir şekinde implement ederek tanıtacak olursak kodumuz aşağıdaki gibi olacaktır.</p>
<pre class="brush: java;">
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(&quot;Pencere başlığı&quot;);
		frame.setSize(new Dimension(320, 240));
		frame.setVisible(true);
		throw new RuntimeException(
			&quot;EDT içerisinde bir exception fırlatıldı.&quot;);
	    }
	});
    }
}
</pre>
<p>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.</p>
<p>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.</p>
<p>Kolay gelsin.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.atay.org/swing-exceptionlarini-yakalamak/feed</wfw:commentRss>
		</item>
		<item>
		<title>Directory Synchronizer</title>
		<link>http://www.atay.org/directory-synchronizer</link>
		<comments>http://www.atay.org/directory-synchronizer#comments</comments>
		<pubDate>Sun, 03 May 2009 16:53:55 +0000</pubDate>
		<dc:creator>selcuk</dc:creator>
		
		<category><![CDATA[Program Önerileri]]></category>

		<guid isPermaLink="false">http://www.atay.org/?p=90</guid>
		<description><![CDATA[Ü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
]]></description>
			<content:encoded><![CDATA[<p>Ü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.</p>
<p>Detaylı bilgi için: <a href="http://sites.atay.org/directory-synchronizer">http://sites.atay.org/directory-synchronizer</a></p>
<p>Download etmek için: <a href="https://directorysynchronizer.dev.java.net/servlets/ProjectDocumentList">https://directorysynchronizer.dev.java.net/servlets/ProjectDocumentList</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.atay.org/directory-synchronizer/feed</wfw:commentRss>
		</item>
		<item>
		<title>Kenai - açık kaynak platformu</title>
		<link>http://www.atay.org/kenai-acik-kaynak-platformu</link>
		<comments>http://www.atay.org/kenai-acik-kaynak-platformu#comments</comments>
		<pubDate>Mon, 27 Apr 2009 15:22:52 +0000</pubDate>
		<dc:creator>selcuk</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<category><![CDATA[Kenai]]></category>

		<guid isPermaLink="false">http://www.atay.org/?p=85</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Kenai - açık kaynak platformu</strong></p>
<p>Yeni bir open source platformu açıldı.</p>
<p>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.</p>
<p>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. </p>
<p>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. </p>
<p>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.</p>
<p><a href="http://www.kenai.com" target="_blank">http://www.kenai.com</a></p>
<p>Java Swing ile ve JTable ile ilgili iseniz bizim projemize de bir göz atın lütfen.</p>
<p><a href="http://kenai.com/projects/celleditorlibrary">http://kenai.com/projects/celleditorlibrary</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.atay.org/kenai-acik-kaynak-platformu/feed</wfw:commentRss>
		</item>
		<item>
		<title>Mp3 indirme programı</title>
		<link>http://www.atay.org/mp3-indirme-programi</link>
		<comments>http://www.atay.org/mp3-indirme-programi#comments</comments>
		<pubDate>Mon, 27 Apr 2009 11:10:02 +0000</pubDate>
		<dc:creator>selcuk</dc:creator>
		
		<category><![CDATA[Program Önerileri]]></category>

		<guid isPermaLink="false">http://www.atay.org/?p=80</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p>Bilgisayarınızdan müzik dinlemek gibi bir alışkanlığınız var ise kullanabileceğiniz fevkalade başarılı bir araç var.<br />
Bu bir kaç KB lik bir program. <a href="http://www.mp3indirmeprogrami.com">http://www.mp3indirmeprogrami.com</a> 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.</p>
<p>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.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.atay.org/mp3-indirme-programi/feed</wfw:commentRss>
		</item>
		<item>
		<title>Property Based Object Comparer</title>
		<link>http://www.atay.org/property-based-object-comparer</link>
		<comments>http://www.atay.org/property-based-object-comparer#comments</comments>
		<pubDate>Tue, 10 Feb 2009 08:09:26 +0000</pubDate>
		<dc:creator>selcuk</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://www.atay.org/?p=47</guid>
		<description><![CDATA[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&#8217;s.   Google&#8217;ed to find a class that compares two objects by looking their property values but couldn&#8217;t find [...]]]></description>
			<content:encoded><![CDATA[<p>Today i need to get two different type of objects compared by their property values.</p>
<p>Problem was those objects are not supporting IComparable interface. Yet they might be different type of objects. Basicly they are plain objects, POJO&#8217;s.   Google&#8217;ed to find a class that compares two objects by looking their property values but couldn&#8217;t find any simple implementation.</p>
<p>So I had to code it right away and I wanted to share.</p>
<pre class="brush: csharp;">

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;
}
}
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.atay.org/property-based-object-comparer/feed</wfw:commentRss>
		</item>
	</channel>
</rss>
