Apache Camel ve XSLT

Şu an çalışmakta olduğum şirkette bir projede camel kullanmaktayız. Açıkçası önceden Camel adını çok duymama rağmen kullanma fırsatım olmamıştı, fakat şimdi kullanma fırsatı bulabildiğime seviniyorum. Bu yazıda ise kullanma sırasında öğrendiğim kısımlardan birini, Camel ve XSLT kullanarak soap mesajlarını birbirine  nasıl çevrilebileceğini, anlatmaya çalışacağım.

Camel tanımlanması zor bir framework. Fakat kısaca kural tabanlı yönelendirme framework’u diyebiliriz. Bu kurallı yönlendirmelerinizi iseterseniz size sağladığı API üzerinden isterseniz DSL üzerinden gerçekleştirebiliyorsunuz. Ayrıca tüm bu kural yapılarını ve yönlendirmelerini Enterprise Integration Patters kullanarak yapmanızı sağlıyor ki bu da heralde en büyük artısı.

Yapacağımız örnekte A servisine ait bir methodu, B servisine ait başka bir methoda çevireceğiz. Böylelikle A sevsini kullanan müşterileriniz B servisinden haberdar olmaksızın sisteminizle iletişim kurmaya devam edebilecekler. camel_xslt

Biraz daha gerçek hayattan örnek vermeye çalışalım. Bir ürün geliştirdiniz. Çevre sistemler sizin ürününüzle servisler üzerinden haberleşiyor. Fakat zaman ilerledikçe ürününüzü geliştirdiğiniz sırada göremediğiniz başka ihtiyaçlarınız olduğu ortaya çıkıyor. Sizde servislerinizi bu doğrultuda güncellemek istiyorsunuz. Fakat müşterileriniz hali hazırda ilk versiyonu kullandığından yeni servislerinizle entegre olmak istemeyecektir. Bu durum da yapabileceğiniz tek şey ilk servislerinizi kapatmadan ikinci servislerinizi ayağa kaldırmaktır. Bu da kodunuzun tekrar edilmesine neden olacağından iyi bir çözüm sayılmaz.

İşte tam bu noktada camel devreye giriyor. Camel sayesinde son versionda ayağa kaldırdığınız servisleri ilk versionun WSDL yapısı üzerinden rahatlıkla kullanabilirisniz. Bunun için tek yapmanız gereken Camel içerisinde yönlendirme tanımlayıp, versiyon1 isteklerinizi XSLT ( ya da başka bir mekanizma) kullanarak son versiyon isteklerine çevirmek ve Versiyon2 servislerine yönlendirmektir. Benim bu yazıda yapmak istediğim örnekte tam olarak bu.

Hazırlık

Öncelikle kullanacağımız servislerden ve bu servislerin WSDL’lerinden bahsedelim. Elimizde HelloWorldService servisi bulunmakta ve bu servisin birtane methodu var.

Bu methodun parametresi HelloRequest, versiyon 1 servislerinde sadece fullName alırken version 2 servislerinde firstName ve lastName değişkenleri alıyor. Her iki versiyonun WSDL yapılarını inceleyelim. Tabi bu WSDL’leri daha sonra projemizde de kullanacağız.

HelloWorldService.v1

 HelloWorldService.v2

Eğer bu WSDL servislerini Altova XMLSpy gibi bir araçla inceleyecek olursanız, HelloRequest sınıfnın her iki durumda da farklı farklı olduğunu göreceksiniz. Fakat daha net olması açısından, bu iki WSDL’i SOAPUI ile açtığınızda üretilen istek XML’lerinide veriyorum.

sayHello(…).v1

sayHello(…).v2

Bizim yapacağımız ise Camel yönlendirmeleriyle sayHello(…).v1 üzerinden gelen bir isteği sayHell(…).v2 versiyonuna çevirmek olacak.

Projenin Yaratılması

Projeyi maven kullanarak oluşturacağız. Spring, CXF ve Camel araçlarını kullanacağız. Takip edeceğimiz yok aşağıdaki gibi olacak

  • HelloWorldService.v1 için Camel tarafında endpoint ayağa kaldırılacak. Bu endpoint ayağa kaldırılırken HelloWorldService.v1 WSDL’i kullanılacak ve bu endpoint’e gerçek bir servis ayağa kaldırılmayacak. Bu endpointe gelen servisler Camel tarafından yakalanıp yönlendirmeler yapılacak.
  • HelloWorldService.v2 için CXF kullanılarak JAXWS endpoint’i ayağa kaldırılacak. HelloWorldService.v1 endpointine gelen istekler XSLT ile dönüştürüldükten sonra bu endpointe yönlendirilecek.

