Friday, July 10, 2009

Sahi JAAS'a Ne Oldu?


Java Developer’s Journal’in bu haftaki sayısında “Whatever Happened To JAASbaşlıklı bir makale dikkatimi çekti. JAAS, java runtime security üzerinde bina edilmiş bir kimliklendirme ve yetkilendirme framework olarak uzun zamandır kurumsal java dünyasında; ancak ilk çıktığından bu yana istenilen ilgi ve alakayı görebilmiş değil. Bunun sorumlusu ise tabi ki Java spesifikasyonlarını oluşturan komiteler. Ne JEE  ve EJB, ne de JAAS’ın kendi spesifikasyonları tam manası ile kurumsal uygulama geliştiricilere cevap verebilecek bir olgunluğa şu zamana kadar erişemediler. Birbirleri arasında da eksiklikler ve uyumsuzluklar da şu zamana kadar hep süregeldi.

Kurumsal java teknolojileri ile yazılım geliştiren bizlerden kaçımız acaba uygulamalarımızda JAAS’ı kullanıyoruz. Web uygulaması geliştirenler için Servlet spesifikasyonu kendi başına güvenlik ihtiyaçlarının kimliklendirme ve basit de olsa yetkilendirme kısımlarına bir cevap bulmaya çalışmış. JAAS’ı kendi bünyelerine dahil etmeye çalışan container üreticileri ise spesifikasyonlardaki açıklardan dolayı kendilerine özgü çözümler üretmişler. Uygulamanızı container’ın sağladığı güvenlik kabiliyetlerinden yararlanarak geliştirmek istediğiniz vakit Java’nın “write once run everywhere” sloganı da sizin için geçersiz hale gelmiş oluyordu. Gerçi JEE dünyasında spesifikasonylardaki bi eksiklikler ve çelişkilerden dolayı write once, debug everywhere” daha anlamlı bir slogan olur.

Neyse konumuza geri dönelim, makalede JAAS’ı toparlamaya, nereydese Java 1.3.1’den bu yana çözüm bulunamamış problemlerine çözüm bulmaya çalışan yeni bir spesifikasyondan bahsediliyor. JSR-196 sanırım JEE 6 spesifikasyonun içerisinde dahil edilmiş. Güzel ama kurumsal java geliştiricileri yıllardır filter tabanlı kendi in-house çözümleri ile baş başa bırakıldıktan sonra biraz geç değil mi? Ayrıca bu alanı gayet başarılı biçimde dolduran Spring Security gibi framework’ler de mevcutken JSR-196’nın Subject, Principal ayrımı gibi problemlere cevap arama gayretleri, sanırım büyük resimde yine bizleri tatmin edici kapsamlı bir çözüm ortaya çıkmayacak izlenimi veriyor. Web container security  ve JAAS kurumsal java geliştiricilerin gözdesi olabilir mi? Pek sanmam, ama zaman içinde bunu hep beraber göreceğiz...


Wednesday, July 08, 2009

How to create a custom FacesContext


Altough I am not happy with several issues in JSF spec, I like its customizabilty. A couple of days ago, I needed to introduce Mediator pattern in my case studies.  FacesContext instance seemed to be a good candidate as Mediator object. You need to execute  three easy steps to introduce custom FacesContext implementation into your JSF lifecycle.

First, create your custom FacesContext class implementation. It is better to extend FacesContext class available in the API. Your FacesContext implementation must be able to accept a FacesContext instance as delegate via its constructor. You need to redirect calls to delegate except for calls you will provide custom behaviour. For example;

public class MediatorFacesContext extends FacesContext {
   private FacesContext delegate;
   public MediatorFacesContext(FacesContext delegate) {
      this.delegate = delegate;
   }
...
}

After that you need to create a custom FacesContextFactory implementation. It should return an instance of your custom FacesContext implementation.

public class MediatorFacesFontextFacory extends FacesContextFactoryImpl {
   public FacesContext getFacesContext(Object context,
      Object request,
      Object response,
      Lifecycle lifecycle) throws FacesException {
      FacesContext defaultFacesContext = super.getFacesContext(context, request, response, lifecycle)
      MediatorFacesContext mediatorFacesContext = new MediatorFacesContext(defaultFacesContext);
      return mediatorFacesContext;
   }
}

