26 Eylül 2012 Çarşamba

Wicket Deployment Mode

 Wicket Deployment Mode ve ExceptionSettings

Wicket atanan deployment moduna göre yakalanmamış runtime exception'ları işlemektedir.
Eğer deploment mode RuntimeConfigurationType.DEVELOPMENT ise yakalanmamış exceptionlar stack trace bilgisi ile gösteriliyor.

Ancak Eğer deploment mode RuntimeConfigurationType.DEPLOYMENT ise yakalanmamış exceptionların stack trace bilgisi gösterilmiyor.

How can I see stack traces for my Wicket app? başlıklı soruda da cevaplandığı gibi DEPLOYMENT mod ile exceptionları göstermek için uygulamanın ExceptionSettings ayarları değiştirilebilir.

Eğer Wicket filter olarak kullanılıyorsa buradan aldığım şekildeki gibi web.xml dosyasından deployment mod da atanabilir.

Aşağıda bu sınıfın diğer sınıflar ile ilişkisi ve uygulama açılırken nereden okundğunu gösteren bir şekil bulabilirsiniz.


19 Eylül 2012 Çarşamba

Spring ve Factory Bean

Spring içindeki bazı FactoryBean sınıflarına örnekler. Collections başlıklı yazıya bakmakta da fayda var.

ListFactoryBean
ListFactoryBean sınıfı ile ilgili gördüğüm güzel bir cevap how does the <list> tag work in spring başlıklı soruda var.

Buradan aldığım örnekte List yaratan bir ListFactoryBean örneği var.


13 Eylül 2012 Perşembe

Hibernate hbm2ddl

Hibernate ile hbm2ddl isminde bir araç geliyor. Bu araç ile ilgili bulabildiğim en iyi yazılardan birisi Eyal Lupu tarafından yazılmış olan Hibernate's hbm2ddl tool başlıklı yazı.

Bu aracı kullanmak için konfigürasyon dosyasına

hibernate.hbm2ddl.auto = validate | update | create | create-drop seçeneklerinden birisini yazmak gerekiyor.

Aşağıdaki örnekte tablolar otomatik olarak yaratılıyor.

<hibernate-configuration>
    <session-factory>
        <property name="hbm2ddl.auto">create</property>
    </session-factory>
</hibernate-configuration>

Index Yaratma
Creating Indexes on DB with Hibernate @Index Annotation başlıklı soruda güzel bir cevap var.

Constraint Yaratma
@UniqueConstraint JPA anotasyon açıklaması ise burada.

12 Eylül 2012 Çarşamba

Apache Wicket ve Spring


Yazıya başlamadan önce hem Apache Wicket hem de Spring'in  bir servlet container içinde çalıştığını unutmamak lazım. Dolayısıyla ilk yapılması gereken iş, Servlet container ile bu iki yazılımı birleştirmek olmalı.

Spring ve Servlet Container


Spring ile Servlet Container'ı birleştirmeyi buradan aldığım şekil güzel açıklamış. Servlet Container bir spring sınıfı olan org.springframework.web.context.ContextLoaderListener sınıfını kullanarak Spring'i ayağa kaldırır. org.springframework.web.context.ContextLoaderListener sınıfının hiyerarşisi aşağıda.




ContextLoaderListener web.xml dosyasına aşağıdaki gibi tanımlanır.

ContextLoaderListene sınıfının okuması gereken dosyalar ise aşağıdaki gibi tanımlanır.

Burada okunacak dosyanın WEB-INF dizini altında olduğuna dikkat etmek lazım. Çünkü war dosyasının yapısı aşağıdaki gibi.

ContextLoader okuması söylenen dosyaları aşağıdaki şekildeki gibi okur ve Spring framework çalışmaya başlar.

Spring ayağa kalkınca herşeyin kalbi olan "ApplicationContext" nesnesini bir yerde saklaması gerekir. Bu iş için de ServletContext arayüzünü kullanır. Bu durumu gösteren şekli buradan aldım.

ServletContext içinde bir nesne saklanmasını göstern örnek kodu buradan aldım.

// following method is invoked one time, when you web application starts (is deployed)
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
    // ...
    final int numberOfThreads = ...;
    final ExecutorService threadPool = Executors.newFixedThreadPool(numberOfThreads); // starts thread pool
    final ServletContext servletContext = servletContextEvent.getServletContext();
    servletContext.setAttribute("threadPoolAlias", threadPool);
    // ...
}

// following method is invoked one time when your web application stops (is undeployed)
public void contextDestroyed(ServletContextEvent servletContextEvent) {
    // following code is just to free resources occupied by thread pool when web application is undeployed
    final ExecutorService threadPool = (ExecutorService) servletContextEvent.getServletContext().getAttribute("threadPoolAlias");
    threadPool.shutdown();
}

Apachet Wicket ve ServletContainer

 Apache Wicket ile ServletContainer'ın nasıl birleştiğini aşağıdaki şekil gösteriyor.
Daha sonra javax.servlet.ServletContext nesnesine erişmek için Wicket Notes yazısındaki kod parçası kullanılabilir.


Eğer bir war dosyası içindeki relative path kullanmak istiyorsak Wicket - Relative Image Path without Mounting Page sorusundaki gibi UrlUtils.rewriteToContextRelative metodu kullanılabilir. context.getRealPath() metodu /MyApp gibi bir dizin döndürdüğü için rewriteToContextRelative  metodu /MyApp/images/img1.png gibi bir path döndürür. Aşağıda war dosyasının dizin yapısı görülebilir.


