2014년 5월 21일 수요일

get last modified file by pattern(wildcard)




import java.io.File;
import java.io.FileFilter;
import java.util.Arrays;
import java.util.Comparator;

import org.apache.commons.io.filefilter.WildcardFileFilter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LastModifiedFileByPattern {
public static Logger logger = LoggerFactory.getLogger(FileFilterTest.class);
@SuppressWarnings({ "unchecked", "rawtypes" })
public static File getLastModifiedFile(File dir, String wildcard) {
File file = null;
if (dir == null || dir.isDirectory() == false) {
return null;
}
FileFilter fileFilter = new WildcardFileFilter(wildcard);
File[] files = dir.listFiles(fileFilter);
if (files == null || files.length == 0) {
return null;
}
Arrays.sort(files, new Comparator() {
    public int compare(Object o1, Object o2) {
        if (((File)o1).lastModified() > ((File)o2).lastModified()) {
            return -1;
        } else if (((File)o1).lastModified() < ((File)o2).lastModified()) {
            return +1;
        } else {
            return 0;
        }
    }
});
file = files[0];
return file;
}
public static void main(String[] args) {
File dir = new File("/somepath/");
String wildcard = "service_*.log";
File f = getLastModifiedFile(dir, wildcard);
logger.debug(f.toString());
}


}

Get All Classes Within A Package




http://dzone.com/snippets/get-all-classes-within-package


public static void main(String[] args) throws Exception{
String packageName = "a.b.c.d";

List<?> list = getClasses(packageName);
System.out.println(list);
}

/**
* Scans all classes accessible from the context class loader which belong to the given package and subpackages.
*
* @param packageName The base package
* @return The classes
* @throws ClassNotFoundException
* @throws IOException
*/
public static List<?> getClasses(String packageName) throws ClassNotFoundException, IOException {
   ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
   assert classLoader != null;
   String path = packageName.replace('.', '/');
   Enumeration<URL> resources = classLoader.getResources(path);
   List<File> dirs = new ArrayList<File>();
   while (resources.hasMoreElements()) {
       URL resource = resources.nextElement();
       dirs.add(new File(resource.getFile()));
   }
   ArrayList<Class<?>> classes = new ArrayList<Class<?>>();
   for (File directory : dirs) {
       classes.addAll(findClasses(directory, packageName));
   }
   return classes;
}

/**
* Recursive method used to find all classes in a given directory and subdirs.
*
* @param directory   The base directory
* @param packageName The package name for classes found inside the base directory
* @return The classes
* @throws ClassNotFoundException
*/
private static List<Class<?>> findClasses(File directory, String packageName) throws ClassNotFoundException {
   List<Class<?>> classes = new ArrayList<Class<?>>();
   if (!directory.exists()) {
       return classes;
   }
   File[] files = directory.listFiles();
   for (File file : files) {
       if (file.isDirectory()) {
           assert !file.getName().contains(".");
           classes.addAll(findClasses(file, packageName + "." + file.getName()));
       } else if (file.getName().endsWith(".class")) {
           classes.add(Class.forName(packageName + '.' + file.getName().substring(0, file.getName().length() - 6)));
       }
   }
   return classes;
}

JBoss EAP 6.0 (jBoss Application Server 7.0)에서 오라클 DataSource 설정하기


** 참고: https://community.jboss.org/thread/169104

1. 오라클 JDBC 드라이버(ojdbc6.jar) 다운로드
http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-112010-090769.html

2. jBoss Oracle JDBC 모듈 추가
ojdbc6.jar 파일을 ${JBOSS_HOME}/modules/com/oracle/ojdbc6/main 디렉토리에 복사
위 디렉토리에 module.xml 파일을 생성하고 아래 내용으로 저장

<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.1" name="com.oracle.ojdbc6">
    <resources>
        <resource-root path="ojdbc6.jar"/>
    </resources>
    <dependencies>
        <module name="javax.api" />
        <module name="javax.transaction.api"/>
        <module name="javax.servlet.api" optional="true"/>
    </dependencies>
</module>



3. DataSource 설정
${JBOSS_HOME}/standalone/configuration/standalone.xml에 DataSource 정보 추가
            <datasources>
                ...
                <datasource jndi-name="java:/TestDS" pool-name="TestDS" enabled="true">
                    <connection-url>jdbc:oracle:thin:@192.168.0.1:ORCL</connection-url>
                    <driver>oracle</driver>
                    <security>
                        <user-name>scott</user-name>
                        <password>tiger</password>
                    </security>
                    <validation>
                        <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleValidConnectionChecker"/>
                        <stale-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleStaleConnectionChecker"/>
                        <exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleExceptionSorter"/>
                    </validation>
                </datasource>
                <drivers>
                    ...
                    <driver name="oracle" module="com.oracle.ojdbc6">
                        <xa-datasource-class>oracle.jdbc.xa.client.OracleXADataSource</xa-datasource-class>
                    </driver>
                </drivers>
            </datasources>

