Yazar arşivleri: Musa YUVACI

Çelişki ve İşbirliği

Tarık Tufan’ın Anna şiirini İsmail KILIÇARSLAN’ın yorumuyla dinlemeyi hep sevmişimdir.
“Biz her şeye,
esirgeyen ve bağışlayan,
çokça esirgeyen ve çokça bağışlayan,
hep esirgeyen ve hep bağışlayan rabbin adıyla başlayan adamlarız anna.”
Aklın ve Kalbin, hem büyük bir çatışma hem de aynı çatışma anında çok büyük bir işbirliği içinde olduğunun idrakine vardığımızda ufkumuz bir kat daha artıyor. Kalp etmek ile akletmenin farklı kavramlar olduğunu bir kez daha anlıyoruz.
Meseller, meseller üstüne geldikçe, daha iyi idrak ediyoruz bu kavramı. Duygusal anlamda kızmak, utanmak, sevmek, sinirlenmek bunların hepsi insani, aynı zamanda bu duygular içerisinde olmanız aklen yapılması gerekenleri engellemiyor, en azından bizim için, yani aklen önemsenmeyecek bir konu olduğunu bilmeniz, buna kani olmanız ve buna göre adımlarınızı atmanıza rağmen canınız acıyabiliyor. Şu güzel düşünceyi çok ama çok seviyorum,
“Bunların (herhangi bir olayın) önemli olmadığını biliyorum. Yarın, bunlar ile ilgili çok ama çok az hatıra kalacak aklımda, ama durumun bu şekilde olması şu anda canımın yanmayacağı anlamına gelmiyor.”
Aslında bu acıtma düşüncesi, ayrı bir pencerenin kapılarını açıyor insana. Hala duygularının olduğunu, bu kapitalist dünya içinde hala insan kalabilmiş olduğunu gösteriyor.
Çok büyük dişlilerin arasında olupta, bu dişli sistemini fark etmemiz ve bu sistemin dışına çıkma düşüncesine sahip olma basiretini gösterebilmemiz, çelişki gibi gözüken işbirliklerini bizim anlamımıza fırsat veren Allah’ın bir hikmetidir.
“Önemli olan bilgiye sahip olmak değildir, hikmete sahip olmaktır”

Kalpler Ancak; Allah’ı Zikretmekle Mutmain Olur

Çokluk, çokluk içinde azlık, işte tüm mesele bundan ibaret. Etrafta bir çok ses gürültü ama anlamı yok, hiç bir şey ifade etmiyorlar. Tek tek baktığım zaman suretlere hepsi de donuklaşıyor, yavaş yavaş siliniyor, anlam ifade etmiyorlar. İşte modern insan bu kadar tek, kendi başına. Hayata anlam katmaya çalışıyor, çalışıyor çalışıyor. Sonra da ayırıyoruz kendimizi diğer güruhtan, biz diyoruz “dava adamıyız”, bir davamız var ve bu dava uğruna savaşıyoruz Allah izniyle, her zaman yanımızda Allah Azze ve Celle var. İnsanın içi daha bir ferahlıyor bunları düşününce. Etraftan gelen bütün sesler ayrışmaya başlıyor artık.

Elhamdülillah.

Son olarak altın vuruşu yapalım, Kalpler ancak; Allah’ı zikretmekle mutmain olur (Ra’d suresi 28.Ayetin Bir Kısmı).

Hata Yapmak ve Rethinking

Zamanında değerli bir hocam anlamların üzerine konuşurken ingilizce rethinking diye bir ifadeden bahsetmişti, kelimeyi ilk duyduğunuzda ilginç bir durum uyandırmıyor. Fakat biraz daha anlatmaya devam edince, işte o zaman sırrı yakalıyorsunuz, rethinking kelimesinin ifade ettiği gerçek anlam, düşünmüş olduğunuz fikri farklı bir şekilde daha önce yapmadığınız bir şekilde düşünmek olduğunu farkediyorsunuz. Bu kenarda bir dursun.

Çok sevdiğim bir dostumdan öğrendiğim bir arab atasözü “Allah kuluna yardım etmek isterse ona hatasını gösterir”, çok muazzam bir yaklaşım. Biz faniler zor kabul ederiz hatalarımızı, daha doğrusu insan kendisini tanrılaştırma sürecini fazlaca deneyimlediği için hata yaptığı gibi bir düşünceye genelde katılmaz.

“Hata yapmak
fırsatını Adem’e veren sendin
bilmedim onun talihinden ne kadar düştü bana
gençtim ve ben neden hata payı yok diyordum hayatımda
gergin bedenim toprağa binlerce fışkını saplar idi
haykırınca çeviklik katardım gökyüzüne
bir düşü düşlere dalmaksızın kavrayarak
bulutu kapsayarak açmadan buluta içtekini
tanıdım Ademoğlu kimin nesiymiş
ter döküp soru sormak nereye sürüklermiş kişiyi.” (Tamamı için İsmet ÖZEL Münacaat)

İşte böyle, hata yapmak. Bu kavram üzerine uzun uzun düşünmek, düşünürken elde ettiğiniz veriler neticesinde, hata yapmanın tecrübenin temelini oluşturduğunun farkına varmak. Sonuçta şu anda olduğumuz kişi şimdiye kadar edindiğimiz hayat tecrübesinin yekünü değil mi?

Bütün bunlar ışığında Allah’ın sevgili kulu oldunuz zaman (İnşallah o mertebeye ulaşmayı Allah nasip eder), Allah bize yardım ettiğinde, hatamızı gösterdiğinde, bir karar vermek gerekiyor. Havlumu atılacak, yoksa yeniden mi düşünülecek (rethinking)? Allah’ın izniyle yeniden düşüneceğiz, bu sefer daha farklı bir şekilde yapacağız bu işi, daha planlı daha inançlı daha organize ve bir sürü daha eşliğinde. Bu şekilde ilerleyecek tekamül sürecimiz. Hayatın düz bir çizgi olmadığını, çıkışlar kadar inişlerinde olduğunu, fakat önemli olanın çıkarkende inerkende prensiplerine bağlı kalarak sağa sola savrulmadan dimdik bir şekilde ilerleyebilmek olduğunu, deneyimlemiş olarak devam edeceğiz yolumuza.

Kalem ve Zaman

Kafamız yeteri kadar dağınık, fonda Zagreb Radyosu çalıyor, götürüyor ruhumuzu uzaklara, amansız bir yalnızlığa. Olmuyor ama Ahmet KAYA ile, geri dönmek lazım uzaklardan yakınlara, yakınlardaki hayatın gerçeklerine. Daha yeni tanıdığımız Evgeny GRINKO yetişiyor imdadımıza, başlıyoruz hayatın gerçekleri ile vals yapmaya. Sonra bir bir yıkılıyor bütün duvarlar, özgürce dans edeceğimiz alanlar gitgide büyüyor, mekansal ve zamansal bir büyüme. Zaman zaman ayağımıza basıp canımızı yakıyor hayatın gerçekleri, daha sonra fark ediyoruz ki bu ayak basmaları bizi hazırlayan, olgunlaştıran küçük ama etkili uyarılarmış, sürekli canlı kalmamızı sağlayan.

