28 Ekim 2010 Perşembe

Eclipse OpenCV Entegrasyonu

OpenCV görüntü işlemede yaygın olarak kullanılan açık kaynak kodlu geniş bir kütüphanedir. C++ ile yazılmıştır. Eclipse ise Java'da yazılmış bir IDE olduğu için ekstradan konfigürasyon gerektirmektedir. Yanı sıra C++ compiling language olduğu için yine açık kaynak kodlu olan compiler tool'larını da kurmamız gerekmektedir.

Dokümanı indirmek için tıklayınız.

4 Ekim 2010 Pazartesi

Log4J Kullanarak Mail Gönderme

Yazılım projelerinde loglama için genelde Log4J kullanılır. Biz de bu yazımızda Log4J'nin bir özelliğine bakacağız. Ama Log4J'nin kullanımına dair değil. Log4J'nin mail gönderme özelliğinden. Bu özelliğe dair birçok örnek bulabilirsiniz. Ama Spring ve JavaMail Framwork'ü kullanarak Log4J'nin SMTP Appender sınıfını customize edebilirsiniz. Güle Güle Kullanın (GGK)!

MailingUsingLog4J.pdf

Projenin source kodları

24 Eylül 2010 Cuma

JUnit Testing

Yazılım projelerinde test işlemleri aşağıdaki grafikte görüldüğü gibi özetlenebilir:





















İşte bu süreçlerin core kısmında yer alan birim (unit) testleri için kullanılan JUnit framework'ü bu yazının konusudur. JUnit framework'ü kullanışlı ve kullanımı kolay olan bir framework'tür. Tek handikapı ise interface class'ları test edememesidir. Buna yönelik çözüm için de mock objects ve stub kullanılır. Ve son olarak da test işlemlerinin gerçekleştiği kodların içerisinde kaybolma riskine karşı Eclipse'in plugini olarak piyasaya sürülen EclEmma2 incelemesi de yine bu yazı içinde değerlendirilmiştir. İşte tüm bu konuları bulabileceğiniz, şu an çalıştığım firma için hazırladığım dokümanı indirmek için lütfen burayı tıklayınız. Güle güle kullanmanız dileğiyle :)

1 Nisan 2010 Perşembe

Clob To String Converter

Clob tipinde tuttuğunuz veriyi String'e çevirmek istediğinizde aşağıdaki metot size yardımcı olacaktır.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.Reader;
import java.sql.Clob;
import java.sql.SQLException;

public class ClobToStringConverter {
  
    public static String convertClobToString(Clob clb){
        Reader reader;
        String msgStr = "";
        String line;
        try {
             if(clb!=null){
                 reader = clb.getCharacterStream();
                 BufferedReader bufferedReader = new BufferedReader(reader);
                 while((line=bufferedReader.readLine())!=null)
                        msgStr +=line;
             }
           
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }       
       return msgStr;
    }

}

Drop And Create Database Table

       Hibernate annotationlarını kullanarak pojo'larınızı oluşturduysanızve projenizde Spring frameworkten faydalanıyorsanız aşağıdaki class'ı kullanarak veritabanınızdaki tabloları kolaylıkla kaldırıp yeniden yaratabilirsiniz.

import java.lang.reflect.Field;
import javax.sql.DataSource;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.orm.hibernate3.LocalSessionFactoryBean;


public class DropAndCreateTables {
    public static void main(String [] args){
    ClassPathXmlApplicationContext context =  new ClassPathXmlApplicationContext(new String[] {
                "classpath:context/annotationBasedContext.xml", "classpath:context/dao.xml" });     

        LocalSessionFactoryBean localSessionFactoryBean =(LocalSessionFactoryBean) context.getBean("&baseSessionFactory"); 

        org.hibernate.cfg.Configuration configuration = localSessionFactoryBean.getConfiguration();

        try {

            Field declaredField =LocalSessionFactoryBean.class.getDeclaredField("configTimeDataSourceHolder");
            declaredField.setAccessible(true);
            ThreadLocal tl = (ThreadLocal) (declaredField.get(null));
            tl.set((DataSource) context.getBean("dataSource"));
        } catch (Throwable e) {
            e.printStackTrace();
        }
            SchemaExport export = new SchemaExport(configuration);
            export.setOutputFile("exportdb.ddl");
            export.setDelimiter(";");
            export.create(true, true);
    }
}


