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.
Bu sayede JSF içindeki sayfalardan 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 orijinal 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 dosyadaki
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
dosyası 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üne 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ğrısı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.