Category: Java Project

Java Uygulama için Api’ın Geçerli Sertifika Dosyasını Set Etmek

Https protokolü ile SaaS hizmet sağlayan https://api1.paritus.com servisi mevcut. Bu servisin cevabını, yazmış olduğumuz bir java uygulaması içinde kullanmayı planlıyoruz. Jackson – JaxRS, Jersey-Client veya başka bir rest client kütüphanesi kullanarak normal bir http isteğini handle edebiliriz. Ama iş https üzerinden veri çekmeye gelince java tarafında daha önce karşılaşmadığım javax.net.ssl.SSLHandshakeException hatası ile karşılaştım.

Biraz araştırınca .Net tarafında da benzer problemler olduğunu, .Net tarafında aşağıdaki gibi bir yöntem ile kod içinde çözülebildiğini gördüm.

//System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate(object s, System.Security.Cryptography.X509Certificates.X509Certificate certificate, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors) { return true; };

Java tarafında daha farklı çözümler varmış. Biri application server’ın conf/server.xml konfigurasyon dosyası üzerinde cert dosyasını tanımlamak. Diğeri ise uygulamanın çalışacağı java’nın keystore dosyasına api1.paritus.com’un .cer dosyasını import etmek. Ben ikincisini uyguladığımdan onu açıklayacağım.

Öncelikle api1.paritus.com’un kullandığı sertifikayı tarayıcı üzerinden görüntüleyip exportunu alıyoruz. Aşağıdaki .cer dosyası tarayı üzerinden inmiş sertifika bilgi dosyasıdır.

./jre_linux/bin/keytool -import -noprompt -trustcacerts -alias api1.paritus.com -file ../api1_paritus_com.cer -keystore ./jre_linux/lib/security/cacerts -storepass changeit

Yukarda “keytool” u kullanarak güvenilir ca sertifikalarına yenisini ekliyoruz. Alias ile bir isim veriyoruz. file ile tarayıcıdan indirdiğimiz sertifika bilgi dosyasını belirtiyoruz. keystore ile ca sertifikalarının olduğu caCerts dosyasını belirtiyoruz.

Bundan sonra kodu geliştirdiğimiz ortamı veya kodun çalıştığı application server’i restart ediyoruz ve handshake hatasını almayıp kodumuzun başarılı çalıştığını görüyoruz.

Not: linux ve windows makine üzerinde aynı komutu çalıştırdım. Problem yaşamadım. Sormak istediğiniz birşey olursa sefersezer@gmail.com adresime mail atabilirsiniz.

Saygılarımla

Advertisements

İlk Spring Boot Uygulaması

Bu yazıdaki hedefimiz spring boot’un derinlerine inmek değil, hello-world uygulama yazıp, çalıştırılabilir .jar olarak paketleyip servisin çalışırlığını test etmektir.

Başlamadan önce biraz bahsetmek isterim. Spring boot, eskide kalan ve uygulama sunucusuna ihtiyaç duyan .war paketi yerine tüm ihtiyaçlarını .jar paketi içinde toparlamayı sağlayan bir Spring framework kütüphanesidir. En temel özelliği, yazılacak uygulamanın servis katmanını, istenilen methodlar veya interface method signature’ları üzerindeki notasyonlar ile kolaylıkla yönetebilmektir.

Hızlıca günün gereksinimlerini açıklayayım:

  • maven 3.0 +

  • java 1.8

  • Ide (eclipse)

1. Method ve Notasyonları

Klasik bir maven projesi oluşturup, “hello-world” yazdırabilmek için App.java sınıfını şu şekilde düzenliyoruz. Daha başka konfigurasyona ihtiyaç duymadan servisimizi kullanılabilir hale getiriyoruz…

Aşağıdaki commentlerde hangi satırın ne işe yaradığı açıklanmaktadır.

@EnableAutoConfiguration
@RestController
public class App {
public static void main(String[] args) { // starter method
SpringApplication.run(App.class, args); // spring boot uygulaması burada tetikleniyor.
}

@RequestMapping(“/”) // request mapping sağlanıyor. şimdilik sadece root dizininde, parametresiz, yalın bir çağırım gerçekleştiriliyor.
public String home() {
return “Hello Docker World”;
}
}

2. Bağımlılıklar ve Parent

Kodu yazdıktan sonra .pom dosyasına sadece şu dependency’leri eklememiz yeterli olacaktır:

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>1.3.3.RELEASE</version>
</dependency>

Projenin parent’i olarak spring-boot-starter-parent belirliyoruz. Bu parent projenin .jar olarak start edilebilmesini sağlayacak olan manifestleri içermektedir. Bir konfigurasyon beklememektedir. Eğer parent’i eklemek istemezseniz manifest ve diğer konfigurasyonları manuel yapmanız gerekecektir. <dependencies> node’unun üstüne / dışına yazmamız uygun olacaktır.

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.3.RELEASE</version>
</parent>

