InputStream 을 문자열로 반환하는 넘.
public static String readStringFromStream(InputStream in) throws IOException {   
        StringBuilder sb = new StringBuilder(1024);
   
        for (int i = in.read(); i != -1; i = in.read()) {
            sb.append((char) i);
        }   
        in.close();   
        return sb.toString();
}

InputStream 을 byte array로 반환하는 넘
private static final int DEFAULT_BUFFER_SIZE = 1024 * 4;

public static byte[] readBytesFromStream(InputStream in) throws IOException {
        int i = in.available();
        if (i < DEFAULT_BUFFER_SIZE) {
            i = DEFAULT_BUFFER_SIZE;
        }
        ByteArrayOutputStream bos = new ByteArrayOutputStream(i);
        copy(in, bos);
        in.close();
        return bos.toByteArray();
}

public static int copy(final InputStream input, final OutputStream output) throws IOException {
         return copy(input, output, DEFAULT_BUFFER_SIZE);
}
     
public static int copy(final InputStream input, final OutputStream output, int bufferSize) throws IOException {
        int avail = input.available();
        if (avail > 262144) {
            avail = 262144;
        }
        if (avail > bufferSize) {
            bufferSize = avail;
        }
        final byte[] buffer = new byte[bufferSize];
        int n = 0;
        n = input.read(buffer);
        int total = 0;
        while (-1 != n) {
            output.write(buffer, 0, n);
            total += n;
            n = input.read(buffer);
        }
        return total;
}

Posted by 짱가쟁이
매번 까먹고 다시 만들고.. 머릿속의 지우개는 어떻게 하지 못하는 건지.... 쩌ㅃ~

 /**
     *
     * @param format
     *             ex> format : yyyyMMddHHmmssSSS
     * @return
     */
    public static String getCurrentTime_0(String format) {
        Calendar calendar = Calendar.getInstance();
        SimpleDateFormat dateFormat = new SimpleDateFormat(format);

        return dateFormat.format(calendar.getTime());
    }

    public static String getCurrentTime_1(String format) {
        DateFormat df = new SimpleDateFormat(format); // HH=24h, hh=12h
         return df.format(System.currentTimeMillis());
    }

- format 을 맞춰주면 오늘 날짜/시간을 가져온다. 밀리세컨드 까징..
- 뭐 나오세컨드 까지 나온듯 싶지만.. 고넘은 벌써 까먹음.. 다음에 기회가 생기면 그때.. 쩌ㅃ~
Posted by 짱가쟁이
String 클래스에 repalceAll() 요넘.. '$' 특수문자 변환에 걸려서리.. 사용하기 존내 짜증남.. 예전에 어떻게 처리 한거 같기도 한데.. 마찮가지로 머릿속의 지우개가 문제인듯.

public static String replaceAll(String buffer, String src, String dst)
{
    if (buffer == null)
        return null;
    if (src == null || buffer.indexOf(src) < 0)
        return buffer;

    int bufLen = buffer.length();
    int srcLen = src.length();
    StringBuffer result = new StringBuffer();

    int i = 0;
    int j = 0;
    for (; i < bufLen;)
    {
        j = buffer.indexOf(src, j);
        if (j >= 0)
        {
            result.append(buffer.substring(i, j));
            result.append(dst);

            j += srcLen;
            i = j;
        }
        else
            break;
    }
    result.append(buffer.substring(i));
    return result.toString();
}

Posted by 짱가쟁이
quartz를 사용하고 멀티쓰레드로 작업을 병렬로 처리하던중.. 작업지연으로 인해서 이전 작업이 끝나기도 전에 다음 작업이 시작된다. 뭐.. 가장 좋은 방법은 단순하게 쿼즈가 실행하는 쓰레드 하나만 사용하면 좋것지만.. DB 성능 문제로 인해서 꼭 병렬처리를 수행해야 한다면.. ?? 이때.. Callable 인터페이스를 사용하여 쓰레드의 결과값을 받을 수 있다.

Launcher.java
private final ExecutorService executor  = Executors.newFixedThreadPool(THEAD_SIZE);