Class'ın içinde kullanılan annotationBasedContext.xml projenizin spring konfigürasyon dosyası. dao.xml dosyası ise veritabanı bağlantı parametreleri ve ayarlarının tutulduğu xml doyasıdır.


*********************************dao.xml **********************************

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:util="http://www.springframework.org/schema/util"
 xmlns:aop="http://www.springframework.org/schema/aop"
 xmlns:context="http://www.springframework.org/schema/context"
 xmlns:tx="http://www.springframework.org/schema/tx"
 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
 http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd
 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
 http://www.springframework.org/schema/context/spring-context-2.5.xsd"&gt;

   <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="false"/>
   <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
   <property name="sessionFactory">
    <ref local="baseSessionFactory" />
   </property>
   </bean>
   <bean id="baseSessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource">
        <ref local="dataSource" />
    </property>
    <property name="configLocation" value="${hibernate.config.file}"/>
    <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
    <property name="hibernateProperties">
        <props>
        <prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop>
        <prop key="hibernate.show_sql">false</prop>
        <prop key="hibernate.format_sql">true</prop>
        </props>
    </property>
   </bean>

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
    <property name="driverClass" value="oracle.jdbc.driver.OracleDriver" />
    <property name="jdbcUrl" value="jdbc:oracle:thin:@${database.url}"></property>
    <property name="properties">
        <props>
        <prop key="c3p0.acquire_increment">1</prop>
        <prop key="c3p0.idle_test_period">100</prop>
        <prop key="c3p0.max_size">30</prop>
        <prop key="c3p0.min_size">10</prop>
        <prop key="c3p0.max_statements">100</prop>
        <prop key="c3p0.timeout">180</prop>
        <prop key="user">${database.user}</prop>
        <prop key="password">${database.password}</prop>
        </props>
    </property>
        <property name="maxPoolSize" value="100" />
        <property name="initialPoolSize" value="2" />
        <property name="minPoolSize" value="1" />
        <property name="maxStatements" value="200" />
        <property name="maxIdleTime" value="300" />
        <property name="acquireIncrement" value="10" />
        <property name="unreturnedConnectionTimeout" value="240" />
        <property name="maxConnectionAge" value="240" />
</bean>
</beans>

     
**************************annotationBasedContext.xml *******************************

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-2.5.xsd ">
    <context:annotation-config />
    <context:component-scan base-package="com.akgun.akris" />
    <context:property-placeholder location="classpath:/configuration/jdbc.properties" />
    <aop:aspectj-autoproxy />
    <bean id="contextApplicationContextProvider" class="com.akgun.akris.context.ApplicationContextProvider"></bean>
    <bean class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator" />
</beans>


Bu xml dosyaları sizin projenizin ayarlarına göre farklılık gösterebilir. Örnek olması açısından paylaşmak istedim.
Benim işlerimi çok kolaylaştırmıştır bu class umarım herkese faydalı olur...

22 Mart 2010 Pazartesi

NetBeans 6.8'deki Bug

NetBeans 6.8 sürümünü yayınladı. Ben de hemen apar topar geçtim NetBeans 6.8'e. Aslında biraz tesadüf de olmadı değil. Çünkü çalıştığım projede sorun çıkmaya başladı, ben de "tebdil-i mekânda ferahlık vardır" diyerek ilhak ettim 6.8'e. :) Ama daha kullanmaya yeni başlamıştım ki hemen bir bug buldum bile. Tabi benden daha hızlı davrananlar da var, gâvurların bu konudaki hızına yetişmek çok mümkün olmuyor. Ama yine de çok yaygın olmadığı için bu bug'ın çözümünü burada paylaşayım istedim.