Eğer “parent kullanmak istemiyorum. Projemdeki jpa’nın persistence dosyası veya diğer bağımlılıklar ile çakışmalar yaratıyor” diyorsanız spring-boot-maven-plugin eklentisini aşağıdaki ikinci yöntem gibi düzenleyebilirsiniz.

3. Plugin’ler

Aşağıda targetteki java sürümünü 1.8 olarak belirlememizi sağlayan compiler plugin ve spring boot’u executable package haline getirmemizi sağlayan eklentiler yer almaktadır.

Maven compiler plugin, projenin diğer bağımlılıklarını .jar dosyasına include etmeyi sağlar. Ayrıca bu plugin ile compiling jre version belirlenebilir.

<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>

Parent’i kullanıyorsanız:

<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin></plugins></build>

Parent’i kullanmadan:

<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>1.3.5.RELEASE</version>
<configuration>
<mainClass>com.test.App</mainClass>
<finalName>${project.build.finalname}</finalName>
<outputDirectory>${project.build.directory}</outputDirectory>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>

Yukarda spring-boot ile paketleme işlemi yaptık. Normal paketleme executable package oluşturamıyor; spring boot’a özel paketleme gerekiyor. Ayrıca yukarıda görüldüğü gibi bir main class ve harici output dir verilebiliyor.

4. Packaging

Benim kullandığım projede “jpa ile ilgili problemlerimi” görmezden gelirsek, sadece mvn package çalıştırarak paketimizi oluşturabiliyoruz.

mvn clean package spring-boot:repackage

5. Start

Sonrasında windows konsolu, linux konsolu veya Jenkins CI Tool ile aşağıdaki kodu tetikleyerek servisi çalışır hale getirebiliriz.

java -jar bootsample.jar

Not: Ben docker içinde kullanacağım için işim henüz bitmedi. Docker’in image’ında çalışma ortam bilgileri de set edilmesi gerekiyormuş… araştırmaya devam edeceğim ve bir container içinde harici kaynaklar ile çalışan bir uygulama yazacağım.

Saygılarımla

sefersezer@gmail.com

Apache Solr Notlarım

Post.jar ile windowsta döküman indexleme:
java -Dc=istenenCoreAdı -jar post.jar .\example\*.xml
Indexleme aracı post.jar, http üzerinden core veya collection’un /update pathine curl isteği göndererek iş yapar. Post.jar’da input için default olarak ayarlanmış 3 tip vardır. Xml, json ve csv. Eğer bir pdf veya doc dosyası indexlenmek istenirse Apache Tika tool’u kullanılmalıdır.

Select parametreleri:
Örnek Adres: http://localhost:8983/solr/techproducts/select?q=video

  • fl: field. Sonuçlarda hangi fieldın gözükeceğini belirtmek istediğinizde bu parametre ile veriyorsunuz. fl=name,features gibi bir yazım ile birden fazla alanın gözükmesini sağlayabilirsiniz.
  • q: query. Aranan kelimedir. Örnek indexte herhangi bir alanda video kelimesi aranabilir durumdadır. field belirtilmezse tüm alanlarda (schema.xml’de öyle yapılandırılmış olmalı) arama yapacaktır. Name alanında da video ile eşleşse, id alanında da video ile eşleşse bu kayıtları response ile getirecektir. Ayrıca q içinde field da belirtebilirsiniz.
    Örneğin: http://localhost:8983/solr/techproducts/select?q=name:Apple
    q=price:[0 TO 400]&fl=id,name,price
    bu şekilde bir kullanım ile price alanına aralık verebilirsiniz
  • facet=true&facet.field=cat
    Facet Solr’ın temel özelliklerinden biridir. Facet ile sonuçlar üzerinde gruplama, kategorilendirme, sınıflandırma yapılabilir. İçeriğe göre çok farklı nitelikleri yakalayarak gruplama yapabilirsiniz. Sadece alanlara bağlı değil, içeriğe bağlı da çalışıyor olması ve çok yüksek hızlarda çalışıyor olması büyük avantajlar sağlamaktadır. Facet =true ile gelen sonuçlarda facet özelliğini kullanılabilir yapıyoruz. Basit örneğimiz için facet.field ile de gruplama yapılacak alanı belirtiyoruz. Aşağıdaki ilk adresteki gibi bir sorgu gönderdiğimizde sonuçlar üzerinde, category alanına ilişkin kullanılabilir category alanlarının sayısı gözükmektedir. Burada sadece facet alanı tanımlaması ve temel işlem olan sayıya göre gruplama yaptık.
    Facet’in daha bir çok parametresi / özelliği bulunduğundan bu category sayılarını daha farklı şekillerde kullanabilme imkanına sahibiz. Mesela ikinci adresteki gibi fq=cat:software ile filter query‘i sadece software categorysinde olacak şekilde yapılandırabiliriz. Sonuçlarda price 200 400 arasında olan, software kategorisindeki kayıtların id, name, price alanları gözükecektir.

    1. http://localhost:8983/solr/techproducts/select?q=price:%5B200 TO 400]& fl=id,name,price & facet=true& facet.field=cat
    2. http://localhost:8983/solr/techproducts/select?q=price:%5B0%20TO%20400%5D&fl=id,cat,name,price&facet=true&facet.field=cat&fq=cat:software
  • qt: Request Handler. İstekleri /select pathi üzerinden gönderebilmemiz için kullanılır. Standalone’da bir collection üzerinden istek göndeririz. Fakat cloudda nodelardan birine isteği göndermemiz gereken durumlar olabilir. Bunun için core/collection altındaki /select path’i ile select sorgu isteklerini handle edebiliriz.
  • sort: Select sorgusu ile gelen sonuçları ascending descending sıralamaya olanak sağlar. Örneğin: price desc yazdığımızda fiyatı azalan sırada listeleyecektir. inStock desc, price asc yazarak da birden fazla sorting parameter belirtebiliriz. Temel olarak sort işlemi bunlarla yapılabilir fakat sum(x,y ) desc gibi bir yazım ile de sorting query parametresi verilebilirmiş. Ben kullanmadım.
  • start: /select sorgusu ile gelen sonuçlarda, eşleşen dökümanlardan baştan kaçıncıdan itibaren göstermesini istiyorsak start a belirtmemiz gerekir. Örneğin 30 sonuç gelen bir sorguda start:10 dersek, 10. kayıttan başlayarak dökümanları listeler.
  • rows: Eşleşen dökümanlardan kaç adedinin gözükeceği belirtilir.
  • wt: gelen sonucun gösterim formatını belirler. Xml, json, python, php, ruby, csv olabilir.
  • indent: okunabilir formatta gösterim sağlar

