11 Şubat 2016 Perşembe

Spring Framework ve Spring Security'i 4'e yükseltmek



Geliştirmekte olduğumuz spring mvc projesinin versiyonunu 3.x'ten 4.x'e yükseltmek istedik fakat bu geçişle birlikte birkaç yerde de değişiklik yapmak zorunda kaldık.

What's new adresinden yapılan yenilikleri okuyabilirsiniz.

Türkçe kaynak da bulunması adına, yaptığımız değişiklikleri buraya not edeceğim ki belki birilerinin işine yarar.

Role'ler kısıtlamasında yapılan değişiklikler bizi çok etkilemedi çünkü henüz o kısıtlamaları kullanmıyorduk.

pom.xml tarafında değiştirilmesi gerekenler;

Eğer versiyonları değişkenden alacak şekilde tanımlamışsanız işiniz kolay yoksa her  bağımlılıklar (dependency) versiyonu eklemeniz gerekecek

örnek olarak;

<spring.version>4.2.4.RELEASE</spring.version>
<spring-security.version>4.0.3.RELEASE</spring-security.version>

22 Ekim 2015 Perşembe

Spring MVC ve çoklu dil desteği (i18n)

Merhabalar,

Yeni geliştirmekte olduğumuz projede çoklu dil desteğini uygulamak istedik. İnternetten araştırdığımızda (çok fazla türkçe kaynak bulunmadığı için) sorunumuza çözüm olmayan  bir çok çözümlerle karşılaştık.

İnternette diğer kaynaklarda anlatıldığı gibi i18n'i adım adım uyguladık ama ~

baz aldığımız kaynaklar;

http://www.mkyong.com/spring-mvc/spring-mvc-internationalization-example/

http://www.journaldev.com/2610/spring-mvc-internationalization-i18n-and-localization-l10n-example

application-context.xml sayfamızdan default dili "en" ya da "tr" verdiğimizde düzgünce çalışıyor ama maalesef "Türkçe" ve "English" linklerine bastığımızda mesajlar ilgili dile çevrilmiyordu.

        <!-- changes are then saved in cookies for future request -->
<bean id="localeResolver"
   class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
   <property name="defaultLocale" value="en"/>
</bean>

Araştırmaya devam ettikçe application-context.xml'e mvc'yi dahil etmem gerektiğini okudum.

<mvc:annotation-driven/>

ve

6 Ocak 2014 Pazartesi

MongoDB'ye giriş

Ufaktan ufaktan MongoDB'ye giriş yapıyorum. Yaparken de öğrendiklerimi belki birilerine faydalı olur umuduyla paylaşıyorum.

MongoDB'deki kavramlar ve ilişkilendirilmiş veri tabanlarındaki karşılığı aşağıdaki tabloda yer alıyor. Teknoloji ile ilgili terimlerin türkçeleştirilmesini mantıklı karşılamayanlardan olduğum için orjinal kavramdan uzak kalmayacağım.



RDBMS MongoDB
Database Database
Row Document
Column Field

(RDBMS- Relational Database Management System)


MongoBD'de document ( döküman/belge/row ) kavramı

MongoDB içindeki key-value eklinde tutulan bir kayıt bir document'tır. Her document kendi dinamic  şemasına sahiptir. dinamik şemadan kasıt, aynı collection (tablo) içindeki document'ların aynı yapı ve aynı alanlara sahip olması gerekmiyor demektir. Farklı field da tanımlamalar yapılabilir.
Ortak alanlarda farklı tiplerde veri tutabilir. MongoDB'deki belgeler (documents) JSON nesnelerine benzer. 'deki "row" karvamına karşılık gelmektedir.


Örnek 1.
MongoDB'de bir document (row)


MongoDB'de Collection (Tablo) kavramı
Collection (Koleksiyon/tablo) MongoDB belgelerinin (documents) grubudur. RDBMS'deki karşılığı ise "TABLO"lardır. Collection içindeki Documents (belgeler) farklı alanlara sahip olabilir.
 Bir koleksiyondaki tüm belgeler (documents) benzer ya da bir amaçla bağlantılıdır.

MongoDB'deki "id" mantığı
_id her document'ın tekliğini sağlayan / garanti eden 12 byte'lık hexadecimal bir numaradır.
Document'ı eklerken bu değeri siz de verebilirsiniz. Siz vermediğiniz takdirde MongoDB kendi bir tane atayacaktır. Otomatik atanan _id'nin atanması ise şu şekildedir;

ilk 4 byte = şuanki zaman (current timestamp)
sonraki 3 byte = makine id'si (machine id)
sonraki 3 byte = mongodb serverin işlem id'si (process id of mongodb server )
son 2 byte ise artan bir değerdir.