Evgeny GRINKO çalıyor biz devam ediyoruz yazmaya, aklımızdakileri, sadece aklımızdakileri de değil hissettiklerimizi de. Sahi nasıl tanımlayabiliriz hissettiklerimizi. Nasıl yazıya dökeriz sonrasında. Acaba yazıya dökerken yeterince dokunabilir miyiz diğer insanların dimağlarına. Düşünüyoruz bunu. Kalemi ele alınıp sonrasını zamana bırakmak ve izlemek, kalemin, kağıdın teninde yavaş yavaş ilerlemesini. Kalem ve zaman güzel bir ikili oluyorlar. Zaman akıyor, kalem yazıyor ve bizi bize anlatıyor. Hatta en gölgede kalan kısımları dahi atlamıyorlar, hiçbir sansür olmadan döküyorlar yazıya.

“Fakat Müzeyyen bu derin bir tutku” diyor satırlarında malum müellif, aynı zamanda da bir yönetmen dedirtiyor aynı sözleri bir oyuncusuna, hatta kadın belli bir mesafeden cevap veriyor bir yabancının ses tonuyla. Burada bırakmak istiyor kalem ve zaman…

Diklemesine Teğet Geçiyoruz Hayatı

Diklemesine teğet geçiyoruz hayatı, nefes alıp verir gibi yapıyoruz, aslında aldığımızın gerçekten nefes olmadığını bilerek. Cebimizdeki hayat nakitlerinden harcıyoruz, anlamsızca, sonra da bir kahve fincanında arıyoruz nedenleri, dikerken kahve fincanını acıyan yüreğimize, yavaş yavaş telkinlerde bulunuyoruz kendimize, “sabret delikanlı sabret”, kendimize de “delikanlı” demekten de uzak durmuyoruz hani, saçlarımıza beyazlar düşmüş olsa da.

Sorgulamaların sonu da filmler gibi önceden kestirilebiliyor artık, sonunda hep bir mantık hep bir mantık, aman Allah’ım nasıl iştir bu böyle. Demek ki her dakika sorgulama yapmak gerekiyor, daha doğrusu daha büyük bir sınavın olduğunu bilerek yaşamak gerekiyor. Yaşadığımız bu gerçeksizlikten kurtulmak için, bir üst bilince ulaşmamız gerekiyor.

Olmuyor ama, çok şükela bir şekilde söylüyoruz da bir üst akla ulaşmak gerekliliğini, peki yapabiliyor muyuz yeteri kadar, klavyeyi kırmak istermişçesine tartakladığımız anlarda bile, yok yok olmuyor, başka bir yolu olmalı elbet bu gerçeksizliğin sarmalından kurtulmanın. Kurtulmak derken, evet kurtulmayı kastediyoruz her tarafımızı çepeçevre sarmış bu gözü dönmüşlüklerden, hırslardan, paradan, makamdan, mevkiden daha bir sürü ışıltılı görülen gerçeksizlik nedenlerinden.

Gene aynı yere geldik, sanırsam bu işte bir gariplik yok, olması gereken bu. Sorgularsın, belli değerlerin vardır, belli bir anayasan, bu değerler çerçevesinde alırsın aklını başına. Hafiften başkaldırmış olan yoldan sapma temayülünü böylece bertaraf etmiş olursun, Allah’ın izniyle.

Allah’a emanet.

MUSA YUVACI

Zamanı Yakalamak

Bir şeyi yakalamak için önce kaçırmanız gerekiyor. Daha doğru bir yaklaşımla, kaçırdığınızı kabullenmeniz gerekiyor. Aslında bunları söylerken zihnimde benimle bir miktar akıl oyunları oynuyor. Ardı ardına patlatıyor soruları, zaman mefhumu göreceli değil mi? Sadece biz insanlara, yani evrene ait değil mi, hatta bu evrende bile farklı işlemiyor mu? Hem nasıl kaçırıyor muşsun ki zamanı, sadece sana özel olan bir kavramı nasıl kaçırırsın.

Zihnimden geçen sorular burada bir dursun, sonrasında tekrar canlandırırız bu nehrin sularını. Her şey etrafında oluyor, gelişiyor, değişiyor, şekilleniyor ama sen bütün bunlara kendini uzak hissediyorsun. Birebir içindeyken bile hayatın fersah fersah uzaktasın gibi geliyor, neden diye geliyor aklına insanın. Ya bu hayat, yaşam olgusu içinde bir şeyler fazlaca yavan geliyor, yada başka bir şeyler var tanımlanması, ortaya çıkarılması gereken.

Amaç sorgulamasına getiriyor bu türden irdelemeler insanı. Şöyle bir miktar yukarıya çıkıp zaman ve mekan kavramından sıyrılınca, bir miktar daha net oluyor sorgulamalar. Tam da bu noktada aslında bu durumun sağlıklı olduğunu fark ediyorsun, üzerine düşünmeye değer olduğunu görüyorsun.

Sonra yavaş yavaş, uzaklaşıp bir filme bakar gibi bakmış olduğun hayat olgusunun içine girmeye başlıyorsun. Sana başka bir insan tarafından biçilen role uymayacağını zaten biliyorsun, çünkü inanıyorsun sadece Allah’a ve bütün işlerin, düşüncelerin, duyguların Allah’ın rızası için olması gerektiğine. Sadece inanmakla kalmıyorsun aynı zamanda performans da gösteriyorsun çünkü bu senin görevin.

Sonrasında aslında hiçbir şeyi kaçırmadığını sadece yeniden irdeleyip düşünmen gerektiği farkına varıyorsun, küçük bir zaman diliminde. Zihninin içerisinde taşmak için hazırlanan büyük bir nehir var ve izin vermelisin taşmasına, açmalısın kurduğun barajların kapaklarını ve özgürce akmasını sağlamalısın engin düşüncelerin. Göreceksin ki kaçırdığın bir şey yok, sadece kaçırdığını hissettiriyor, büyük şaşalı illüzyonlar, bu kapitalist düzen içerisinde ayakta kalmaya çalışanlara. Sonra gerçeklerin farkına varıyorsun, yokmuş bir şey kaçırdığın…

Allah’a Emanet.

Musa YUVACI

Özgüven ve EGO arasında

Özgüven ve EGO arasında bulunan ince bir çizgi mevcut ama bu çizgi sahip olan için değil değerlendiren kişi için geçerli. Einstein’ın tanımlamasından EGO = 1/BİLGİ yola çıkacak olursak ne kadar az bilgiye sahipsen o kadar yüksek bir egoya sahipsin, bu konuda tamamız bir itirazımız yok. İtirazımızın olduğu kısım değerlendiren! kişinin sahip olduğunuzun EGO mu yoksa Özgüven mi olduğunu anlayamaması.

Nasıl karar verebilirsiniz bir insanın samimi olduğuna, bir Özgüvene sahip olduğuna, büyüklenmediğine. Burada yeterli bir değerlendirme yapılamadığı kanısına sahibim. Neye göre bir şeyler söyleyeceksin? Sadece ve sadece ilk izlenime göre, karşıdaki insanı tanıyor musun? Hayır, hayata bakış açısını, felsefesini biliyor musun? Hayır. Peki o zaman neye göre değerlendiriyorsun? Burada Kanuni Sultan Süleyman’ın bir özelliğinden bahsetmek yerinde olacaktır, Kanuni Sultan Süleyman bir olay ile ilgili karar vereceği zaman olay yerine gider bütün verileri değerlendirir ve ondan sonra karar verirmiş. Buradan yola çıkarak değerlendirilen insan hakkında yeterli bilgi sahibi olmadan onu nasıl sağlıklı değerlendirebiliriz. Burası büyük bir soru işareti olmasına rağmen, bilmediğini bilmeyen insanlar rahatça değerlendirme yapıyor ve etiket yapıştırıyor, fazlaca üzücü bir durum.

İşlerini (iş dediğimizde kasıt her şeydir) iyi yapanların sahip olduğu iki duygu vardır,

