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 :)