Finally, in order for JSF impl to use your custom factory, you need to tell about it in your faces-config.xml.

<factory>
<faces-context-factory>
org.speedyframework.web.jsf.handlers.MediatorFacesFontextFacory
</faces-context-factory>
</factory>

That’s all to have a custom FacesContext instance in your application.


Monday, July 06, 2009

4 Temmuz'da İstanbul'daydık

CETÜRK bünyesinde düzenlediğimiz etkinliklerin devamında 4 Temmuz 2009 Cumartesi günü İstanbul’daydık. Aslında bu etkinlik 13 Haziran’da Ankara’da düzenlediğimiz Java Teknolojileri Etkinliği’nin bir tekrarı oldu.

Ankara’da düzenlediğimiz program içerik olarak oldukça tatmin edici bir düzeydeydi. Bir günde 5 değişik konu üzerinde örneklerle desteklenen dolu dolu dunumlar katılımcıların da oldukça beğenisini kazanmıştı. Bu nedenle CETÜRK yöneticisi Mehmet Aca ile etkinliğin bir tekrarını da İstanbul’da yapmaya karar verdik. Bu Cumartesi günü de katılımcılar programın içeriğinden oldukça memnun kaldılar, bunu hem gün boyunca katılımcı sayısının belli bir düzeyin üstünde kalmasından hem de değerlendirme formlarına yazılan yorumlardan rahatlıkla söyleyebiliriz. Bu İstanbul’da yaşayan ve daha önceki etkinliğe katılamayan arkadaşlar için güzel bir fırsattı.

Etkinliğin düzenlenmesine destek veren sponsor firmalardan IBM Türk ve I-Con’a çok teşekkür ederiz. Özellikle IBM’in salon ve gün boyunca yapılan ikramlar konusunda desteği, çalışanlarının gösterdiği özen bizi ve katılımcıları çok memnun etti. Umarım bu tür etkinliklere ileride daha geniş çapta sponsor desteği söz konusu olur. Ülke genelinde hatta uluslararası boyutta, nitelikli organizasyonlar düzenleyebilmek için sponsor desteğinin önemi büyük. Bilişim sektöründeki firmaların bu tür etkinliklere cüzi de olsa, verdikleri destek kendilerine çok daha büyük oranlarda pozitif bir imaj ve reklam olarak geri dönüyor.




Bence firmalar kendi bünyelerinde, çalışma mekanlarında da dışarıdan katılıma açık benzer etkinlikler düzenlemeliler. Bu sayede firma çalışanları için bilişim dünyasındaki gelişmeler, yenilikler hakkında bilgilenme ve tazelenme fırsatı olabileceği gibi, şirket içinde de bu konulara yönelik daha olumlu bir atmosferin oluşması mümkün olur. Ayrıca sektörün değişik yerlerinden gelen katılımcılar ve firma için karşılıklı bir tanışma fırsatı da doğabilir.




Hafta sonundaki organizasyon sayesinde bir süredir görüşmeye fırsat bulamadığım arkadaşlarımla da bir araya gelme ve fikir alışverişinde bulunma fırsatım oldu. Aslında bu tür etkinlikler sadece sunumlardaki içerikle teknik boyutta değil, bilişim dünyasında yer alan çalışanları, öğrencileri bir araya getirerek sosyal boyutta da sektöre önemli katkıda bulunuyor.

Umarım gelecekte daha farklı ve daha kaliteli içeriklerle Türkiye’nin değişik bölgelerinde bu tür organizasyonları düzenleyebiliriz.

Friday, July 03, 2009

Integrating JSFUnit To Your Project


Actually I am not a big fun of in-container unit testing approaches. They have longer execution times, e.g. container and database startup, intialization times etc. In addition, they create configuration complexity in terms of packaging of tests and deployment of application together with them. Anyway, recently I needed to examine JSFUnit solution more closely for some issue and integrated it into my project.