1) İşlerini iyi yapmanın verdiği özgüven.
2) İşlerini iyi ve eksiksiz yapmanın verdiği gönül rahatlığı.

Gönlümüz rahat olsun.
Allaha emanet.

İz Bırakmak

İlkeler üzerine hayatını inşa etmek zor ama bir o kadar da lezzetli. Çoğu zaman insanların seni anlamadığını düşünürsün, diğer taraftan da kendini bildiğin için yolunun doğru olduğunu bilirsin. Allah hak yolumuzdan ayrılmamızı nasip etmesin.

Eşrefi mahlukat olan insan bulunduğu yerde iz bırakmalı, nevi şahsına münhasır olmalı. Dik durmalı. İnandığı gibi davranmalı, bütün sıkıntıların, yanlışların karşısında. Ne eksik ne fazla sadece kendisi olmalı.

İnsan hayatı boyunca bir çok yerde bulunur, insanlar tanır. Ardından zaman gelir, bu tanıdığı insanlardan zaman ve mekan boyutunda ayrışmaya. İçinde bir miktar kırıklıklar olsa da dostluklarının zaman ve mekan ile sınırlı olmadığını bildiği için çok da fazla üzmez kendini, sadece birazcık burukluk ile ayrılır sevdiği insanların yanından.

Bidayeti olan her şeyin bir nihayeti vardır. İki yıla yakın bir süredir çalışmış olduğum Yapı Kredi Sigorta’dan ayrılıyorum. Hoşça bakın zatınıza.

Hoşça bak zatına kim zübde-i alemsin sen
Merdüm-i dide-i ekvan olan ademsin sen

Sevgi ve saygıyla.

Hibernate Envers İle Versiyon(Logların) Kayıtlarının Sorgulanması

Hibernate Envers serisinin bir önceki yazısına buradan ulaşabilirsiniz. Bir Önceki yazıda Hibernate Envers hakkında bilgi verip, nasıl kullanılacağı ve kullanım detayları üzerinde durulmuştu. Bu yazının içeriğinde ise Hibernate Envers ile versiyonlama işlemi yapılan nesnelerin versiyon bilgilerini sorgulama üzerinde duracağız.

Sorgulama işlemi Hibernate Criteria ile benzerlik gösteriyor bu nedenle kolayca öğrenilebileceğini düşünüyorum. Direk kod örneklerine bakmak daha yararlı olacaktır. Yazının sonunda eclipse projesi olarak örnek proje paylaşılacaktır.

Adım adım yapılması gerekenler

1) Hibernate Envers entity versiyonları(logları) üzerinde sorgulama yapmak için AuditReader nesnesi oluşturuluyor. AuditReader nesnesi oluşturulurken sahip olunan hibernate session bilgisi verilir.

AuditReader reader = AuditReaderFactory.get(getSessionFactory().getCurrentSession());

2) Hangi entitye ait olan versiyonlar (loglar) üzerinde sorgulama işlemini yapacağımızı ve bununla ilgili detaylari belirtmek için AuditQuery nesnesi oluşturuluyor. Burada meslek entitysine ait olan versiyonlar üzerinde sorgulama yapacağımızı belirtiyoruz, forRevisionsOfEntity(Meslek.class, false, true) metodundaki ilk boolean parametre (selectEntitiesOnly parametresi) true olarak verilirse sadece meslek entitylerini, false olarak verilirse meslek entityleri ile birlikte revision detaylarıda sorgu sonucuna dahil edilir. İkinci boolean parametre (selectDeletedEntities parametresi) ise sorgulanacak versiyonlara(loglara) silinmiş olan entitylerin dahil edilmesi ile ilgilidir, eğer true olarak verilirse silinen entity versiyonları da sorgulama sonucunda getirilir. False olarak verilirse sorgulama sonucunda silinmiş entity logları gelmeyecektir.

AuditQuery auditQuery = reader.createQuery().forRevisionsOfEntity(Meslek.class, false, true);

3) Sorgulama için kriter ekleme işlemi. Entitynin sahip olduğu degişkenler ve revision bilgisi için kriterler eklenebilir.

/**
* Sorgulama icin kriter mevcut ise sorgulamaya ekleniyor.
*/
if (meslekAudit != null && meslekAudit.getMeslek() != null) {

	/**
	 * Meslek nesnesinin id bilgisi kritere dahil ediliyor.
	 */
	if (meslekAudit.getMeslek().getId() != null && meslekAudit.getMeslek().getId() != 0) {

		/**
		 * auditQuery nesnesine criter ekliyoruz. Buradakli kullanim
		 * criteriaApi ile benzerlik gosterir. Entity id si icin esitlik
		 * criteri ekleniyor.
		 */
		auditQuery.add(AuditEntity.id().eq(meslekAudit.getMeslek().getId()));
	}

	/**
	 * Meslek nesnesinin ad bilgisi kritere dahil ediliyor.
	 */
	if (meslekAudit.getMeslek().getAd() != null && !meslekAudit.getMeslek().getAd().trim().equals("")) {

		/**
		 * auditQuery nesnesine criter ekliyoruz. Entitynin ad isimli
		 * variable icin like kriteri ekleniyor..
		 */
		auditQuery.add(AuditEntity.property("ad").like(meslekAudit.getMeslek().getAd(), MatchMode.ANYWHERE));
	}

	/**
	 * Islemi yapan personel bilgisi kritere dahil ediliyor.
	 */
	if (meslekAudit.getUserName() != null && !meslekAudit.getUserName().trim().equals("")) {

		/**
		 * auditQuery nesnesine criter ekliyoruz. Fakat burada bir
		 * farklilik mevcut, kriterimiz revision bilgisi ile ilgili
		 * islemi kimin yaptigi bilgisi username esitlik kriteri
		 * ekleniyor.
		 */
		auditQuery.add(AuditEntity.revisionProperty("username").eq(meslekAudit.getUserName()));
	}

	/**
	 * Islemin yapilma tarih bilgisi kritere dahil ediliyor.
	 */
	if (meslekAudit.getOperationTime() != null) {

	/**
	 * auditQuery nesnesine criter ekliyoruz. Fakat burada bir
	 * farklilik mevcut, kriterimiz revision bilgisi ile ilgili
	 * islemin yapilma tarihi ile iligli esitlik kriteri ekleniyor.
	 */
	auditQuery.add(AuditEntity.revisionProperty("timestamp").gt(new Date().getTime()));
	}
}

4) Sorgu sonucunun alınması.

List<Object[]> resultList = null;

/**
 * Sorgulama sonucu elde ediliyor.
 */
resultList = auditQuery.getResultList();

List<MeslekAudit> meslekAuditListesi = new ArrayList<MeslekAudit>();

MeslekAudit auditMeslek;

for (Object[] data : resultList) {

	auditMeslek = new MeslekAudit();

	auditMeslek.setMeslek((Meslek) data[0]);

	auditMeslek.setUserName(((CustomRevisionEntity) data[1]).getUsername());

	Date islemYapilmaZamani = new Date();
	islemYapilmaZamani.setTime(((CustomRevisionEntity) data[1]).getTimestamp());
	auditMeslek.setOperationTime(islemYapilmaZamani);

	meslekAuditListesi.add(auditMeslek);
}

Adımların Tamamı.

