3 Aralık 2008 Çarşamba

Java web uygulamasında web server data source kullanımı

Web uygulamasında web server data source kullanımı için:

1.web serverda data source oluşturuluyor.(web logic için console arayüzü kullanılabilir.)

2.Uygulama web.xml de resource-ref elmanı tanımlanıyor. Bu resource-ref elmanı dış bir kaynağa(burada data source) web uygulamasıreferansı tanımı için kullanılıyor. Buradaki res-ref-name elmanı(XXX) web server da oluşturulan data source jndi name i olacak.
Ör:
<resource-ref>
<res-ref-name>XXX</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>

3.Connection ın alındığı ilgili sınıfta, connection ı döndüren metodta javax.naming.Context objesi oluşturup bu objeninlookup metoduna web server da oluşturulan data source jndi name'ini parametre olarak geçerek javax.sql.DataSource objesi elde ediliyor.
Ör:
public static synchronized Connection getConnection() throws Exception {
try
{
Context init = new InitialContext();
Context ctx = (Context) init.lookup("java:comp/env");
DataSource ds = (DataSource) ctx.lookup("XXX");
Connection connection = ds.getConnection();
return (connection);
}
catch (Exception e)
{
throw new Exception(e.getMessage());
}
}

13 Kasım 2008 Perşembe

OC4J Üzerinde Netbeans ile hazırlanmış JAX-WS Webservisleri Çalıştırmak

Şimdi... Bu iş biraz karışık... JAX-WS standardı kullanmak için java versiyonu 1.5 ve üstü olmak zorunda. Bunun sebebi JAX-WS standardında annotation'ların kullanılıyor olması. Bu da biliyorsunuz 1.5'ten sonra gelen bir özellik.... Şu an resmi olarak Java 5 standardını destekleyen hangi application server'lar var bir sayalım:


  1. Glassfish
  2. Tomcat 6
  3. Oracle Weblogic
Görüldüğü gibi listede OC4J yok! Zaten Oracle BEA'yı bünyesine aldıktan sonra OC4J devam etmeyecekmiş gibi görünüyor. Neyse... Asıl konu şu: Netbeans ile webservisi oluşturulunca (Tabi özellikle axis2 ile kullanılmıyorsa) default olarak JAX-WS kullanılıyor. Bunlar zaten Glassfish üzerine rahatça deploy edilip çalıştırılabiliyor. OC4J ile çalıştırmak için build.xml scriptinin içine şu komutları eklemek gerekiyor:


<target name="-pre-dist">
<taskdef name="wsgen" classname="com.sun.tools.ws.ant.WsGen">
<classpath path="${javac.classpath}"/>
</taskdef>
<echo>running wsgen - quixotic</echo>
<wsgen
debug="true"
keep="true"
destdir="build/web/WEB-INF/classes"
resourcedestdir="build/web/WEB-INF/classes"
sei="tr.com.SINIF_ADI">
<classpath>
<pathelement path="${javac.classpath}"/>
<pathelement location="${java.home}/../lib/tools.jar"/>
<pathelement location="build/web/WEB-INF/classes"/>
</classpath>
</wsgen>
</target>


Bundan sonra derlediğimiz kod hem Glassfih hem OC4J üzerinde deploy edilebilir hale gelecektir. Tabi netbeans'de project properties'den library olarak JAX-WS kütüphanesini eklemiş olmak şartıyla!

Hâlâ birşeyleri çözebiliyor olmak ne güzel! :-))

21 Eylül 2008 Pazar

Sevgili dostlarıma bir mektup

Sevgili arkadaşlarım,

Sizlerle hiç unutamayacağım iki sene geçirdim. Ardımda o kadar güzel hatıralar bırakıyorum ki... Sizlerle paylaştığım ne varsa hepsi için teşekkür ediyorum.

Sevgili Gusto,

İşini senin gibi iyi bilen, iyi yapan birisine "arka-daş" olmak harikaydı. Yapılması gereken en mühim işlerde arkamı endişe taşımadan yaslayabileceğim, emanet edebileceğim bir dostla çalışmanın rahatlığını yaşattın bana. Polemiklerimizin tadı tuzu da sendin. Bu zamanda aynı mantık zemini üzerinde durup konuşabileceğimiz insan sayısı bu kadar azken sana rastgelmiş olmak büyük şanstı.


Sevgili Elf,

İşe seninle aynı gün başladık. O günlerde birileri, senin benim için iş arkadaşlığımız neticesinde ifade edeceğin anlamdan bahsetse ona inanmazdım. Bir sürü çetrefilli iş peşinde beraber koşturduk. Bana verdiğin desteğin ve dostluğunun kıymetini kelimelerle ifade etmem mümkün değil. İnanılmaz zerâfetini ve güler yüzünü hiç unutmayacağım.


Sevgili Gelgin,

Senin dostluğun da kazanmış olmakla iftihar ettiğim dostluklardan. Bir insanın bakışlarından temizlik ve iyilik akar mı diye sorsalar "evet" derim. "İnanmıyorsanız Gelgin'le oturun iki dakika sohbet edin!" Polemiklerimizin olmazsa olmazı, sevgili dostum, bu güzel bakışlarını, mütebessim çehreni özleyeceğim.


Sevgili Edi,

Seninle nispeten daha kısa bir süre beraber çalıştık ama şimdi dönüp bakıyorum da sanki yıllarca çalışmış gibi hissediyorum. Senin zor meseleleri anlamak ve bir yerlere oturtmak için vicdan terazinde tartışını hep hatırlayacağım. Hadiselere böylesine ön yargısız yaklaşabilen az insan vardır. Polemiklerimizi daha rasyonel bir zemine çekmek için yaptığın wikipedia araştırmaları da hafızamda hoş birer hatıra olarak kalacak.


Sevgili abSoLuT,

Seni elbette polemiklere katkıların ve Gusto'ya tatlı tatlı takılmaların ile hatırlayacağım. Tabi bir de yılan hikâyesine dönen basın özetleri programıyla! Ben hâlâ basın özetleri programını opensource bir proje yapmak lazım diye düşünüyorum haberin olsun.


Sevgili Halp,

Kadim dostum, sessiz sedasız en önemli projelerden birini tek başına aldın, yüklendin, ayağa kaldırdın. Öyle önemli bir yükü kaldırdın ki, uğraştığın işle benim meşgul olmam hemen hemen hiç gerekmedi. Kıymeti bilinmesi gereken bir adamsın sen. Asansör sırasında hep en arkaya kalışın, her nasılsa ikide bir çeşitli organizasyonların düzenleyicisi oluvermen YM günlerimizin renkli hatıralarıydı.


Sevgili Grkm,

Bu blog işlerine hiç girmedin. O yüzden nick'ini ben uydurdum. Başlangıçtaki olumsuz şartlara rağmen işe başlaman ve bir sene boyunca "oyundan düşmemen" çok etkileyiciydi. Senin önünün açık olduğunu düşünüyorum. Kendini yetiştirmek yönünde biraz daha gayretle çok iyi noktalara geleceksin. Şunu da itiraf edeyim ki seni Fifa'da bir kez olsun yenememiş olmak içimde bir sızı olarak kalacaktır!...


Sevgili Uçan Teneke,

Teknolojiye, bilgisayarlara olan ilgin seni daha çok ötelere taşıyacak. Bu heyecanı kaybetmemeye dikkat etmelisin. İşimiz gereği bir sürü farklı teknolojide kendimizi geliştirmemiz gerekiyor. Bunu en iyi yapan kişi olarak takımımızın "joker" oyuncusu oldun. Çeşitli sebeplerden bu durum seni çok mutlu etmese de uzun vadede lehine olacak. Adres etiket programını devreye aldığın zaman bana haber verir misin? ;-)


Sevgili fkrt,

İlk geldiğimde kursa gitmene mâni olmuş, .net'i kendin gayret ederek öğrenebileceğini söylemiştim. Ve öğrendin! Hem de iyi öğrendin. Beraber çalıştığımız müddetçe beni en çok mutlu eden olaylardan birisi buydu. Hele sen meseleyi kavrayıp yeni teknolojileri heyecanla takip etmeye başlayınca sevincim katlandı. Ne olur bu gayretini sürdür. Günlük sıkıntıların seni durdurmasına izin verme. Hedefini yüksek tut. Türkiye'nin bir numaralı LINQ uzmanı olmak hedefi nasıl?


Sevgili Fırat,

Zaman zaman yaptığın iş gereği de olsa, kurumumuzda hitap ettiğimiz kitleyi en iyi tanıyan kişi olduğunu dile getirdim. Aslında herşey olması gerektiği gibi olsa, el üstünde tutulman gerekirdi. Bizi gerçek dünyaya bağlayan hayat adamı olarak ekibin ayrılmaz bir parçasıydın. Sadece pazarlıklarımız değil, zaman zaman yeraltı dünyası ile, zaman zaman iş dünyası ile ilgili bilgi akışımız da sana emanetti. Ben senin insan ilişkileri hususundaki potansiyelini ileride çok daha güzel değerlendireceğine inanıyorum.