JSFUnit is based on Cactus in-container unit testing framework. Tests are run on server side and results can be examined through your browser. I had presented about Cactus several years ago. I found that presentation in one of dusty corners of my laptop. It was a nice nostalgia for me.

Anyway JSFUnit has a really good startup document on its site. I have totally followed their step by step guides and it almost worked. I had a stupid error while running my tests. The problem was because of Spring WebFlow’s JSF 1.1 compatibility efforts. As you may know SWF2 has some JSF specific parts. Their FlowFacesContext implementation tries to  understand if getELContext() method is available in delegated FacesContext object, in that case JSFUnitFacesContext instance, via reflection. As JSFUnit support JSF 2.0, trying to understand if that method is supported via class retrospection will cause ClassNotFoundException. Here is the stacktrace:

Caused by: java.lang.NoClassDefFoundError: javax/faces/context/ExceptionHandler


              at java.lang.Class.getDeclaredMethods0(Native Method)


              at java.lang.Class.privateGetDeclaredMethods(Class.java:2427)


              at java.lang.Class.getMethod0(Class.java:2670)


              at java.lang.Class.getMethod(Class.java:1603)


              at org.springframework.util.ClassUtils.getMethodIfAvailable(ClassUtils.java:549) at org.springframework.faces.webflow.FlowFacesContext.getELContext(FlowFacesContext.java:97) at org.speedyframework.web.view.jsf.util.JsfUtils.createValueExpression(JsfUtils.java:45) at org.speedyframework.web.view.jsf.component.ui.Label.<init>(Label.java:32) at org.speedyframework.admin.pages.common.Login.afterPropertiesSet(Login.java:40) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1369) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1335)


... 85 more


 


Caused by: java.lang.ClassNotFoundException: javax.faces.context.ExceptionHandler at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1360) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1206) at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)


... 96 more

Unfortunately there is no clean solution for such a problem in current java classloading model. We still wait for developments to get matured enough in OSGI area for JEE. For the moment, we just need to add JSF 2.0 API jar to the classpath, even though we still use MyFaces implementation of JSF 1.2. After adding jsf-api-2.0.jar to the classpath, problem is carried to somewhere else. This time, JSF 2.0 classes were loaded before JSF 1.2 classes because of java class discovery mechanics. Classloaders process jars alphabetically and classes with same signatures in a different jar will get loaded before your actual classes. We just have to rename jsf-api.jar to come after myfaces-api.jar by putting ‘z-‘ in front of its name to solve this problem as well.

Another annoying part during JSFUnit integration was related with oldness of Cactus Framework. It still depends on ages old Junit 3.8.1 and if you use JUnit 4, it won’t work. You need to add Junit 3.8.1 jars in your classpath. Same jar renaming approach can be followed in order for classes with same signature in JUnit4 jar to be discovered at first place.


Monday, June 29, 2009

İstanbul'daki CETÜRK Java Teknolojileri Etkinliğindeyiz

Yakın zamanda Ankara'da düzenlenen Java Teknolojileri Etkinliğinin tekrarını 4 Temmuz'da İstanbul'da gerçekleştiriyoruz. Program ve diğer detaylar için CETÜRK'deki etkinlik sayfasına bakabilirsiniz. Ankara'da çok verimli geçen bu etkinliğin İstanbul'da da benzer bir ilgi görmesini ve aynı verimlilikte geçmesini ümit ediyorum.

Tuesday, June 16, 2009

Ankara CETÜRK Java Teknolojileri Etkinliği Düzenlendi



13 Haziran Cumartesi günü İnnova Bilişim Çözümleri A.Ş.’nin ve i-Con’un destekleri ile ODTÜ Kültür Kongre Merkezi’nde Java Teknolojileri Etkinliği’ni gerçekleştirdik. CETÜRK Anadolu turunun devamı olarak gerçekleştirilen etkinlik çok başarılı geçti, katılım oranı da oldukça yüksekti. Daha önce Çankaya, Fırat, 18 Mart ve Doğu Akdeniz üniversitelerinde düzenlenen serinin bu kez durağı ODTÜ idi.









 Açılış konuşmasını CETÜRK kurucusu Mehmet Aca gerçekleştirdi. Konuşmasında kısaca CETÜRK’ten ve faaliyetlerinden bahsettikten sonra programa geçildi.