Akışı az çok belirlediğimize göre projeyi olutşurabiliriz.  maven-archetype-webapp archetype’ını kullanarak projemizi oluşturuyoruz. Oluştururken kullandığımız parametreler:

  • GroupId: com.bahadirakin
  • ArtifactId: camel-xslt
  • Version: 0.0.1-SNAPSHOT

Bı bilgilerle projenizi oluşturduktan sonra pom.xml dosyanızı aşağıdaki gibi güncellemeniz gerekiyor.

pom.xml

Aynı şekilde web.xml dosyanızıda aşağıdaki gibi güncellemeniz gerekmektedir. Bu değişiklikle Spring ve CXF ayarlarını yapmış oluyorsunuz.

web.xml

Endpoint’lerin Olusturulması

HelloWorldService.v2 Endpoint

Burdan sonra artık HelloService.v2 endpoint’i gerçek JAXWS endpoint’ini ayağa kaldırabiliriz. Bunun için Aşağıdaki request ve response sınıflarının haricinde birde servis sınıfının yaratılması gerekiyor.

HelloResponse.java

Bu response her iki endpoint tarafında da özdeştir.

HelloRequest.java

Şimdi ise servis sınıfımızı yazıyoruz.

HelloWorldService.java

Şimdi ise oluşturduğumuz bu servis sınıfını, camel Spring context tanımlamamıza ekliyoruz.

Bunun için src/main/resources klasörünün altına jaxws-context.xml adında bir xml dosyası oluşturuyor ve içeriğini aşağıdaki gibi yapıyoruz.

jaxws-context.xml

Bu xml dosyamızıda asıl context dosyamıza ekliyoruz. Eğer yoksa src/main/resources klasörünün altına applicationContext.xml isminde bir dosya yaratıyoruz.

applicationContext.xml

HelloWorldService.v1 Endpoint

Öncelikle hazırlık aşamasında verdiğimiz HelloWorldService.v1.wsdl ve HelloWorldService.v2.wsdl dosyasını src/main/resources/wsdl klasörünün altına ekliyoruz.

Sonrasında src/main/resources klasörünün altında camel-context.xml dosyamızı yaratıyor ve bu dosya içerisinde HelloWorldService.v1 ve HelloWorldService.v2 endpoint’ini ayağa kaldırıyoruz. HelloWorldService.v2 endpoint’ini buraya da tanımlıyoruz. Çünkü eğer tanımlamazsak gelen isteği V2 endpoint’ine yönlendiremiyoruz.

camel-context.xml

Burada biraz duralım ve ne yaptığımıza bakalım.

  • HelloWorldService.V1 için camel endpoint’i oluşturduk.
  • HelloWorldService.V2 için camel endpoint’i oluşturduk.
  • Bu endpoint’leri oluştururken doğrudan CXF değil, Camel’in CXF bileşenini kullandık. Yani CXF kütüphanesi ayrı Camel CXF bileşeni ayrı.
  • Daha sonradan bir yönlendirme tanımladık. Dedik ki eğer istek HelloWorld.V1 endpoin’ine geliyorsa, bu isteği XSLT kullanarak dönüştür ve HelloWroldV2 endpoint’ine yönlendir.

Şu anda geriye sadece XSLT dönüşümü kaldı. Onuda eklediğimizde sistemimiz hazır hale gelecek.

XSLT

Heralde projenin en çok zorlayacak bölümü XSTL dönüşümüdür. Çünkü XSLT dönüşümü öyle bir oturuşta yazılabilecek birşey değil bence. İnsanı uğraştırıyor. Fakat sağolsun Altova MapForce diye bir uygulama geliştirmiş. Bu uygulamayı kullanarak, sürükle bırak gibi kolay işlemlerle iki XML arasında dönüşüm yapılabiliyor. Aşağıda gördüğünüz üzere bende iki request arasında dönüşüm yaptım.

Yukarıdaki şemanın detayı ise aşağıdaki gibidir. Hangisinin daha kolay olduğuna siz karar verin.

sayHello.v1.to.v2.xslt

Yukarıda verdiğim xslt dosyasını src/main/resources/xslt altına kaydediyoruz.  Burdan sonra geriye kodunuzu çalıştırmak kalıyor.

Son

Projenizi başarıyla çalıştırıp http://localhost:8080/camel-xslt adresine gittiğinizde tüm endpoint’lerinizin ayakta olduğunu görmelisiniz. Burada sanki iki farklı versiyon varmış gibi gözüksede siz aslında bir versiyon olduğunu bileceksiniz. Burdan sonra iseter V1 endpoint’ine isterseniz V2 endpoint’ine istek gönderip uygulamanızı test edebilirsiniz.

Githubgitcat

Kaynaklar

End Of Line