12 Ekim 2014 Pazar

Spring + Quartz ile zamanlanmış görevler

Merhaba,
bu yazımda sizlere spring ve quartz entegrasyonundan bahsedeceğim. Bir projede belli aralıklarla işlem yapmak isterseniz(SMS gönderme , Mail gönderme, vs ..), bu yapıdan faydalanabilirsiniz. Ben bu projede 10 sn aralıklarla mail gönderme işlemini anlatacağım, kodları inceleyerek zamanlanmış görevler hakkında bilgi sahibi olabilirsiniz.

Öncelikli olarak intelliJ aracılığıyla bir Spring web projesi oluşturuyoruz.
Proje bittiğinde aşağıdaki yapıda olacaktır:


pom.xml dosyasına quartz dependency tanımlamalarını yaparak hemen başlayalım.

pom.xml
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>3.1.2.RELEASE</version>
        </dependency>

        <!-- Quartz API -->
        <dependency>
            <groupId>opensymphony</groupId>
            <artifactId>quartz</artifactId>
            <version>1.6.3</version>
        </dependency>

        <dependency>
            <groupId>commons-collections</groupId>
            <artifactId>commons-collections</artifactId>
            <version>3.2.1</version>
        </dependency>

        <dependency>
            <groupId>org.apache.directory.studio</groupId>
            <artifactId>org.apache.commons.logging</artifactId>
            <version>1.1.1</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-support</artifactId>
            <version>2.0.6</version>
        </dependency>

Web projesi oluşturduğum için projeye gelen tüm URL leri  index.jsp  sayfasına yönlendirelim. Yönlendirme yapmasak ta quartz çalışacaktır ancak yönlendirme yaparsak projeyi çalıştırdığımız bir karşılama sayfası olur ve sayfa bulunamadı hatası almayız.
HelloController .java
@Controller
@RequestMapping("/")
public class HelloController {
                @RequestMapping(method = RequestMethod.GET)
                public String printWelcome(ModelMap model) {
                               model.addAttribute("message", "Hello world!");
                               return "hello";
                }
}

scheduler için xml dosyası aracılığıyla MailReportServiceImpl .java dosyasındaki mailSend metotunu çağıracağız. Dolayısıyla bu class ve metodu hemen oluşturalım.

 MailReportServiceImpl .java
package com.company.service.impl;

import com.company.service.MailReportService;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;

/**
 * Created by levent.yildiz on 12.10.2014.
 */
public class MailReportServiceImpl implements MailReportService {
    @Override
    public void mailSend() {

        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Calendar calendar = Calendar.getInstance();
        String strDate = dateFormat.format(calendar.getTime());

        //TODO : development
        //Mail gönderme işlemi burada yapılacak
        System.out.println("Mail Gonderiliyor.." + strDate);
    }
}



Ve son aşamada quartz ayarlarını bir xml dosyasından yapıyoruz.
MailReportServiceImpl , MethodInvokingJobDetailFactoryBean(Quartz) ve SimpleTriggerBean(Quartz) metotlarını çağıran bean ler oluşturuyoruz.

MethodInvokingJobDetailFactoryBean metodunu çağırırken kendi yazdığımız MailReportServiceImpl  classını ve mailSend metodunu refere ediyoruz.

Birde son olarak SimpleTriggerBean metoduna bu job'un ne sıklıkla çalışması gerektiğini set ediyoruz.

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p" xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">


    <!-- Beans -->
    <bean id="mail"
          class="com.company.service.impl.MailReportServiceImpl"/>


    <bean id="methodJobDetailBean"
          class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"
          p:concurrent="false" p:targetObject-ref="mail" p:targetMethod="mailSend"/>


    <!-- For Testing -->
    <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean"
          p:jobDetail-ref="methodJobDetailBean" p:startDelay="20000"
          p:repeatInterval="10000"/>


    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"
          p:waitForJobsToCompleteOnShutdown="true">
        <property name="triggers">
            <list>
                <ref bean="simpleTrigger"/>
            </list>
        </property>
    </bean>
  
</beans>


projenin çıktısı aşağıdaki gibi olacaktır:


kaynak dosyalar(github) : indirmek için tıklayın

jslt koşullu seçenekler(choose when otherwise)

Merhaba arkadaşlar,
Aslında daha önceden size jslt tarafında koşullu ifadelerin nasıl tanımlanacağını paylaşmıştım. Ancak Internet üzerinde bir araştırma yaparken stackoverflow da gözüme çarpan bir açıklama oldu. Önceki yazıyı kirletmeden yeni bir başlık altında sizlere de paylaşayım istedim. Kullanım sade ve anlaşılır olduğu için orijinal haline dokunmadan paylaşıyorum:


<c:choose>
  <c:when test="${condition1}">
    ...
  </c:when>
  <c:when test="${condition2}">
    ...
  </c:when>
  <c:otherwise>
    ...
  </c:otherwise>
</c:choose>


<c:if test="${temperature eq 'HOT' || temperature eq 'VERYHOT'}">



postgresql tip dönüştürme (casting) kullanım örneği

Merhaba, bir ders notumu(Aslında iş notu) daha sizinle paylaşmak istiyorum.
yazılım dillerinde olduğu gibi veri tabanı tarafında da tip dönüşümü(casting) işlemleri vardır. Geçenlerde böyle bir ihtiyaç oluşmuştu vt tarafında. Daha sonra tekrar lazım olur diye not etmiştim. sizinle de paylaşayım istedim.

"yıldız" string ifadesini  chracter varying türünde soyadi sütununa cast edelim
cast('yıldız' AS character varying) AS soyadi

null değerini smallint tipinde turu sütununa cast edlim
cast(null AS smallint) AS turu


örnek postgres kullanımı aşağıdadır:
select
cast('yıldız' AS character varying) AS soyadi,
cast(null AS smallint) AS turu
from table

En bilinen/kullanılan linux/unix komutları

Merhaba arkadaşlar,
Unix sistemleri öğrenmeye başladığımda en çok kullanılan komutları not etmiştim. Bu notumu sizede faydası olur diye paylaşmak istiyorum. Ayrıca bende hala Unix tarafında yeni komutlar öğreniyorum. Dolayısıyla benim Unix hazineme yeni komutlar eklendikçe bu sayfayı da güncelleyeceğim.

Şu anlık elimde olanlar aşağıdadır : 


KOMUT
AÇIKLAMA / KULLANIM
İŞLEV
Pwd
Print working directory
Bulnduğumuz directory’nin path  bilgisini verir.
Cd
Change directory
Ls
List Directory Contains
Bulunduğumuz dizindeki tüm dosyala ve dizinleri listeler.
Mkdir
Make Directory
Bulunduğumuz dizinde yeni bir klasör oluşturur.
Touch
Bulunduğumuz dizinde yeni bir dosya oluşturmak için kullanılır.
Rm
Remove
Dosya silmek için kullanılır
Mv
Move
Dosyayı taşımak için kullanılır.
Cp
Copy
Dosyayı kopyalar
Man
Short For Manual Page
Komutların kullanımını gösteren manual sayfasına gider
Grep
 cat /var/log/catalina.log | grep "error"
Regex aracılığıyla girilen değere benzer listelemeler yapar.
Sudo
Substitute User  Do
Rm -r
Rm –r directoryName
Klasörü içindeki dosyalarla birlikte siler.
Dpkg
dpkg --get-selections| grep -v deinstall > output.log
Yüklenen paketleri listeler
 Curl
  curl -I http://twitter.com/
supported protocols (DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET and TFTP)
 locate
 Locate tomcat
 Dosyayı ismine göre arar. Regex ile arama yapar.
Passwd
passwd adm_levent
Enter new UNIX password:
Retype new UNIX password:
Unix sistemler üzerinde ki kullanıcı hesabınızın şifresini değiştirmenize olanak sağlar.
find
find -name Abc.java
Abc.java adında dosya arar
sha256sum
echo -n 'bunuşifrele' |sha256sum
Stringi sha256 ile şifreler

11 Ekim 2014 Cumartesi

Java İle Dosya İşlemleri (Okuma / Yazma / Ekleme)

Merhaba arkadaşlar,
Bayram, şehir dışı seyahatler , iş yoğunluğu derken uzun zamandır yazamıyordum.  Bu gün sizlere Java ile Dosya işlemleri nasıl yapıldığını paylaşacağım.  Bir aksilik olmazsa eğer[uyku/yorgunluk.. vs :)  ] 1-2  yazı daha yazıp proje/kaynak dosyalarıyla birlikte paylaşıyor olacağım.

Aslında her işlem de olduğu gibi dosya operasyonlarını da Javada birden fazla yöntemlerle yapabilirsiniz ancak ben burada en  bilinen yöntem olan BufferedWriter ve BufferedReader ile dosya  işlemleri yapacağım.

Öncelikle intelliJ aracılığıyla bir consol projesi oluşturalım(Web projesi oluşturarak ta aynı işlemleri yapabilirsiniz). 

Projenin yapısı(Son hali) aşağıdaki gibi olacaktır.