Sevgili Haluk Bey,

Ekibimize katılmanız bir lütuftu. Bu sayede gerçek bir mühendis nasıl olur, iş nasıl doğru yapılır görme fırsatını bulmuş olduk. Pek az insan bilse de koskoca bir projeyi yeniden ele alıp neredeyse baştan yazdınız. Kurumda kullanılan teknolojiler içinde en moderni, en yenisi bu projede kullanıldı. Keşke ekip olarak sizden daha fazla istifade edebilseydik. İstanbul'daki hayatınızda başarılar diliyorum.


Sevgili arkadaşlar,

Hepinize sonsuz teşekkürler, hepiniz çok iyi insanlarsınız ve sizinle çalışmak benim için büyük şanstı... Hepinize ömür boyu mutluluklar diliyorum... Yeniden görüşmek üzere...

22 Ağustos 2008 Cuma

Malezya 2

Kuala Lumpur`da bir cadde

Malezya Tower denilen komunikasyon kulesinin tepesinde yer alan bir restorandayiz. Yandaki arkadas Filipinlerin Ekonomi Bakani :)

Petronas Towers

Genelde teknolojik arastirma kurumlarinin bulundugu bolgede (cyberjaya) yer alan Multimedya Universitesindeki e-galery

Bizim egitimin verildigi Melaka sehrinde bir balik lokantasi (bizdeki baliklarin tadini alamadim ya neyse yine de yedik balik, karides , istakoz artik ne bulduysak )

21 Ağustos 2008 Perşembe

Malezya'dan Sevgilerle...

Petronas Towers`da Koprudeyim (Skybridge)

Petronas Towers

Eye Of Malezeya denilen buyuk donme dolabin bulundugu park. Arka planda Petronas Towers

Hukumet merkezinin bulundugu Putrajaya bolgesinde Basbakanin ofisi.