Program olarak olukça dolu ve kapsamlı bir etkinlik oldu. İlk önce STM’den Hasan Türksoy, son dönemde “rich internet applications” geliştirmeye yönelik olarak kurumsal java teknolojileri dünyasında ciddi bir dönüşüme öncülük eden Google Web Toolkit hakkında güzel bir sunum yaptı. Sunumla birlikte iki örnek uygulama geliştirilerek GWT’nin mimarisi ve kabiliyetleri gösterildi.










İkinci sunum en son Enterprise Java Beans spesifikasyonu hakkında oldu. Sunumu gerçekleştiren Vardar Yazılım’dan Ümit Vardar, EJB 3.1 ile gelen yeniliklerden ve bileşen tabanlı yazılım geliştirme teknolojilerindeki gelişmelerden bahsetti.










Bu sunumların ardından İnnova çalışanlarından Mustafa Demir ve Mustafa Daşgın arkadaşlarımız Spring Web Servis Framework’ünü tanıtan bir sunum yaptılar. İki arkadaşımız da uzun zamandır Spring Web Servis Framework’ünü İnnova’daki uygulamalarda kullanarak bu framewok ve genel olarak web servis geliştirme konuları hakkında ciddi bir bilgi birikimi ve deneyim sahibi olmuşlardı. Sunumda da bu deneyimlerini gerçek bir örnek üzerinden katılımcılarla paylaştılar.











Etkinlikteki diğer bir sunum ise kurumsal java dünyasındaki modülerlik, koşut zamanda dinamik olarak yeniden yüklenebilirlik, sınıf yükleme gibi kronikleşmiş problemlere çözüm olabilecek OSGI hakkında oldu. Sunumu STM’den Mehmet Gürsul gerçekleştirdi. Mehmet Gürsul, sunumunu herkesten farklı olarak powerpoint yerine zihin haritalama yöntemi ile FreeMind aracını kullanarak yaptı. Bu açıdan da sunum izleyiciler için farklı bir tecrübe oldu.










Son olarak ben, bu sene ekim ayında düzenlenecek olan Ulusal Yazılım Mühendisliği Sempozyumu’na göndermiş olduğum, “Aspect Oriented Programlama ve ORM teknolojileri vasıtası ile servis düzeyinde audit loglama” konulu makaleden yola çıkarak hazırladığım sunumu katılımcılara takdim ettim. Sunum sonunda Spring AOP ve Hibernate kullanarak ana hatları ile benzer sistemin nasıl geliştirilebileceğini örnek uygulama ile gösterme fırsatım da oldu. Sunuma buradan erişebilirsiniz.










Etkinlik sonunda katılımcılar arasında yapılan çekilişle üç kişiye Özcan Acar arkadaşımızın yazdığı Extreme Programming isimli kitap, bir kişiye de Mehmet Gürsul arkadaşımızın hazırlattığı ilginç bir t-shirt hediye edildi.








 











Etkinliğe destek veren sponsorlara, gayet kaliteli ve düzeyli sunumları ile konuşmacılara, bizleri yalnız bırakmayan bütün katılımcılara ve CETÜRK ekibine çok teşekkürler. Yeni bir etkinlikte görüşmek üzere...

Monday, June 08, 2009

Ankara'da CETURK Java Teknolojileri Etkinliği

13 Haziran Cumartesi günü CETURK ODTÜ Kültür Kongre Merkezi'nde Java Teknolojileri etkinliği düzenliyor. Ocak ayındaki etkinlik Çankaya Üniversitesi'de gerçekleşmişti ve oldukça verimli olmuştu. Bu seferki etkinlikte de yine ilginç konular katılımcılara sunulacak.

