<?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/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Kurumsal Java Yazılımı &#187; Püf Noktası</title>
	<atom:link href="http://www.kurumsaljava.com/category/puf-noktasi/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.kurumsaljava.com</link>
	<description>Java Enterprise Architecture</description>
	<lastBuildDate>Sat, 24 Jul 2010 19:59:04 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Java Compiler Versiyonu</title>
		<link>http://www.kurumsaljava.com/2010/05/26/java-compiler-versiyonu/</link>
		<comments>http://www.kurumsaljava.com/2010/05/26/java-compiler-versiyonu/#comments</comments>
		<pubDate>Wed, 26 May 2010 14:42:54 +0000</pubDate>
		<dc:creator>acar</dc:creator>
				<category><![CDATA[Püf Noktası]]></category>

		<guid isPermaLink="false">http://www.kurumsaljava.com/?p=1156</guid>
		<description><![CDATA[<p>Bir Java sınıfının hangi Java compiler versiyonu ile derlendiğini görmek için <b>javap</b> komutu aşağıdaki şekilde kullanılır. <span id="more-1156"></span></p>
<pre name="code" class="java">

C:\&gt;javap.exe -verbose tumbler.Story
Compiled from &quot;Story.java&quot;
public interface tumbler.Story extends java.lang.annotation.Annotation
  SourceFile: &quot;Story.java&quot;
  RuntimeVisibleAnnotations: length = 0x1B
   00 02 00 09 00 01 00 04 65 00 0A 00 0B 00 0C 00
   01 00 04 5B 00 01 65 00 0D 00 0E
  minor version: 0
  major version: 50
  Constant pool:
const #1 = class        #15;    //  tumbler/Story
const #2 = class        #16;    //  java/lang/Object
const #3 = class        #17;    //  java/lang/annotation/Annotation
const #4 = Asciz        value;
const #5 = Asciz        ()Ljava/lang/String;;
const #6 = Asciz        SourceFile;
const #7 = Asciz        Story.java;
const #8 = Asciz        RuntimeVisibleAnnotations;
const #9 = Asciz        Ljava/lang/annotation/Retention;;
const #10 = Asciz       Ljava/lang/annotation/RetentionPolicy;;
const #11 = Asciz       RUNTIME;
const #12 = Asciz       Ljava/lang/annotation/Target;;
const #13 = Asciz       Ljava/lang/annotation/ElementType;;
const #14 = Asciz       TYPE;
const #15 = Asciz       tumbler/Story;
const #16 = Asciz       java/lang/Object;
const #17 = Asciz       java/lang/annotation/Annotation;

{
public abstract java.lang.String value();

}
</pre>
<p><b>thumbler.Story</b> sınıfı için major number 50, minor number 0 görünmektektedir. Aşağıdaki listeden bu sınıfın hangi Java compiler versiyonu ile derlendiğini anlamak mümkündür.</p>
<p>* Java 1.2 uses major version 46<br />
* Java 1.3 uses major version 47<br />
* Java 1.4 uses major version 48<br />
* Java 5 uses major version 49<br />
* Java 6 uses major version 50</p>
<p><i><br />
EOF ( End Of Fun)<br />
Özcan Acar<br />
</i></p>
]]></description>
			<content:encoded><![CDATA[<p>Bir Java sınıfının hangi Java compiler versiyonu ile derlendiğini görmek için <b>javap</b> komutu aşağıdaki şekilde kullanılır. <span id="more-1156"></span></p>
<pre name="code" class="java">

C:\&gt;javap.exe -verbose tumbler.Story
Compiled from &quot;Story.java&quot;
public interface tumbler.Story extends java.lang.annotation.Annotation
  SourceFile: &quot;Story.java&quot;
  RuntimeVisibleAnnotations: length = 0x1B
   00 02 00 09 00 01 00 04 65 00 0A 00 0B 00 0C 00
   01 00 04 5B 00 01 65 00 0D 00 0E
  minor version: 0
  major version: 50
  Constant pool:
const #1 = class        #15;    //  tumbler/Story
const #2 = class        #16;    //  java/lang/Object
const #3 = class        #17;    //  java/lang/annotation/Annotation
const #4 = Asciz        value;
const #5 = Asciz        ()Ljava/lang/String;;
const #6 = Asciz        SourceFile;
const #7 = Asciz        Story.java;
const #8 = Asciz        RuntimeVisibleAnnotations;
const #9 = Asciz        Ljava/lang/annotation/Retention;;
const #10 = Asciz       Ljava/lang/annotation/RetentionPolicy;;
const #11 = Asciz       RUNTIME;
const #12 = Asciz       Ljava/lang/annotation/Target;;
const #13 = Asciz       Ljava/lang/annotation/ElementType;;
const #14 = Asciz       TYPE;
const #15 = Asciz       tumbler/Story;
const #16 = Asciz       java/lang/Object;
const #17 = Asciz       java/lang/annotation/Annotation;

{
public abstract java.lang.String value();

}
</pre>
<p><b>thumbler.Story</b> sınıfı için major number 50, minor number 0 görünmektektedir. Aşağıdaki listeden bu sınıfın hangi Java compiler versiyonu ile derlendiğini anlamak mümkündür.</p>
<p>* Java 1.2 uses major version 46<br />
* Java 1.3 uses major version 47<br />
* Java 1.4 uses major version 48<br />
* Java 5 uses major version 49<br />
* Java 6 uses major version 50</p>
<p><i><br />
EOF ( End Of Fun)<br />
Özcan Acar<br />
</i></p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.kurumsaljava.com%2F2010%2F05%2F26%2Fjava-compiler-versiyonu%2F&amp;linkname=Java%20Compiler%20Versiyonu"><img src="http://www.kurumsaljava.com/wp-content/plugins/add-to-any/share_save_256_24.png" width="256" height="24" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.kurumsaljava.com/2010/05/26/java-compiler-versiyonu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java&#8217;da Finalizer Metodu</title>
		<link>http://www.kurumsaljava.com/2010/02/23/javada-finalizer-metodu/</link>
		<comments>http://www.kurumsaljava.com/2010/02/23/javada-finalizer-metodu/#comments</comments>
		<pubDate>Tue, 23 Feb 2010 11:39:23 +0000</pubDate>
		<dc:creator>acar</dc:creator>
				<category><![CDATA[Püf Noktası]]></category>

		<guid isPermaLink="false">http://www.kurumsaljava.com/?p=1098</guid>
		<description><![CDATA[<p>Java_tr grubunda aşağıdaki yer alan soru soruldu. Bu soru ve benim bu konudaki düşüncelerim aşağıda yer almaktadır.</p>
<p><i>Java&#8217;da bulmaca sevenlere; Aşağıda ki kod parçası için çıktı ne olur,<br />
&#8220;finalized&#8221; yazar mı? Constructor&#8217;ýnda exception fırlatmış bir nesnenin<br />
finalize işleminden geçmesini bekler misiniz?<br />
</i></p>
<pre name="code" class="java">

public class FinalizerTest {

&lt;span id=&quot;more-1098&quot;&gt;&lt;/span&gt;

  public FinalizerTest() {
    System.out.println(&quot;constructed&quot;);
    throw new RuntimeException();
  }

  protected void finalize() throws Throwable {
    System.out.println(&quot;finalized&quot;);
  }

  public static void main(String[] args) {
    try {
      new FinalizerTest();
    } catch (Exception e) {
      System.out.println(&quot;exception&quot;);
    }
    System.gc();
  }
}
</pre>
<p>Benim verdiğim cevap şu şekildedir:</p>
<p><i><br />
Java&#8217;da <i>finalize()</i> kullanılması doğru değildir, çünkü JVM&#8217;in finalize metodunu ne zaman koşturacağını kestirmek mümkün değildir. Buna güvenerek örneğin finalize() içinde kullanılan kaynakları serbest bırakmak yapılabilecek en büyük hatalardan birisidir. Pratikte finalize() metodu kesinlikle kullanmamalıdır. Finalizer kullanımı performansı düşürür. Finalizer ile nesnenin yok edilmesi daha uzun zaman alır. Finalize yerine bir terminasyon metodu kullanılmalıdır. <i>gc()</i> metodunun kullanımı da GC nin hemen devreye gireceği garantisini vermez.</p>
<p>Yukarıda yer alan programın konstruktöründe try catch ile hata yakalanarak, daha önce bahsettiğim terminasyon metodu (örneğin <i>myExit()</i>)  koşturulmalıdır.<br />
</i></p>
<p><i><br />
EOF ( End Of Fun)<br />
Özcan Acar<br />
</i></p>
]]></description>
			<content:encoded><![CDATA[<p>Java_tr grubunda aşağıdaki yer alan soru soruldu. Bu soru ve benim bu konudaki düşüncelerim aşağıda yer almaktadır.</p>
<p><i>Java&#8217;da bulmaca sevenlere; Aşağıda ki kod parçası için çıktı ne olur,<br />
&#8220;finalized&#8221; yazar mı? Constructor&#8217;ýnda exception fırlatmış bir nesnenin<br />
finalize işleminden geçmesini bekler misiniz?<br />
</i></p>
<pre name="code" class="java">

public class FinalizerTest {

&lt;span id=&quot;more-1098&quot;&gt;&lt;/span&gt;

  public FinalizerTest() {
    System.out.println(&quot;constructed&quot;);
    throw new RuntimeException();
  }

  protected void finalize() throws Throwable {
    System.out.println(&quot;finalized&quot;);
  }

  public static void main(String[] args) {
    try {
      new FinalizerTest();
    } catch (Exception e) {
      System.out.println(&quot;exception&quot;);
    }
    System.gc();
  }
}
</pre>
<p>Benim verdiğim cevap şu şekildedir:</p>
<p><i><br />
Java&#8217;da <i>finalize()</i> kullanılması doğru değildir, çünkü JVM&#8217;in finalize metodunu ne zaman koşturacağını kestirmek mümkün değildir. Buna güvenerek örneğin finalize() içinde kullanılan kaynakları serbest bırakmak yapılabilecek en büyük hatalardan birisidir. Pratikte finalize() metodu kesinlikle kullanmamalıdır. Finalizer kullanımı performansı düşürür. Finalizer ile nesnenin yok edilmesi daha uzun zaman alır. Finalize yerine bir terminasyon metodu kullanılmalıdır. <i>gc()</i> metodunun kullanımı da GC nin hemen devreye gireceği garantisini vermez.</p>
<p>Yukarıda yer alan programın konstruktöründe try catch ile hata yakalanarak, daha önce bahsettiğim terminasyon metodu (örneğin <i>myExit()</i>)  koşturulmalıdır.<br />
</i></p>
<p><i><br />
EOF ( End Of Fun)<br />
Özcan Acar<br />
</i></p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.kurumsaljava.com%2F2010%2F02%2F23%2Fjavada-finalizer-metodu%2F&amp;linkname=Java%26%238217%3Bda%20Finalizer%20Metodu"><img src="http://www.kurumsaljava.com/wp-content/plugins/add-to-any/share_save_256_24.png" width="256" height="24" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.kurumsaljava.com/2010/02/23/javada-finalizer-metodu/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Java&#8217;da Final Anahtar Kelimesi</title>
		<link>http://www.kurumsaljava.com/2010/02/18/javada-final-anahtar-kelimesi/</link>
		<comments>http://www.kurumsaljava.com/2010/02/18/javada-final-anahtar-kelimesi/#comments</comments>
		<pubDate>Wed, 17 Feb 2010 23:21:14 +0000</pubDate>
		<dc:creator>acar</dc:creator>
				<category><![CDATA[Püf Noktası]]></category>
		<category><![CDATA[Final]]></category>
		<category><![CDATA[Java Keyword]]></category>

		<guid isPermaLink="false">http://www.kurumsaljava.com/?p=1093</guid>
		<description><![CDATA[<p>Java&#8217;da <b>final</b> anahtar kelimesi aşağıda yer alan yapılar için kullanılabilir:</p>
<ul>
<li><b>Final sınıf değişkenleri</b>: Final olan bir sınıf değişkenine sadece bir kere değer ataması yapilabilir ve bu atama sadece sınıf konstrüktöründe gerçekleşebilir.</li>
<li><b>Final metot parametreleri</b>: Final olarak tanımlanmış bir metot parametresine sadece bir kere değer atanabilir. Metot parametrelerinin tamamen final olarak tanımlamış olmalarında büyük fayda vardır. Bu şekilde parametrenin metot bünyesinde değişikliğe ugrama tehlikesi ortadan kaldırılmış olur.</li>
<li><b>Final metotlar</b>: Final olan bir metot ne alt sınıflarca yeniden yüklenebilir (method overloading) ne de saklı (hidden) tutulabilir.</li>
<li><b>Final sınıflar</b>: Final olan bir sınıf genişletilerek bir alt sınıf oluşturulamaz.</li>
</ul>
<p><span id="more-1093"></span></p>
<p>Final anahtar kelimesi Java programcılığında en çok göz ardı edilenlerdendir. En son siz ne zaman final anahtar kelimesini kullandınız?<br />
Final anahtar kelimesi programın daha doğru, hatalara dayanıklı ve performanslı çalışmasını sağlar.</p>
<p>Final anahtar kelimesinin kullanımında yapılan en büyük hatalardan birisi final static olarak tanımlanmış olan bir sınıf değişkenine değistirilebilir bir değerin atanmasıdır. Örneğin aşağıdaki tanımlama yanlıştır, çünkü static değişken final olmasına rağmen, bu değişkene atanan değer, kullanıcı tarafından değiştirilebilir.</p>
<pre name="code" class="java">

public class App
{
    public static final String[] LIST = {&quot;1&quot;,&quot;2&quot;,&quot;3&quot;};

    public static void main(String[] args)
    {
	String[] list = App.LIST;
	list[0] = &quot;2&quot;;
	System.out.println(App.LIST[0]);
    }
}
</pre>
<p>Yukarda yer alan main() metodunda final olan LIST degiskeninin ihtiva ettiği array değiştirilmektedir. Bu sorunu ortadan kaldırmak için LIST değişkeni private yapılabilir ve bu değişkeni baz alarak içeriğinin değiştirilemeyeceği bir array değerini geri döndüren metot oluşturulabilir. Bunun bir örneği aşağıda yer almaktadır:</p>
<pre name="code" class="java">

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class App
{
    private static final String[] LIST = {&quot;1&quot;,&quot;2&quot;,&quot;3&quot;};

    public static final List&lt;String&gt; getList()
    {
	return Collections.unmodifiableList(Arrays.asList(App.LIST));
    }

    public static void main(String[] args)
    {
	List&lt;String&gt; list = App.getList();
	list.remove(0);
	System.out.println(list);
    }
}
</pre>
<p>Bu program koşturulduğunda alınacak hata şu şekildedır:</p>
<p><b><br />
Exception in thread &#8220;main&#8221; java.lang.UnsupportedOperationException<br />
	at java.util.Collections$UnmodifiableList.remove(Collections.java:1162)<br />
	at test.App.main(App.java:22)<br />
</b></p>
<p>Bu şekilde final olarak tanımladığımız LIST değişkenin ihtiva ettiği değerleri üzerinde oynama yapmak mümkün değildir. getList() metodu bünyesinde Collections.unmodifiableList() ile içeriğinin değiştirilmesi mümkün olmayan bir liste oluşturulmaktadır.</p>
<p><i><br />
EOF ( End Of Fun)<br />
Özcan Acar<br />
</i></p>
]]></description>
			<content:encoded><![CDATA[<p>Java&#8217;da <b>final</b> anahtar kelimesi aşağıda yer alan yapılar için kullanılabilir:</p>
<ul>
<li><b>Final sınıf değişkenleri</b>: Final olan bir sınıf değişkenine sadece bir kere değer ataması yapilabilir ve bu atama sadece sınıf konstrüktöründe gerçekleşebilir.</li>
<li><b>Final metot parametreleri</b>: Final olarak tanımlanmış bir metot parametresine sadece bir kere değer atanabilir. Metot parametrelerinin tamamen final olarak tanımlamış olmalarında büyük fayda vardır. Bu şekilde parametrenin metot bünyesinde değişikliğe ugrama tehlikesi ortadan kaldırılmış olur.</li>
<li><b>Final metotlar</b>: Final olan bir metot ne alt sınıflarca yeniden yüklenebilir (method overloading) ne de saklı (hidden) tutulabilir.</li>
<li><b>Final sınıflar</b>: Final olan bir sınıf genişletilerek bir alt sınıf oluşturulamaz.</li>
</ul>
<p><span id="more-1093"></span></p>
<p>Final anahtar kelimesi Java programcılığında en çok göz ardı edilenlerdendir. En son siz ne zaman final anahtar kelimesini kullandınız?<br />
Final anahtar kelimesi programın daha doğru, hatalara dayanıklı ve performanslı çalışmasını sağlar.</p>
<p>Final anahtar kelimesinin kullanımında yapılan en büyük hatalardan birisi final static olarak tanımlanmış olan bir sınıf değişkenine değistirilebilir bir değerin atanmasıdır. Örneğin aşağıdaki tanımlama yanlıştır, çünkü static değişken final olmasına rağmen, bu değişkene atanan değer, kullanıcı tarafından değiştirilebilir.</p>
<pre name="code" class="java">

public class App
{
    public static final String[] LIST = {&quot;1&quot;,&quot;2&quot;,&quot;3&quot;};

    public static void main(String[] args)
    {
	String[] list = App.LIST;
	list[0] = &quot;2&quot;;
	System.out.println(App.LIST[0]);
    }
}
</pre>
<p>Yukarda yer alan main() metodunda final olan LIST degiskeninin ihtiva ettiği array değiştirilmektedir. Bu sorunu ortadan kaldırmak için LIST değişkeni private yapılabilir ve bu değişkeni baz alarak içeriğinin değiştirilemeyeceği bir array değerini geri döndüren metot oluşturulabilir. Bunun bir örneği aşağıda yer almaktadır:</p>
<pre name="code" class="java">

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class App
{
    private static final String[] LIST = {&quot;1&quot;,&quot;2&quot;,&quot;3&quot;};

    public static final List&lt;String&gt; getList()
    {
	return Collections.unmodifiableList(Arrays.asList(App.LIST));
    }

    public static void main(String[] args)
    {
	List&lt;String&gt; list = App.getList();
	list.remove(0);
	System.out.println(list);
    }
}
</pre>
<p>Bu program koşturulduğunda alınacak hata şu şekildedır:</p>
<p><b><br />
Exception in thread &#8220;main&#8221; java.lang.UnsupportedOperationException<br />
	at java.util.Collections$UnmodifiableList.remove(Collections.java:1162)<br />
	at test.App.main(App.java:22)<br />
</b></p>
<p>Bu şekilde final olarak tanımladığımız LIST değişkenin ihtiva ettiği değerleri üzerinde oynama yapmak mümkün değildir. getList() metodu bünyesinde Collections.unmodifiableList() ile içeriğinin değiştirilmesi mümkün olmayan bir liste oluşturulmaktadır.</p>
<p><i><br />
EOF ( End Of Fun)<br />
Özcan Acar<br />
</i></p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.kurumsaljava.com%2F2010%2F02%2F18%2Fjavada-final-anahtar-kelimesi%2F&amp;linkname=Java%26%238217%3Bda%20Final%20Anahtar%20Kelimesi"><img src="http://www.kurumsaljava.com/wp-content/plugins/add-to-any/share_save_256_24.png" width="256" height="24" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.kurumsaljava.com/2010/02/18/javada-final-anahtar-kelimesi/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Covariant Return Types</title>
		<link>http://www.kurumsaljava.com/2010/02/06/covariant-return-types/</link>
		<comments>http://www.kurumsaljava.com/2010/02/06/covariant-return-types/#comments</comments>
		<pubDate>Sat, 06 Feb 2010 10:22:21 +0000</pubDate>
		<dc:creator>acar</dc:creator>
				<category><![CDATA[Püf Noktası]]></category>
		<category><![CDATA[Covariant Return Type]]></category>

		<guid isPermaLink="false">http://www.kurumsaljava.com/?p=1078</guid>
		<description><![CDATA[<p>Java 1.5 ile kullanıma sunulan ve <strong>covariant return type</strong> ismini taşıyan bir yapı mevcuttur. Java 1.5 öncesi bir alt sınıf, bir üst sınıfın sahip olduğu metodu yeniden implemente etmek (method overriding) istediginde, bu metodun geri döndürdüğü veri tipinin, üst sınıftaki metot ile aynı olması gerekmekteydi. Bunun bir örneği aşağıda yer almaktadır.</p>
<p><span id="more-1078"></span></p>
<pre name="code" class="java">

package test.controller;

import java.util.Map;

import test.criteria.Criteria;

public abstract class AbstractController implements Controller
{
    public void executeFilter()
    {
	Map&lt;String, String&gt; map = createCriteria().getCriteriaMap();

    }

    public abstract Criteria createCriteria();
}
</pre>
<p>Soyut (abstract) olan <i>AbstractController</i> sınıfı bünyesinde, alt sınıflarda implemente edilmek üzere <i>createCriteria()</i> isminde bir metot tanımlıyoruz. <i>AccountTableController</i> sınıfı bu metodu implemente etmektedir.</p>
<pre name="code" class="java">

package test.controller;

import java.util.HashMap;
import java.util.Map;

import test.criteria.MyCriteria;
import test.model.Konto;

public class AccountTableController extends AbstractController
{
    private Account model = new Account();

    public Criteria createCriteria()
    {
	Map&lt;String, String&gt; map = new HashMap&lt;String, String&gt;();
	map.put(&quot;kontonr&quot;, model.getKontonr());
	map.put(&quot;blz&quot;, model.getBlz());
	return new Criteria(map);
    }
}
</pre>
<p>Görüldüğü gibi <i>AccountTableController.createCriteria()</i> metodu <i>Criteria</i> tipinde bir degeri geri döndürmektedir. Bu metodun geri döndürdüğü değerin Java 1.5 öncesi <i>Criteria</i> tipinde olması gerekmektedir, çünkü üst sınıfta tanımlanmış olan bu metodun, üst sınıf bünyesinde geri döndürdüğü değer <i>Criteria</i> tipindedir.</p>
<p>Java 1.5 ile bu durum değişmiştir. Üst sınıfta yer alan bir metot alt sınıfta tekrar reimplement edilirse (method overriding), reimplemente edilen metodun geri döndürdüğü değerin tipi, üst sınıftaki metodun geri döndürdüğü sınıfın bir alt sınıfı olabilir. Bunun bir örneği aşağıda yer almaktadır.</p>
<pre name="code" class="java">

package test.controller;

import java.util.HashMap;
import java.util.Map;

import test.criteria.MyCriteria;
import test.model.Konto;

public class AccountTableController extends AbstractController
{
    private Account model = new Account();

    @Override
    public MyCriteria createCriteria()
    {
	Map&lt;String, String&gt; map = new HashMap&lt;String, String&gt;();
	map.put(&quot;kontonr&quot;, model.getKontonr());
	map.put(&quot;blz&quot;, model.getBlz());
	return new MyCriteria(map);
    }
}
</pre>
<p><i>MyCriteria</i>, <i>Criteria</i> sınıfının bir alt sınıfıdır ve <i>AccountTableController</i> sınıfı implemente ettiği <i>createCriteria()</i> metodunun <i>MyCriteria</i> tipinde bir değeri geri döndürmesi sağlamıştır. Bu şekilde cast işlemi yapılmadan alt sınıfların daha zengin tipte verileri geri döndürebilmeleri amaçlanmaktadır.</p>
<p><i><br />
EOF ( End Of Fun)<br />
Özcan Acar</i></p>
]]></description>
			<content:encoded><![CDATA[<p>Java 1.5 ile kullanıma sunulan ve <strong>covariant return type</strong> ismini taşıyan bir yapı mevcuttur. Java 1.5 öncesi bir alt sınıf, bir üst sınıfın sahip olduğu metodu yeniden implemente etmek (method overriding) istediginde, bu metodun geri döndürdüğü veri tipinin, üst sınıftaki metot ile aynı olması gerekmekteydi. Bunun bir örneği aşağıda yer almaktadır.</p>
<p><span id="more-1078"></span></p>
<pre name="code" class="java">

package test.controller;

import java.util.Map;

import test.criteria.Criteria;

public abstract class AbstractController implements Controller
{
    public void executeFilter()
    {
	Map&lt;String, String&gt; map = createCriteria().getCriteriaMap();

    }

    public abstract Criteria createCriteria();
}
</pre>
<p>Soyut (abstract) olan <i>AbstractController</i> sınıfı bünyesinde, alt sınıflarda implemente edilmek üzere <i>createCriteria()</i> isminde bir metot tanımlıyoruz. <i>AccountTableController</i> sınıfı bu metodu implemente etmektedir.</p>
<pre name="code" class="java">

package test.controller;

import java.util.HashMap;
import java.util.Map;

import test.criteria.MyCriteria;
import test.model.Konto;

public class AccountTableController extends AbstractController
{
    private Account model = new Account();

    public Criteria createCriteria()
    {
	Map&lt;String, String&gt; map = new HashMap&lt;String, String&gt;();
	map.put(&quot;kontonr&quot;, model.getKontonr());
	map.put(&quot;blz&quot;, model.getBlz());
	return new Criteria(map);
    }
}
</pre>
<p>Görüldüğü gibi <i>AccountTableController.createCriteria()</i> metodu <i>Criteria</i> tipinde bir degeri geri döndürmektedir. Bu metodun geri döndürdüğü değerin Java 1.5 öncesi <i>Criteria</i> tipinde olması gerekmektedir, çünkü üst sınıfta tanımlanmış olan bu metodun, üst sınıf bünyesinde geri döndürdüğü değer <i>Criteria</i> tipindedir.</p>
<p>Java 1.5 ile bu durum değişmiştir. Üst sınıfta yer alan bir metot alt sınıfta tekrar reimplement edilirse (method overriding), reimplemente edilen metodun geri döndürdüğü değerin tipi, üst sınıftaki metodun geri döndürdüğü sınıfın bir alt sınıfı olabilir. Bunun bir örneği aşağıda yer almaktadır.</p>
<pre name="code" class="java">

package test.controller;

import java.util.HashMap;
import java.util.Map;

import test.criteria.MyCriteria;
import test.model.Konto;

public class AccountTableController extends AbstractController
{
    private Account model = new Account();

    @Override
    public MyCriteria createCriteria()
    {
	Map&lt;String, String&gt; map = new HashMap&lt;String, String&gt;();
	map.put(&quot;kontonr&quot;, model.getKontonr());
	map.put(&quot;blz&quot;, model.getBlz());
	return new MyCriteria(map);
    }
}
</pre>
<p><i>MyCriteria</i>, <i>Criteria</i> sınıfının bir alt sınıfıdır ve <i>AccountTableController</i> sınıfı implemente ettiği <i>createCriteria()</i> metodunun <i>MyCriteria</i> tipinde bir değeri geri döndürmesi sağlamıştır. Bu şekilde cast işlemi yapılmadan alt sınıfların daha zengin tipte verileri geri döndürebilmeleri amaçlanmaktadır.</p>
<p><i><br />
EOF ( End Of Fun)<br />
Özcan Acar</i></p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.kurumsaljava.com%2F2010%2F02%2F06%2Fcovariant-return-types%2F&amp;linkname=Covariant%20Return%20Types"><img src="http://www.kurumsaljava.com/wp-content/plugins/add-to-any/share_save_256_24.png" width="256" height="24" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.kurumsaljava.com/2010/02/06/covariant-return-types/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java Enum ile Singleton Tasarım Şablonu</title>
		<link>http://www.kurumsaljava.com/2010/02/02/java-enum-ile-singleton-tasarim-sablonu/</link>
		<comments>http://www.kurumsaljava.com/2010/02/02/java-enum-ile-singleton-tasarim-sablonu/#comments</comments>
		<pubDate>Tue, 02 Feb 2010 08:32:42 +0000</pubDate>
		<dc:creator>acar</dc:creator>
				<category><![CDATA[Püf Noktası]]></category>
		<category><![CDATA[Tasarım Şablonları (Design Patterns)]]></category>
		<category><![CDATA[Enum]]></category>
		<category><![CDATA[Singleton]]></category>

		<guid isPermaLink="false">http://www.kurumsaljava.com/?p=1067</guid>
		<description><![CDATA[<p>Daha önceki bir yazımda <a href="http://www.kurumsaljava.com/2008/11/27/singleton-yanlizlik-tasarim-sablonu/" target="_blank">Singleton tasarım şablonunun</a> ne olduğunu ve Java&#8217;da nasıl kullanıldığını yakından incelemiştik. Bu yazımda Java 1.5 den itibaren kullanıma sunulan <i>Enum</i> sınıfı ile singleton tasarım şablonunun nasıl kullanılabileceğine değinmek istiyorum.</p>
<p><span id="more-1067"></span></p>
<p>Öncelikle küçük bir örnek üzerinde singleton bir nesnesinin nasıl oluşturulacağına bir göz atalım:</p>
<pre name="code" class="java">

package com.kurumsaljava.com.designpatterns.singleton;

public class MySingleton
{
    private static final MySingleton instance = new MySingleton();

    private MySingleton()
    {
    }

    public void myMethod()
    {

    }
}
</pre>
<p><i>MySingleton</i> sınıfının sahip olduğu konstruktör <i>private</i> olduğu için bu sınıftan bir nesne oluşturmamız mümkün değildir. Bu sınıf bünyesinde ve <i>MySingleton</i> tipinde olan <i>instance</i> ismindeki sınıf değişkeni singleton nesnedir. Bu sınıf ilk kullanıldığında <i>private</i> olan konstruktör bir defaya mahsus olarak işlem göreceği için <i>instance</i> degişkeni bir singleton nesne haline gelecektir. Buradaki sorun, reflection yöntemleri kullanılarak <i>private</i> olan konstruktörün birden fazla singleton nesne oluşturmasını sağlayabilmektir. Bunun yanısıra eger <i>MySingleton</i> sınıfı <i>Serializable</i> interface sınıfını implemente ediyorsa, <b><i>readResolve()</i></b> metodunun da implemente edilmesi gerekmektedir, aksi taktirde deserializasyon esnasında yeni bir nesne oluşturulur ki, bu da singleton tasarım şablonunun mantığına ters düşer.</p>
<p>Java 1.5 den itibaren kullanıma sunulan <i>Enum</i> sınıfı ile singleton nesneler oluşturmak mümkündür. Bunun bir örneği aşağıda yer almaktadır.</p>
<pre name="code" class="java">

package com.kurumsaljava.com.designpatterns.singleton;

public enum MySingletonEnum
{
    INSTANCE;

    public void myMethod()
    {

    }
}
</pre>
<p><i>MySingletionEnum.INSTANCE</i> sadece ve sadece bir kere mevcut olan bir singleton değişkendir. Bunun yanısıra reflection metotları kullanılarak yeni bir singleton olmayan nesne oluşturulamaz. Ayrıca serializasyon işlemlerinde <i>readResolve()</i> kullanılmak zorunda kalmadan enum nesnesinin singletonluğu garanti edilmektedir. Tek elementli olan bir enum sınıfı singleton tasarım şablonunu implemente etmek i.in kullanılabilecek en iyi yöntemdir.</p>
]]></description>
			<content:encoded><![CDATA[<p>Daha önceki bir yazımda <a href="http://www.kurumsaljava.com/2008/11/27/singleton-yanlizlik-tasarim-sablonu/" target="_blank">Singleton tasarım şablonunun</a> ne olduğunu ve Java&#8217;da nasıl kullanıldığını yakından incelemiştik. Bu yazımda Java 1.5 den itibaren kullanıma sunulan <i>Enum</i> sınıfı ile singleton tasarım şablonunun nasıl kullanılabileceğine değinmek istiyorum.</p>
<p><span id="more-1067"></span></p>
<p>Öncelikle küçük bir örnek üzerinde singleton bir nesnesinin nasıl oluşturulacağına bir göz atalım:</p>
<pre name="code" class="java">

package com.kurumsaljava.com.designpatterns.singleton;

public class MySingleton
{
    private static final MySingleton instance = new MySingleton();

    private MySingleton()
    {
    }

    public void myMethod()
    {

    }
}
</pre>
<p><i>MySingleton</i> sınıfının sahip olduğu konstruktör <i>private</i> olduğu için bu sınıftan bir nesne oluşturmamız mümkün değildir. Bu sınıf bünyesinde ve <i>MySingleton</i> tipinde olan <i>instance</i> ismindeki sınıf değişkeni singleton nesnedir. Bu sınıf ilk kullanıldığında <i>private</i> olan konstruktör bir defaya mahsus olarak işlem göreceği için <i>instance</i> degişkeni bir singleton nesne haline gelecektir. Buradaki sorun, reflection yöntemleri kullanılarak <i>private</i> olan konstruktörün birden fazla singleton nesne oluşturmasını sağlayabilmektir. Bunun yanısıra eger <i>MySingleton</i> sınıfı <i>Serializable</i> interface sınıfını implemente ediyorsa, <b><i>readResolve()</i></b> metodunun da implemente edilmesi gerekmektedir, aksi taktirde deserializasyon esnasında yeni bir nesne oluşturulur ki, bu da singleton tasarım şablonunun mantığına ters düşer.</p>
<p>Java 1.5 den itibaren kullanıma sunulan <i>Enum</i> sınıfı ile singleton nesneler oluşturmak mümkündür. Bunun bir örneği aşağıda yer almaktadır.</p>
<pre name="code" class="java">

package com.kurumsaljava.com.designpatterns.singleton;

public enum MySingletonEnum
{
    INSTANCE;

    public void myMethod()
    {

    }
}
</pre>
<p><i>MySingletionEnum.INSTANCE</i> sadece ve sadece bir kere mevcut olan bir singleton değişkendir. Bunun yanısıra reflection metotları kullanılarak yeni bir singleton olmayan nesne oluşturulamaz. Ayrıca serializasyon işlemlerinde <i>readResolve()</i> kullanılmak zorunda kalmadan enum nesnesinin singletonluğu garanti edilmektedir. Tek elementli olan bir enum sınıfı singleton tasarım şablonunu implemente etmek i.in kullanılabilecek en iyi yöntemdir.</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.kurumsaljava.com%2F2010%2F02%2F02%2Fjava-enum-ile-singleton-tasarim-sablonu%2F&amp;linkname=Java%20Enum%20ile%20Singleton%20Tasar%C4%B1m%20%C5%9Eablonu"><img src="http://www.kurumsaljava.com/wp-content/plugins/add-to-any/share_save_256_24.png" width="256" height="24" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.kurumsaljava.com/2010/02/02/java-enum-ile-singleton-tasarim-sablonu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DBUnit JUnit Entegrasyonu</title>
		<link>http://www.kurumsaljava.com/2010/01/15/dbunit-junit-entegrasyonu/</link>
		<comments>http://www.kurumsaljava.com/2010/01/15/dbunit-junit-entegrasyonu/#comments</comments>
		<pubDate>Fri, 15 Jan 2010 15:48:47 +0000</pubDate>
		<dc:creator>acar</dc:creator>
				<category><![CDATA[Püf Noktası]]></category>
		<category><![CDATA[DBUnit]]></category>
		<category><![CDATA[Junit]]></category>

		<guid isPermaLink="false">http://www.kurumsaljava.com/?p=1049</guid>
		<description><![CDATA[<p><a href="http://www.dbunit.org" target="_blank">DBUnit</a> JUnit ile entegre edilerek <a href="http://www.kurumsaljava.com/download/8/">entegrasyon ve regresyon testlerinin</a> JUnit testleri olarak implemente edilmesi mümkündür. DBUnit JUnit entegrasyonu aşağıdaki şekilde gerçekleştirilebilir. Bilgibankası olarak örnekte HSQLDB kullanılmıştır (bakınız <a href="http://www.kurumsaljava.com/2010/01/15/hsqldb-ve-junit-entegrasyonu/" target=_blank>HSQLDB JUnit entegrasyonu</a>). Verilerin <b>dbunit-dataset.xml</b> dosyasında tanımlanmıs olması gerekmektedir. <b>setUp()</b> metodu her test öncesi JUnit frameworkü tarafından koşturulacağı için istenilen veriler test öncesi bilgibankasına eklenmiş ve regresyon testleri için taban oluşturulmuş olacaktır.</p>
<p><span id="more-1049"></span></p>
<pre name="code" class="java">

// JDBC Driver
    public static final String DRIVERCLASS      = &quot;org.hsqldb.jdbcDriver&quot;;
    // standalone mode
    public static final String CONNECTIONURL    = &quot;jdbc:hsqldb:hsql://localhost:9006/mydb&quot;;
    public static final String USERNAME         = &quot;sa&quot;;
    public static final String PASSWORD         = &quot;&quot;;

public void setUp() throws Exception
	{
		PreparedStatement pstmt = null;

		 try
		 {
			IDatabaseConnection connection = getConnection();
			IDataSet dataSet = getDataSet();
			try
			{
				// REF INTEGRITY MUST BE DISABLED IN ORDER TO IMPORT THE DATA
				// THIS SOLUTION IS ONLY VALID FOR HSQLDB 1.8
				pstmt = connection.getConnection().prepareStatement(&quot;set referential_integrity FALSE&quot;);
				pstmt.executeUpdate();
				DatabaseOperation.CLEAN_INSERT.execute(connection, dataSet);
				pstmt = connection.getConnection().prepareStatement(&quot;set referential_integrity TRUE&quot;);
				pstmt.executeUpdate();
			}
			finally
			{
				connection.close();
			}
		}
		catch (Exception e)
		{
		    throw e;
		}
	}

	protected IDatabaseConnection getConnection() throws Exception
	{
		Class.forName(DRIVERCLASS);
		Connection jdbcConnection = DriverManager.getConnection(CONNECTIONURL, USERNAME, PASSWORD);
		IDatabaseConnection con =  new DatabaseConnection(jdbcConnection);
		DatabaseConfig config = con.getConfig();
		config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new HsqldbDataTypeFactory());
		return con;
	}

protected final IDataSet getDataSet() throws Exception
	{
		final URL url = DatabaseTestCase.class.getResource( &quot;/dbunit-dataset.xml&quot;);
	    final File file = new File(url.getPath());
	    return new FlatXmlDataSet(file);
	}
</pre>
]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.dbunit.org" target="_blank">DBUnit</a> JUnit ile entegre edilerek <a href="http://www.kurumsaljava.com/download/8/">entegrasyon ve regresyon testlerinin</a> JUnit testleri olarak implemente edilmesi mümkündür. DBUnit JUnit entegrasyonu aşağıdaki şekilde gerçekleştirilebilir. Bilgibankası olarak örnekte HSQLDB kullanılmıştır (bakınız <a href="http://www.kurumsaljava.com/2010/01/15/hsqldb-ve-junit-entegrasyonu/" target=_blank>HSQLDB JUnit entegrasyonu</a>). Verilerin <b>dbunit-dataset.xml</b> dosyasında tanımlanmıs olması gerekmektedir. <b>setUp()</b> metodu her test öncesi JUnit frameworkü tarafından koşturulacağı için istenilen veriler test öncesi bilgibankasına eklenmiş ve regresyon testleri için taban oluşturulmuş olacaktır.</p>
<p><span id="more-1049"></span></p>
<pre name="code" class="java">

// JDBC Driver
    public static final String DRIVERCLASS      = &quot;org.hsqldb.jdbcDriver&quot;;
    // standalone mode
    public static final String CONNECTIONURL    = &quot;jdbc:hsqldb:hsql://localhost:9006/mydb&quot;;
    public static final String USERNAME         = &quot;sa&quot;;
    public static final String PASSWORD         = &quot;&quot;;

public void setUp() throws Exception
	{
		PreparedStatement pstmt = null;

		 try
		 {
			IDatabaseConnection connection = getConnection();
			IDataSet dataSet = getDataSet();
			try
			{
				// REF INTEGRITY MUST BE DISABLED IN ORDER TO IMPORT THE DATA
				// THIS SOLUTION IS ONLY VALID FOR HSQLDB 1.8
				pstmt = connection.getConnection().prepareStatement(&quot;set referential_integrity FALSE&quot;);
				pstmt.executeUpdate();
				DatabaseOperation.CLEAN_INSERT.execute(connection, dataSet);
				pstmt = connection.getConnection().prepareStatement(&quot;set referential_integrity TRUE&quot;);
				pstmt.executeUpdate();
			}
			finally
			{
				connection.close();
			}
		}
		catch (Exception e)
		{
		    throw e;
		}
	}

	protected IDatabaseConnection getConnection() throws Exception
	{
		Class.forName(DRIVERCLASS);
		Connection jdbcConnection = DriverManager.getConnection(CONNECTIONURL, USERNAME, PASSWORD);
		IDatabaseConnection con =  new DatabaseConnection(jdbcConnection);
		DatabaseConfig config = con.getConfig();
		config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new HsqldbDataTypeFactory());
		return con;
	}

protected final IDataSet getDataSet() throws Exception
	{
		final URL url = DatabaseTestCase.class.getResource( &quot;/dbunit-dataset.xml&quot;);
	    final File file = new File(url.getPath());
	    return new FlatXmlDataSet(file);
	}
</pre>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.kurumsaljava.com%2F2010%2F01%2F15%2Fdbunit-junit-entegrasyonu%2F&amp;linkname=DBUnit%20JUnit%20Entegrasyonu"><img src="http://www.kurumsaljava.com/wp-content/plugins/add-to-any/share_save_256_24.png" width="256" height="24" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.kurumsaljava.com/2010/01/15/dbunit-junit-entegrasyonu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HSQLDB ve JUnit Entegrasyonu</title>
		<link>http://www.kurumsaljava.com/2010/01/15/hsqldb-ve-junit-entegrasyonu/</link>
		<comments>http://www.kurumsaljava.com/2010/01/15/hsqldb-ve-junit-entegrasyonu/#comments</comments>
		<pubDate>Fri, 15 Jan 2010 15:36:02 +0000</pubDate>
		<dc:creator>acar</dc:creator>
				<category><![CDATA[Püf Noktası]]></category>
		<category><![CDATA[HSQDB]]></category>
		<category><![CDATA[Junit]]></category>

		<guid isPermaLink="false">http://www.kurumsaljava.com/?p=1045</guid>
		<description><![CDATA[<p>Oluşturduğum entegrasyon JUnit testlerinde, testler öncesi verilerin bilgibankasına aktarılması gerekiyor. Aşağıda yer aldığı şekilde JUnit sınıfı bünyesinde <a href="http://hsqldb.org/" target=_blank>HSQLDB</a> serveri standalone modda çalıştırılabilir ve <a href="http://www.kurumsaljava.com/2010/01/15/dbunit-junit-entegrasyonu/" target=_blank>DBUnit</a> ile veriler bilgibankasına eklenebilir.</p>
<p><span id="more-1045"></span></p>
<pre name="code" class="java">

    // JDBC Driver
    public static final String DRIVERCLASS      = &quot;org.hsqldb.jdbcDriver&quot;;
    // standalone mode
    public static final String CONNECTIONURL    = &quot;jdbc:hsqldb:hsql://localhost:9006/mydb&quot;;

    public static final String USERNAME         = &quot;sa&quot;;
    public static final String PASSWORD         = &quot;&quot;;

private void startHsqlDb()
    {        

	    if(!isHsqlDbStarted())
	    {
	        Server hsqlServer = new Server();
	        hsqlServer.setAddress(&quot;localhost&quot;);
	        hsqlServer.setPort(9006);
	        hsqlServer.setDatabasePath(0, &quot;db/hsqldb-data/&quot;);
	        hsqlServer.setDatabaseName(0, &quot;mydb&quot;);
	        hsqlServer.start();
	    }
    }

	private boolean isHsqlDbStarted()
    {
        boolean result = false;
        try
        {
            Class.forName(DRIVERCLASS);
            Connection con = DriverManager.getConnection(CONNECTIONURL, USERNAME, PASSWORD);
            con.close();
            result = true;
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        return result;
    }

	private static void stopHsqlDb()
    {
        try
        {
            Class.forName(DRIVERCLASS);
            Connection con = DriverManager.getConnection(CONNECTIONURL, USERNAME, PASSWORD);
            Statement statement = con.createStatement();
            statement.execute(&quot;SHUTDOWN&quot;);
            statement.close();
            con.close();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
</pre>
]]></description>
			<content:encoded><![CDATA[<p>Oluşturduğum entegrasyon JUnit testlerinde, testler öncesi verilerin bilgibankasına aktarılması gerekiyor. Aşağıda yer aldığı şekilde JUnit sınıfı bünyesinde <a href="http://hsqldb.org/" target=_blank>HSQLDB</a> serveri standalone modda çalıştırılabilir ve <a href="http://www.kurumsaljava.com/2010/01/15/dbunit-junit-entegrasyonu/" target=_blank>DBUnit</a> ile veriler bilgibankasına eklenebilir.</p>
<p><span id="more-1045"></span></p>
<pre name="code" class="java">

    // JDBC Driver
    public static final String DRIVERCLASS      = &quot;org.hsqldb.jdbcDriver&quot;;
    // standalone mode
    public static final String CONNECTIONURL    = &quot;jdbc:hsqldb:hsql://localhost:9006/mydb&quot;;

    public static final String USERNAME         = &quot;sa&quot;;
    public static final String PASSWORD         = &quot;&quot;;

private void startHsqlDb()
    {        

	    if(!isHsqlDbStarted())
	    {
	        Server hsqlServer = new Server();
	        hsqlServer.setAddress(&quot;localhost&quot;);
	        hsqlServer.setPort(9006);
	        hsqlServer.setDatabasePath(0, &quot;db/hsqldb-data/&quot;);
	        hsqlServer.setDatabaseName(0, &quot;mydb&quot;);
	        hsqlServer.start();
	    }
    }

	private boolean isHsqlDbStarted()
    {
        boolean result = false;
        try
        {
            Class.forName(DRIVERCLASS);
            Connection con = DriverManager.getConnection(CONNECTIONURL, USERNAME, PASSWORD);
            con.close();
            result = true;
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        return result;
    }

	private static void stopHsqlDb()
    {
        try
        {
            Class.forName(DRIVERCLASS);
            Connection con = DriverManager.getConnection(CONNECTIONURL, USERNAME, PASSWORD);
            Statement statement = con.createStatement();
            statement.execute(&quot;SHUTDOWN&quot;);
            statement.close();
            con.close();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
</pre>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.kurumsaljava.com%2F2010%2F01%2F15%2Fhsqldb-ve-junit-entegrasyonu%2F&amp;linkname=HSQLDB%20ve%20JUnit%20Entegrasyonu"><img src="http://www.kurumsaljava.com/wp-content/plugins/add-to-any/share_save_256_24.png" width="256" height="24" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.kurumsaljava.com/2010/01/15/hsqldb-ve-junit-entegrasyonu/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>JPA Anotasyonları ve Dinamik Tablo İsmi</title>
		<link>http://www.kurumsaljava.com/2009/11/25/jpa-anotasyonlari-ve-dinamik-tablo-ismi/</link>
		<comments>http://www.kurumsaljava.com/2009/11/25/jpa-anotasyonlari-ve-dinamik-tablo-ismi/#comments</comments>
		<pubDate>Wed, 25 Nov 2009 08:54:44 +0000</pubDate>
		<dc:creator>acar</dc:creator>
				<category><![CDATA[Püf Noktası]]></category>
		<category><![CDATA[Hıbernateö Püf Noktası]]></category>

		<guid isPermaLink="false">http://www.kurumsaljava.com/?p=978</guid>
		<description><![CDATA[<p>Projelerde komponent tabanlı çalışmaya özen gösteriyorum. Komponent olarak geliştirdiğim bir modülü, konfigürasyon değişikliği yaparak başka bir projede kullanabilmeliyim. Komponentler kodun tekrar kullanımını (reuse) ve programcının daha az kod yazmasını mümkün kılar.</p>
<p><span id="more-978"></span></p>
<p>Komponent bünyelerinde Hibernate kullanarak, komponent verilerini bilgibankasında sakliyorum. Şu an geliştirdiğim <a href="http://www.jugtr.org" target="_blank">JugTR.org</a> projesinde JPA anotasyonlarını kullandım. Aşağıda blog kayıtlarını temsil eden Blog Entity sınıfı yer alıyor.</p>
<pre name="code" class="java">

package bt.common.manager.blog.domain;

import java.io.Serializable;
import java.sql.Timestamp;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name=&quot;blog&quot;)
public class Blog implements Serializable
{
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = &quot;id&quot;)
private Long id;

@Column(name = &quot;subject&quot;, nullable = false)
private String subject;

@Column(name = &quot;body&quot;, nullable = false)
private String body;

@Column(name = &quot;userid&quot;, nullable = false)
private Long user;

@Column(name = &quot;created&quot;, nullable = false)
private Timestamp created;

public Blog(long blogId)
{
this.id = blogId;
}

public Blog()
{

}

public Long getId()
{
return id;
}

public void setId(Long id)
{
this.id = id;
}

public String getSubject()
{
return subject;
}

public void setSubject(String subject)
{
this.subject = subject;
}

public String getBody()
{
return body;
}

public void setBody(String body)
{
this.body = body;
}

public Long getUser()
{
return user;
}

public void setUser(Long user)
{
this.user = user;
}

public Timestamp getCreated()
{
return created;
}

public void setCreated(Timestamp created)
{
this.created = created;
}
}
</pre>
<p><b>@Table</b> anotasyonunu kullanarak bilgibankası tablosunu belirliyorum. Örnekte görüldüğü gibi Blog nesnesinin ihtiva ettiği veriler <b>blog</b> isimli tabloda saklanmakta.</p>
<p>Blog komponentini (Blog.java ve diger komponent sınıfları) daha önce başka projelerde de kullandım. Komponenti tekrar kullanmak (reuse) benim için kod üzerinde değişiklik yapmamak anlamına gelmektedir. Eğer blog verilerini <b>jugtr_blog</b> isimli tabloda tutmak istersem, Blog.java sınıfında yer alan @Table anotasyonunu değiştirmem gerekiyor. Bu durumda komponentin kodunu değiştirmiş olacağım. Bu da bir nevi tekrar kullanım, lakin bu durumda komponentin birden fazla versiyonu oluşmakta ve bunların bakımı zamanla güçleşmektedir. Benim hayalimde kod üzerinde değişiklik yapmadan Blog komponenentini istediğim projede kullanabilmek  ve bilgibankası tablo ismini projeye göre değiştirebilmek var. Bu ne yazik ki JPA anotasyonlarını kullanarak mümkün değil. Eğer @Table anotasyonu ile tablo ismini belirlediyseniz, o zaman tablo ismini değiştirmek için sınıfı değiştirmeniz gerekiyor.</p>
<p>Bu çoktan beri üzerinde çalıştığım bir sorun. Sorunu Hibernate bünyesinde bir <b>interceptor</b> sınıf oluşturarak çözebildim. Interceptor sınıfı aşağıdaki yapıya sahip:</p>
<pre name="code" class="java">

package bt.jugtr.application.common.hibernate;

import org.hibernate.EmptyInterceptor;

public class JugTRHibernateInterceptor extends EmptyInterceptor
{

	private static final long serialVersionUID = 1L;

	@Override
	 public String onPrepareStatement(String sql)
	 {
	 		 String prepedStatement = super.onPrepareStatement(sql);

	 		 prepedStatement = prepedStatement.replaceAll(&quot;public.&quot;, &quot;jugtr.&quot;);

	 		 return prepedStatement;
	 }
}
</pre>
<p>Bu  interceptor sınıfını aktive etmek için <b>SessionFactory</b> konfigürasyonunu (Spring applicationContext.xml bünyesinde) aşağıdaki şekilde değiştiriyorum:</p>
<pre name="code" class="java">

&lt;bean id=&quot;sessionFactory&quot;
		class=&quot;org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean&quot;&gt;
		 &lt;property name=&quot;entityInterceptor&quot;&gt;
		 		 &lt;bean class=&quot;bt.jugtr.application.common.hibernate.JugTRHibernateInterceptor&quot; /&gt;
		 &lt;/property&gt;
		&lt;property name=&quot;configurationClass&quot;&gt;
			&lt;value&gt;org.hibernate.cfg.AnnotationConfiguration&lt;/value&gt;
		&lt;/property&gt;
		&lt;property name=&quot;hibernateProperties&quot;&gt;
			&lt;props&gt;
				&lt;prop key=&quot;hibernate.dialect&quot;&gt; ${hibernate.dialect} &lt;/prop&gt;
				&lt;prop key=&quot;hibernate.show_sql&quot;&gt;true&lt;/prop&gt;
				&lt;prop key=&quot;hibernate.format_sql&quot;&gt;true&lt;/prop&gt;
				&lt;prop key=&quot;hibernate.use_sql_comments&quot;&gt;true&lt;/prop&gt;
				&lt;prop key=&quot;hibernate.connection.release_mode&quot;&gt;after_transaction&lt;/prop&gt;
				&lt;prop key=&quot;hibernate.current_session_context_class&quot;&gt;thread&lt;/prop&gt;
			&lt;/props&gt;
		&lt;/property&gt;
		&lt;property name=&quot;dataSource&quot;&gt;
			&lt;ref bean=&quot;dataSource&quot; /&gt;
		&lt;/property&gt;
		&lt;property name=&quot;annotatedClasses&quot;&gt;
			&lt;list&gt;
				&lt;value&gt;bt.common.manager.user.domain.BTUser&lt;/value&gt;
				&lt;value&gt;bt.common.manager.user.domain.Authorities&lt;/value&gt;
				&lt;value&gt;bt.common.manager.blog.domain.Blog&lt;/value&gt;
				&lt;value&gt;bt.common.manager.blog.domain.BlogComment&lt;/value&gt;

			&lt;/list&gt;
		&lt;/property&gt;
	&lt;/bean&gt;
</pre>
<p>Hibernate, oluşturduğu SQL komutunu bilgibankasına göndermeden önce <b>JugTRHibernateInterceptor</b> sınıfının <i>onPrepareStatement()</i> metodunu koşturur. Bu metot bünyesinde <i>public.</i> ile başlayan tablo isimlerini <i>jugtr.</i> olarak değiştiriyorum. public. ve jugtr. bilgibankasında kullandığım şemalar (schema). Hibernate tarafından oluşturulan SQL komutlarında public. isminin kullanımını @Table anotasyonuna schema değişkenini ekleyerek sağlayabilirim:</p>
<pre name="code" class="java">

@Entity
@Table(name=&quot;blog&quot;, schema=&quot;public&quot;)
public class Blog implements Serializable
{
}
</pre>
<p>Bu değişikliğin ardından Hibernate tarafından oluşturulan bir SQL aşağıdaki şekilde olacaktır:</p>
<pre name="code" class="java">

/* from Blog order by id desc */
select top ? blog0_.id as id2_, blog0_.body as body2_, blog0_.created as created2_, blog0_.subject
as subject2_, blog0_.userid as userid2_ from public.blog blog0_ order by blog0_.id desc
</pre>
<p>Görüldüğü gibi Hibernate blog tablosunu <b>public.blog</b> seklinde adreslemeye başladı. Tekrar JugTRHibernateInterceptor sınıfına geri dönelim. <i>onPrepareStatement()</i>  metodu bünyesinde SQL komutunda yer alan public. kelimesinin jugtr. olarak değiştirilmesini sağlıyorum. Bu şekilde dinamik olarak başka bir şemayı ve bu şemada bulunan blog tablosunu adreslemiş oluyorum. JugTRHibernateInterceptor devreye girdikten sonra SQL komutu aşağıdaki şekilde değişikliğe uğruyor. Bu şekilde başka bir şema içinde bulunan blog isimli tablo kullanımı mümkün oluyor. Görüldüğü gibi Blog.java kodunu değiştirmek zorunda kalmadan başka bir tabloyu kullanabildik.</p>
<pre name="code" class="java">

/* from Blog order by id desc */
select top ? blog0_.id as id2_, blog0_.body as body2_, blog0_.created as created2_, blog0_.subject
as subject2_, blog0_.userid as userid2_ from jugtr.blog blog0_ order by blog0_.id desc
</pre>
<p><i><br />
EOF ( End Of Fun)<br />
Özcan Acar<br />
</i></p>
]]></description>
			<content:encoded><![CDATA[<p>Projelerde komponent tabanlı çalışmaya özen gösteriyorum. Komponent olarak geliştirdiğim bir modülü, konfigürasyon değişikliği yaparak başka bir projede kullanabilmeliyim. Komponentler kodun tekrar kullanımını (reuse) ve programcının daha az kod yazmasını mümkün kılar.</p>
<p><span id="more-978"></span></p>
<p>Komponent bünyelerinde Hibernate kullanarak, komponent verilerini bilgibankasında sakliyorum. Şu an geliştirdiğim <a href="http://www.jugtr.org" target="_blank">JugTR.org</a> projesinde JPA anotasyonlarını kullandım. Aşağıda blog kayıtlarını temsil eden Blog Entity sınıfı yer alıyor.</p>
<pre name="code" class="java">

package bt.common.manager.blog.domain;

import java.io.Serializable;
import java.sql.Timestamp;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name=&quot;blog&quot;)
public class Blog implements Serializable
{
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = &quot;id&quot;)
private Long id;

@Column(name = &quot;subject&quot;, nullable = false)
private String subject;

@Column(name = &quot;body&quot;, nullable = false)
private String body;

@Column(name = &quot;userid&quot;, nullable = false)
private Long user;

@Column(name = &quot;created&quot;, nullable = false)
private Timestamp created;

public Blog(long blogId)
{
this.id = blogId;
}

public Blog()
{

}

public Long getId()
{
return id;
}

public void setId(Long id)
{
this.id = id;
}

public String getSubject()
{
return subject;
}

public void setSubject(String subject)
{
this.subject = subject;
}

public String getBody()
{
return body;
}

public void setBody(String body)
{
this.body = body;
}

public Long getUser()
{
return user;
}

public void setUser(Long user)
{
this.user = user;
}

public Timestamp getCreated()
{
return created;
}

public void setCreated(Timestamp created)
{
this.created = created;
}
}
</pre>
<p><b>@Table</b> anotasyonunu kullanarak bilgibankası tablosunu belirliyorum. Örnekte görüldüğü gibi Blog nesnesinin ihtiva ettiği veriler <b>blog</b> isimli tabloda saklanmakta.</p>
<p>Blog komponentini (Blog.java ve diger komponent sınıfları) daha önce başka projelerde de kullandım. Komponenti tekrar kullanmak (reuse) benim için kod üzerinde değişiklik yapmamak anlamına gelmektedir. Eğer blog verilerini <b>jugtr_blog</b> isimli tabloda tutmak istersem, Blog.java sınıfında yer alan @Table anotasyonunu değiştirmem gerekiyor. Bu durumda komponentin kodunu değiştirmiş olacağım. Bu da bir nevi tekrar kullanım, lakin bu durumda komponentin birden fazla versiyonu oluşmakta ve bunların bakımı zamanla güçleşmektedir. Benim hayalimde kod üzerinde değişiklik yapmadan Blog komponenentini istediğim projede kullanabilmek  ve bilgibankası tablo ismini projeye göre değiştirebilmek var. Bu ne yazik ki JPA anotasyonlarını kullanarak mümkün değil. Eğer @Table anotasyonu ile tablo ismini belirlediyseniz, o zaman tablo ismini değiştirmek için sınıfı değiştirmeniz gerekiyor.</p>
<p>Bu çoktan beri üzerinde çalıştığım bir sorun. Sorunu Hibernate bünyesinde bir <b>interceptor</b> sınıf oluşturarak çözebildim. Interceptor sınıfı aşağıdaki yapıya sahip:</p>
<pre name="code" class="java">

package bt.jugtr.application.common.hibernate;

import org.hibernate.EmptyInterceptor;

public class JugTRHibernateInterceptor extends EmptyInterceptor
{

	private static final long serialVersionUID = 1L;

	@Override
	 public String onPrepareStatement(String sql)
	 {
	 		 String prepedStatement = super.onPrepareStatement(sql);

	 		 prepedStatement = prepedStatement.replaceAll(&quot;public.&quot;, &quot;jugtr.&quot;);

	 		 return prepedStatement;
	 }
}
</pre>
<p>Bu  interceptor sınıfını aktive etmek için <b>SessionFactory</b> konfigürasyonunu (Spring applicationContext.xml bünyesinde) aşağıdaki şekilde değiştiriyorum:</p>
<pre name="code" class="java">

&lt;bean id=&quot;sessionFactory&quot;
		class=&quot;org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean&quot;&gt;
		 &lt;property name=&quot;entityInterceptor&quot;&gt;
		 		 &lt;bean class=&quot;bt.jugtr.application.common.hibernate.JugTRHibernateInterceptor&quot; /&gt;
		 &lt;/property&gt;
		&lt;property name=&quot;configurationClass&quot;&gt;
			&lt;value&gt;org.hibernate.cfg.AnnotationConfiguration&lt;/value&gt;
		&lt;/property&gt;
		&lt;property name=&quot;hibernateProperties&quot;&gt;
			&lt;props&gt;
				&lt;prop key=&quot;hibernate.dialect&quot;&gt; ${hibernate.dialect} &lt;/prop&gt;
				&lt;prop key=&quot;hibernate.show_sql&quot;&gt;true&lt;/prop&gt;
				&lt;prop key=&quot;hibernate.format_sql&quot;&gt;true&lt;/prop&gt;
				&lt;prop key=&quot;hibernate.use_sql_comments&quot;&gt;true&lt;/prop&gt;
				&lt;prop key=&quot;hibernate.connection.release_mode&quot;&gt;after_transaction&lt;/prop&gt;
				&lt;prop key=&quot;hibernate.current_session_context_class&quot;&gt;thread&lt;/prop&gt;
			&lt;/props&gt;
		&lt;/property&gt;
		&lt;property name=&quot;dataSource&quot;&gt;
			&lt;ref bean=&quot;dataSource&quot; /&gt;
		&lt;/property&gt;
		&lt;property name=&quot;annotatedClasses&quot;&gt;
			&lt;list&gt;
				&lt;value&gt;bt.common.manager.user.domain.BTUser&lt;/value&gt;
				&lt;value&gt;bt.common.manager.user.domain.Authorities&lt;/value&gt;
				&lt;value&gt;bt.common.manager.blog.domain.Blog&lt;/value&gt;
				&lt;value&gt;bt.common.manager.blog.domain.BlogComment&lt;/value&gt;

			&lt;/list&gt;
		&lt;/property&gt;
	&lt;/bean&gt;
</pre>
<p>Hibernate, oluşturduğu SQL komutunu bilgibankasına göndermeden önce <b>JugTRHibernateInterceptor</b> sınıfının <i>onPrepareStatement()</i> metodunu koşturur. Bu metot bünyesinde <i>public.</i> ile başlayan tablo isimlerini <i>jugtr.</i> olarak değiştiriyorum. public. ve jugtr. bilgibankasında kullandığım şemalar (schema). Hibernate tarafından oluşturulan SQL komutlarında public. isminin kullanımını @Table anotasyonuna schema değişkenini ekleyerek sağlayabilirim:</p>
<pre name="code" class="java">

@Entity
@Table(name=&quot;blog&quot;, schema=&quot;public&quot;)
public class Blog implements Serializable
{
}
</pre>
<p>Bu değişikliğin ardından Hibernate tarafından oluşturulan bir SQL aşağıdaki şekilde olacaktır:</p>
<pre name="code" class="java">

/* from Blog order by id desc */
select top ? blog0_.id as id2_, blog0_.body as body2_, blog0_.created as created2_, blog0_.subject
as subject2_, blog0_.userid as userid2_ from public.blog blog0_ order by blog0_.id desc
</pre>
<p>Görüldüğü gibi Hibernate blog tablosunu <b>public.blog</b> seklinde adreslemeye başladı. Tekrar JugTRHibernateInterceptor sınıfına geri dönelim. <i>onPrepareStatement()</i>  metodu bünyesinde SQL komutunda yer alan public. kelimesinin jugtr. olarak değiştirilmesini sağlıyorum. Bu şekilde dinamik olarak başka bir şemayı ve bu şemada bulunan blog tablosunu adreslemiş oluyorum. JugTRHibernateInterceptor devreye girdikten sonra SQL komutu aşağıdaki şekilde değişikliğe uğruyor. Bu şekilde başka bir şema içinde bulunan blog isimli tablo kullanımı mümkün oluyor. Görüldüğü gibi Blog.java kodunu değiştirmek zorunda kalmadan başka bir tabloyu kullanabildik.</p>
<pre name="code" class="java">

/* from Blog order by id desc */
select top ? blog0_.id as id2_, blog0_.body as body2_, blog0_.created as created2_, blog0_.subject
as subject2_, blog0_.userid as userid2_ from jugtr.blog blog0_ order by blog0_.id desc
</pre>
<p><i><br />
EOF ( End Of Fun)<br />
Özcan Acar<br />
</i></p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.kurumsaljava.com%2F2009%2F11%2F25%2Fjpa-anotasyonlari-ve-dinamik-tablo-ismi%2F&amp;linkname=JPA%20Anotasyonlar%C4%B1%20ve%20Dinamik%20Tablo%20%C4%B0smi"><img src="http://www.kurumsaljava.com/wp-content/plugins/add-to-any/share_save_256_24.png" width="256" height="24" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.kurumsaljava.com/2009/11/25/jpa-anotasyonlari-ve-dinamik-tablo-ismi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apache ile Tomcat Arasında Reverse Proxy Oluşturma</title>
		<link>http://www.kurumsaljava.com/2009/11/22/apache-ile-tomcat-arasinda-reverse-proxy-olusturma/</link>
		<comments>http://www.kurumsaljava.com/2009/11/22/apache-ile-tomcat-arasinda-reverse-proxy-olusturma/#comments</comments>
		<pubDate>Sun, 22 Nov 2009 13:13:34 +0000</pubDate>
		<dc:creator>acar</dc:creator>
				<category><![CDATA[Püf Noktası]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[Proxy]]></category>
		<category><![CDATA[Tomcat]]></category>

		<guid isPermaLink="false">http://www.kurumsaljava.com/?p=965</guid>
		<description><![CDATA[<p><a href="http://www.jugtr.org" target="_blank">JugTR.org</a> projesi Tomcat içinde deploy edilen bir Java 6 web aplikasyonu (Servlet 2.5 spec).  Bu aplikasyona <a href="http://www.jugtr.org">http://www.jugtr.org</a> adresi üzerinden ulaşabilmek için Tomcat&#8217;in 80 numaralı port üzerinde çalışması gerekmektedir. Kullandığım server üzerinde 80 numaralı portta Apache çalışmakta. Bu durumda Tomcat&#8217;i 80 numaralı port üzerinde çalıştırmam mümkün değil.  80 haricinde herhangi bir port seçerek, JugTR.org aplikasyonunu deploy edebilirim, örneğin port 8181. Bu durumda aplikasyonun erişim adresi <a href="http://www.jugtr.org:8181">http://www.jugtr.org:8181</a> olacaktır.</p>
<p><span id="more-965"></span></p>
<p>Apache ile Tomcat arasında Reverse Proxy oluşturarak JugTR.org aplikasyonuna 80 numaralı port üzerinden ulaşabiliriz. Reverse Proxy kullanıldığında <a href="http://www.jugtr.org">http://www.jugtr.org</a> adresine gelen kullanıcı istekleri Apache tarafından <a href="http://127.0.0.1:8181">http://127.0.0.1:8181</a> adresine yönlendirilir ve bu şekilde 8181 portu üzerinde faaliyet gösteren Tomcat&#8217;e 80 numaralı port üzerinden erişim sağlanmış olur. Apache,  kullanıcı ile Tomcat içinde deploy edilmiş ve 8181 numaralı portta çalışan JugTR.org aplikasyonu arasında aracılık etmiş olur.</p>
<p>Apache ile Tomcat arasında Reverse Proxy oluşturmak için öncelikle mod_proxy modülünü Apache httpd.conf dosyasina eklememiz gerekiyor. Ben Apache 2 versiyonunu kullanıyorum. Aşağıda httpd.conf dosyasında yer alması gereken konfigürasyon bulunmakta.</p>
<p> </p>
<pre name="code" class="java">

LoadModule proxy_module modules/mod_proxy.so

[Proxy *]
   Order deny,allow
   Allow from all
[/Proxy]

NameVirtualHost 192.168.1.76

[VirtualHost 192.168.1.76]
ServerName www.jugtr.org
ServerAlias www.jugtr.org jugtr.org
ServerAdmin info@jugtr.org
DocumentRoot /database/usr/local/apache/htdocs/
ProxyPass / http://127.0.0.1:8181/
[Location /]
      ProxyPassReverse /
   [/Location]
[/VirtualHost]
</pre>
<p>Yukarda görüldügü gibi VirtualHost direktifini kullanarak, jugtr.org icin yeni bir virtual domain oluşturuyorum. Bu sayede aynı Apache kurulumu üzerinde birden fazla domain ismini kullanmam mümkün.</p>
<p>VirtualHost direktifini yakından incelediğimizde ProxyPass direktifi ile http://www.jugtr.org/ adresine gelen tüm kullanıcı isteklerinin (request) http://127.0.0.1:8181 adresine yönlendirildiğini görmekteyiz. ProxyPass direktifini kullanarak Apache ve Tomcat arasında Reverse Proxy oluşturmus oluyoruz.</p>
<p>Tomcat kullanıcı isteklerine konfigüre edildigi IP ve port adresi ile cevap verir. Yukardaki örnekte kullanıcı http://127.0.0.1:8181 adresine yönlendirilecektir. Bu durumda Apache ile Tomcat arasındaki proxy çalışmamaktadır. Tomcat&#8217;in gönderdigi cevapların reverse proxy adresinde olmasını sağlamak için Tomcat&#8217;in server.xml konfigürasyon dosyası üzerinde değişiklik yapmamız gerekmektedir. Yapılması gereken değişiklik Connector elementi bünyesindedir.</p>
<pre name="code" class="java">

Connector port=&quot;1224&quot; maxThreads=&quot;150&quot; minSpareThreads=&quot;25&quot; maxSpareThreads=&quot;75&quot; enableLookups=&quot;false&quot; redirectPort=&quot;8443&quot;

debug=&quot;0&quot; acceptCount=&quot;100&quot; connectionTimeout=&quot;20000&quot; disableUploadTimeout=&quot;true&quot; URIEncoding=&quot;UTF-8&quot; proxyName=&quot;www.jugtr.org&quot; proxyPort=&quot;80&quot;
</pre>
<p>Connector elementinde kullandığımız proxyName ve proxyPort atributlarıyla Tomcat&#8217;in gönderdiği cevapların http://www.jugtr.org şeklinde olmasını sagladık.</p>
<div><em> </em></div>
<p> </p>
<div><em>EOF ( End Of Fun )</em></div>
<div><em>Özcan Acar</em></div>
<p><em> </p>
<p> </p>
<p> </p>
<p></em></p>
]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.jugtr.org" target="_blank">JugTR.org</a> projesi Tomcat içinde deploy edilen bir Java 6 web aplikasyonu (Servlet 2.5 spec).  Bu aplikasyona <a href="http://www.jugtr.org">http://www.jugtr.org</a> adresi üzerinden ulaşabilmek için Tomcat&#8217;in 80 numaralı port üzerinde çalışması gerekmektedir. Kullandığım server üzerinde 80 numaralı portta Apache çalışmakta. Bu durumda Tomcat&#8217;i 80 numaralı port üzerinde çalıştırmam mümkün değil.  80 haricinde herhangi bir port seçerek, JugTR.org aplikasyonunu deploy edebilirim, örneğin port 8181. Bu durumda aplikasyonun erişim adresi <a href="http://www.jugtr.org:8181">http://www.jugtr.org:8181</a> olacaktır.</p>
<p><span id="more-965"></span></p>
<p>Apache ile Tomcat arasında Reverse Proxy oluşturarak JugTR.org aplikasyonuna 80 numaralı port üzerinden ulaşabiliriz. Reverse Proxy kullanıldığında <a href="http://www.jugtr.org">http://www.jugtr.org</a> adresine gelen kullanıcı istekleri Apache tarafından <a href="http://127.0.0.1:8181">http://127.0.0.1:8181</a> adresine yönlendirilir ve bu şekilde 8181 portu üzerinde faaliyet gösteren Tomcat&#8217;e 80 numaralı port üzerinden erişim sağlanmış olur. Apache,  kullanıcı ile Tomcat içinde deploy edilmiş ve 8181 numaralı portta çalışan JugTR.org aplikasyonu arasında aracılık etmiş olur.</p>
<p>Apache ile Tomcat arasında Reverse Proxy oluşturmak için öncelikle mod_proxy modülünü Apache httpd.conf dosyasina eklememiz gerekiyor. Ben Apache 2 versiyonunu kullanıyorum. Aşağıda httpd.conf dosyasında yer alması gereken konfigürasyon bulunmakta.</p>
<p> </p>
<pre name="code" class="java">

LoadModule proxy_module modules/mod_proxy.so

[Proxy *]
   Order deny,allow
   Allow from all
[/Proxy]

NameVirtualHost 192.168.1.76

[VirtualHost 192.168.1.76]
ServerName www.jugtr.org
ServerAlias www.jugtr.org jugtr.org
ServerAdmin info@jugtr.org
DocumentRoot /database/usr/local/apache/htdocs/
ProxyPass / http://127.0.0.1:8181/
[Location /]
      ProxyPassReverse /
   [/Location]
[/VirtualHost]
</pre>
<p>Yukarda görüldügü gibi VirtualHost direktifini kullanarak, jugtr.org icin yeni bir virtual domain oluşturuyorum. Bu sayede aynı Apache kurulumu üzerinde birden fazla domain ismini kullanmam mümkün.</p>
<p>VirtualHost direktifini yakından incelediğimizde ProxyPass direktifi ile http://www.jugtr.org/ adresine gelen tüm kullanıcı isteklerinin (request) http://127.0.0.1:8181 adresine yönlendirildiğini görmekteyiz. ProxyPass direktifini kullanarak Apache ve Tomcat arasında Reverse Proxy oluşturmus oluyoruz.</p>
<p>Tomcat kullanıcı isteklerine konfigüre edildigi IP ve port adresi ile cevap verir. Yukardaki örnekte kullanıcı http://127.0.0.1:8181 adresine yönlendirilecektir. Bu durumda Apache ile Tomcat arasındaki proxy çalışmamaktadır. Tomcat&#8217;in gönderdigi cevapların reverse proxy adresinde olmasını sağlamak için Tomcat&#8217;in server.xml konfigürasyon dosyası üzerinde değişiklik yapmamız gerekmektedir. Yapılması gereken değişiklik Connector elementi bünyesindedir.</p>
<pre name="code" class="java">

Connector port=&quot;1224&quot; maxThreads=&quot;150&quot; minSpareThreads=&quot;25&quot; maxSpareThreads=&quot;75&quot; enableLookups=&quot;false&quot; redirectPort=&quot;8443&quot;

debug=&quot;0&quot; acceptCount=&quot;100&quot; connectionTimeout=&quot;20000&quot; disableUploadTimeout=&quot;true&quot; URIEncoding=&quot;UTF-8&quot; proxyName=&quot;www.jugtr.org&quot; proxyPort=&quot;80&quot;
</pre>
<p>Connector elementinde kullandığımız proxyName ve proxyPort atributlarıyla Tomcat&#8217;in gönderdiği cevapların http://www.jugtr.org şeklinde olmasını sagladık.</p>
<div><em> </em></div>
<p> </p>
<div><em>EOF ( End Of Fun )</em></div>
<div><em>Özcan Acar</em></div>
<p><em> </p>
<p> </p>
<p> </p>
<p></em></p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.kurumsaljava.com%2F2009%2F11%2F22%2Fapache-ile-tomcat-arasinda-reverse-proxy-olusturma%2F&amp;linkname=Apache%20ile%20Tomcat%20Aras%C4%B1nda%20Reverse%20Proxy%20Olu%C5%9Fturma"><img src="http://www.kurumsaljava.com/wp-content/plugins/add-to-any/share_save_256_24.png" width="256" height="24" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.kurumsaljava.com/2009/11/22/apache-ile-tomcat-arasinda-reverse-proxy-olusturma/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>UML&#8217;i Sevmeyenler İçin</title>
		<link>http://www.kurumsaljava.com/2009/11/17/umli-sevmeyenler-icin/</link>
		<comments>http://www.kurumsaljava.com/2009/11/17/umli-sevmeyenler-icin/#comments</comments>
		<pubDate>Tue, 17 Nov 2009 09:43:38 +0000</pubDate>
		<dc:creator>acar</dc:creator>
				<category><![CDATA[Kaynak Websayfalar]]></category>
		<category><![CDATA[Püf Noktası]]></category>
		<category><![CDATA[UML]]></category>

		<guid isPermaLink="false">http://www.kurumsaljava.com/?p=945</guid>
		<description><![CDATA[<p>Herhangi bir araç kullanmadan UML sequence diagramı çizmek istiyorsanız, <a href=http://www.websequencediagrams.com/ target=_blank>Websequencediagrams.com</a> sitesini bir deneyin <img src='http://www.kurumsaljava.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> <span id="more-945"></span></p>
<p>
<img src=http://www.websequencediagrams.com/cgi-bin/cdraw?lz=QWxpY2UtPkJvYjogQXV0aGVudGljYXRpb24gUmVxdWVzdApub3RlIHJpZ2h0IG9mIAAlBUJvYiB0aGlua3MgYWJvdXQgaXQuCkJvYi0tPgBMBQA5E3Nwb25zZQ&#038;s=default/></p>
<p><i><br />
EOF (End Of Fun)<br />
Özcan Acar<br />
</i></p>
]]></description>
			<content:encoded><![CDATA[<p>Herhangi bir araç kullanmadan UML sequence diagramı çizmek istiyorsanız, <a href=http://www.websequencediagrams.com/ target=_blank>Websequencediagrams.com</a> sitesini bir deneyin <img src='http://www.kurumsaljava.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> <span id="more-945"></span></p>
<p>
<img src=http://www.websequencediagrams.com/cgi-bin/cdraw?lz=QWxpY2UtPkJvYjogQXV0aGVudGljYXRpb24gUmVxdWVzdApub3RlIHJpZ2h0IG9mIAAlBUJvYiB0aGlua3MgYWJvdXQgaXQuCkJvYi0tPgBMBQA5E3Nwb25zZQ&#038;s=default/></p>
<p><i><br />
EOF (End Of Fun)<br />
Özcan Acar<br />
</i></p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.kurumsaljava.com%2F2009%2F11%2F17%2Fumli-sevmeyenler-icin%2F&amp;linkname=UML%26%238217%3Bi%20Sevmeyenler%20%C4%B0%C3%A7in"><img src="http://www.kurumsaljava.com/wp-content/plugins/add-to-any/share_save_256_24.png" width="256" height="24" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.kurumsaljava.com/2009/11/17/umli-sevmeyenler-icin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