/**
 * 
 * Meslek entitysinin versiyonlari uzerinde sorgulama islemi
 * gerceklestirilir. Sorgulama isleminde kriter parametre olarak verilmis
 * olan meslekAudit nesnesinin icerisinde bulunan userName,operationTime,
 * meslek.id,meslek.ad bilgileridir.
 * 
 * @param meslekAudit
 *            , sorgulama yapilirken gerekli kriterlere ait verilerin
 *            bilgisine sahiptir.
 * 
 * @return meslekAuditListesi, sorgulama sonucunda elde edilen meslekAudit
 *         nesnelerinin bulundugu listedir.
 * 
 * @throws Exception
 * 
 * @author Musa YUVACI
 * 
 * @version 1.0 11.07.2012
 * 
 */
@SuppressWarnings("unchecked")
@Override
public List<MeslekAudit> fetchMeslekVersionRecords(MeslekAudit meslekAudit) throws Exception {
	/**
	 * Hibernate Envers entity versiyonlari(loglari) uzerinde sorgulama
	 * yapmak icin AuditReader nesnesi olusturuluyor. AuditReader nesnesi
	 * olusturulurken sahip olunan hibernate sesion bilgisi parametre olarak
	 * geciliyor.
	 */
	AuditReader reader = AuditReaderFactory.get(getSessionFactory().getCurrentSession());

	/**
	 * Hangi entity versiyonlari (loglari) uzerinde sorgulama islemini
	 * yapacagimizi ve bununla ilgili detaylari belirtmek icin AuditQuery
	 * nesnesi olusturuluyor.		 
	 */
	AuditQuery auditQuery = reader.createQuery().forRevisionsOfEntity(Meslek.class, false, true);

	/**
	 * Sorgulama icin kriter mevcut ise sorgulamaya ekleniyor.
	 */
	if (meslekAudit != null && meslekAudit.getMeslek() != null) {

		/**
		 * Meslek nesnesinin id bilgisi kritere dahil ediliyor.
		 */
		if (meslekAudit.getMeslek().getId() != null && meslekAudit.getMeslek().getId() != 0) {

			/**
			 * auditQuery nesnesine criter ekliyoruz. Buradakli kullanim
			 * criteriaApi ile benzerlik gosterir. Entity id si icin esitlik
			 * criteri ekleniyor.
			 */
			auditQuery.add(AuditEntity.id().eq(meslekAudit.getMeslek().getId()));
		}

		/**
		 * Meslek nesnesinin ad bilgisi kritere dahil ediliyor.
		 */
		if (meslekAudit.getMeslek().getAd() != null && !meslekAudit.getMeslek().getAd().trim().equals("")) {

			/**
			 * auditQuery nesnesine criter ekliyoruz. Entitynin ad isimli
			 * variable icin like kriteri ekleniyor..
			 */
			auditQuery.add(AuditEntity.property("ad").like(meslekAudit.getMeslek().getAd(), MatchMode.ANYWHERE));
		}

		/**
		 * Islemi yapan personel bilgisi kritere dahil ediliyor.
		 */
		if (meslekAudit.getUserName() != null && !meslekAudit.getUserName().trim().equals("")) {

			/**
			 * auditQuery nesnesine criter ekliyoruz. Fakat burada bir
			 * farklilik mevcut, kriterimiz revision bilgisi ile ilgili
			 * islemi kimin yaptigi bilgisi username esitlik kriteri
			 * ekleniyor.
			 */
			auditQuery.add(AuditEntity.revisionProperty("username").eq(meslekAudit.getUserName()));
		}

		/**
		 * Islemin yapilma tarih bilgisi kritere dahil ediliyor.
		 */
		if (meslekAudit.getOperationTime() != null) {

			/**
			 * auditQuery nesnesine criter ekliyoruz. Fakat burada bir
			 * farklilik mevcut, kriterimiz revision bilgisi ile ilgili
			 * islemin yapilma tarihi ile iligli esitlik kriteri ekleniyor.
			 */
			auditQuery.add(AuditEntity.revisionProperty("timestamp").gt(new Date().getTime()));
		}
	}

	List<Object[]> resultList = null;

	/**
	 * Sorgulama sonucu elde ediliyor.
	 */
	resultList = auditQuery.getResultList();

	List<MeslekAudit> meslekAuditListesi = new ArrayList<MeslekAudit>();

	MeslekAudit auditMeslek;

	for (Object[] data : resultList) {

		auditMeslek = new MeslekAudit();

		auditMeslek.setMeslek((Meslek) data[0]);

		auditMeslek.setUserName(((CustomRevisionEntity) data[1]).getUsername());

		Date islemYapilmaZamani = new Date();
		islemYapilmaZamani.setTime(((CustomRevisionEntity) data[1]).getTimestamp());

		auditMeslek.setOperationTime(islemYapilmaZamani);

		meslekAuditListesi.add(auditMeslek);
	}

	return meslekAuditListesi;
}

Kaynak Kodlar ve Açıklama

Hibernate Envers projesinin kaynak kodlarını aşağıdaki linkden download edebilirsiniz. Kaynak kodları eclipse (SpringSourse Tool Suite) projesi olarak verilmiştir.

Hibernate Envers Sorgulama

SONUÇ

Hibnernate Envers ile elde edilen entity versiyon(loglar) bilgilerini sorgulama işlemini detaylı bir şekilde, kod örnekleri ile ele almış olduk. Hibernate Envers ile ilgili daha detaylı bilgi için referans dökümantasyonunu inceleyebilirsiniz.

Hibenrate Envers 3.6 Referans Dökümantasyonu

Java İle Email İşlemleri

JavaMail Api İle Email İşlemleri

JavaMail Api ile email gönderme ve alma işlemlerini gerçekleştirebilirsiniz. Email işlemlerini gerçekleştirmek için yazıda verilen kod örneklerini incelemeniz yeterlidir. Yazının sonunda kaynak kodlar Eclipse Java projesi olarak bulunmaktadır.

1. Java İle E-Mail Gönderme

IEMailSender.java interfaceini oluşturuyoruz. IEMailSender iki adet metod içeriyor birisi sendSimpleEMail diğeri ise sendEMailWithAttachment.

package com.apps.email.sender;

import com.apps.email.model.EMail;

public interface IEMailSender {

	/**
	 * 
	 * Parametre olarak verilmis olan email nesnesi email olarak gonderilir.
	 * Email nesnesi attachmentlari ile birlikte gonderilir.
	 * 
	 * @param email
	 *            , attachmentlari ile birlikte gonderilmek istenen email
	 *            nesnesi.
	 * 
	 * @throws Exception
	 * 
	 * @author Musa YUVACI
	 * 
	 * @version 1.0 01.06.2012
	 */
	void sendEMailWithAttachment(EMail email) throws Exception;

	/**
	 * 
	 * Parametre olarak verilmis olan email nesnesi email olarak gonderilir.
	 * Email nesnesinin attachment kismi dikkate alinmaz.Sadece text olarak mail
	 * gonderilir.
	 * 
	 * @param email
	 *            , gonderilmek istenen email nesnesi.Emailin attachmentlari
	 *            dikkate alinmaz.
	 * 
	 * @throws Exception
	 * 
	 * @author Musa YUVACI
	 * 
	 * @version 1.0 01.06.2012
	 */
	void sendSimpleEMail(EMail email) throws Exception;
}

IEmailSender.java interfaceini implement eden EMailSender.java classını oluşturuyoruz.

package com.apps.email.sender;

import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

import com.apps.email.model.EMail;
import com.apps.email.model.EMailAttachment;
import com.apps.email.utility.EnumValues.EmailBaglantiGuvenligi;

public class EMailSender implements IEMailSender {

	private String host;
	private String username;
	private String password;
	private String port;
	private EmailBaglantiGuvenligi baglantiGuvenligi;
	private boolean authentication;