Define multiple JBoss 7 instance using Eclipse Juno


참조 : https://community.jboss.org/thread/221012

* Instance 파일 복사
${JBOSS_HOME}/standalone 디렉토리를 ${JBOSS_HOME}/foo 로 복사

* ${JBOSS_HOME}/foo/configuration/standalone.xml 수정
before
<socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}">
after
<socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:10000}">

* Eclipse server runtime 추가
Window > Preferences > Server > Runtime Environments > Add
Create a runtime environment "JBoss 7.1 Runtime foo"
Configuration file: ..\..\foo\configuration\standalone.xml

* 새 서버 생성
Server view 에서 New / Server
JBoss Community / JBoss AS 7.1 추가

* Server 정보 수정
Server view 에서 위에서 생성된 서버 double click
Server Ports 에서 Detect from Local Runtime 체크 해제하고 Port offset을 10000으로 설정
Deployment 탭으로 이동해서 아래와 같이 수정
- "Use a custom deploy folder" check
- "standalone/deployments" -> "foo/deployments"
- "standalone/tmp" by "foo/tmp"

* Open launch configuration 수정
Overview 탭으로 이동
Always update arguments related to the runtime : uncheck
- Program arguments 수정
/*******************************************************************************
-mp "C:/tools/jboss/jboss-as-7.1.1.Final/modules" -jaxpmodule javax.xml.jaxp-provider org.jboss.as.standalone -b 0.0.0.0 --server-config=..\..\foo\configuration\standalone.xml
*******************************************************************************/
- VM arguments 수정
/*******************************************************************************
-server -Xms64m -Xmx512m -XX:MaxPermSize=256m -Djava.net.preferIPv4Stack=true -Dorg.jboss.resolver.warning=true -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000 -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true "-Dorg.jboss.boot.log.file=C:/tools/jboss/jboss-as-7.1.1.Final/foo/log/boot.log" "-Dlogging.configuration=file:/C:/tools/jboss/jboss-as-7.1.1.Final/foo/configuration/logging.properties" "-Djboss.home.dir=C:/tools/jboss/jboss-as-7.1.1.Final" "-Djboss.server.base.dir=C:\tools\jboss\jboss-as-7.1.1.Final\foo"
*******************************************************************************/
수정할 항목: org.jboss.boot.log.file / logging.configuration / jboss.server.base.dir


* 서버 구동 및 확인
Servers view에서 서버를 (재)시작하고 http://localhost:18080 접속 확인

이름 구분자로 String format하기

Apache commons lang의 StrSubstitutor 클래스를 이용한다.
(commons-lang 2.2 부터 지원)

Map valuesMap = new HashMap();
valuesMap.put("animal", "quick brown fox");
valuesMap.put("target", "lazy dog");
String templateString = "The ${animal} jumped over the ${target}.";
StrSubstitutor sub = new StrSubstitutor(valuesMap);
String resolvedString = sub.replace(templateString);

결과(resolvedString) : The quick brown fox jumped over the lazy dog.


http://commons.apache.org/proper/commons-lang/javadocs/api-2.6/index.html?org/apache/commons/lang/StringUtils.html

2014년 5월 16일 금요일

MyBatis(iBatis)에서 파라미터에 Null 값이 있을 경우 에러 처리

MyBatis(iBatis)에서 파라미터에 Null 값이 있을 경우 에러가 발생한다.
아래 2가지 방식으로 설정 가능하다.

1. 전체 설정
jdbcTypeForNull의 기본값은 OTHER 이다.

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE configuration
    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"      
    "http://mybatis.org/dtd/mybatis-3-config.dtd">
    
<configuration>
<settings>
        ...
        <setting name="jdbcTypeForNull" value="VARCHAR" />
     </settings>
    
<environments>
...
</environments>
<mappers>
<mapper resource="com/..."/>
...
</mappers>
</configuration>

2. 파라미터별 처리(jdbcType를 지정)
Null 값이 입력될 수 있는 부분에 아래와 같이 옵션을 추가한다.

#{id, jdbcType=VARCHAR}


MyBatis(iBatis)에서 Underscore 형식의 필드명을 camel case로 변경하기

MyBatis(iBatis) 설정을 아래와 같이 변경

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE configuration
    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"      
    "http://mybatis.org/dtd/mybatis-3-config.dtd">
    
<configuration>
<settings>
        ...
        <setting name="mapUnderscoreToCamelCase" value="true" />
     </settings>
    
<environments>
...
</environments>
<mappers>
<mapper resource="com/..."/>
...
</mappers>
</configuration>