전에 작성 했던.. "BolckingQueue 와 producer-consumer 패던 활용법 " 예제를 토대로 Executor로 thread pool 예제를 작성거임.
 
1. ConsumerThread.java  수정
  - 등록된 상품이 있으면 무식하게 가져와서 화면에 보여주던 놈을 조금 수정해서 Worker.java 라는 넘으로 Job을 위임함.
  - Executors.newFixedThreadPool 를 사용해 pool 생성 후 Worker.java 를 실행함.
package study.concurrrency;

import java.util.concurrent.Executor;
import java.util.concurrent.Executors;

public class ConsumerThread implements Runnable {

 Thread thread;

 private static final Executor exec = Executors.newFixedThreadPool(10);
 
 public void start() {
  thread = new Thread(this);
  thread.start();
 }
 
 @Override
 public void run() {
  // TODO Auto-generated method stub 
  while(true) {   
   exec.execute(new Worker(BlockingQueueSample.getInstance().getData()));
  }
 }
}

2. Worker.java
  - 넘어온 상품(job)을 무식하게 화면에 보여주는 Thread.
package study.concurrrency;

public class Worker implements Runnable {

 String str;
 
 public Worker(String str) {
  this.str = str;
 }
 @Override
 public void run() {
  // TODO Auto-generated method stub
  System.out.println(str);
  try {
   Thread.sleep(500);
  } catch (InterruptedException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 
 }

}

3. 실행
  - 예전 코드 그대로 실행하면 됨.

4. 결과
  - 위에서 설정했던 pool 사이즈 만큼 job 들이 실행되는 것을 확인할 수 있음.

 
Posted by 짱가쟁이
출처

1. BlockingQueueSample.java
 - 등록된 상품이 있으면 ConsumerThread.java 요넘이 가져가고.. 없으면 대기 시킴.
package study.concurrrency;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

public class BlockingQueueSample {

 static BlockingQueueSample instance;
 
 BlockingQueue queue = new ArrayBlockingQueue(10);
 
 public synchronized static BlockingQueueSample getInstance() {
  if(instance == null)
   instance = new BlockingQueueSample();
 
  return instance;
 }
 