	public EMailSender(String host, String username, String password, String port, EmailBaglantiGuvenligi baglantiGuvenligi, boolean authentication) {

		this.host = host;
		this.username = username;
		this.password = password;
		this.port = port;
		this.baglantiGuvenligi = baglantiGuvenligi;
		this.authentication = authentication;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public void sendSimpleEMail(EMail email) throws Exception {

		Properties props = new Properties();
		props.put("mail.smtp.host", host);
		props.put("mail.smtp.port", port);
		props.put("mail.smtp.auth", String.valueOf(authentication));

		if (EmailBaglantiGuvenligi.SSL.equals(baglantiGuvenligi)) {

			props.put("mail.smtp.socketFactory.port", "465");
			props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");

		} else if (EmailBaglantiGuvenligi.STARTTLS.equals(baglantiGuvenligi)) {

			props.put("mail.smtp.starttls.enable", "true");
		}

		Session session;

		if (authentication) {

			session = Session.getInstance(props, new javax.mail.Authenticator() {
				protected PasswordAuthentication getPasswordAuthentication() {
					
					return new PasswordAuthentication(username, password);
				}
			});

		} else {

			session = Session.getInstance(props);
		}

		try {

			List<String> to = null;
			List<String> cc = null;
			List<String> bcc = null;

			if(email.getToAdresses() != null) {
				
				to = Arrays.asList(email.getToAdresses().split(","));
			}
			
			if(email.getCcAdresses() != null) {
				
				cc = Arrays.asList(email.getCcAdresses().split(","));
			}
			
			if(email.getBccAdresses() != null) {
				
				bcc = Arrays.asList(email.getBccAdresses().split(","));
			}	
			
			InternetAddress[] toAddresses = null;

			if (to != null && to.size() != 0) {

				int size = 0;

				for (String toMailAdresi : to) {

					if (!"".equals(toMailAdresi.trim())) {
						size++;
					}
				}

				toAddresses = new InternetAddress[size];

				for (int index = 0; index < to.size(); index++) {

					if (!"".equals(to.get(index).trim())) {

						toAddresses[index] = new InternetAddress(to.get(index));
					}
				}
			}

			InternetAddress[] ccAddresses = null;

			if (cc != null && cc.size() != 0) {

				int size = 0;

				for (String ccMailAdresi : cc) {

					if (!"".equals(ccMailAdresi.trim())) {
						size++;
					}
				}

				ccAddresses = new InternetAddress[size];

				for (int index = 0; index < cc.size(); index++) {

					if (!"".equals(cc.get(index).trim())) {

						ccAddresses[index] = new InternetAddress(cc.get(index));
					}
				}
			}

			InternetAddress[] bccAddresses = null;

			if (bcc != null && bcc.size() != 0) {

				int size = 0;

				for (String bccMailAdresi : bcc) {

					if (!"".equals(bccMailAdresi.trim())) {
						size++;
					}
				}

				bccAddresses = new InternetAddress[size];

				for (int index = 0; index < bcc.size(); index++) {

					if (!"".equals(bcc.get(index).trim())) {

						bccAddresses[index] = new InternetAddress(bcc.get(index));
					}
				}
			}

			Message message = new MimeMessage(session);
			message.setFrom(new InternetAddress(email.getFrom()));
			

			if (toAddresses != null && toAddresses.length > 0) {

				message.setRecipients(Message.RecipientType.TO, toAddresses);
			}

			if (ccAddresses != null && ccAddresses.length > 0) {

				message.setRecipients(Message.RecipientType.CC, ccAddresses);
			}

			if (bccAddresses != null && bccAddresses.length > 0) {

				message.setRecipients(Message.RecipientType.BCC, bccAddresses);
			}

			message.setSubject(email.getSubject());
			message.setSentDate(new Date());
			message.setContent(email.getMessage(), "text/html;charset=ISO-8859-9");

			Transport.send(message);

		} catch (MessagingException e) {
			
			throw new RuntimeException(e);
		}
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public void sendEMailWithAttachment(EMail email) throws Exception {

		Properties props = new Properties();
		props.put("mail.smtp.host", host);
		props.put("mail.smtp.port", port);
		props.put("mail.smtp.auth", String.valueOf(authentication));

		if (EmailBaglantiGuvenligi.SSL.equals(baglantiGuvenligi)) {

			props.put("mail.smtp.socketFactory.port", "465");
			props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");

		} else if (EmailBaglantiGuvenligi.STARTTLS.equals(baglantiGuvenligi)) {

			props.put("mail.smtp.starttls.enable", "true");

		} else {

		}

		Session session;

		if (authentication) {

			session = Session.getInstance(props, new javax.mail.Authenticator() {
				protected PasswordAuthentication getPasswordAuthentication() {
					return new PasswordAuthentication(username, password);
				}
			});

		} else {

			session = Session.getInstance(props);
		}

		try {
			
			List<String> to = null;
			List<String> cc = null;
			List<String> bcc = null;

			if(email.getToAdresses() != null) {
				
				to = Arrays.asList(email.getToAdresses().split(","));
			}
			
			if(email.getCcAdresses() != null) {
				
				cc = Arrays.asList(email.getCcAdresses().split(","));
			}
			
			if(email.getBccAdresses() != null) {
				
				bcc = Arrays.asList(email.getBccAdresses().split(","));
			}
			
			InternetAddress[] toAddresses = null;

			if (to != null && to.size() != 0) {

				int size = 0;

				for (String toMailAdresi : to) {

					if (!"".equals(toMailAdresi.trim())) {
						size++;
					}
				}

				toAddresses = new InternetAddress[size];

				for (int index = 0; index < to.size(); index++) {

					if (!"".equals(to.get(index).trim())) {

						toAddresses[index] = new InternetAddress(to.get(index));
					}
				}
			}

			InternetAddress[] ccAddresses = null;

			if (cc != null && cc.size() != 0) {

				int size = 0;

				for (String ccMailAdresi : cc) {

					if (!"".equals(ccMailAdresi.trim())) {
						size++;
					}
				}

				ccAddresses = new InternetAddress[size];

				for (int index = 0; index < cc.size(); index++) {

					if (!"".equals(cc.get(index).trim())) {

						ccAddresses[index] = new InternetAddress(cc.get(index));
					}
				}
			}

			InternetAddress[] bccAddresses = null;

			if (bcc != null && bcc.size() != 0) {

				int size = 0;

				for (String bccMailAdresi : bcc) {

					if (!"".equals(bccMailAdresi.trim())) {
						size++;
					}
				}

				bccAddresses = new InternetAddress[size];

				for (int index = 0; index < bcc.size(); index++) {

					if (!"".equals(bcc.get(index).trim())) {

						bccAddresses[index] = new InternetAddress(bcc.get(index));
					}
				}
			}

			Message message = new MimeMessage(session);
			message.setFrom(new InternetAddress(email.getFrom()));

			if (toAddresses != null && toAddresses.length > 0) {

				message.setRecipients(Message.RecipientType.TO, toAddresses);
			}

			if (ccAddresses != null && ccAddresses.length > 0) {

				message.setRecipients(Message.RecipientType.CC, ccAddresses);
			}

			if (bccAddresses != null && bccAddresses.length > 0) {

				message.setRecipients(Message.RecipientType.BCC, bccAddresses);
			}

			message.setSubject(email.getSubject());
			message.setSentDate(new Date());

			/**
			 * Multi part tanımlanıyor.
			 */
			Multipart multiPart = new MimeMultipart();

			/**
			 *İlk önce text part tanımlanıp multi parta ekleniyor.
			 */
			MimeBodyPart textPart = new MimeBodyPart();
			textPart.setText(email.getMessage(),"ISO-8859-9");
			multiPart.addBodyPart(textPart);
		
			/**
			 *Emaile ait butun attachmentler(dosyalar) multi parta ekleniyor 
			 */
			for(EMailAttachment emailAttachment : email.getAttachmentList()) {
				
				MimeBodyPart filePart = new MimeBodyPart();
				FileDataSource fds = new FileDataSource(emailAttachment.getFilePath());

				filePart.setDataHandler(new DataHandler(fds));
				filePart.setFileName(fds.getName());

				multiPart.addBodyPart(filePart);
			}

			/**
			 *Multi partın içeriği message nesnesine veriliyor
			 */
			message.setContent(multiPart);

			Transport.send(message);

		} catch (MessagingException e) {

			throw new RuntimeException(e);
		}
	}
}

EMailSender.java classında IEMailSender.java interface inde bulunan sendSimpleEMail ve sendEMailWithAttachment metodları implement edildi. sendSimpleEmail metodu emailin sadece text olan kısmını gönderir, sendEMailWithAttachment metodu ise hem text hemde attachmentlari gönderir. Burada iki metod yazılmasındaki amaç Java Mail Api ile yapılabileceklerin gösterilmesidir.

2. Java İle Emailleri Email Servis Sağlayıcısından Alma İşlemi

IEMailReader.java interfaceini oluşturuyoruz.

package com.apps.email.reader;

import java.util.Date;
import java.util.List;

import com.apps.email.model.EMail;

public interface IEMailReader {

	/**
	 * EMail servis sağlayicisinda bulunan butun emailler alinir. Alinan
	 * emaillerin attachmentleri parametre olarak verilmis olan downloadDir
	 * system pathine download edilir.
	 * 
	 * @NOT: EMail servis saglayicisina giris yapabilmek icin gerekli olan
	 *       bilgiler, IEMailReader iğnterface ini implement eden classin
	 *       costructorinda verilecektir.
	 * 
	 * @param downloadDir
	 *            , EMail servis saglayicisindan alinan maillerin
	 *            attachmentlarinda bulunan dosyalarin download edilecegi system
	 *            pathi.
	 * 
	 * @return emailListesi, EMail servis saglayicisindan alinan emaillerin
	 *         listesi.
	 * 
	 * @throws Exception
	 * 
	 * @author Musa YUVACI
	 * 
	 * @version 1.0 01.06.2012
	 * 
	 */
	List<EMail> getAllEMailList(String downloadDir) throws Exception;

	/**
	 * EMail servis sağlayicisinda bulunan emaillerin sendDateleri, parametre
	 * olarak verilmis olan lastAccesingDate tarihine esit ve buyuk olanlar
	 * alinir. Alinan emaillerin attachmentleri parametre olarak verilmis olan
	 * downloadDir system pathine download edilir.
	 * 
	 * @NOT: EMail servis saglayicisina giris yapabilmek icin gerekli olan
	 *       bilgiler, IEMailReader iğnterface ini implement eden classin
	 *       costructorinda verilecektir.
	 * 
	 * @param downloadDir
	 *            , EMail servis saglayicisindan alinan maillerin
	 *            attachmentlarinda bulunan dosyalarin download edilecegi system
	 *            pathi.
	 * 
	 * @return emailListesi, EMail servis saglayicisindan alinan emaillerin
	 *         listesi.
	 * 
	 * @throws Exception
	 * 
	 * @author Musa YUVACI
	 * 
	 * @version 1.0 01.06.2012
	 * 
	 */
	List<EMail> getNewEMailList(String downloadDir, Date lastAccesingDate) throws Exception;
}

IEMailReader.java interfaceini implement eden Pop3EMailReader.java classını oluşturuyoruz.

package com.apps.email.reader;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import java.util.Properties;

import javax.activation.MimetypesFileTypeMap;
import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.Part;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;
import javax.mail.search.ComparisonTerm;
import javax.mail.search.SentDateTerm;

import com.apps.email.model.EMail;
import com.apps.email.model.EMailAttachment;

/**
 * 
 * Email Servis Saglayicisindan maillerin pop3 destegi ile okunmasi islemini
 * gerceklestrir.
 * 
 * @author Musa YUVACI
 * 
 * @version 1.0 01.06.2012
 */
public class Pop3EMailReader implements IEMailReader {

	private String host;
	private String userName;
	private String password;

	public Pop3EMailReader(String host, String userName, String password) {

		this.host = host;
		this.userName = userName;
		this.password = password;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public List<EMail> getAllEMailList(String downloadDir) throws Exception {

		List<EMail> retVal = new ArrayList<EMail>();

		Folder folder = null;
		Store store = null;

		try {

			Properties properties = System.getProperties();
			Session session = Session.getInstance(properties);

			store = session.getStore("pop3");
			store.connect(host, userName, password);

			folder = store.getFolder("inbox");

			if (!folder.exists()) {

				System.out.println("No INBOX...");
				System.exit(0);
			}

			folder.open(Folder.READ_ONLY);
			Message[] messages = folder.getMessages();

			for (int i = 0; i < messages.length; i++) {

				EMail email = new EMail();

				/**
				 * Emailin from bilgisi aliniyor
				 */
				email.setFrom(MimeUtility.decodeText(InternetAddress.toString(messages[i].getFrom())));

				/**
				 * TO adres bilgisi aliniyor.
				 */
				Address[] toAdresses = messages[i].getRecipients(Message.RecipientType.TO);

				String to = "";

				if (toAdresses != null) {

					for (int index = 0; index < toAdresses.length; index++) {

						to += "," + toAdresses[index];
					}

					email.setToAdresses(to.substring(1));
				}

				/**
				 * CC adres bilgisi aliniyor.
				 */
				Address[] ccAdresses = messages[i].getRecipients(Message.RecipientType.CC);

				String cc = "";

				if (ccAdresses != null) {

					for (int index = 0; index < ccAdresses.length; index++) {

						cc += "," + ccAdresses[index];
					}

					email.setCcAdresses(cc.substring(1));
				}

				/**
				 * BCC adres bilgisi aliniyor.
				 */
				Address[] bccAdresses = messages[i].getRecipients(Message.RecipientType.BCC);

				String bcc = "";

				if (bccAdresses != null) {

					for (int index = 0; index < bccAdresses.length; index++) {

						bcc += "," + bccAdresses[index];
					}

					email.setBccAdresses(bcc.substring(1));
				}

				email.setReplyTo(InternetAddress.toString(messages[i].getReplyTo()));
				email.setSubject(messages[i].getSubject());
				email.setReceivedDate(messages[i].getReceivedDate());
				email.setSentDate(messages[i].getSentDate());

				String messageBodyText = "";
				String messageBodyHtml = "";

				List<EMailAttachment> attachmentList = new ArrayList<EMailAttachment>();

				Object content = messages[i].getContent();

				if (content instanceof String) {

					messageBodyText += content;

				} else if (content instanceof Multipart) {

					MimeMultipart mimeMultipart = (MimeMultipart) content;

					LinkedList<Part> partList = new LinkedList<Part>();

					for (int index = 0; index < mimeMultipart.getCount(); index++) {

						partList.add(mimeMultipart.getBodyPart(index));
					}

					while (partList.size() != 0) {

						Part part = partList.pollFirst();

						String disposition = part.getDisposition();

						if (disposition != null && (disposition.equals(BodyPart.ATTACHMENT))) {

							/**
							 * Mail have some attachment
							 */
							EMailAttachment eMailAttachment = new EMailAttachment();
							File savedir = new File(downloadDir);

							if (!savedir.exists()) {

								savedir.mkdirs();
							}

							String systemFileName = MimeUtility.decodeText(part.getFileName());

							File savefile = new File(downloadDir, systemFileName);

							int fileSize = saveFile(savefile, part);

							eMailAttachment.setEmail(email);
							eMailAttachment.setFileName(MimeUtility.decodeText(part.getFileName()));
							eMailAttachment.setFileSystemName(systemFileName);
							eMailAttachment.setFilePath(savefile.getAbsolutePath());
							eMailAttachment.setFileSize(fileSize);
							eMailAttachment.setMimeType(new MimetypesFileTypeMap().getContentType(systemFileName));

							attachmentList.add(eMailAttachment);

						} else if (part.getContent() instanceof Multipart) {

							for (int index = ((Multipart) part.getContent()).getCount() - 1; index >= 0; index--) {

								partList.addFirst(((Multipart) part.getContent()).getBodyPart(index));
							}

						} else if (part.getContent() instanceof String) {

							if (part.isMimeType("text/html")) {

								messageBodyHtml += part.getContent();

							} else if (part.isMimeType("text/plain")) {

								messageBodyText += part.getContent();
							}

						} else if (part.getContent() instanceof InputStream) {

							InputStream in = (InputStream) part.getContent();

							BufferedInputStream bis = new BufferedInputStream(in);
							ByteArrayOutputStream buf = new ByteArrayOutputStream();

							int result = bis.read();

							while (result != -1) {
								byte b = (byte) result;
								buf.write(b);
								result = bis.read();
							}

							messageBodyText = buf.toString();
						}
					}
				}

				email.setAttachmentList(attachmentList);

				if (!"".equals(messageBodyHtml)) {

					email.setMessage(messageBodyHtml);

				} else {

					email.setMessage(messageBodyText);

				}

				retVal.add(email);
			}

		} catch (Exception e) {

			e.printStackTrace();

		} finally {

			if (folder != null) {

				folder.close(true);
			}

			if (store != null) {

				store.close();
			}
		}

		return retVal;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public List<EMail> getNewEMailList(String downloadDir, Date lastAccesingDate) throws Exception {

		List<EMail> retVal = new ArrayList<EMail>();

		Folder folder = null;
		Store store = null;

		try {

			Properties properties = System.getProperties();
			Session session = Session.getInstance(properties);

			store = session.getStore("pop3");
			store.connect(host, userName, password);

			folder = store.getFolder("inbox");

			if (!folder.exists()) {

				System.out.println("No INBOX...");
				System.exit(0);
			}

			folder.open(Folder.READ_ONLY);
			Message[] messages = folder.search(new SentDateTerm(ComparisonTerm.GE, lastAccesingDate));

			for (int i = 0; i < messages.length; i++) {

				EMail email = new EMail();

				/**
				 * Emailin from bilgisi aliniyor
				 */
				email.setFrom(MimeUtility.decodeText(InternetAddress.toString(messages[i].getFrom())));

				/**
				 * TO adres bilgisi aliniyor.
				 */
				Address[] toAdresses = messages[i].getRecipients(Message.RecipientType.TO);

				String to = "";

				if (toAdresses != null) {

					for (int index = 0; index < toAdresses.length; index++) {

						to += "," + toAdresses[index];
					}

					email.setToAdresses(to.substring(1));

				}

				/**
				 * CC adres bilgisi aliniyor.
				 */
				Address[] ccAdresses = messages[i].getRecipients(Message.RecipientType.CC);

				String cc = "";

				if (ccAdresses != null) {

					for (int index = 0; index < ccAdresses.length; index++) {

						cc += "," + ccAdresses[index];
					}

					email.setCcAdresses(cc.substring(1));
				}

				/**
				 * BCC adres bilgisi aliniyor.
				 */
				Address[] bccAdresses = messages[i].getRecipients(Message.RecipientType.BCC);

				String bcc = "";

				if (bccAdresses != null) {

					for (int index = 0; index < bccAdresses.length; index++) {

						bcc += "," + bccAdresses[index];
					}

					email.setBccAdresses(bcc.substring(1));
				}

				email.setReplyTo(InternetAddress.toString(messages[i].getReplyTo()));
				email.setSubject(messages[i].getSubject());
				email.setReceivedDate(messages[i].getReceivedDate());
				email.setSentDate(messages[i].getSentDate());

				String messageBodyText = "";
				String messageBodyHtml = "";

				List<EMailAttachment> attachmentList = new ArrayList<EMailAttachment>();

				Object content = messages[i].getContent();

				if (content instanceof String) {

					messageBodyText += content;

				} else if (content instanceof Multipart) {

					MimeMultipart mimeMultipart = (MimeMultipart) content;

					LinkedList<Part> partList = new LinkedList<Part>();

					for (int index = 0; index < mimeMultipart.getCount(); index++) {

						partList.add(mimeMultipart.getBodyPart(index));
					}

					while (partList.size() != 0) {

						Part part = partList.pollFirst();

						String disposition = part.getDisposition();

						if (disposition != null && (disposition.equals(BodyPart.ATTACHMENT))) {
							/**
							 * Mail have some attachment
							 */
							EMailAttachment eMailAttachment = new EMailAttachment();
							File savedir = new File(downloadDir);

							if (!savedir.exists()) {

								savedir.mkdirs();
							}

							String systemFileName = MimeUtility.decodeText(part.getFileName());

							File savefile = new File(downloadDir, systemFileName);

							int fileSize = saveFile(savefile, part);

							eMailAttachment.setEmail(email);
							eMailAttachment.setFileName(MimeUtility.decodeText(part.getFileName()));
							eMailAttachment.setFileSystemName(systemFileName);
							eMailAttachment.setFilePath(savefile.getAbsolutePath());
							eMailAttachment.setFileSize(fileSize);
							eMailAttachment.setMimeType(new MimetypesFileTypeMap().getContentType(systemFileName));

							attachmentList.add(eMailAttachment);

						} else if (part.getContent() instanceof Multipart) {

							for (int index = ((Multipart) part.getContent()).getCount() - 1; index >= 0; index--) {

								partList.addFirst(((Multipart) part.getContent()).getBodyPart(index));
							}

						} else if (part.getContent() instanceof String) {

							if (part.isMimeType("text/html")) {

								messageBodyHtml += part.getContent();

							} else if (part.isMimeType("text/plain")) {

								messageBodyText += part.getContent();
							}

						} else if (part.getContent() instanceof InputStream) {

							InputStream in = (InputStream) part.getContent();

							BufferedInputStream bis = new BufferedInputStream(in);
							ByteArrayOutputStream buf = new ByteArrayOutputStream();

							int result = bis.read();

							while (result != -1) {

								byte b = (byte) result;
								buf.write(b);
								result = bis.read();
							}

							messageBodyText = buf.toString();
						}
					}
				}

				email.setAttachmentList(attachmentList);

				if (!"".equals(messageBodyHtml)) {

					email.setMessage(messageBodyHtml);

				} else {

					email.setMessage(messageBodyText);
				}

				retVal.add(email);
			}

		} catch (Exception e) {

			e.printStackTrace();

		} finally {

			if (folder != null) {

				folder.close(true);
			}

			if (store != null) {

				store.close();
			}
		}

		return retVal;
	}

	/**
	 * Email nesnesinin sahip oldugu attachmentlarin systeme download edilmesi
	 * islemini gerceklestirir.
	 */
	private static int saveFile(File saveFile, Part part) throws Exception {

		BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(saveFile));

		byte[] buff = new byte[2048];

		InputStream is = part.getInputStream();

		int ret = 0, count = 0;

		while ((ret = is.read(buff)) > 0) {

			bos.write(buff, 0, ret);

			count += ret;
		}

		bos.close();
		is.close();

		return count;
	}
}

Pop3EMailReader sınıfında getAllEMailList ve getNewEMailList metodlarını implement ediyoruz. getAllEMailList metodu email servis sağlayıcısında bulunan bütün mailleri alma işlemi gerçekleştirir, getNewEMailList metodu ise, email servis saplayıcısından, metoda verilen lastAccesingDate tarih degerinden sonra gelen bütün emailleri alır.

3. Email Gönderme Örnekleri

3.a. Simple EMail Gönderme Örneği

EMail(Sadece email gonderilir attachmentlar dikkate alınmaz) göndermek için SendSimpleEMailSample.java classını oluşturuyoruz. Email servis sağlayıcısına ait ayar bilgileri EMailSender initialize edilirken constructorına veriliyor.

package com.apps.email.sample;

import com.apps.email.model.EMail;
import com.apps.email.sender.EMailSender;
import com.apps.email.utility.EnumValues.EmailBaglantiGuvenligi;

public class SendSimpleEMailSample {

	public static void main(String[] args) throws Exception {

		/**
		 * Email Settings
		 */
		String emailHost = "";
		String userName = "";
		String password = "";
		String emailSendingPort = "";
		/**
		 * Email authentication bilgisi, email servis saglayicilari farklilik
		 * gosterebilir.
		 */
		boolean authentication = true;

		/**
		 * Email Servis Saglayiciya ait baglanti guvenligi bilgisi.(Servis
		 * Saglayicilari Farklilik gosterebilir)
		 */
		EmailBaglantiGuvenligi emailBaglantiGuvenligi = EmailBaglantiGuvenligi.NONE;

		EMail email = new EMail();
		email.setFrom("");
		email.setToAdresses("");
		email.setCcAdresses(null);
		email.setBccAdresses(null);
		email.setSubject("E-Mail Sample");
		email.setMessage("E-Mail Sample Simple Message");

		EMailSender emailSender = new EMailSender(emailHost, userName, password, emailSendingPort, emailBaglantiGuvenligi, authentication);
		emailSender.sendSimpleEMail(email);
	}
}

3.b. Attachmentlı EMail Gönderme Örneği

Attachmentlı Email gönderme için SendEMailWithAttachmentSample.java classını olusturuyoruz. Email servis sağlayıcısına ait ayar bilgileri EMailSender initialize edilirken constructorına veriliyor.

package com.apps.email.sample;

import com.apps.email.model.EMail;
import com.apps.email.model.EMailAttachment;
import com.apps.email.sender.EMailSender;
import com.apps.email.utility.EnumValues.EmailBaglantiGuvenligi;

public class SendEMailWithAttachmentSample {

	public static void main(String[] args) throws Exception {

		/**
		 * Email Settings
		 */
		String emailHost = "";
		String userName = "";
		String password = "";
		String emailSendingPort = "";

		/**
		 * Email authentication bilgisi, email servis saglayicilari farklilik
		 * gosterebilir.
		 */
		boolean authentication = true;

		/**
		 * Email Servis Saglayiciya ait baglanti guvenligi bilgisi.(Servis
		 * Saglayicilari Farklilik gosterebilir)
		 */
		EmailBaglantiGuvenligi emailBaglantiGuvenligi = EmailBaglantiGuvenligi.NONE;

		/**
		 * Email
		 */
		EMail email = new EMail();
		email.setFrom("");

		/**
		 * birden fazla mail adresini , ile ayiriniz.
		 */
		email.setToAdresses("");
		email.setCcAdresses(null);
		email.setBccAdresses(null);
		email.setSubject("E-Mail Sample With Attachment");
		email.setMessage("E-Mail Sample Attachment Mail...");

		/**
		 * Email's attachment 1
		 */
		EMailAttachment eMailAttachment = new EMailAttachment();
		eMailAttachment.setFilePath("");

		/**
		 * Email's attachment 2
		 */
		EMailAttachment eMailAttachment2 = new EMailAttachment();
		eMailAttachment2.setFilePath("");

		email.getAttachmentList().add(eMailAttachment);
		email.getAttachmentList().add(eMailAttachment2);

		EMailSender emailSender = new EMailSender(emailHost, userName, password, emailSendingPort, emailBaglantiGuvenligi, authentication);
		emailSender.sendEMailWithAttachment(email);
	}
}

4. Email Servis Sağlayıcısından Emaillerin Alınması Örneği

Email servis sağlayıcısından emailleri almak için ReadEMailSample.java classını oluşturuyoruz.

package com.apps.email.sample;

import java.util.List;

import com.apps.email.model.EMail;
import com.apps.email.reader.Pop3EMailReader;

public class ReadEMailSample {

	public static void main(String[] args) throws Exception {

		String emailHost = "";
		String userName = "";
		String password = "";

		String downloadDir = "";

		Pop3EMailReader pop3EmailReader = new Pop3EMailReader(emailHost,userName,password);
		List<EMail> emailListesi = pop3EmailReader.getAllEMailList(downloadDir);

		for(EMail email : emailListesi) {

			System.out.println("-----------------------------------------------------------");
			System.out.println("Email From Adress : " + email.getFrom());
			System.out.println("Email Subject     : " + email.getSubject());
			System.out.println("Email Message     : " + email.getMessage());
			System.out.println("***********************************************************");
		}
	}
}

DETAYLAR

1) Email Sevis Sağlayıcısından Emailler Alınırken Email Adreslerinin Format Problemi.

Pop3EMailReader.java classı 92. satır

/*
 * Emailin from bilgisi aliniyor
 */
email.setFrom(MimeUtility.decodeText(InternetAddress.toString(messages[i].getFrom())));

MimeUtility classında bulunan static decodeText metodu format problemini çözüyor.

2) Email Servis Sağlayıcısından Emailler Alınırken Email Attchmentların Dosya İsimlerinin Format Problemi.

Pop3EMailReader.java classı 191. satır

String systemFileName = MimeUtility.decodeText(part.getFileName());

MimeUtility classında bulunan static decodeText metodu format problemini çözüyor.

3) Email Gönderme İşleminde Türkçe Karakter Problemi.