13 Haziran'daki sunumlarla ilgili kısa bilgiler vermek istiyorum. İlk olarak, Hasan Türksoy Google Web Toolkit'i tanıtacak. GWT çıktığı ilk günden beri, RIA geliştirme konusunda JSF, Wicket vb. teknolojilere ciddi bir alternatif olarak karşımızda duruyor. Bu sunumda GWT'yi daha yakından tanıma fırsatı bulacağız. Ümit Vardar ise EJB 3.1'deki yeniliklerden bahsedecek. Mustafa Daşgın ve Mustafa Demir uzun süredir Spring Web Servis Framework'ünü kullanıyorlar. Spring'in web servis geliştirmede benimsediği "contract first" yaklaşım başta olmak üzere, framework ile ilgili dikkate değer tecrübelerini bizimle paylaşacaklar. Mehmet Gürsul ise OSGI hakkında bir sunum yapacak. OSGI'ın JEE dünyasında classpath, jar versiyonlarındaki çakışmalar, modülerite gibi kronikleşmiş problemlere nasıl çözüm ürettiğinden bahsedecek. Son olarak ben de kurumsal uygulamalarda sıkça karşımıza çıkan audit loglama ihtiyacından, audit loglama yöntemlerinen ve bu ihtiyaçların AOP ve ORM teknolojileri kullarak nasıl çözülebileceğinden bahsedeceğim.

Etkinliğin gerçekleşmesinde önemli katkıları olan İnnova Bilişim Çözümleri A.Ş.'ye, i-Con'a ve CETURK'e teşekkür etmek istiyorum. Umarım Ankara'daki Java geliştiricileri ve teknoloji meraklıları için faydalı ve verimli bir gün olur.

Etkinliğe katılım her zaman olduğu gibi ücretsiz olacak. Katılım için ceturk@ceturk.com'a mesaj atmanız veya etkinlik sayfasından kayıt yaptırmanız yeterli. Detaylı bilgiyi etkinlik sayfasından öğrenebilirsiniz.

Monday, May 18, 2009

UYMS 2009

Ulusal Yazılım Mühendisliği Sempozyumu 8-10 Ekim tarihleri arasında Yıldız Teknik Üniversitesi'nde yapılıyor. Bu seneki organizasyona ben de bir makale gönderdim. "İlgi Yönelimli Yazılım Geliştirme İle Servis Düzeyinde Audit Loglaması" başlığına sahip makalede, kurumsal uygulamalarda sıklıkla karşımıza çıkan audit loglaması ihtiyacının genel bir incelemesini yaptıktan sonra, AOP ve ORM teknikleri kullanılarak servis düzeyinde audit loglamasının nasıl gerçekleştirilebileceğini anlatmaya çalıştım. Makale şu an komite tarafından inceleniyor, umarım kabul görür. Konu ile ilgilenen arkadaşlar makaleye buradan erişebilir, yorum ve eleştirilerini bana bildirebilirler.

Monday, April 20, 2009

JBoss JBPM Admin Console-I

Admin console JBPM dağıtımı ile birlikte gelen bir web uygulamasıdır. Jsf-console.war’ı web container’ınıza deploy ettiğinizde çalışması için container’da JbpmDataSource isimli bir JNDI datasource nesnesinin olması gerekmektedir. Ayrıca console uygulamasının mesaj, yetkilendirme gibi kısımlarında kendinize özgü değişiklikler yapmanız pek muhtemeldir. Biz admin console’u kendi uygulamalarımızın içerisinde gömülü biçimde çalıştırmayı tercih ettik. Bu sayede process tanımlarının console vasıtası ile runtimeda istenilen vakitte deploy edilebilmesinin yanında, tanımların hem uygulama tarafından hem de console tarafından aynı anda yönetilebilmesi mümkündür. Admin console’u kendi web uygulamalarımızın içerisinde gömülü olarak çalıştırmak için yaptığımız işlemlerle başlayalım.


Dosyaların ve Dizinlerin Kopyalanması


Jsf-console.war bundle’ı açtığımızda aşağıdaki gibi bir dizin yapısı ile karşılaşırız.

 


 