Dosya  işlemleri için Service paketinin altında Operations.java adında bir sınıf oluşturuyoruz.
Bu sınıfın içinde aşağıdaki isimlerde 3 tane metot olacak. 
public static void writeFile(String content) // dosya yazar 
public static void appendFile(String content) // dosyaya içerik ekler(Eski verileri silmeden)
public static void readFile(String path) // dosyadan okur


Operations.java / writeFile

    public static void writeFile(String content) {

        File file = new File("write-file.txt");

        //if file doesn't exists , then create it
        if (!file.exists())
            try {
                file.createNewFile();
            } catch (Exception e) {
                e.printStackTrace();
            }

        try {
            FileWriter fw = new FileWriter(file.getAbsoluteFile());
            BufferedWriter bw = new BufferedWriter(fw);
            bw.write(content);
            bw.close();
            System.out.println("SUCCESS..");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


Yukarıdaki metot dosyaya yazmak istediğiniz her içeriği işlerken, mevcut  dosya içeriğini temizler/ezer(override).  Eğer dosyadaki var olan içeriğe dokunmadan en alta satır eklemek istiyorsanız yapmanız gereken tek işlem var oda FileWriter'a true değerine sahip  ikinci bir parametre göndermek. Bu sayede FileWriter sınıfındaki override işlemi disable olur. Girdiğiniz içerikler ardı ardına eklenir.

Operations.java / appendFile
            FileWriter fw = new FileWriter(file.getAbsoluteFile(), true);

Operations.java / readFile
    public static void readFile(String path) {

        BufferedReader br = null;

        String sCurrentLine;
        String filePath = path;

        try {
            br = new BufferedReader(new FileReader(filePath));
            while ((sCurrentLine = br.readLine()) != null) {
                System.out.println("READ ::::: " + sCurrentLine);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                br.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }


Run.java sınıfındaki main metodu çalıştırarak console ekranından işlemlerin sonucunu görebilirsiniz.
controller/Run.java
    public static void main(String[] args) {

        System.out.println("RUNING..");

        //call writer class
        Operations op = new Operations();

        Long currDate = System.currentTimeMillis();
        Date date = new Date(currDate);
        String timeStr = date.toString();

        //content to file  + system time
        String content1 = "ilk satiri dosyaya yaz " + timeStr + "\n";
        String content2 = "ikinci satiri dosyaya yaz " + timeStr + "\n";
        String content3 = "Ucuncu  satiri dosyaya yaz " + timeStr + "\n";

        //write to file
        op.writeFile(content1);
        op.writeFile(content2);
        op.writeFile(content3);

        //append to file
        op.appendFile(content1);
        op.appendFile(content2);
        op.appendFile(content3);


        //read file
        op.readFile("C:\\read-file.txt");


    }


NOT1: okunacak dosya C:\read-file.txt  dosyasıdır. C dizininde bu dosya bulunmazsa file not found exception hatası alırsınız.

NOT2: Özel karakterlerin string'e dönüştürebilmesi için dosya path inde  ki slash ları iki kere yazın C:\read-file.txt yi C:\\read-file.txt şeklinde

Son olarak projeyi run edince aşağıdaki çıktıları üretecektir.



kaynak dosyalar(github) : indirmek için tıklayın

21 Eylül 2014 Pazar

javax ile smtp mail gönderme

Merhabalar herkese,
bu yazımda sizlere javax ile smtp doğrulama yaparak mail gönderme işlemi yapacağız. Java da Mail gönderme işlemi yapan birkaç yöntem var ben sadece bir tanesini anlatacağım. Bu size şimdilik  yol göstermiş olsun ilerleyen zamanlarda ihtiyaç duyulursa diğer metodları da yazarım.


Öncelikle yine intelliJ ile bir web(Spring MVC) projesi oluşturarak işe başlıyoruz.
projenin bitmiş hali aşağıdaki yapıda olacaktır:


projeyi oluşturduktan sonra maven dosyasını(pom.xml) aşağıdaki tanımlamaları ekleyelim.
pom.xml 
        <dependency>
            <groupId>javax.mail</groupId>
            <artifactId>mail</artifactId>
            <version>1.4</version>
        </dependency>

        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>1.7.1</version>
        </dependency>

burada gördüğünüz üzere iki farklı tanımlama var. Birincisi mail göndermemize yarayan jar diğeri ise json değerleri okumamıza yarar.


index html sayfasında basit bir form oluşturalım ve bu form sayesinden son kullanıcıdan mail bilgilerini alalım.

index.html 
<div class="mailDiv">
    <form role="form" id="mailForm" method="POST" onsubmit="return false;">
        <div class="form-group">
            <input type="text" class="form-control" name="firstname" id="firstname" placeholder="Ad">
        </div>

        <div class="form-group">
            <input type="text" class="form-control" name="lastname" id="lastname" placeholder="Soyad">
        </div>
        <div class="form-group">
            <input type="email" class="form-control" id="email" name="email" placeholder="E-Posta">
        </div>

        <div class="form-group">
            <input type="password" class="form-control" id="password" name="password" placeholder="Sifre">
        </div>

        <div class="form-group">
            <input type="text" class="form-control" id="subject" name="subject" placeholder="Konu">
        </div>

        <div class="form-group">
            <textarea class="form-control" rows="3" name="message"></textarea>
        </div>
        <button type="submit" id="btnFormPost" class="btn btn-primary">Gonder</button>
    </form>
</div>

özetle bu formdan bilgileri post edip java ile karşılayacağız. Daha sonra  gelen değerli alarak Javax ile mail gönderme yapacağız.

 MailController.java
        final Mail mail = new Mail();
        mail.setFirstname(request.getParameter("firstname")); // Adı
        mail.setLastname(request.getParameter("lastname")); // Soyadı
        mail.setFromMail(request.getParameter("email")); //Gönderen Mail
        mail.setToMail(request.getParameter("email")); // Alan Mail
        mail.setPassword(request.getParameter("password")); // Gönderen Mail Şifresi
        mail.setMessage(request.getParameter("message")); // Mail mesajı
        mail.setSubject(request.getParameter("subject")); //mail konusu


        mail.setHost("smtp.gmail.com"); //sender smtp host
        mail.setPort(587);//smtp port

        Properties props = new Properties();
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.host", mail.getHost());
        props.put("mail.smtp.port", "587");//gönderen mail port

üstteki kodlar ile formdan gelen bilgilerle Mail nesnesini dolduracağız. Ayrıca Properties sınıfını da gmail in mail sunucu bilgilerine göre dolduruyoruz. Diğer mail sunucular için ayarları(port,auth,host,..vs) güncellemeyi unutmayın.

projenin çıktısı aşağıdaki gibidir:


formdan girilen değerlerle mail gönderme işlemi yaptıktan sonra Adı,Soyadı,Email ve Email gönderme durumunu ekrana yazacaktır.

kaynak dosyalar(github) : indirmek için tıklayın

20 Eylül 2014 Cumartesi

Jsp ile Basit Dört işlem

Merhaba, hatırlarsanız  Neden yazıyorum? Neler yazacağım ? başlıklı yazımda sizlere(yeni başlayanlara) dört işlem ve form işlemlerinden başlayarak belirli bir java seviyesi kazandırmayı amaçladığımı belirtmiştim.
Bu yazımda  jsp sayfası üzerinden form işlemleri çerçevesinde basit aritmetik işlemler(Toplama,Çıkarma,Çarpma,Bölme) yapacağız.

Hemen intelliJ ile bir web(Spring MVC) projesi oluşturarak işe başlıyoruz.
Projenin bitmiş hali aşağıdaki yapıda olacaktır:


Oluşturduğumuz projenin görsel tarafıyla zaman kaybetmemek adına projeyi  bootstrap üzerine inşa edeceğim.
Öncelikle bootstrap  kaynak(source) linklerini jsp sayfamıza ekleyelim.

index.html 
<!-- minified CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">

<!-- minified JavaScript -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>

Projede jquery ve ajax post işlemleri yaptıracağımız için Jquery  kodlarını da   sayfaya ekleyelim.
 index.html
<!-- minified jQuery -->
<script src="http://code.jquery.com/jquery-2.1.0.min.js"></script>


sonuçları json formatında alacağım için pom xml'e jackson-mapper-asl' yi ekliyorum.
pom.xml 
        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>1.7.1</version>
        </dependency>

OpController.java dosyasında tüm işlemler(toplama,çıkarma,çarpa,bölme) için birer method ekleyelim.

OpController.java 
    @RequestMapping(value = "/topla.html", method = RequestMethod.POST)
    public
    @ResponseBody
    Numbers topla(HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        Numbers numbers = new Numbers();
        numbers.setFirstNum(Integer.parseInt(request.getParameter("firstNum")));
        numbers.setSecNum(Integer.parseInt(request.getParameter("secNum")));
        numbers.setResult((double) (numbers.getFirstNum() + numbers.getSecNum()));
        return numbers;
    }


Yazıda bilgi tekrarı yaparak sizleri sıkmamak adına yazımı burada sonlandırıyorum.Kolay anlaşılabilmesi için  projenin kaynak kodlarını yazarken gerekli yerlerde  yorum satırları ekledim. Bu size yol gösterecektir.

Projenin çıktısı aşağıdaki gibi olacaktır:




kaynak dosyalar(github) : indirmek için tıklayın