3 Ocak 2014 Cuma

MongoDB'ye başlangıç


Bu aralar MongoDB'ye merak saldım ve araştırmaya başladım. 

Araştırmaya başlarken genellikle ilgili teknolojinin kendi dökümanını okumayı tercih ediyorum fakat bu sefer önce var olan türkçe kaynaklara baktım. Gerçekten bir hayli kişi bu teknolojiye merak salmış ve araştırmış her ne kadar bazıları olduğu gibi çeviri yapmış olsa da bazıları anlayarak anlatmayı tercih etmiş. Önceden yazılım üzerine Türkçe kaynak bulmak gerçekten zordu. Neyse ki artık insanlarımız paylaşmanın önemini farkedip paylaşımcı bir ruh edinmiş :)

Bu siteler içerisinde bazıları şunlardır, belki siz de bir göz atmak istersiniz;









ve şuan okumakta olduğum Pro Hibernate and MongoDB isimli kitap,

Tüm bunlara istinaden ufak bir giriş;

MongoDB nedir?

C++ ile yazılmış, döküman tabanlı, ölçeklenebilir, NoSQL veri tabanı uygulamsıdır.
Windows, linux, Mac ve Solaris' için uygundur
Standart tablo tabanlı database yapısından kaçınır
JSON yapısını kullanarak dinamik belgeler oluşturur
2007'de 10gen isimli firma tarafından geliştirilmeye başlanmıştır. Şimdiki ismi ise MongoDB Inc.'tir


Zaten web'de olan kaynakları burada paylaşmamın bir mantığı olmadığından şimdilik bu kadar. Okudukça, öğrendikçe paylaşacağım.

11 Aralık 2013 Çarşamba

iReport-Jasperreport'u şifrelemek

Programınızdan indirdiğiniz dosyanın şifrelenmesini sağlayabilirsiniz.

Var olan JRPdfExporter exporter'in parametresine aşağıdaki özellikleri eklemeniz

exporter.setParameter(JRPdfExporterParameter.IS_ENCRYPTED, Boolean.TRUE);
exporter.setParameter(JRPdfExporterParameter.IS_128_BIT_KEY, Boolean.TRUE);
exporter.setParameter(JRPdfExporterParameter.USER_PASSWORD, "12345");
exporter.setParameter(JRPdfExporterParameter.OWNER_PASSWORD, "123456");
exporter.setParameter(JRPdfExporterParameter.PERMISSIONS,  new Integer(PdfWriter.ALLOW_PRINTING));

OWNER_PASSWORD ve USER_PASSWORD birbirinden farklı olabilir.

ve bcprov-ext-jdk16-1.45.jar'ını projenize yüklemeniz gerekmektedir. Dosyanız indirildiğinde artık şifrelenmiş bir şekilde inecektir. 

11 Nisan 2013 Perşembe

EnumSet

Dün Enum nesnelerle ilgili araştırma yaparken karşıma çıkan bir örneği paylaşmak ve yeni java öğrenmeye çalışan arkadaşlar için de biraz araştıracağım.

Haftanın günlerini enum değerler olarak tanımladık.
Enumset'in

  • range() metodu ile Pazartesi'den Cuma'ya kadar olan enum değerlerini iş günleri değişkenine atadık.
  • alloff() metodu ise verilen  tüm enum değerli kapsıyor.
  • size() listenin kaç elemanlı olduğunu
  • removeAll() ise verilen listenin diğer enum liste içerisinden çıkarılması sağlar


isWorkday() metodumuz gelen değerin hafta içi olup olmadığını kontrol ediyor.

Bu esnada öğrendiğim bir sey daha oldu. String.format metodu. Bununla ilgili de internette araştıma yaptığımda String nesnesinin format metodunun çok güzel işler yaptığını farkettim.

Bunu bir sonraki yazımda paylaşmaya çalışacağım.


public final class EnumSetOrnegi {

  private enum HaftaninGunleri {
   PAZARTESI, SALI, CARSAMBA, PERSEMBE, CUMA, CUMARTESI, PAZAR;
EnumSet IS_GUNLERI = EnumSet.range(PAZARTESI, CUMA);

   public final boolean isWorkday() {
    return IS_GUNLERI.contains(this);
   }

   public static final EnumSet BUTUN_HAFTA = EnumSet.allOf(HaftaninGunleri.class);
  }