Simple email gönderilirken,

EMailSender.java classı 195.Satır. Simple email gonderilirken emailin contentine hangi charsetin kullanılacağı bilgisi verilir.

message.setContent(email.getMessage(), "text/html;charset=ISO-8859-9");

Attachmentlı email gönderilirken,

EMailSender.java classı 367.Satır. Attachmentlı email gönderilirken, gönderilen emailin text mesajının hangi karakter set ile gönderilmesi istendiği belirtiliyor “textPart.setText(email.getMessage(),“ISO-8859-9”);”

/**
 * Multi part tanımlanıyor.
 */
Multipart multiPart = new MimeMultipart();

/**
 * İlk önce text part tanımlanıp multi parta ekleniyor.
 */
MimeBodyPart textPart = new MimeBodyPart();
textPart.setText(email.getMessage(),"ISO-8859-9");
multiPart.addBodyPart(textPart);

SONUÇ

JavaEMailFramework projesinin kaynak kodlarına aşağıdaki linkten Eclipse (SpringSource Tool Suit) Java Projesi olarak ulaşabilirsiniz.

JavaEMailFramework (Kaynak Kodlar-Eclipse(SpringSource Tool Suit) Java Projesi)

Java Mail Api ile ilgili daha detaylı bilgiye adresinden ulaşabilirsiniz.