Console Maven Projesine Web Projesi Özelliği Katmak

Merhabalar,

Daha önce File/new/maven project… yolunu kullanarak oluşturduğunuz bir projeyi web’de yayınlama ihtiyacı hissettiniz. Projeyi web projesine dönüştürebilmemiz için gerekli anahtar kelime FACETS!.

Projeye adına tıkladıktan sonra ALT+Enter ile proje özelliklerini açtıktan sonra search kısmına Facets yazalım. Burada Project Facets‘i bulacağız. Facets geldikten sonra da Javascript ve JavaServer Facets olarak seçmemiz yeterli olacaktır. JavaServer Facets sürümü 2.2 desteklemiyor ise 2.1 seçerek ve application server tipimi seçerek burada işimi bitirebilirim.

Bu arada benim bahsi geçen projemin gereksinimi olmadığından “Further Configuration Available” seçeneğinden Jsf implementation library’i disable edebilirim.

Burada maven projesini maven web projesine çevirdik. Tomcat gibi web application server altında yayınlamak için Projeyi, web projesi olarak yayınlamak için packaging tipini jar yerine war olarak değiştirmemiz gerektiği gibi diğer gereksinimleri biliyor olduğumuzu farzediyorum. Olmadı sefer.social@gmail.com adresine mail atın iki geyik yaparız…

Adsız

Tasarım Modelleri

Dur. Tasarım dediğin uygulamanın tasarımından ibaret değil. İçindeki kodun da bir tasarımı var. Kullandığın yöntemlerin de, kurduğun bağlantının da, bağlandığın servisin de…

Uzun uzadıya tasarım yok şöyle yapılmalı yok böyle yapılmalı demeyeceğim. Ki zaten tasarım experi değilim…

Şöyle yapalım; internette ilgimi çeken tasarım kaynaklarının linkini paylaşayım; bir bakın. Sonra ne – nasıl olmalı yaptığın işin neyi doğru neyi yanlış bunu siz sorgulayın.

Güzel yaz lan şu kodu diyen Liskov Substitution (LSP) disiplini Burak Selim Şenyurt’tan

Üç beş güzel tasarım sunan chrome eklentisi PANDA, Ahmet Sülek ve William Channer’dan

Patronu ikna ettikten sonra cidden güzel olan tasarımları nasıl yapacağını açıklayan ve örnekleyen site GoodUI

Tasarım yeteneğim yok, benden front-end developer olmaz diyenlere ‘Hıh! Salak beni kullansana’ diyen site BootStrap ayrıca utanmadan performansa yönelik optimizasyon sağlayan araçlar da sunuyor.

Yaptık ettik nerde saklıcaz da gerektiğinde bulucaz dersen al eline bir kova ve doldur. Ya da BitBucket (ve de sourceTree)

{Şimdilik bu kadar. Güncellenecek mi? -Tabiki de!}