Console’un JSF syafaları ve css dosyası, "app, sa ve ua" dizinlerinde bulunmaktadır. Biz bu üç dizindeki dosyaları ve images dizinini tek bir dizin (jbpm-console) altında topladık. JSF, css, imaj gibi dosyaların tek bir dizin altında toplanması ile birlikte bu dosyalardan diğer dosyalara olan referansların güncellenmesi gerekti. Ayrıca uygulamaların jbpm-console dizini yerine başka bir dizin adı kullanabilmelerine olanak sağlamak amacı ile bir property de uygulama içerisine eklendi.

#jbpm console ayarlari


jbpm.console.base.path=/jbpm-console


Bu sayade JSF içindeki sayaflardan diğer sayfalara referans verilirken url ifadesinin başına jbpm.console.base.path’in değerini veren EL’i ekleyerek JSF sayfalarının dizin değişikliklerinden etkilenmemesini sağladık.


Web.xml’deki Değişiklikler


Bir sonraki adımda jbpm-console’un çalışabilmesi için aşağıdaki tanımlamaların web.xml dosyasına eklenmesi gerekti.


<listener>


    <listener-class>org.jbpm.web.JbpmConfigurationCloser</listener-class>


</listener>


<servlet>


    <servlet-name>GPD Deployer Servlet</servlet-name>


    <servlet-class>org.jbpm.web.ProcessUploadServlet</servlet-class>


    <load-on-startup>1</load-on-startup>


</servlet>