public void excute() {
    Future[] future = new Future[THEAD_SIZE];
    for(int i = 0;i<THEAD_SIZE;i++) {
        future[i] = executor.submit(new WokerThread(synchData, 1, totalCount, reqVo));                       
    }
    for(int i = 0;i<THEAD_SIZE;i++) {
        info.info("[" + future[i].get() + "] 종료" );   
    }
}

Callable을 구현한 넘
import java.util.concurrent.Callable;

public class WokerThread implements Callable<String> {
  
    public String call() {       
        while(true) {           
            return (String)Thread.currentThread().getName();
        }
    }
}

위에 샘플은 단순한 사용방법을 구현했지만.. 다양한 방법으로 유용하게 사용할 수 있을듯.


Posted by 짱가쟁이
<select id="select_excute" parameterClass="cxf.demo.dao.excute.req.TableSelectVo" resultClass="xml">
    $sql$
</select>

위 설정을 보면 select sql 문을 직접 받아서 실행한 결과를 XML로 받는 sample이다.
위 예제 처음에 한번은 제대로 동작하지만.. 쿼리를 수정해서 보내면.. 이전 ResultMap 을 물고 있는 관계로 자꾸 column을 찾을 수가 없다고 나온다. 뭐.. 내부적으로 성능을 위해서 caching을 하는거 같은데.. 중요한건 요넘 어떻게 해야 하는지 도통 찾을수가 없다.
spring SqlMapClientFactoryBean을 봐도 없고.. ibatis SqlMapClient 을 봐도 답이 안보이고.. 구글링을 해도 실력이 부족하지 않보이더라..
포기할까 하다.. "http://ibatis.apache.org/dtd/sql-map-2.dtd" 요넘을 한번 보자라는 생각이 들었다. ㅋㅋ
<!ELEMENT statement (#PCDATA | include | dynamic | iterate | isParameterPresent | isNotParameterPresent | isEmpty | isNotEmpty | isNotNull | isNull | isNotEqual | isEqual | isGreaterThan | isGreaterEqual | isLessThan | isLessEqual | isPropertyAvailable | isNotPropertyAvailable)*>
<!ATTLIST statement
id CDATA #REQUIRED
parameterMap CDATA #IMPLIED
parameterClass CDATA #IMPLIED
resultMap CDATA #IMPLIED
resultClass CDATA #IMPLIED
cacheModel CDATA #IMPLIED
resultSetType (FORWARD_ONLY | SCROLL_INSENSITIVE | SCROLL_SENSITIVE) #IMPLIED
fetchSize CDATA #IMPLIED
xmlResultName CDATA #IMPLIED
remapResults (true|false) #IMPLIED
timeout CDATA #IMPLIED

remapResults <- 요넘 대충 봐도.. result map 로딩하는거 설정하는 놈 같아 보여서 찍었는데... 제대로 찍었다. 학교댕길때 찍을때는 그렇게 안맞더니.. 쩌ㅃ~
<select id="select_excute"  parameterClass="cxf.demo.dao.excute.req.TableSelectVo" resultClass="xml" remapResults="true">
        $sql$
</select>


빨간색 넘으로 테스트 해보면 제대로 돌아간다. 까먹지 말고.. 난중에 필히 적용하자.. 쩌ㅃ~

'framework > ibatis' 카테고리의 다른 글

[Mybtis] - log interceptor  (0) 2014.10.24
[ibatis] - 오류  (0) 2010.07.06
Posted by 짱가쟁이

- Sample
NumberFormat nf = NumberFormat.getNumberInstance();
nf.setMinimumFractionDigits(9);
nf.setGroupingUsed(false);

nf.format((double)228588.0/(double)1000000000.0);

- Result
0.000228588

'java > util' 카테고리의 다른 글

Calendar, SimpleDateFormat 사용하자  (0) 2010.06.28
[replaceAll] - 문자열 치환  (0) 2010.06.28
[정규식] - Pattern 을 사용한 Validate  (0) 2010.06.25
[정규식] - 한글 검사  (0) 2010.06.25
[정규식] - 초성 검사  (0) 2010.06.25
Posted by 짱가쟁이

package com.util;

import java.util.regex.Pattern;

/**
 * 정규식을 이용한 값 체크
 *
 * @author bbaeggar
 *
 */
public class ValidationUtil {

    /**
     * 일반 전화번호 검증
     *
     * @param phoneNum
     * @return
     */
    public static boolean isNomalPhoneNumber(String phoneNum, String separate) {
        String regEx = "^\\d{2,3}"+separate+"\\d{3,4}"+separate+"\\d{4}$";      
        return Pattern.matches(regEx, phoneNum);
    }
  
    /**
     * 모바일 전화번호 검증
     *
     * @param phoneNum
     * @return
     */
    public static boolean isMobilePhoneNumber(String phoneNum, String separate) {
        String regEx = "^01(?:[0-9])"+separate+"(?:\\d{3}|\\d{4})"+separate+"\\d{4}$";      
        return Pattern.matches(regEx, phoneNum);
    }

    /**
     * V4 Ip Address 검증
     *
     * @param ipAddress
     * @return
     */
    public static boolean isIpAdressVersion4(String ipAddress) {
        String regEx = "([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})";      
        return Pattern.matches(regEx, ipAddress);
    }
  
    /**
     * 주민번호 검증
     *
     * @param ipAddress
     * @return
     */
    public static boolean isJuminNumber(String number) {
        String regEx = "\\d{6}\\-[1-4]\\d{6}";      
        return Pattern.matches(regEx, number);
    }

    /**
     * 이메일 검증
     *
     * @param email
     * @return
     */
    public static boolean isEmail(String email) {
        String regEx = "^([0-9a-zA-Z_-]+)@([0-9a-zA-Z_-]+)(\\.[0-9a-zA-Z_-]+){1,2}$";      
        return Pattern.matches(regEx, email);
    }
  
    public static void main(String[] args) {      
        System.out.println(ValidationUtil.isNomalPhoneNumber("02-123-4516", "-"));
        System.out.println(ValidationUtil.isMobilePhoneNumber("016-0014-1234", "-"));
        System.out.println(ValidationUtil.isIpAdressVersion4("1.1.1.1"));
        System.out.println(ValidationUtil.isJuminNumber("123456-1634316"));
        System.out.println(ValidationUtil.isEmail("bbaeggar@gmail.com"));
    }
}

Posted by 짱가쟁이
입력값을 검사해서 한글이면 따로 조건을 줘야할때 사용하면 좋다.

public static boolean isKorean(String src) {
    String regEx = "[ㄱ-ㅎㅏ-ㅣ가-힣]*";
    return Pattern.matches(regEx, src);
}

Posted by 짱가쟁이
이번 프로젝트는 나름 알아가는 재미가 있는듯. 입력받은 문자열이 초성만 있는지 검사하는 정규식.

public static boolean isChosung(String src) {
       String regEx = "[ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ]*";
    return Pattern.matches(regEx, src);
}


Posted by 짱가쟁이

클래스에 @XmlRootElement annotation을 사용하지 않은 obejct를 마샬링할 때 사용하면 유용할듯.


public String getMarshallingString(Object obj, String uri, String rootElement) throws Exception {
    JAXBContext jaxbContext;
    StringWriter st = new StringWriter();
    try {
        jaxbContext = JAXBContext.newInstance(obj.getClass());
        Marshaller marshaller = jaxbContext.createMarshaller();
        marshaller.marshal(new JAXBElement(
                  new QName("http://map.star", obj.getClass().getSimpleName()), obj.getClass(), obj ), st);

        return XMLPrinter.prettyFormat(st.toString());
    } catch(Exception e) {
        e.printStackTrace();
        throw e;
    }
}

'java > xml' 카테고리의 다른 글

[JAXB] - unmarshalling, marshalling  (0) 2010.06.29
[xml] - xjc.exe 를 사용한 xsd to java class 생성  (0) 2010.06.29
[xml] - xml to xsd  (0) 2010.06.29
Posted by 짱가쟁이