Projeyi debug ettiğinizde eğer şöyle bir hata ile karşılaşıyorsanız:

Have no FileObject for C:\Program Files\Java\jdk1.6.0_17\jre\lib\sunrsasign.jar
Have no FileObject for C:\Program Files\Java\jdk1.6.0_17\jre\classes

Yapılacak iş öncelikle "
sunrsasign.jar"ı bulmak. Hiç uğraşmayın, burayı tıklayarak indirin. İndirdiğiniz bu jar'ı, hata mesajının ilk satırında yer alan dizine gidip yapıştırın. Yine aynı şekilde ikinci satırda yer alan dizine gidip "classes" dizinini yaratın ve (forumlarda da belirtildiği gibi) NetBeans'imiz sorunsuz, mutlu bir şekilde çalışmaya devam eder... :)

12 Ekim 2009 Pazartesi

Search (Clob Veri Tipinde Arama)

Veritabanında "Text" olarak pojonuzda da "Clob" olarak tuttuğunuz
verilerin içinde arama yapabilmek için aşağıdakileri uygulamanız
yeterli olacaktır.

**Öncelikle hibernate search annotationlarını ve fonksiyonlarını kullanabilmeniz için aşağıdaki .jar dosyalarını projenize eklemeniz gerekmektedir.

solr-core.jar
solr-common.jar
slf4j-api.jar
lucene-core.jar
jta.jar
jsr250-api.jar
jms.jar
hibernate-core.jar
hibernate-commons-annotations.jar
ejb3-persistence.jar
hibernate-search.jar
lucene-analyzers.jar
lucene-snowball.jar
( http://sourceforge.net/projects/hibernate/files/hibernate-search/3.1.1.GA/hibernate-search-3.1.1.GA-dist.zip/download Buradan lib dizininden yukarıdaki .jar dosyalarına erişebilirsiniz.)

**Pojonuzdaki arama yapmak istediğiniz değişkene hibernate search annotationlarını eklemelisiniz.

@Column(name="content")
@Field(name = "content",index=Index.TOKENIZED,store=Store.NO)
@FieldBridge(impl=ClobImpl.class)
private Clob content;

**ClomImpl Sınıfı

import java.sql.Clob;

import org.hibernate.search.bridge.StringBridge;

/**
* @author hilal
* @version 2.0
*/
public class ClobImpl implements StringBridge {

public String objectToString(Object object) {

Clob overview = ( (Clob) object );
String str = null;
StringBuilder sb = new StringBuilder();
BufferedReader br = null;
try{
br = new BufferedReader(overview.getCharacterStream());
String line = null;
while((line = br.readLine())!= null){
sb.append(line);
}
str=sb.toString();
br.close();
}catch(Exception e){
if (br!=null)
try {
br.close();
}
catch (IOException e1) {
e1.printStackTrace();
}
e.printStackTrace();

}
return str;
}
}
**En son yapacağınız iş ise search fonksiyonunu yazmak.

public List search(String keyword) throws Exception {

Session sess = (Session) HibernateUtil.getSessionFactory().getCurrentSession();
FullTextSession fullTextSession = Search.getFullTextSession(sess);
Transaction tx = fullTextSession.beginTransaction();
try {
List result= searchByKeyword1(fullTextSession,keyword);
List diaryFormList;
diaryFormList = getFormList(result);
tx.commit();
return diaryFormList;
}
catch (Exception e) {
log.error("Diary search Error \n"+e.getMessage());
if (tx!=null && tx.isActive())
tx.rollback();
e.printStackTrace();
throw e;
}

}

public static List searchByKeyword(FullTextSession fs, ,String keyword) {

BooleanQuery booleanQuery = new BooleanQuery();
booleanQuery.add( new PrefixQuery( new Term( "content", keyword) ), BooleanClause.Occur.MUST );

org.hibernate.Query fullTextQuery = fs.createFullTextQuery(booleanQuery, Diary.class);

List result = fullTextQuery.list();

return result;
}

Artık "Clob " tipinde anahtar kelime arama işlemini rahatlıkla yapabilirsiniz.