  public static final void main(final String... argumgents) {
   System.out.println("İş Takvimi:");

   for (final HaftaninGunleri weekday : HaftaninGunleri.BUTUN_HAFTA)
    System.out.println(String.format("%d. %s günü sen " + (weekday.isWorkday() ? "çalışmak zorundasın" : "gezip tozabilirsin") + ".", weekday.ordinal() + 1, weekday));

   System.out.println("Bütün hafta boyunca çalışmak zorunda mıyım?");
   System.out.println(HaftaninGunleri.IS_GUNLERI.containsAll(HaftaninGunleri.BUTUN_HAFTA) ? "Evet, maalesef." : "Kesinlikle hayır.");
   final EnumSet weekend = HaftaninGunleri.BUTUN_HAFTA.clone();
   weekend.removeAll(HaftaninGunleri.IS_GUNLERI);
  }
 }

Yukaridaki kodu çalıştırdığınızda çıktısı şu şekilde olacaktır :
//

İş Takvimi:
1. PAZARTESI Günü Sen çalışmak zorundasın.
2. SALI Günü Sen çalışmak zorundasın.
3. CARSAMBA Günü Sen çalışmak zorundasın.
4. PERSEMBE Günü Sen çalışmak zorundasın.
5. CUMA Günü Sen çalışmak zorundasın.
6. CUMARTESI Günü Sen gezip tozabilirsin.
7. PAZAR Günü Sen gezip tozabilirsin.
Bütün hafta boyunca çalışmak zorunda mıyım?
Kesinlikle hayır.
//

kaynak : Fun with EnumSet

10 Nisan 2013 Çarşamba

Java'da iki Enum değerini karşılaştırmak

Java'da iki Enum değeri nasıl karşılaştırsınız? "==" operatorünü mü yoksa equals() metodunu mu kullanırsınız?
İkisi arasındaki fark nedir sorusu genellikle java iş göürşmelerinde sorulabilecek hileli sorulardan birtanesidir. Eğer Java'daki Enum değerlerle ilgili ayrıntılı bilginizyoksa bunu gönül rahatlığıyla cevaplamaya çekinirsiniz.

Enum nesneler String nesnelerin tersine == ve equals() metoduyla karşılaştırılabilirler. İkisi de aynı sonucu döndüreceklerdir. Çünkü Java.lang.Enum'ın equals() metodu içerisinde == ifadesini kullanır iki nesneyi karşılaştırırken.

Enum equals() metodu;

public final boolean equals(Object other) {
        return this==other;
}


1) Enum Karşılaştırma işlemini == ile yaptığınızda NullPointerException hatası almazsınız. Değerlerden biri null olsa bile sonuç olarak size false döndürecektir. Aynı işlemi equals() metodu ile yapmak istediğiniz de NullPointerException hatası alırsınız.

private enum Shape{
        RECTANGLE, SQUARE, CIRCLE, TRIANGLE;
} 

private enum Status{
        ON, OFF;
}

Shape unknown = null;
Shape circle = Shape.CIRCLE;      

boolean result = unknown == circle; //return false
result = unknown.equals(circle); //throws NullPointerException

2) == kullanmanın diğer avantajlarından birisi de Derleme (compile) esnasında güvenli olması. Derleme esnasında iki enum nesnesinin aynı enum tipinde olup olmadığını ya da eşitliğini kendi kendine kontrol eder.

3) == operatoru equals() metodundan daha hızlıdır. Operator kullanmak method çağırmaktan çok daha hızlı olmalı, değil mi.

compareTo metodu ile Enumları karşılaştırma
İki Enum'ı karşılaştırmak demek herzaman o iki Enum'ın eşit olup olmadığını kontrol etmek değildir. Bazen onları sorlamak ve belli bir sıraya koymayı da isteyebilirsiniz. Biliyoruz ki, Java'daki Comparable and Comparator sınıflarını kullanarak nesneleri karşılaştırabilir ya da sıraya koyabiliriz. Enum'ı da aynı şekilde elealabiliriz.

Java.lang.Enum sınıfımızı Comparable arayüz (interface'den) implements edebiliriz. Bildiğiniz gibi  compareTo() metodu sadece aynı tip nesneleri kıyaslar.
Aynı sıralama işlemini Enum'ın ordinal() metodu,  EnumSet ve EnumMap ilede yapabilirsiniz.

public final int compareTo(E o) {
 Enum other = (Enum)o;
 Enum self = this;

 if (self.getClass() != other.getClass() && // optimization
  self.getDeclaringClass() != other.getDeclaringClass()) throw new ClassCastException();

return self.ordinal - other.ordinal;
}

Eğer son satıra bakarsanız karşılaştırma için ordinal metodunun kullanıldığını görürsünüz.


Kaynak: http://javarevisited.blogspot.com/2013/04/how-to-compare-two-enum-in-java-equals.html#ixzz2Q4PBHXds