Arka planda Putrajaya bolgesi. Burasi ise buyuk Convention Center`in bulundugu bir tepe

6 Ağustos 2008 Çarşamba

Sql den takvim yapmaca...

Aşağıdaki kodla sqlde yıllık takvim elde edebilirsiniz. Sql düşündüğünüzden daha güçlü olabiliyor bazen...


SELECT LPAD (MONTH, 20 - (20 - LENGTH (MONTH)) / 2) MONTH, "Sun", "Mon",
"Tue", "Wed", "Thu", "Fri", "Sat"
FROM (SELECT TO_CHAR (dt, 'fmMonthfm YYYY') MONTH,
TO_CHAR (dt + 1, 'iw') week,
MAX (DECODE (TO_CHAR (dt, 'd'),
'1', LPAD (TO_CHAR (dt, 'fmdd'), 2)
)
) "Sun",
MAX (DECODE (TO_CHAR (dt, 'd'),
'2', LPAD (TO_CHAR (dt, 'fmdd'), 2)
)
) "Mon",
MAX (DECODE (TO_CHAR (dt, 'd'),
'3', LPAD (TO_CHAR (dt, 'fmdd'), 2)
)
) "Tue",
MAX (DECODE (TO_CHAR (dt, 'd'),
'4', LPAD (TO_CHAR (dt, 'fmdd'), 2)
)
) "Wed",
MAX (DECODE (TO_CHAR (dt, 'd'),
'5', LPAD (TO_CHAR (dt, 'fmdd'), 2)
)
) "Thu",
MAX (DECODE (TO_CHAR (dt, 'd'),
'6', LPAD (TO_CHAR (dt, 'fmdd'), 2)
)
) "Fri",
MAX (DECODE (TO_CHAR (dt, 'd'),
'7', LPAD (TO_CHAR (dt, 'fmdd'), 2)
)
) "Sat"
FROM (SELECT TRUNC (SYSDATE, 'y') - 1 + ROWNUM dt
FROM ALL_OBJECTS
WHERE ROWNUM <=
ADD_MONTHS (TRUNC (SYSDATE, 'y'), 12)
- TRUNC (SYSDATE, 'y'))
GROUP BY TO_CHAR (dt, 'fmMonthfm YYYY'), TO_CHAR (dt + 1, 'iw'))
ORDER BY TO_DATE (MONTH, 'Month YYYY'), TO_NUMBER (week);

4 Ağustos 2008 Pazartesi

24 Temmuz 2008 Perşembe

SICAKLIK BAŞIMIZA VURDU





















Son günlerdeki halimizi anlatmak için bu resme bakmak yetmez... Yaşamak lazım buyruuun...

23 Temmuz 2008 Çarşamba

Sıcak!

Sıcaklarla birlikte yazarlarımız yazılarına ara vermişlerdir. Şu an içerinin sıcaklığı 35.6 ve yükselmeye devam ediyor....

12 Haziran 2008 Perşembe

DynaFaces - Tablo içerisinde kullanılan button gibi ögeler

Tablo içerisinde "button", "checkbox" vb. kontollar kullanıldığında bu kontrollardan DynaFaces eylemlerini başlatmak mümkün değildir. Aynı zamanda tabloda kullanılan tüm kontrollarda dinamik olarak rowId atanır.
Örneğin :
form1:table1:tableRowGroup1:tableColumn1:button1 kontrolunu kullanmamız yanlış olur, bunun yerine:
1nci satır için form1:table1:tableRowGroup1:0:tableColumn1:button1
2nci satır için form1:table1:tableRowGroup1:1:tableColumn1:button1
...

olarak kullanmamız gerekir. Dinamik olarak satır numarasını almak için (satır numaraları 0'dan başlar, 0 ilk satırdır, en son satır satır miktarı-1'dir):

(Tablo'nun button OnClick JavaScript kısmına aşağıdaki komutları yazabiliriz.)
DynaFaces.Tx.fire('ajaxTransaction1', 'form1:table1:tableRowGroup1:'+'#{currentRow.tableRow.rowId}'+':tableColumn1:button1');
return false;

Ancak DynaFaces için bu çalışmayacaktır. Burada bir "bug" söz konusu. Ancak "bug" giderilmiş durumda ise kullanabilirsiniz. Ancak eğer kullanamıyorsanız problemin çözümü şu şekilde:

1. tablonun dışında form üzerinde kullanmadığınız bir yere bir textField koyunuz. Button'un action event'i yerine artık textField'in valueChange event'ini kullanacağız. Button için yazdığınız Java kodunu TextField valueChange event Java koduna yerleştiriniz. TextField alanına Button JavaScript'i ile rowId'yi atamak suretiyle değerinin değişmesini ve rowId'nin Java kodumuz içerisinde kullanılmasını sağlayacağız.

2. DynaFaces transaction'ını Button'da kullanmayıp TextField için tanımlayınız (Send input "yes" olacak).

3. Button onClick JavaScript kodu :

document.getElementById('form1:textField1').setProps({value:'#{currentRow.tableRow.rowId}'});

document.getElementById('ajaxTransaction1', 'form1:table1:tableRowGroup1:'+'#{currentRow.tableRow.rowId}'+':tableColumn1:button1').refresh('form1:textField1');

DynaFaces.Tx.fire("ajaxTransaction1", "textField1");
return false;

(Burada dikkatinizi DynaFaces.Tx.fire("ajaxTransaction1", "textField1") komutuna çekmek istiyorum. DynaFaces eylemini button kontrolu içerisinde ve textField1 için başlatıyoruz-ateşliyoruz. Bu sayede TextField onChange JavaScript eventi içerisine bu komutu yazmamız gerekmiyor, zaten TextField onchange eventini çalıştırmamız da gerekmiyor ).

4. TextField kontrolunuzun visible özelliğini "false" yapınız.

10 Haziran 2008 Salı

Google ın sırları

Google ın sırları ile ilgili enteresan bir yazı .

DynaFaces (Ajax) - Checkbox, radiobutton ögeleri sorununa çare

Checkbox, radiobutton gibi ögeler Visual Web JSF sayfalarında kullanıldığında bu ögeler ilk kez tıklandığında DynaFaces Ajax eylemi çalışmakta ancak 2nci kez tıklandığında çalışmamaktadır.

Bu durum webuijsf (WoodStock-JSF 1.2), ui (JSF 1.1) ve h (html) ögeleri için de geçerlidir.

Problemin yaratılması :
1. Visual JSF projesi yaratınız. (Ben Java EE5 ve dolayısıyla JSF 1.2'yi seçtim).
2. Proje yaratıldıktan sonra açılan Page1.jsf görsel sayfasına bir WoodStock Basic bölümünden bir adet statictext ve bir adet checkbox yerleştiriniz.
3. Projenizin Component Library bölümü üzerine gelip sağ fare butonuna kullanarak DynaFaces Components (0.2)'yi ekleyiniz.
4. Eğer Java EE5 yerine JDK 1.4'ü şeçtiyseniz web.xml dosyasının Faces Servlet kısmı aşağıdaki gibi olmalıdır.

<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<init-param>
<param-name>javax.faces.LIFECYCLE_ID</param-name>
<param-value>com.sun.faces.lifecycle.PARTIAL</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

5. DynaFaces paletinden sayfanıza AjaxTransaction'ı sürükleyip bırakınız.

6. CheckBox onclik'e aşağıdaki Java Script kodunu yazınız:


DynaFaces.Tx.fire("ajaxTransaction1", "checkbox1");


7. CheckBox process value change eventi (checkbox üzerine çift tıkladığınızda açılacak olan Java kodu):
public void checkbox1_processValueChange(ValueChangeEvent event)
{
Calendar cal = new GregorianCalendar();
staticText1.setText(cal.getTime());
}

8. checkbox1 üzerinde iken sağ fare butonu ile menüden "Configure Ajax Transactions"ı seçiniz sol üst tarafta checkbox1 olduğundan emin olunuz. Transaction'ın ismi "ajaxTransaction1"dir. "Send Input" kısmını "Yes", "Re-Render" kısmını "No" Yapınız.

9. staticText1 üzerine geliniz, sağ fare butonu ile menüden "Configure Ajax Transactions"ı seçiniz sol üst tarafta staticText1 olduğundan emin olunuz. Transaction'ın ismi "ajaxTransaction1"dir. "Send Input" kısmını "No", "Re-Render" kısmını "Yes" Yapınız.








10. Projenizi çalıştırdığınızda ve Checkbox'a birinci kez tıkladığınızda aşağıdaki gibi görülecektir.



Ancak 2nci kez tıkladığınızda static text te görülmesi istenen zaman bilgisinin değişmediğini ve ilk tıkladığınızdaki tarih ve saatin aynı kaldığını göreceksiniz. Başka bir deyişle tazelenmesi istenen static text alanı tazelenmemektedir.

Çözüm :

1. Visual Web JSF sayfanıza bir buton ekleyiniz.

2. button1 üzerinde iken sağ fare butonu ile menüden "Configure Ajax Transactions"ı seçiniz sol üst tarafta checkbox1 olduğundan emin olunuz. Transaction'ın ismi "ajaxTransaction1"dir. "Send Input" kısmını "Yes", "Re-Render" kısmını "No" Yapınız. (button1'i checkbox1 ile aynı yaptık).
3. button1 action eventi (button1 üzerine çift tıkladığınızda açılacak olan Java kodu):
public void button1_action()
{
Calendar cal = new GregorianCalendar();
staticText1.setText(cal.getTime());
}

4. button1 visible özelliğini false yapınız.

9 Haziran 2008 Pazartesi

DynaFaces Örneği (Netbeans 6.1 - Visual JSF)

1. Yeni bir Visual Web JSF projesi yaratınız. (Ben Java EE5 ve dolayısıyla JSF 1.2'yi seçtim).

2. Projenizin Component Library bölümü üzerine gelip sağ fare butonuna kullanarak DynaFaces Components (0.2)'yi ekleyiniz.



3. Eğer Java EE5 yerine JDK 1.4'ü şeçtiyseniz web.xml dosyasının Faces Servlet kısmı aşağıdaki gibi olmalıdır.



4. DynaFaces paletinden sayfanıza AjaxTransaction'ı sürükleyip bırakınız.





5. Page1.jsf görsel sayfasına bir WoodStock Basic bölümünden bir adet statictext ve bir adet textfield yerleştiriniz.

6. textField1 üzerinde iken sağ fare butonu ile menüden "Configure Ajax Transactions"ı seçiniz sol üst tarafta checkbox1 olduğundan emin olunuz. Transaction'ın ismi "ajaxTransaction1"dir. "Send Input" kısmını "Yes", "Re-Render" kısmını "No" Yapınız.




7. staticText1 üzerine geliniz, sağ fare butonu ile menüden "Configure Ajax Transactions"ı seçiniz sol üst tarafta staticText1 olduğundan emin olunuz. Transaction'ın ismi "ajaxTransaction1"dir. "Send Input" kısmını "No", "Re-Render" kısmını "Yes" Yapınız.





8. textField1 process value change event'i için aşağıdaki Java kodunu yazınız. (textField1 üzerinde iken çift tıkladığınızda açılan Java kod kısmına)
public void textField1_processValueChange(ValueChangeEvent event) {
staticText1.setText(textField1.getText());
}

9. textField1 onclik'e aşağıdaki Java Script kodunu yazınız:
DynaFaces.Tx.fire("ajaxTransaction1", "textField1");

10. Projenizi artık çalıştırabilirsiniz.

Aşağıda örnek projeler bulunmaktadır. İlki JDK 1.4 (JSF 1.1), ikincisi ise Java EE 5 (JSF 1.2) örneğidir.



Dynamic Faces UTF-8 probleminin giderilmesi

Dynamic Faces JSF extensions projesinin bir kısmıdır ve JSF ögelerinin ajaxlaştırılmasını ve kısmi olarak tazelenmesini sağlar.

Ancak Türkçe dahil uluslararası karakterlerde ufak bir soruna sahiptir. Aşağıda bu sorunun nasıl giderileceği anlatılmaktadır.

JSF/JSP sayfalarınız UTF-8 olsa bile kısmi olarak Ajax cevabı ISO-8859-1 olmaktadır. Halbuki tazelenen öge örneğin bir listbox ise bu listbox içerisindeki karakterlerin de UTF-8 olarak işleme tabi tutulması gerekir.

ISO-8859-1 karakter “encoding” seçilmediği taktirde varsayılan “encoding” tir. O halde biz “encoding”i aşağıdakine benzer olarak yapmalıyız:

context.getExternalContext().setResponseCharacterEncoding("UTF-8");

Değişikliğin yapılması:
1. https://jsf-extensions.dev.java.net/servlets/ProjectDocumentList?folderID=5580&expandFolder=5580&folderID=0 adresinden en son jsf-extensions-dynamic-faces’i indiriniz. İndirdiğiniz hem binary hem de kaynak olmalı.

2. Kaynak kodları olan dosyayı diskinizde bir klasöre açınız.

3. NetBeans’te “Java Project with existing code” ile yeni bir proje yaratınız ve mevcut kaynak kodlar olarak 2nci adımda belirtilen klasördeki jsf-extensions-dynamic-faces kaynak kodlarınız seçiniz. Projenizin adı 1nci adımda indirdiğiniz binary jar dosyasının adı ile aynı olmalıdır (örnek: jsf-extensions-dynamic-faces-0.1)

4. Projenin class path’ine aşağıdaki kitaplık ve jar dosyaları tanımlanmalıdır:
- Kitaplıklar : JSF 1.2, Web UI Components
- Jar dosyaları: el-api.jar, jsp-api.jar, servlet-api.jar, shale-remoting.jar

5. com.sun.faces.extensions.avatar.lifecycle paketindeki AsyncResponse.java dosyasını NetBeans içerisinden açınız ve aşağıdaki metoda kırmızı ile boyan kısmı ekleyiniz.

public void installOnOffResponse(FacesContext context) {
context.getExternalContext().setResponseCharacterEncoding("UTF-8");
origResponse = context.getExternalContext().getResponse();
context.getExternalContext().setResponse(getNoOpResponse(origResponse));
}


6. Projenizi derleyiniz ve dist klasöründeki jar dosyasını
${netbeans_installation_dir}/visualweb1/modules/ext klasörüne koyunuz.

Eğer dilerseniz projenizi derlediğiniz build klasörünün altındaki com.sun.faces.extensions.avatar.lifecycle paketinin altında bulunan class uzantılı dosyaları 1nci adımda indirdiğiniz original binary jar dosyasının ilgili kısmına da kopyalayıp kullanabilirsiniz.

Aşağıda yukarıdaki adımlar uygulanarak sorunun düzeltildiği 2 jar dosyasının bulunduğu zip'li dosya bulunmaktadır, aşağıdaki linkten indirip hemen kullanmaya başlayabilirsiniz.

4 Haziran 2008 Çarşamba

RichFaces/Ajax4JSF ve Netbeans

Richfaces Ajax kütüphanesini JSF 1.2 (WoodStock) ile kullanmak mümkün değildir. Çünkü WoodStock zaten Ajax'ı kullanabileceğiniz ögeleri içerir. webuijsf etiketli ögeler dışındaki html veya RichFaces (a4j etiketli) ögeler kullanılabilir.

webuijsf ögelerini peki nasıl kullanırız ?

2 yöntemi var, bunlardan biri WoodStock Ajax'ı kullanmamak, diğeri ise JSF 1.1'i kullanmak. Burada JSF 1.1'i kullanmak anlatılacaktır.

1. Netbeans ile Visual Web JSF projesi yaratmaya başlayın. İlk 2 adımı geçtikten sonra 3ncü adımda (Server and settings) Java EE 5 version bölümünde J2EE JDK 1.4'ü seçiniz ve projenin yaratılmasını tamamlayınız.

2. Proje yaratıldıktan sonra projenizin özelliklerini (Properties) proje adı üzerine gelerek sağ fare butonu ile görünüz. "Sources" bölümünde "Source/Binary format" JDK 1.4 görünüyorsa sunucunıuzdaki JDK sürümüne uygun olarak JDK 5 veya JDK 6 yapınız. Eğer JDK 1.4 olarak kalırsa JAX-WS Web servislerini kullanmanız mümkün olmayacaktır.

30 Mayıs 2008 Cuma

Windows Ortam Değişkenlerini Windows'u Yeniden Başlatmadan Değiştirmek

Zaman zaman kod geliştirirken ortam değişkenlerini ayarlamak ya da değiştirmek gerekiyor. Bunun için bilgisayarım ikonuna sağ tuşla tıklayıp özelliklerden bu değişiklikleri ayarlayabiliyoruz ancak ne yazık ki ayarlarımızın geçerli olması için işletim sisteminin yeniden başlatılması gerekiyor. Bu da zaman ve konsantrasyon kaybına neden oluyor.

Bilgisayarcı lisanı ile söylersek "sistemi yeniden başlatmadan environment variable'ları nasıl set edilir" sorusunun basit bir cevabı var:

1. Command line açılır. (Başlat->Çalıştır->cmd)
2. Mesela ayarlanmak istenen değişken TOMCAT_HOME ise;
SET TOMCAT_HOME=C:\TOMCAT5.5
denilerek ayarlanır.

3. Ayarların başarıyla uygulanıp uygulanmadığını anlamak için
echo %TOMCAT_HOME%
yazılır.

Değişkeni set ederken başına ve sonuna hiçbirşey konulmazken, ekrana yazdırırken başına ve sonuna % koyulduğuna dikkat!

Not: Resmin ne alâkası var diye içinden geçirenlere cevap: bir alâkası yok... Öylesine! :-))

28 Mayıs 2008 Çarşamba

Önerileriniz..

Arkadaşlar, blogta görmek istediğiniz yeniliklerle ilgili önerileriniz var mı? Örneğin; kendi kendime bir öneri yapayım, sağ kolondaki etiket listesinin daha farklı gösterilmesi. Renkler, fontlar, eklemeler, gruplamalar, linkler, arkaplan, vs..... aklınıza ne geliyorsa yazabilirsiniz...

27 Mayıs 2008 Salı

JSF Web/Portal Uygulamaları için JasperReports tabanlı raporlama kütüphanesi


JRRaporlama Java Kütüphanesi kaynak kodları:




JRRaporlama.jar dosyası:


 
Yukarıdaki JRRaporlama kütüphanesi hemen indirip JSF Web uygulamaları veya JSF portletleriniz içerisinde kullanarak 
HTML, PDF, Excel, Word gibi formatlarda Web veya portlet uygulamanız içersinde aşağıdaki gibi gösterebilirsiniz.  
 
 
RaporOlustur metodu:
public java.lang.String RaporOlustur(javax.faces.context.FacesContext fc,
                                     int raporTuru,
                                     java.lang.String dBDriver,
                                     java.lang.String dBConnectString,
                                     java.lang.String dBUserName,
                                     java.lang.String dBUserPassword,
                                     java.lang.String reportFileName,
                                     java.lang.String ReportFolderPath,
                                     java.lang.Object[][] parameters)


RaporOlustur metodu IReport ile olusturulmus olan rapor dosyasini kullanarak istenilen formatta rapor alabilmeyi saglar. Bu metod kendi Web uygulamaniz icerisinde kullanilir.

Alabileceginiz rapor formatlari PDF, Word/RTF, Excel ve Html'dir.

Html biciminde rapor istiyorsaniz kendi Web uygulamanizin web.xml dosyasina asagidaki kismi ekleyiniz.

<servlet>
<servlet-name>ImageServlet</servlet-name>
<servlet-class>jrraporlama.ImageServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ImageServlet</servlet-name>
<url-pattern>/image</url-pattern>
</servlet-mapping>

Web uygulamanizda yapmaniz gereken diger islemler:

· JRRaporlama.jar dosyasini uygulamanizin classpath'ine ekleyiniz.

· JasperReports kitapligini http://www.jasperforge.org/ adresinden indiriniz.
Indirdiginiz dosyadan asagidaki kitapliklari uygulamanizin classpath'ine koyabileceginiz gibi Tomcat'in ../common/lib/ext veya ../lib/ext, SunAS icin ise ../domains/{your-domain}/lib klasorune koyabilirsiniz.
jasperreports-2.0.2-javaflow.jar
jasperreports-2.0.2.jar
commons-beanutils-1.7.jar
commons-collections-2.1.jar
commons-digester-1.7.jar
commons-javaflow-20060411.jar
itext-1.3.1.jar
poi-3.0.1-FINAL-20070705.jar
commons-logging-1.0.2.jar
jdt-compiler-3.1.1.jar
groovy-all-1.0.jar
jaxen-1.1.1.jar
jcommon-1.0.0.jar
jfreechart-1.0.0.jar
jpa.jar
poi-3.0.1-FINAL-20070705.jar





Parametreler:



externalContext -

Web uygulamanizdan this.getExternalContext() seklinde bu paramtereyi deger gecirebilirsiniz. Bu paramtre ile Http response ve request'i elde edilir ve Web uygulamanizin Web sayfasina rapor hazirlanarak gonderilir. JRRaporlama kitapligi JSF 1.1 ve JSF 1.2 (WoodStock) kullanilabilinir. Ancak JSF'de rapor sonrasi asagidaki komut olmaldir. this.getFacesContext().responseComplete();

raporTuru - Alinacak raporun turu

Rapor.PDF, Rapor.DOC, Rapor.XLS, Rapor.HTML olabilir.

dBDriver - Veritabani surucusu

MySQL icin: com.mysql.jdbc.Driver, Oracle icin: oracle.jdbc.OracleDriver

dBConnectString - Veritabani baglantisi karakter katari

MySQL icin ornek: jdbc:mysql://localhost:3306/test, Oracle icin ornek: jdbc:oracle:thin:@localhost:1521:test

dBUserName - Veritabani kullanici adi

dBUserPassword - Veritabani kullanicisinin parolasi

reportFileFullPath - Rapor dosyasinin tam yolu ve adi

Örnek : d:/test/test1.jrxml

subReportFolderPath - Raporun alt raporlari var ise alt raporlarin oldugu klasor

Örnek : d:/test/subreports/

parameters - 2 boyutlu Object sınıfında JasperReports sablonuna gecirilecek parametreler



Örnek :



jrraporlama.Rapor rapor = new jrraporlama.Rapor();
Object[][] parametreler = new Object[1][2];
parametreler[0][0] = "param1";
parametreler[0][1] = "deger1";

String sonuc = rapor.RaporOlustur(this.getFacesContext(),
rapor.HTML,
"com.mysql.jdbc.Driver",
"jdbc\:mysql\://localhost/test",
"testuser",
"password",
"test.jrxml",
"c:/test" ,
parametreler);
if (sonuc != null) {
alert1.setType("error");
alert1.setSummary(sonuc);
}

Glassfish JDBC Resources ve Connection Pools

Oracle 10g için Glassfish üzerinde JDBC bağlantılarını yapmak için yapılması gerekenler:
Öncelikle ojdbc14.jar ın /domains/domain1/lib dizininde olup olmadığını kontrol et. Yoksa http://www.oracle.com/ dan indirebilirsiniz.

Resources > JDBC > Connection Pools a tıkla ve New ile yeni bir Connection Pool yarat.
Name: UyePool
ResourceType: javax.sql.DataSource
Vendor Type: Oracle

URL: jdbc:oracle:thin:@10.10.10.20:xxxx:tobb
user: kullanıcıAdı
password: şifre

Daha sonra Ping butonu ile yarattığınız connection pool un çalışıp çalışmadığını test edebilirsiniz.

Başarıyla pool oluşturduktan sonra yeni bir JDBC Resource tanımlayıp ve Pool Name olarak yarattığınız pool u seçebilirsiniz. Oluşturduğumuz resource un adı jdbc/test olsun.

Uygulamadan erişim için:
Connection c = null;
InitialContext ctx = new InitialContext();
javax.sql.DataSource ds = ( javax.sql.DataSource)ctx.lookup("jdbc/test");
c= ds.getConnection();

Web Servis, HTTP Authentication ve LDAP

NetBeans 6.1 ile Glassfish üzerinde geliştirilen web servisleri için HTTP authentication ve LDAP kullanmak istediğimizde yapmamız gerekenler şu şekildedir.

Öncelikle Glassfish Admin Console ile bir ldap realm tanımlıyoruz.

Admin console da Configuration > Security > Realms de New ile yeni bir Realm tanımla.
Name: ldapRealmName (herhangi birsey olabilir, web.xml de kullanılacak.)
ClassName: com.sun.enterprise.security.auth.realm.ldap.LDAPRealm

ClassName seçilince JAAS context otomatik olarak ldapRealm gelir.
Directory: ldap sunucu adresi
Base DN: cn=Users,dc=xxxx,dc=com,dc=tr

Ek olarak aşağıdakiler tanımlanır.
search-filter: sAMAccountName=%s
group-base-dn: cn=Groups, dc=xxxx,dc=com,dc=tr
search-bind-password: şifre
group-search-filter: member=%d
search-bind-dn: cn:Administrator,cn=Users,dc=xxxx,dc=com,dc=tr

Bu tanımladığımız ldap realm web.xml de login config ayarlarında kullanılacak.

Web servisinin geliştirildiği web uygulamasında yapılması gerekenler:
web.xml üzerinde yapmamız gereken eklemeler:


<security-constraint>

<display-name>MyConstraint</display-name>
<web-resource-collection>
<web-resource-name>myresource</web-resource-name>
<description/>
<url-pattern>/*</url-pattern>
<http-method>POST</http-method>
<http-method>HEAD</http-method>
<http-method>PUT</http-method>
<http-method>OPTIONS</http-method>
<http-method>TRACE</http-method>
<http-method>DELETE</http-method>
</web-resource-collection>
<auth-constraint>
<description>MyDescription</description>
<role-name>AuthRole </role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>ldapRealmName</realm-name>
</login-config>
<security-role>
<description/>
<role-name>AuthRole</role-name>
</security-role>

sun-web.xml üzerindeki değişiklikler:

<security-role-mapping>

<role-name>AuthRole </role-name>
<group-name>User</group-name>
</security-role-mapping>

Buradaki GrupAdı Ldap ta tanımlanan grup adı olmalıdır. Uygulamaya erişim için kullanılacak kullanıcılar bu grup üyesi olarak tanımlanmalıdır.

Bu web servisinin client ını yazarken, tek yapmamız gereken kullanıcı adı ve şifre göndermek. Web servisini çağırdığınız yere aşağıdaki kod parçasını ekleyebilirsiniz.
((BindingProvider)port).getRequestContext().put( BindingProvider.USERNAME_PROPERTY, "kullanıcıAdı");
((BindingProvider)port).getRequestContext().put( BindingProvider.PASSWORD_PROPERTY, "şifre");


Java ile Geliştirilen Web Uygulamalarında Ortak Konfigürasyon

Bir WEB uygulaması pek çok ögeden oluşur. Bu ögelerin herbirinde ayrı ayrı konfigürasyon gerçekleştirmek bakımı zorlaştırabileceği gibi örneğin veritabanının parolasının değiştirilmesi, IP adresinin değiştirilmesi gibi durumlarda unutma sonucu pek çok istenmeyen duruma da neden olabilir.

Ip adresi, "connection string", kullanıcı adı, Url gibi geliştirilen pek çok Web tabanlı Java uygulamalarında kodun içerisinde yer alan tanımlamalar tembel :) yazılım geliştiriciler tarafından kullanıldığını bilmekteyiz. Konfigürasyonda olabilecek değişiklikler karşısında kabusa varan sorunlar yaşanır. Geliştirilen projelerin iyi dokümante edilmemesi ve geliştirici kılavuzlarının az veya yetersiz olması, zaman içerisinde güncellenmemesi de başlıbaşına bir sorundur. En sık karşılaşılan konfigürasyon problemlerini aşmak ve ortak kültürü yakalayabilmek için jar, war dosyalarının kendi içlerinde "properties" tarzı dosyalarda bu bilgileri tutmak yerine ortak bir konfigürasyon havuzu kullanılması yerinde olacaktır.

TOBBconfigUtil kütüphanesi ResourceBundle sınıfından yararlanır. Bu sınıf ile “bundle” dosyasından istenen bir anahtar kelimeye karşılık gelen değeri okunur ve configGetValue metodu okunan değeri iletir. Konfigürasyon ile ilgili anahtar kelime ve karşılıkları bu kütüphane içerisinde bulunan konfigurasyon.properties dosyasına kaydedilir. Bu sayede her bir uygulamanın içerisinde konfigürasyon verilerini tutmak gerekmez. Örneğin bu jar dosyası Tomcat’in common/lib/ext klasörü veya Sun AS 9.1 (GlassFish) domains/domain1/lib içerisine konulduğu taktirde diğer uygulamaların yapacağı tek şey bu metodu çağırmaktan ibaret olacaktır. Bu kütüpaheyi değişiklik yapmaksızın kullanmak istediğinizde jar dosyasını koyduğunuz yerde TOBBConfig isimli bir klasör yaratmalı ve bu klasörün içerisinde konfigurasyon.properties isimli bir metin tipinde dosya yaratmanız gerekir.



TOBBConfigUtil Java kütüpanesi kaynak kodları:



TOBBConfigUtil.jar dosyası:



TOBBConfigUtil Java kütüpanesinde yer alan configUtils.java dosyası:




package tr.org.tobb.config;


/**
*
* @author Haluk ERYUKSEL
*/
import java.util.ResourceBundle;

public class configUtils{

public configUtils() {
}

public String configGetValue(String key) {

try {
ResourceBundle bundle =ResourceBundle.getBundle("TOBBConfig.konfigurasyon");
return bundle.getString(key);
} catch (Exception e) {
e.printStackTrace(); // sistem loguna yaz.
return "Hata : "+e.getMessage();
}

}


}



TOBBConfigUtil projesi kök dizinindeki MANIFEST.MF dosyası içeriği :

Class-Path: .






Örnek Konfigurasyon.properties dosyası :

MySqlUser=root
MySqlPassword=xxxxx
MySqlDriver=com.mysql.jdbc.Driver
MySqlConnectString=jdbc\:mysql\://localhost/


Konfigurasyon.properties dosyası TOBBconfigUtil.jar dosyasının olduğu yerde TOBBConfig isimli bir klasör içerisinde olmalıdır.


Kullanımı :
Kendi uygulamanız içerisinden bu kütüphaneyi kullanmak için TOBBconfigUtil.jar dosyasını CLASSPATH’e tanımlamanız gerekir. Gerekli tanımlamayı gerçekleştirdikten sonra aşağıdaki gibi kullanabilirsiniz.
configUtils cfg = new configUtil
String driver = cfg.configGetValue("MySqlDriver");
String connectString = cfg.configGetValue("MySqlConnectString");

Glassfish ve JDBC BC

Netbeans 6.1 ile gelen Open-ESB JDBC BC (binding component)'i denemek istediğinizde bir türlü çalıştıramadığınızı ve sonuç alamadığınızı göreceksiniz. Aynı problemi Open-ESB sitesinden indireceğiniz NetBeans + GlassFish + Open-ESB'de de yaşıyacaksınız, ancak artık üzülmeyin :) Sorunun nedeni hataları ayıklanmış olan JDBC BC'nun her iki durumda da Netbeans içerisinde ve GlassFish uygulama sunucusunda normal bir şekilde kurulum yapıldığında yer almaması.

Open-ESB : https://open-esb.dev.java.net/

Netbeans : http://www.netbeans.org/


Sorunu aşağıdaki gibi ortadan kaldırabilir ve JDBC BC'yi BPEL diagramınız içerisinde artık kullanabilirsiniz.




Adım 1:

GlassFish uygulama sunucusu JDBC BC bileşenini aşağıdaki adresten indiriniz. İndireceğiniz dosya jdbcbc.jar olmalıdır.

http://download.java.net/jbi/binaries/open-jbi-components/main/nightly/latest/ojc/

Adım 2:

Services sekmesine geçip GlassFish uygulama sunucusunu başlatınız. Uygulama sunucusu çalışır hale geldikten sonra Services sekmesindeki GlassFish bölümündeki seçenekler görülecektir. Bunlardan JBI üzerine gelip "Binding Components"ı bulunuz. "Sun-jdbc-binding" i görüyorsanız.





Sağ fare butonu ile üzerine geldikten sonra shutdown ve ardından uninstall ile kaldırabilirsiniz. Eski JDBC BC'yi kaldırdıktan sonra yine aynı menüden "install" ile indirdiğinizi kurabilirsiniz.



Adım 3:

http://download.java.net/jbi/binaries/open-esb-full-install/nbm/latest/ adresinden org-netbeans-modules-wsdlextensions-jdbc.nbm isimli dosyayı indiniz. Netbeans Tools->Plugins menüsünü kullanarak kurunuz.

Böylece artık JDBC BC ile çalışmaya hazır hale geldiniz.

21 Mayıs 2008 Çarşamba

* Netbeans 6.1 portlet desteği ile Visual portlet geliştirdiğimizde, aşağıda belirtilen kısmı web.xml dosyasından silmez isek "deploy" aşamasında aşağıdaki hata Glassfish server.log dosyasında görülecektir.

Error loading deployment descriptors for module [portlet1] Line 132 Column 11 -- Deployment descriptor file WEB-INF/web.xml in archive [portlet1]. cvc-complex-type.2.4.a: Invalid content was found starting with element 'taglib'. One of '{"http://java.sun.com/xml/ns/javaee":jsp-property-group}' is expected.;_RequestID=80651ab6-2ae1-4e3d-a686-a1eeec206d84;"DPL8011: autodeployment failure while deploying the application : Error loading deployment descriptors for module [portlet1] Line 132 Column 11 -- Deployment descriptor file WEB-INF/web.xml in archive [portlet1]. cvc-complex-type.2.4.a: Invalid content was found starting with element 'taglib'. One of '{"http://java.sun.com/xml/ns/javaee":jsp-property-group}' is exected.

Bu hatayı ortadan kaldırmak için web.xml dosyasından aşağıdaki kısmı siliniz.


<jsp-config>
<jsp-property-group>
<url-pattern>*.jspf</url-pattern>
<is-xml>true</is-xml>
</jsp-property-group>
</jsp-config>


* Portletiniz doğru bir şekilde "deploy" edilmiş olsa bile örneğin bir butona bastığınızda sayfa tazelenecek ancak butona bağlamış olduğunuz kod çalışmayacaktır. Aşağıdaki bölümü portlet.xml dosyasına ekleyiniz (hemen </portlet-app>'den önce)

<container-runtime-option>
<name>javax.portlet.escapeXml</name>
<value>false</value>
</container-runtime-option>

I18N için properties dosyaları oluşturmak

Çok lîsanlı çözümler üretmek için properties dosyalarından yararlanıyoruz. Netbeans'in içinde bu işi oldukça kolay bir şekilde halleden bir editör plugini var. İşte bu plugin müstakil bir proje aslında! Adı "Property Resource Bundle Editor". Eğer amacınız herhangi bir proje oluşturmadan çok dilli bir kaynak oluşturmaksa çok faydalı olan bu açık kaynaklı programı indirip kullanmak isterseniz adresi:

https://prbeditor.dev.java.net/

Blogspot'ta xml'li tag'li kodlar yayınlamak

Blogspot'ta bir kod örneği yayınlamak istediğimizde problem çıkıyor. Farklı tag'lar farklı yorumlanıyor, bu da metnin düzenini bozuyor. Çözüm kodları "dönüştürmekte". Bu dönüşüm sizin için yapan basit bir araca http://www.accessify.com/tools-and-wizards/developer-tools/quick-escape/default.php adresinden erişebilirsiniz.

20 Mayıs 2008 Salı

.properties Dosyaları ile Çalışma

Java uygulamlarında kullanılan properties dosyaları çok farklı ihtiyaçlar için kullanılabilinir. Örneğin yerelleştirme, konfigürasyon bunların başında gelir. Ancak bu dosyaları projelerimizde kullandığımız zaman eğer META-INF klasöründe özel bir şekilde belirtmediğimiz taktirde bu dosyalar JAR veya WAR dosyalarının içerisinde yer alır. Aşağıda verilen metodlar Java bundle kitaplığı kullanılmadan properties dosyaları üzerinde işlem yapmanızı sağlar.


private Properties readFromPropertiesFile() {
// Read properties file.
Properties prop = new Properties();

try {
prop.load(new FileInputStream("data.properties"));


} catch (IOException e) {
}
return prop;
}




private void writeToPropertiesFile(Properties prop) {
// Write properties file.
try {
prop.store(new FileOutputStream("data.properties"), null);
} catch (IOException e) {
}
}


private String readKey(Properties prop, String key)
{
return prop.getProperty(key);
}



private void writeKey(Properties prop, String key, String value)
{
prop.setProperty(key, value);
}

JSF 1.1 (JDK 1.4) Web Uygulamalarının veya Portletlerin JSF 1.2 (Java EE 5)'ye Dönüştürülmesi

(For English please click here.)


Winston Prakash tarafından aşağıdaki adresteki blogunda belirtilen JSF 1.1 Web uygulamalarının JSF 1.2'ye dönüştürülmesi ile ilgili olarak sunulan Netbeans 6.0 pluginini sadece Web uygulamaları için değil aynı zamanda JSF 1.1 (JDK 1.4) ve JSR-168 spesifikasyonlarını kullanacak şekilde geliştirilen portlet uygulamalarının dönüştürülebilmesini de sağladım.


Winston Prakash'ın blogu aşağıdaki adrestedir:

http://blogs.sun.com/winston/entry/vwpprojectconverter

Ayrıca Prakash'ın geliştirdiği plugin'deki pek çok hata da giderilmiştir.

Netbeans 6.x plugini (NBM dosyası)


Kaynak kodu:

16 Mayıs 2008 Cuma

İstatistik

Blogumuzun son 4 haftalık ziyaret grafiği:

İlk açıldığından bu yana blogumuzu ziyaret edenlerin ülkelere göre dağılımı:


Netbeans 6.1'de paletten eklenen ögelerin bağlantıları


Netbeans 6.1'den önceki sürümlerde paletten herhangi bir öge seçilip Visual JSF sayfasına eklendiğinde jsf sekmesinde ögeye bir isim verilir ve java dosyasında da bağlantıları (binding) yapılır idi. Ancak bu tanımlamalardan % 90'ı neredeyse hiç kullanılmaz ve kaynak kodununu büyütmesinin yanısıra karmaşıklığı arttırır idi. Netbeans 6.1 ile ilk çalıştığınızda ilk karşılaşacağınız ve şaşıracağınız konu bu olacaktır. Hemen TV'nizin ayarları ile oynamayınız :)))
For English please visit :

Sample JSR-286 Netbeans Visual portlet for Liferay Portal

You can download this JSR-286 sample portlet below.


If you want to play and make some modifications, you need :

  • Netbeans 6.1 IDE (Generic Portlet, JSF Portlet Bridge Library and Visual Web JSF Portlet Support plugins)

Just deploying you need :

  • Liferay 5.0.1 or greater
  • GlassFish AS V2UR2

Before deploying this sample portlet you must copy some files to {Glassfish dir}/domains/domain1/lib directory and restart Glassfish server. These files are :

1. Open liferay-portal-dependencies-5.0.1.zip and extract portal-kernel.jar and portal-service.jar (don't use portlet.jar) to {Glassfish dir}/domains/domain1/lib.

2. Find "portlet-api-2.0.jar" and "portlettaglib.jar" under the directory {user dir}\.netbeans\6.1\modules\ext\portalpack and copy them to {Glassfish dir}/domains/domain1/lib.

Enjoy :)

15 Mayıs 2008 Perşembe

C# ve .net ile secure web servisine client yazmak (bu cümle Türkçedir)

Sanki web servislerinde güvenliğe kimse ihtiyaç duymayacakmış gibi bu güvenlik konusunda hep workaround'lar ile çözüme ulaşılıyor. Sadece .net dünyasında değil, JAVA dünyasında da bu böyle... HTPP authentication isteyen güvenli bir web servisine ulaşmamız söz konusu ise .net'te şöyle yapmamız gerekiyor:

1. Web Referansımızı WSDL ile her zaman yaptığımız standar şekilde oluşturuyoruz. Diyelim ki web referansımızın adı WR, web servisimizin adı SERVIS olsun...

2. Güvenlik için sorulan http authentication bilgilerini wermek için .net tarafından oluşturulan proxy class'ın bir metodunu override etmemiz gerekecek. Bunu tabi ki üretilen proxy class'ın içinde de yapabiliriz ama herhangi bir update yaptığımızda kodumuzun silinmemesi için sub-classing yapmak daha doğru. Bu sebeple yeni bir class oluşturuyoruz.

3. Yeni oluşturduğumuz class'ın içine şu kodu yazıyoruz:

public class GuvenliServis : WR.SERVIS
{
protected override System.Net.WebRequest GetWebRequest(Uri uri)
{
HttpWebRequest request;
request = (HttpWebRequest)base.GetWebRequest(uri);
if (PreAuthenticate)
{
NetworkCredential networkCredentials = Credentials.GetCredential(uri, "Basic");
if (networkCredentials != null)
{
byte[] credentialBuffer = new UTF8Encoding().GetBytes(networkCredentials.UserName + ":"+networkCredentials.Password);

request.Headers["Authorization"] ="Basic " + Convert.ToBase64String(credentialBuffer);
}
else
{
throw new ApplicationException("No network credentials");
}
}
return request;
}
}


4. Artık web servisini kullandığımız kodumuz içinde proxy class'ı değil, yeni oluşturduğumuz sub-class'ı çağıracağız. Kullanıcı adı ve şifreyi de şöyle belirteceğiz:

GuvenliServis Gs = new SERVIS();
NetworkCredential netCredential = new NetworkCredential("", "<Şifre>");
Uri uri = new Uri(es.Url);
ICredentials credentials = netCredential.GetCredential(uri, "Basic");
Gs.Credentials = credentials;
Gs.PreAuthenticate = true;
Gs.<ÇağırmakİstediğinizMetod>();

Bu arada giden gelen SOAP mesajlarını kontrol etmek için YATT isimli araç kullanılabilir.

14 Mayıs 2008 Çarşamba

Classpath'e aynı dizindeki birçok jarı aynı tek seferde tanımlamak

Bir klasörde onlarca jar dosyası var ve hepsininin de claspath içinde olması gerekiyorsa aşağıdaki satırları bir text dosyasına yapıştırıp cpAyarla.bat ismiyle kaydedin:

@echo off

set CLASSPATH=

call :setall . %*
goto end

:setall
if .%1.==.. goto end
set dir=%1
set dir=%dir:"=%
if not "%CLASSPATH%"=="" set CLASSPATH=%CLASSPATH%;%dir%
if "%CLASSPATH%"=="" set CLASSPATH=%dir%
for %%i in ("%dir%\*.jar") do call :setone "%%i"
for %%i in ("%dir%\*.zip") do call :setone "%%i"
shift
goto setall

:setone
set file=%1
set file=%file:"=%
set CLASSPATH=%CLASSPATH%;%file%

Daha sonra tek komutla classpath'inizi oluşturabilirsiniz. Mesele dosyalırınız c:\jarlar klasöründeyse vermeniz gereken komut:

cpAyarla c:\jarlar

:end

13 Mayıs 2008 Salı

Mernis Web Servislerinde saatin önemi

Mernis Web Sevislerine bir client yazdınız herşey çok güzel... Fakat kodu çalıştırdığınızda şöyle bir hata aldınız:
faultCode: {http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd}InvalidSecurity
faultSubcode:
faultString: Invalid creation time value in Timestamp
...
...

Çözüm: Mernis web servisini çağırdığınız makinanın saatini kontrol edin, tam ayarlı olduğundan emin olun.. Artık client progranımınız sorunsuz çalılşacaktır...
Bu arada linux makinada shell komutuyla saat ayarını nasıl yapacağınızı da öğrenmeniz gerekebilir.. Öğrenmenin yaşı yok :)

30 Nisan 2008 Çarşamba

Tomcat 6 üzerinde JSF 1.2 ve Web Servisleri

Merhaba

Tomcat6'yı kurdunuz. Netbeans ya da Eclipse ile JSF 1.2 kullanan bir sayfa yaptınız çalıştı. Herşey çok güzel derken bir web servis client eklemek istediniz ama olmadı! Tomcat logunda şu satırları görüyorsunuz:

javax.naming.NameNotFoundException: Name * is not bound in this Context

Basit bir web servisini neden çağıramıyorum diye saçınızı başınızı yoldunuz. Internette aradınız aradınız birşey bulamadınız.

Problemin çözümü şöyle:

1. Tomcat6 dizinininde "endorsed" isimli bir klasör oluşturun. Unutmayın tomcat6 root'unda olacak lib'in altında falan değil.

2. Netbeans kurulumunun olduğu dizinin altında "java1\modules\ext\jaxws21\api" yolunu takip ederek "api" klasörüne gidin. Bu klasörde bulunan tüm jar dosyalarını Tomcat6 dizininde oluşturduğunuz "endorsed" klasörüne kopyalayın. Dikkat klasörleri değil içindekileri kopyalıyoruz.

3. Kodunuza dönün. Web servisinizi tanımladığınız @WebServiceRef(wsdlLocation = ... diye başlayan satır(lar)ı silin ya da "comment out" edin. Problemlere buradaki @ işareti sebep oluyor.

4. Web servisinizi çağırdığınız yere gelin. En başa service = new WEBSERVİSİNİZİNADI(); ifadesini ekleyin ki service derken neden bahsettiğimiz anlaşılsın.

5. Tomcat'i durdurun

6. Clean + Build yapın

7. Tomcat'i yeniden başlatın.

İşlem tamamdır...

Everybody's Gotta Learn Sometimes

Belki çok geç oldu ama şu meşhur "Eternal Sunshine of a Spotless Mind" filmini syrettim. Film âmiyâne tabirle "damar". Bir filmi damar yapan unsurların en başında müzik gelir. Son sahnede arkadan yavaşça yükselip yüreğimizi dağlayan, Beck tarafından icra edilmiş eski bir (80 model) The Korgis grubu parçasıydı : "Everybody's got to learn sometime"

Parçayı youtube'da buldum. Dinleyince hemen hatırlayacaksınız. Parçanın gecenin ilerleyen vakitlerinde dinlenmesi depresif etki yaratabilir! Hele bunalımlı, hafakanlı bir hâlet-i ruhiye ile dinlenirse daha derin etkiler yaratabileceği de göz önüne alınmalıdır! :-)

Bir akşam üstü, güneşin solan ışıklarının yerlerini yavaş yavaş kıpıdanmaya başlayan şehir ışıklarına bırakmaya başladığı bir anda, evinizin penceresinden dışarıya bakarken, ya da geceyarısı arabanızda yalnız seyahat ederken arka planda çalınıp bizleri derin düşncelere ve hislere garkedebilme potansiyeline sahip parçanın versiyonları şunlar:

The Korgis versiyonu:



Beck Versiyonu (filmden sahneler eşliğinde):



Lara Fabian & Zucchero versiyonu:

22 Nisan 2008 Salı

Dondurma Sezonu

Bahara merhaba dediğimiz şu günlerde dondurma organizasyonlarına yavaş yavaş ağırlık verilmesini teklif ediyorum.

Reklam gibi algılanmazsa Algida'nın iştah artırıcı dondurmalarını sizinle paylaşmak isterim..

Afiyet olsun..

21 Nisan 2008 Pazartesi

Mutluluklar Edi ve abSoLuT

Sevgili arkadaşlarımız Edi ve abSoLuT 15 Nisan 2008 günü bize çok mutlu bir haber verdiler. Tabi günler geçti, geriye bu mutlu anların fotoğrafları kaldı. Sözlenen arkadaşlarımızı tebrik ediyor ömür boyu mutluluklar diliyor, o mutlu anlarımızın fotoğraflarını sunuyorum.









18 Nisan 2008 Cuma

Bu Adamlar Neye Bakıyor? KISA BİR MOLA YILIN FOTOĞRAFI ÖDÜLLERİ

İşte o anlardan birisi;
Genç yaşlı fenerli,cimbomlu, beşiktaşlı demeden neredeyse tüm ekibi meraklandıran neydi acaba?
işteé Bu nadide fotografla beraber Kısa Bir Mola editörlerini yeni bir sanatsal etkinliğe davet ediyorum. Projenin adıı ... KISA BİR MOLA YILIN FOTOĞRAFI ÖDÜLLERİ. ilk yarışmacı olarakta "bu adamlar nereye bakıyor?"isimli çalışmamı gönderiyorum. etkinlik sonundada birinci olan arkadaşımız bir patlama organinasyonda muafiyet kazanabilir mesela.Yada en az oy alanlar patlama organisayonu yapar?

9 Nisan 2008 Çarşamba

Teşekkürler Fenerbahçe


Bu resimler hafızlardan kolay kolay gitmeyecek.
Bize çeyrek final heyecanını yaşattığı için Fenerim'e
teşekkür ediyorum.



7 Nisan 2008 Pazartesi

ping

Deniyorum bakalım bunu ilk kim görecek

28 Mart 2008 Cuma

Resim Konuşturmaca konulu yarışma başlamıştır.



Bunun için gerekli hayalgücü, espri, gözlem yeteneği, bilimum geyik kapasitesi vs. bende var diyorsan haydi durma sen de katıl!

İşte kurallar:

1.Birden fazla çalışma ile katılınabilir
2.Resimde konuşturulan kişinin espri hoşgörüsü olup olmadığının riski katılımcının kendisine aittir. Olası bir kavga durumunda ayırma işlemi yapılmaz.
3.Resimde konuşturulan kişilerin kişilik haklarına saygı esastır.
4.İlle de herkes konuşacak diye bir kuralımız yoktur.
5.Tek bir kişi üzerine oynanabileceği gibi diyalog oluşturmak da kabülümüzdür.
6.Çalışmalar yorum şeklinde teslim edilecektir. Sözle yapılan başvurular asla kabul edilmeyecektir.
7.Oylama yine bu sitede anket şeklinde olacak ve çalışmaların en son teslim tarihinden sonra yapılacaktır.
8.En iyi çalışmayı yapan kişi ödüllendirilecektir. Ödüller kazanan kişiye göre daha sonra açıklanacaktır.

27 Mart 2008 Perşembe

No Country For Old Men

Ben de filmi bir çok kişi gibi "en iyi film" oscarını aldığı için izledim. Filmi izledikten sonra sinema sanatından hiç anlamadığıma kanaat getirdim.
Burada (http://www.sinemalar.com/film/2383/Ihtiyarlara-Yer-Yok/) baya çok yorum yapılmış. Bir de ben yorum yazarak kafanızı şişirmeyeyim. Çoğu kimsenin ortak fikri Javier Bardem'in performasının oscarı hakkettiği üzerine.
Bu arada film bende var. Goruntu kalitesi gayet guzel ama dublaj cok kotu ve Rusça:))))))))

Son Dakika!

8. haftadan en yeni ve net fotoğraf ! Yoğun istek üzerine baloncuk eklendi.

- Gelgin: Gel bakalım Absolutum.
- Absolut: :)
- Quixotic: Uykum var.
- Halp: Efendi çoban diyorum.

...yaparsa, quixotic müdür yapar.



Önce en alta tuzsuz etimekleri dizeceksin, onun üzerinde, muhtemelen 'pekşeker' markalı şekerle yapılmış, son derece kıvamında şurubu gezdireceksin -ki yiyenler hem lezzetli hem de hafif tatlı işte bu diyecek-, yetmedi, üzerine vanilyalı puding -kaçak- katını çıkacaksın (hammaddeleri saymazsak menüdeki tek hazır gıdadır kendisi), daha da yetmedi, bazı arkadaşların starbuckstan aldıkları kimi içeceklerin üzerinde de görmeye alışık oldukları, krem şanti ile adeta Osmanlı hat sanatından örnekler vereceksin, sonrada tatlı konusuna noktayı, damla çikolatalarla koyacaksın...

Adeta bir zarfı andıran talaş böreğinin içine havuçlu, bezelyeli ve de sanıyoruz ki sindirimi kolay olsun diye küp küp doğranmış tavuk parçacıklarını ustaca karıştıracaksın ve yiyenlerin midesine löp diye oturmasın bilakis bir kuş hafifliğinde uçsun diye milföy hamurunu tercih edeceksin...

Artık klasikleşmiş bir ürün haline gelmiş, Akman pastanesinin meşhur sosisli sandviçlerinde kullanılanın enfes tadıyla yarışır nitelikteki rus salatasını da, hani servis tabağı boş kalmasın dercesine menüye ekleyeceksin.

Sonra da gece boyunca sürdüğünü söylediğin hazırlık aşamasında gösterdiğin hamaratlığı, bu harika tadları, evden getirdiğin -ve Absolut ile bendenizi hangi malzemeden yapılanlarının daha kolay kullanıldığı ve sağlığa zararlı olup olmadığı gibi türlü tartışmalara sevk eden- spatula ile tabaklara servis ederken de göstereceksin.

İşte sevgili okurlar, bunlar kolay işler değil, hem de hiç değil. İçinde bulunduğumuz bu gergin günlerde bunu yapsa yapsa biri yapar;

Yaparsa bizim quixotic müdür yapar hem de her zamanki mütevazılığı ve soğukkanlılığıyla yapar.

Adet olduğu şekliyle bitirelim:

Emeğine sağlık !

Yedinci Hafta

Aslında sekizinci haftayı geride bıraktık ama yedinci haftayı da unutmayalım. Yedinci hafta Seda'nın bol çeşitli ve özenle hazırlanmış menüsüyle karşılaştık. Mercimekli köfte, börek ve irmikli tatlıyla birlikte çıtayı ben artık göremiyorum. Mercimekli köftenin yanında marul ve limon da unutulmamıştı. Fotoğraf da çekmiştim ama sanırım Gelgin'deler.

26 Mart 2008 Çarşamba

domaine giris

Planlanan uygulamaya geçişde hepimizin işine yarayabilir, bilgisayarınızı başka bir domain'e geçirmeden önce bir çalışma grubu üyesi yaparsanız, geçişde problem yaşamazsınız.
Önce "istediginiz isimde" bir çalışma grubuna geçin
Sonra geçmek istediginiz domain'e giriş yapın
Domain'e girerken, bilgisayar adınızın herhangi bir suffixinin olmamasına dikkat edin :)

ps: adaya geçmeyecegim fkrt, port geçişte yanetki bırakıyormus :)

25 Mart 2008 Salı

Sebilli Günler


Çok sevdiğimiz sebilimiz dün sabah itibariyle aramızdan ayrılmıştır ve henüz geri dönmemiştir. Yıllardır sıcak ve soğuk su seçenekleriyle itiyaçlarımızı karşılıyan sebilimizi çok özledik. Alt kısımdaki dolap çalışmıyo diye her ne kadar trip yapsakta sensiz buraların tadı yok bir an önce geri dön. YZLM MDRLG

24 Mart 2008 Pazartesi

Zaman Yönetimi

Hangi sitelerde ne kadar süre geçirdiğimizin istatistiğini tutan bir site varmış. İlgili yazı için buraya tıklayabilirsiniz. Ama Serdar Kuzuloğlu'nun da belirttiği gibi, eğer bu yazılımı geliştiren firma, verileri kaydediyorsa, ki neden olmasın, kullanmamakta yarar var.

20 Mart 2008 Perşembe

Nasıl Sürdürülemez Kod Yazılır?

Edi: Quixotic buraya Roedy Green'in "How to Write Unmaintable Code" yazısının türkçesini eklemişti. Ama görüldüğü üzere yazı yok. Çok uzun bir yazı olduğu için admin olarak yazıyı kaldırdım. (yetkilerim pek çok :)) Onun yerine çevirmeninin sayfasında yazının orjinaline bir link veriyorum. Nasıl Sürdürülemez Kod Yazılır ? yazısı için buraya tıklayın.

14 Mart 2008 Cuma

6. Hafta - Devam 2

Ve kek rüyası bitti ....

6. Hafta - Devam

Kekin dağıtımı denetim altında gerçekleştirildi.

Yemek Organizasyonu 6. Hafta

Absolut'un çikolata parçacıklı, cevizli, havuçlu keki ile bir haftayı daha tamamladık.
Gusto bakarken, Absolut keserken...




























6 Mart 2008 Perşembe

Okuma Odası :)

henüz kitapları bitiremedim ama asagidaki blog bir arkadasimin ve bence basarili yazılar var, paylasayim istedim :)
http://altayatli.blogspot.com/

Yemek Organizasyonunda 5. Hafta

Elf'in pudingli kedi dilli pastası, limonlu keki ve börekleri ....

Edi ve Gelgin pastayı tutmaya çalışıyorlar.
Halp: Acaba arabayı almakla iyi mi ettim?
Gerdoğan: Acaba borsa düşer mi ?
Can: Ben şurdan yavaş yavaş yaklaşayım.
Absolut: Ben yokum.


Gusto: O öyle olmaz, yanlış yapıyorsunuz.
Edi: Bıdıbıdı bıdı.
Elf: Pasta kesim işinden de yırttım, iyi oldu.
Fkrt: Fotoğraf çekiliyor yaşasın.
Can: Burası iyi.
Absolut: Ben niye yokum?


Gusto: Beni dinleyin beni !
Gelgin: Bu tabaklar da elimde kaldı.
Can: Buraya geldim ama bana pasta vermediler.


Gusto: Ben de mi yesem acaba? O kadar da laf ettim.
Fkrt: Yine fotoğraf çekiliyor, süper :)


Gusto: Yicem yicem ben de yicem.
Elf: He he yiyolar..


Can: Bak hala alamadım.
Balacali: Ne güzel yiyorlar.
Absolut: Ben hala yokum.


Edi: Daldım gittim.
Fkrt: Süper poz yakaladım.
Quixotic: Fotoğraflar süper oldu.
Gusto: :)
Gelgin: Bu tabaklardan kurtulamadım.
Absolut: Ben nerdeyim?


Pudingli kedi dilli (dili li ) pastadan sonra, limonlu kekten ve böreklerden önce...