Benzer bir işi How do i link to my Image-Folder inside my Apache Wicket Application? sorusunda cevaplandığı gibi ContextRelativeResource sınıfını kullanarak ta yapabiliriz.
  Apachet Wicket içinden Spring ApplicationContext'e erişmek


Spring ile entegre olmak için wicket-spring.jar dosyasının projeye dahil edilmesi gerekiyor.


Apache Wicket ve Spring'i birbirine entegre etmek çok kolay. Nasıl yapılacağı burada anlatılıyor.

Not : Spring ve Bean Yaratılması başlıklı yazıda Spring Container'ın çalışması ile ilgili biraz daha detaylı bilgi bulabilirsiniz.

1. Annotation Yöntemi

En kolay yöntem de Annotation Based Approach paragrafında anlatıldığı gibi yapmak. Aşağıda buradan aldığım @SpringBean anotasyonu kullanılan örnek bir kod parçası var.


Spring-Wicket: optional but named bean still required sorusunda da anlatıldığı gibi @SpringBean ile required=false kullanarak enjeksiyonu engellemek te mümkün.

2. Kod İle Elle Enjeksiyon Yöntemi
 
Yalnız bu dokümanda dikkat edilmesi gereken bir nokta var. Örnekte de verildiği gibi SpringComponentInjector sınıfı sadece Wicket Component'ları yaratıldığı zaman çağırılan bir listener.Aşağıdaki şekilde bir Component yaratılınca nasıl listener'ın çağırıldığını görmek mümkün.



Halbuki Wicket içindeki her sınıf Component sınıfından türemiyor. Örneğin Model sınıfı gibi. Aşağıdaki şekli buradan aldım ve Component hiyerarşisini kabaca gösteriyor.



Bu durumda model sınıfında @SpringBean anotasyonu kullanılsa bile işe yaramaz.Bunun yerine


InjectorHolder.getInjector().inject(this)

kodunu kullanmak lazım.

Bu da Wicket'ın bir azizliği işte. Bir çok yazılım çatısında da çatıdaki her sınıfın ortak bir atadan türemediğini gördüm. Burada da aynı durum var ve nadiren de olsa bazen normal kullanımdan sapmayı gerektirebiliyor.

3. Kod İle ApplicationContext Nesnesine Erişim Yöntemi

Yukarıda kod ile enjeksiyon yönteminde enjekte edilecek nesnelerin sınıfın bir üyesi (member attribute) olması gerekiyor. Eğer bunu da istemiyorsak ve metod içinde kullanmak üzere ApplicationContext nesnesine erişmek istersek Spring bize kolaylık olması için WebApplicationContextUtils isimli sınıfı kullanılabilir.

Aşağıdaki örnekte olduğu gibi Wicket'ın Application sınıfından ApplicationContext nesnesine erişim mümkün.

public ApplicationContext getContext() {
        return WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());
 }


Wicket Stateful ise Spring ile Nasıl Entegre Oluyor ?

Wicket statefull bir yazılım. Bu durumu anlatan güzel bir örneği burada bulabilirsiniz. Bu basit örnekte aynı safya defalarca tazelendiği halde Wicket'ın nasıl stateful çalıştığı anlatılmış. Aslında Wicket bir oturum içinde gösterilen tüm sayfalar için state tutuyor. Bu durumu gösteren güzel bir şekli buradan aldım.


Bu çalışma modeli bir sayfa'nın içindeki herşeyin Serializable olmasını gerektiriyor. Peki bu durumda sayfaya enjekte edilen Spring Bean'lerin de Serializable olması gerekmiyor mu ? Hal böyle ise bir bean ve onun bağımlı olduğu tüm beanlerin de yazılması gerekir.

Eğer böyle olsaydı Wicket Spring ile hayatta entegre olamazdı. @SpringBean ile enjekte edilen sınıf aslında bir proxy. Dolayısıyla @SpringBean ile Spring Framework'teki kullanımın aksine sadece interface kullanılabilir. Sayfa da session'a yazılınca üretilen proxy yazılıyor, atıfta bulunduğu Spring Bean sınıfı değil. Bu durumu açıklayan güzel bir soruyu burada buldum. Yine aynı konuya değinen güzel bir cevabı da burada buldum.. Bir diğer açıklama ise Double-click seems to disrupt Wicket-Spring injection sorusunda açıklanmış.

5 Eylül 2012 Çarşamba

Paralel İşlemler

Paralel işlemler konusundaki kafa karışıklığım devam ediyor. Bir çok dil farklı farklı yapılar sunuyorlar. Ben de notlarımı aşağıya ekliyorum.

Parallel işlemlerle ilgili Data Parallelism sunumu çok faydalı. Sunumun temel konusu donanı mümkün olduğunca çok kullanıp, sinekten yağ çıkarmak. Bu amaç için de izlenebilecek yöntemler aşağıdaki gibi sıralanmış.
En çok kullanılan yöntemleri kırmızı çerçeve içine aldım. "Work Queue" ile "Divide and Conquer" arasında çok ince bir ayrım var. İlki işleri kabaca sadece paralel olarak yürütmeye çalışırken, ikincisi işleri çok daha küçük parçalara ayırarak paralel olarak yürütmeye çalışıyor. Burada ne kadar küçük parçalara ayırmalıyız sorusuna verilen cevap aşağıda.

Yani sequential olarak yürütmenin paralel yürütmekten daha hızlı olduğu noktaya kadar bölmek lazım. Dolayısıyla Fork-Join çatısı I/O işlemleri için kullanılamaz.

Java fork/join framework logic yazısı da konuyu irdelemek açısından faydalı.