 public void setData(String arg) {
  try {
   queue.put(arg);
  } catch (InterruptedException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
 
 public String getData() {
  try {
   return (String)queue.take();
  } catch (InterruptedException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return null;
 }
}

2. ConsumerThread.java
 - BlockingQueueSample.java 에 등록된 상품이 있으면 무조건 가져오는 무식한 놈임. 이런 소비자만 있으면 무쟈게 행복할듯..
package study.concurrrency;

public class ConsumerThread implements Runnable {

 Thread thread;

 public void start() {
  thread = new Thread(this);
  thread.start();
 }
 
 @Override
 public void run() {
  // TODO Auto-generated method stub 

  while(true) { 
   System.out.println("aaa : " + BlockingQueueSample.getInstance().getData());
   System.out.println("aaa : " + BlockingQueueSample.getInstance().queue.size());
  
   try {
    Thread.sleep(500);
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
 }
}

3. ProducerThread.java
 - 원하는 제품을 무식하게 만들어 주는 놈.
package study.concurrrency;

public class ProducerThread implements Runnable {

 Thread thread;

 String string;
 int time;
 
 public ProducerThread(String string, int time) {
  this.string = string;
  this.time = time;
 }
 public void start() {
  thread = new Thread(this);
  thread.start();
 }
 
 @Override
 public void run() {
  // TODO Auto-generated method stub 

  int index = 0;
 
  while(index<10) {
   index++;
  
   BlockingQueueSample.getInstance().setData(string + "[" + index + "]");
   try {
    Thread.sleep(time);
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
 }
}

4. 테스트
ConsumerThread sample = new ConsumerThread();
sample.start();
 
ProducerThread p1 = new ProducerThread("가방", 1);
p1.start();
 
ProducerThread p2 = new ProducerThread("지갑", 1);
p2.start();

ps.
  위 예제를 참고로 Excutor를 사용해서 Thread Pool을 만들어 봐야 할듯.
Posted by 짱가쟁이
Posted by 짱가쟁이
매번 테이블을 만들기도 귀찮고.. 테이블을 동적으로 생성하게 만들어 놓으면 혹시나.. 서버에서 보내는 데이터를 토대로 테이블을 만들어 주면 좋겟다.. 라는 생각으로 만들게됨.

ps.
   prototype 으로 제작했기 때문에 추후 need가 생기면.. 참고로 정식 버전을 작성하면 될듯.

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

<tableconfig>
    <tables>
     <id>table_body_result</id>
     <fields>
      <text>no</text>
      <size></size>    
     </fields>
     <fields>
      <text>command</text>
      <size></size>    
     </fields>
     <fields>
      <text>data</text>
      <size></size>    
     </fields>
     <fields>
      <text>sw</text>
      <size></size>    
     </fields>
     <fields>
      <text>response</text>
      <size></size>    
     </fields>
    </tables> 
    <tables>
     <id>command_table</id>
     <fields>
      <text>no</text>
      <size></size>    
     </fields>
     <fields>
      <text>command</text>
      <size></size>    
     </fields>
     <fields>
      <text>data</text>
      <size></size>    
     </fields>
    </tables>        
</tableconfig>

sample.xml 과 매핑되는 Class 생성 (JAXB 사용)
- Fields.java
- Tableconfig.java
- Tables.java

XML Bind
package jface.common.table;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.UnmarshallerHandler;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;

import jface.common.constants.Constants;
import jface.common.table.generated.Tableconfig;

public class TableXmlBinding {

 public Tableconfig getTableconfig() {
 
  try {
   ClassLoader cl = this.getClass().getClassLoader();
   JAXBContext context   = JAXBContext.newInstance(Tableconfig.class); 
   Unmarshaller unmarshaller  = context.createUnmarshaller();
  
   // Unmarshaller에서 저수준 처리기를 얻는다.
   UnmarshallerHandler unmarshallerHandler = unmarshaller.getUnmarshallerHandler();

   // SAX 파서를 얻기 위해 JAXP를 사용한다.
   SAXParserFactory factory = SAXParserFactory.newInstance();

   // factory 옵션을 설정한 다음, 표준 JAXP 호출을 사용한다.
   factory.setNamespaceAware(true);

  
   XMLReader reader = factory.newSAXParser().getXMLReader();

   // unmarshallerHandler로 reader 처리기를 설정한다.
   reader.setContentHandler(unmarshallerHandler);

   // 이제 JAXB에서 가져온 언마샬링 처리기를 사용해 구문분석에 들어간다.
   reader.parse(new InputSource(cl.getResourceAsStream(Constants.tableconfig)));
  
   Tableconfig instance = (Tableconfig)unmarshallerHandler.getResult();

   return instance;
  } catch(Exception e) {
   e.printStackTrace();
   return null;
  }
 }
}

Table 생성
package jface.common.table;

import java.util.List;

import jface.common.table.generated.Fields;
import jface.common.table.generated.Tableconfig;
import jface.common.table.generated.Tables;

import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;

public class DefineTable {

 Table makedTable;
 
 public DefineTable(Composite parent, int style) { 
  makedTable = new Table(parent, style);
 }

 public void makeTable(String tableId) {
 
  TableXmlBinding bind = new TableXmlBinding();
 
  Tableconfig config = bind.getTableconfig();
 
  List tables = config.getTables();
 
  for(int i = 0;i<tables.size();i++) {
   Tables table = (Tables)tables.get(i);
  
   String id = table.getId();
  
   if(id.equals(tableId)) {
    List fields = table.getFields();
  
    for(int j = 0;j<fields.size();j++) {
     Fields field = (Fields)fields.get(j);
    
     TableColumn col = new TableColumn (makedTable, SWT.CENTER);
     col.setText(field.getText());
    
     if(field.getSize() > 0) {
      col.setWidth(field.getSize());
     }   
    
     col.pack();
    }
   } 
  }
 }

 public Table getMakedTable() {
  return makedTable;
 }

 public void setMakedTable(Table makedTable) {
  this.makedTable = makedTable;
 }
}

Launcher
{
   Group group = new Group(this, SWT.NONE);
   group.setBackground(Display.getDefault().getSystemColor (SWT.COLOR_BLACK));
  
   DefineTable defineTable  = new DefineTable(group, SWT.MULTI | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.READ_ONLY | SWT.FULL_SELECTION); 
   defineTable.makeTable(Constants.table_body_result);
  
   detailTable = defineTable.getMakedTable();
   detailTable.setLinesVisible (true);
   detailTable.setHeaderVisible (true);
  
   GridLayoutFactory.fillDefaults().generateLayout(group);
}

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

[swt] - TreeTable TreeEditor  (0) 2010.06.29
[swt] Progress Bar(??)  (0) 2010.06.29
Posted by 짱가쟁이
Tree Table의 모든 Cell을 수정하고 싶은데.. 이거는 뭐.. 구글링을 해도 전체 셀을 수정하는 sample은 눈을 씻고 찾아도 안나옴. 어쩔수 없이 그냥 이것저것 짬뽕해서 만듬..

문제점.
마우스 좌표값을 가지고 작성한 것이기 때문에 마우스 이벤트(SWT.MouseDown, SWT.MouseDoubleClick)를 받아야만 동작함.

사용법
- 첨부파일을 참고하삼.
- Tree Listener에 작성된 리스너 등록하면 땡.
- ex> tree.addListener(SWT.MouseDown, new TreeAllCellEditorListener(editor));


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

[swt] - dynamic table 만들기  (0) 2010.06.29
[swt] Progress Bar(??)  (0) 2010.06.29
Posted by 짱가쟁이
2010. 6. 29. 15:45
구글링을 하다가 우연한 기회에 재미있는 기능을 가진 화면을 보고 .. 나도 저거 만들고 싶다라는 생각에 무식하게 만든넘.

- 프로그래스 바 사용전


- 프로그래스 바 구동




1. 사용방법
// 프로그래스바 인스턴스 생성
ProgressBar bar = new ProgressBar();

/**
   * 지정된 shell 에 전체화면 프로그래스를 그려준다.
   * 프로그래스를 그리면서 시작 콜백 메소드를 호출하고 끝나면
   * 프로그래스를 종료하면서 종료 콜백 메소드를 호출한다.
   *
   * @param shell
   *     프로그래스를 보여줄 shell
   * @param instance
   *     콜백함수를 포함하는 instance.
   * @param startMethod
   *     프로그래스 시작과 동시에 호출될 콜백함수(ex>비지니스 처리용)
   * @param endMethod
   *     프로그래스바 종료와 동시에 호출된 콜백함수(ex> 비지니스 결과 처리용)
   */
  bar.start(shell, this, "startMethod", "endMehod");

/**
  * 프로그래스바 시작과 동시에 호출됨. (콜백함수)
  *
  * 프로그래스바가 동작하면서 수행되는 비지니스(로그인 등)를 처리한다.
  */
 public void startMethod() { 
  // 비지니스 처리

  // ex> 로그인, 조회, 삭제 등등
 }

/**
  * 프로그래스바가 종료되면서 호출됨.(콜백함수)
  *
  * 프로그래스바가 종료되면서(비지니스가 종료됨) 해당 결과를 처리하는 메소드
  */
 public void endMehod(){
  // 비지니스 처리 결과를 보여줌.
  // ex> 로그인 성공, 실패 등
 }


ps.
  - 테스트 성으로 만들었기때문에 추후 사용 시 좀더 보완을 해야 할듯.( 콜백함수 파라미터 등등)
  - 안정성 테스트도 충분히 해야 할듯.. (아직까지는 발견 못함)
  - 리팩토링도 해야 함.

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

[swt] - dynamic table 만들기  (0) 2010.06.29
[swt] - TreeTable TreeEditor  (0) 2010.06.29
Posted by 짱가쟁이

1. 연결된 리더기 목록 가져오기
// TerminalFactory 인스턴스 얻기.
TerminalFactory terminalFactory = TerminalFactory.getInstance("PC/SC", null);

// 사용 가능한 CardTerminal  가져오기
List<CardTerminal> list = terminalFactory.terminals().list();

public String[] getReaderList() throws CardException {
 
    List<CardTerminal> list = terminalFactory.terminals().list();
    String[] readerList    = new String[list.size()];
   
    for(int i = 0;i<list.size();i++) {
     readerList[i] = ((CardTerminal)list.get(i)).getName();
    }
   
    return readerList;
}

2. 리더기에 Connect 하기
// 연결할 카드 터미널(스마트카드 리더) 가져오기
CardTerminal cardTerminal = terminalFactory.terminals().getTerminal("리더기 이름을 넣는다.");

// 프로토콜 설정하기
Card card = cardTerminal.connect("*");

// 채널 가져오기
CardChannel cardChannel = card.getBasicChannel();

public boolean connect(String readerName) {
 
    try {
        CardTerminal cardTerminal = terminalFactory.terminals().getTerminal(readerName);
       
        card = cardTerminal.connect("*");
        cardChannel = card.getBasicChannel();
       
        return true;
    } catch(Exception e) {
        e.printStackTrace();
        return false;
    }
}

3. 연결 끊기
public void disConnect() {
    try { 
        card.disconnect(true);       
        cardChannel = null;
        card   = null;
    } catch(Exception e) {
        e.printStackTrace();
    }
}

4. ATR 가져오기
// 접속된 카드 객체에서 ATR을 가져옴
card.getATR();

5. APDU 전송하기
public ResponseAPDU apdu(CommandAPDU cmd) {
    try {
        return cardChannel.transmit(cmd);
    } catch(Exception e) {
        e.printStackTrace();
        return null;
    }
}

SCard.java
package com.scard;

import java.security.NoSuchAlgorithmException;
import java.util.List;

import javax.smartcardio.ATR;
import javax.smartcardio.Card;
import javax.smartcardio.CardChannel;
import javax.smartcardio.CardException;
import javax.smartcardio.CardTerminal;
import javax.smartcardio.CardTerminals;
import javax.smartcardio.CommandAPDU;
import javax.smartcardio.ResponseAPDU;
import javax.smartcardio.TerminalFactory;

public class SCard {

 private TerminalFactory terminalFactory;
 private Card    card   = null;
 private CardChannel  cardChannel = null;
 
 public SCard() throws NullPointerException, NoSuchAlgorithmException {
  terminalFactory = TerminalFactory.getInstance("PC/SC", null);
 }
 
 public String[] getReaderList() throws CardException {
 
  List<CardTerminal> list = terminalFactory.terminals().list();
 
  String[] readerList    = new String[list.size()];
 
  for(int i = 0;i<list.size();i++) {
   readerList[i] = ((CardTerminal)list.get(i)).getName();
  }

  return readerList;
 }
 
 public boolean connect(String readerName) {
 
  try {
   CardTerminal cardTerminal = terminalFactory.terminals().getTerminal(readerName);

   card = cardTerminal.connect("*");
   cardChannel = card.getBasicChannel();
  
   return true;
  } catch(Exception e) {
   e.printStackTrace();
   return false;
  }
 }
 
 public ATR getATR() {
  return card.getATR();
 }
 
 public void disConnect() {
  try { 
   card.disconnect(true);
  
   cardChannel = null;
   card   = null;
  } catch(Exception e) {
   e.printStackTrace();
  }
 }
 
 public ResponseAPDU apdu(CommandAPDU cmd) {
 
  try {
   return cardChannel.transmit(cmd);
  } catch(Exception e) {
   e.printStackTrace();
   return null;
  }
 }
}

테스트
SCard sCard = new SCard();
 
// 리더기 목록 가져오기
String[] readers = sCard.getReaderList();

// 리더기에 연결하기
sCard.connect(readers[0]);

// 명령 APDU 생성하기
CommandAPDU commandApdu = new CommandAPDU((byte)0x00, (byte)0xA4, (byte)0x04, (byte)0x00, StringUtils.unHex("A0000000030000"), 0, (byte)0x07);

// APDU 전송하기
ResponseAPDU responseApdu = sCard.apdu(commandApdu);

// responseApdu : 잘 찾아보면 응닶값이랑.. sw가 있을거임..

'java > smart card' 카테고리의 다른 글

[wipi 2.0] - smart card i/o 하자  (0) 2010.07.16
[smart card] - smartcardio 사용하기(1)  (0) 2010.06.29
Posted by 짱가쟁이
현재까지 windows에서 java로 Smart Card I/O 하는 방법을 찾은건 2가지가 있다.

1. OpenCard Framwork(http://www.openscdp.org/ocf/)
    - 사용하기 귀찮고, 따로 api를 추가 시켜줘야함.

2. smartcardio 사용
    - OCF보다 사용하기 편하다.
    - jdk 1.6 버전  에서는 기본 API 제공한다.
    - javax.smartcardio.*

목표
    - javax.smartcardio.* API를 사용해서 Smart Card APDU Test Tool을 제작해보자.


'java > smart card' 카테고리의 다른 글

[wipi 2.0] - smart card i/o 하자  (0) 2010.07.16
[smart card] - smartcardio 사용하기(2)  (3) 2010.06.29
Posted by 짱가쟁이
- java web start로 app.를 배포하려고 함.
- Launcher.jar 로 묶을때 설정파일 및 이미지 등이 classpath내(jar 파일 안에)에 존재해야함.
- 이미지 초기화 하는 모듈("images/" 디렉토리에서 모든 파일을 읽어와서 이미지 파일만 초기화 시킴)에서 해당 디렉토리를 찾을 수 없다는 오류와 몇몇가지 문제가 발생됨.

 문제점
    - 디렉토리 디코딩 문제
    - eclipse로 개발할때와 jar로 묶었을때 바라보는 경로가 다름.

해결책
- eclipse로 개발시
        if (dirURL != null && dirURL.getProtocol().equals("file")) {
             /* A file path: easy enough */
             return new File(dirURL.toURI()).list();
        }

- jar로 묶었을때
        if (dirURL.getProtocol().equals("jar")) {

            // 해당 디렉토리 내 파일목록을 가져옴.

        }

사용방법(sample 참조)
try {
   // path 디렉토리내의 파일 리스트를 가져온다.
   String[] fineList = getResourceListing(this.getClass(), path);
} catch(Exception e) {
   e.printStackTrace();
}



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

[java] - byte array to float  (0) 2010.06.29
[java] - byte array to short  (0) 2010.06.29
[Reflection] - Value Object 로그 만들자  (0) 2010.06.28
[XML] - Pretty XML print  (0) 2010.06.28
[java] - 가변인자(??)  (0) 2010.06.28
Posted by 짱가쟁이
참조


Excel file을 다루는 Java APIs 를 소개한다. 위 참조를 보면 자세한 설명이 있음. 간략하게 소개하면..
1. Andy Khan's Java Excel API
2. The xlSQL Excel JDBC Driver
3. OpenXLS
4. Apache POI



Posted by 짱가쟁이