<servlet-mapping>


    <servlet-name>GPD Deployer Servlet</servlet-name>


    <url-pattern>/upload/*</url-pattern>


</servlet-mapping>


<servlet>


    <servlet-name>Faces Servlet</servlet-name>


    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>


    <load-on-startup>1</load-on-startup>


</servlet>


<servlet-mapping>


    <servlet-name>Faces Servlet</servlet-name>


    <url-pattern>/jbpm-console/pi/*</url-pattern>


</servlet-mapping>


<servlet-mapping>


    <servlet-name>Faces Servlet</servlet-name>


    <url-pattern>*.jsf</url-pattern>


</servlet-mapping>


Faces-config.xml’deki Değişiklikler


faces-config.xml içerisinde aşağıdaki view-handler ve navigation-handler tanımlarının yapılması gerekiyor.

 

<view-handler>


org.jboss.gravel.QueryPreservingViewHandler
</view-handler>




<navigation-handler>
org.jboss.gravel.navigation.GravelNavigationHandler
</navigation-handler>

 

QueryPreservingViewHandler içerisinde SWF ile uyumlu çalışabilmesi için küçük bir değişiklik yapmak gerekti. QueryPreservingViewHandler sadece orjinal action URL’de query string mevcut değilse request’deki query string’i URL’e append edecek biçimde değiştirildi.


Jbpm4jsf-config.xml Dosyasının Oluşturulması


WEB-INF dizini altında jbpm4jsf-config.xml dosyasını oluşturmak gerekiyor. Dosyanın içeriği aşağıdaki gibi olmalıdır. Dosyayı jsf-console’un açılmış halindeki WEB-INF dizini altından da alabilirsiniz.

 

<?xml version="1.0" encoding="UTF-8"?>


    <jbpm4jsf-config xmlns="http://jbpm.org/jbpm4jsf/config">


    <!-- This entry controls whether to map JSF user authentication to


    actor IDs. Set to false if the authentication scheme used by


    the administration console is not related to the set of actors


    that is used by your processes.


    -->


    <authentication-service>


        <use-jsf-actor>true</use-jsf-actor>


    </authentication-service>


    <!-- This entry facilitates the usage of process image URLs -->


    <process-file-matcher>


        <pattern>^/jbpm-console/pi/(\d+).jpg$</pattern>


        <file-name>processimage.jpg</file-name>


        <content-type>image/jpg</content-type>


    </process-file-matcher>


</jbpm4jsf-config>


JBPM Console’a Erişim Kontrol Dosyasının Oluşturulması


Jsf-console açıldığında WEB-INF dizini altında access.properties dosyası yer alacaktır. JBPM Console bu dosyasdaki tanımlara göre console daki fonksiyonlara kullanıcıların rol bazında erişimlerini yönetmektedir.

<gd:loadProperties path="access.properties" var="access"/>

Dosyayı t_loggedin.xhtml doyası içerisinde aşağıdaki JSF component’i vasıtası ile yüklemektedir. access.properties dosyasının içerisinde console’un fonksiyonlarının karşısına hangi rollerin erişebileceğini yazmak gerekiyor. Örneğin;

 

# Process definition operations


role.process.deploy=ROLE_ADMIN


role.process.delete=ROLE_ADMIN


role.process.start=

 

Burada process tanımlarını deploy etmek ve silmek için gerekli arayüze erişim yetkisi sadece ROLE_ADMIN rolüna sahip kullanıcılara verilmiştir. Process tanımından yeni bir process instance başlatmak ise bütün kullanıcılara açılmış bir özelliktir. Eğer bir özelliği bütün kullanıcılara kapatmak isterseniz, bu özelliğin karşısına geçersiz bir rol tanımı girmeniz yeterlidir.

 

Uygulamalarımızda güvenlik altyapısı olarak Acegi Security Framework’ü kullanıyoruz. Acegi’nin SecurityContextHolderAwareRequestFilter özelliği sayesinde o andaki web request’inin isUserInRole() metod çağırsının sisteme Acegi ile login olmuş kullanıcının rol bilgilerini kullanarak cevap dönmesi sayesinde JBPM console’un sistemimizdeki kimliklendirme ve yetkilendirme altyapısına entegrasyonu için ilave birşey yapmaya gerek kalmadı.


i18n Özelliğinin Ayarlanması


Jsf-console’un WEB-INF/classes dizini altında messages.properties dosyası bulunmaktadır. Bu dosya içerisinden JBPM console’un UI ve kullanıcı mesajları kullanıcıya uygun bir dile çevrilebilir. Dosyayı uygulamanız içerisinde WEB-INF/classes dizini altına kopyalamalısınız. 
 

<f:loadBundle var="msgs" basename="messages"/>


messages.properties dosyası t_base.xhtml içerisinden yüklenmektedir. Console’un farklı dilleri desteklemesi söz konusu ise messages_lang_country.properties formatında desteklenen locale’e uygun versiyonunun oluşturularak uygulamanıza eklenmesi yeterli olacaktır.


Ortak SessionFactory Kullanımı


JBPM Console o anda uygulamanın execution context’i içerisinde default JbpmConfiguration instance’ını kullanarak yeni bir JbpmContext oluşturmaya çalışmaktadır. LocalJbpmConfigurationFactoryBean ile oluşturulan JbpmConfiguration kullanılmadığı için DbPersistenceServiceFactory’nin uygulamanın spring managed SessionFactory nesnesinin dışında yeni bir SessionFactory nesnesi oluşturması söz konusu olmaktadır. Bu problemi aşmak için custom bir DbPersistenceServiceFactory yazılarak spring managed SessionFactory nesnesinin dönülmesi sağlanmıştır. Custom DbPersistenceServiceFactory jbpm.cfg.xml içerisinde persistence service olarak belirtilmelidir.

 

Bir sonraki yazımda JBPM Console’u incelemeye devam edeceğiz. Örnek bir process’i JBPM GPD ile oluşturup console ile deploy ettikten sonra process’i baştan sona console ile yürüteceğiz.


Tuesday, April 14, 2009

CETÜRK Doğu Akdeniz Üniversitesi Java Etkinlikleri


11-12 Nisan 2009 tarihlerinde CETÜRK ve Doğu Akdeniz Üniversitesi Yazılım Kulübü işbirliği ile düzenlenen Java Etkinlikleri Günü'ne konuşmacı olarak katıldım. Öncelikle bu güzel ve başarılı etkinliği düzenleyen CETÜRK ekibinden Mehmet Aca'ya, Yazılım Kulübü'nden Hakkı, Selçuk, Sinan ve Olcay arkadaşlarımıza ve etkinliğe katılmamızı mümkün kılan üniversite yönetimine teşekkür ederim. Küçük aksaklıklar olsada arkadaşlar Kıbrıs için çok güzel ve yararlı bir etkinliği gayet başarılı biçimde organize ettiler.

 

Etkinliğin ikinci günü yaptığım sunumda "Spring Security Framework"den bahsettim. Spring Security Framework daha öncesinde Acegi Security Framework adı ile biliniyordu, ancak Spring dünyasında gördüğü ilgi ve yaygın kullanımı sonucunda 2.0 sürümünden itibaren Spring ürün ailesine dahil edildi ve ismi de Spring Security olarak değiştirildi. Sunumda kurumsal uygulamaların genel olarak karşılaştığı temel kimliklendirme (authentication) ve yetkilendirme (authorization) ihtiyaçlarından, Spring Security'nin bu ihtiyaçlara getirdiği çözümlerden, diğer alternatif çözümlere göre Spring Security Framework'ün artılarından bahsettikten sonra, kimliklendirme ve yetkilendirme konularını detaylı biçimde inceledik. Ayrıca sunum içerisinde Spring Security 2.0'ın bir web uygulamasında nasıl devreye alınacağını, form tabanlı kimliklendirme yönteminin kullanımını, web kaynaklarının ve servis metodlarının yetkilendirmeye tabi tutulmasını ve JSP security taglerini örnek uygulama geliştirerek anlatmaya çalıştım. Umarım katılımcı arkadaşlar açısından faydalı bir sunum olmuştur.

 

Etkinlikte ayrıca ilk gün Furkan Horasan "Volantis", ikinci gün ise Özan Acar "Java ile yüksek performanslı web platformlarının oluşturulması", ardından da Mehmet Gürsul "Zihin Haritası(Mind Map) yöntemi ile çalışmak" konularında ilgi çekici sunumlar gerçekleştirdiler. Organizasyonun ilk gününe malesef iştirak etme fırsatımız olmadığı için ilk gün ile ilgili ayrıntılı birşey söyleyemeyeceğim, ancak organizasyonu yapan arkadaşların belirttiğine göre bütün Kıbrıs çapında yoğun bir katılım söz konusu oldu, ikinci gün ise belki biraz da Pazar gününün etkisi ile ilk güne oranla daha az bir katılım söz konusuydu ancak yine de katılımcı sayısı tatmin edici düzeydeydi diyebilirim. Katılımcılar gün sonuna kadar organizasyonu ilgi ile takip ettiler.

 

Sunumların ardından "Kariyer Gelişim Sürecinde Teknoloji Tercihinin Önemi" konulu bir panel gerçekleştirdik. Yaklaşık bir saat süren bu panelde öğrenci arkadaşların kariyer gelişim sürecinde üzerine eğilmeleri, önem vermeleri gereken konulardan, kendilerini geliştirmeleri gereken noktalardan bahsettik. Bunun yanında bilişimle ilgili diğer soruları da cevaplama ve bunlarla ilgili tartışma fırsatımız da oldu. Yaklaşık bir saat süren panel sanırım herkes için oldukça doyurucu bir aktivite oldu.

 

Doğu Akdeniz Üniversitesi'nde düzenlenen bu etkinlikğe katılanların neredeyse hepsi Kıbrıs'taki değişik üniversitelerde okuyan öğrenci arkadaşlarımızdı. Daha önce CETÜRK'ün Ankara Çankaya Üniversitesi'nde düzenlediği etkinlikte de gözlediğim gibi buradaki öğrenci arkadaşlar da bu tür bilgilendirici çalışmalara büyük bir ilgi gösteriyorlar. Onlara gelecek için yol gösterecek, faydalı bilgiler ve değişik bakış açıları kazandıracak organizasyonlara gerçekten ihtiyaç duyuyorlar. Umarım Türkiye genelinde benzer organizasyonlar daha yaygın ve kapsamlı biçimde gerçekleştirilir. Emeği geçen herkese tekrar teşekkürler...