매번 테이블을 만들기도 귀찮고.. 테이블을 동적으로 생성하게 만들어 놓으면 혹시나.. 서버에서 보내는 데이터를 토대로 테이블을 만들어 주면 좋겟다.. 라는 생각으로 만들게됨.

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 짱가쟁이
구글링중 쓸만한 기사가 있어서 올린다.

Working with XML on Android : http://www.ibm.com/developerworks/library/x-android/

'android' 카테고리의 다른 글

[android] - Log 사용하기  (0) 2010.06.30
[android] - AlertDialog 사용하기  (0) 2010.06.29
[android] - Intent  (0) 2010.06.29
Posted by 짱가쟁이

사용 예
package com.demo.grid;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;

public class GridViewOnItemClickListener implements OnItemClickListener {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
      AlertDialog dlg = new AlertDialog.Builder(parent.getContext()).create();
      dlg.setTitle("타이틀");
      dlg.setMessage(position + " 번째 item 을 선택했습니다."); 
      dlg.setCancelable(false);
      dlg.setButton("OK", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) {
             dialog.cancel();
        }
      });
      dlg.show();
    }
}

'android' 카테고리의 다른 글

[android] - Log 사용하기  (0) 2010.06.30
[android] - XML 가지고 놀기  (0) 2010.06.29
[android] - Intent  (0) 2010.06.29
Posted by 짱가쟁이
2010. 6. 29. 15:17
Intent는 component(activities, services, broadcast receivers) 를 활성화할 때 사용되는 비동기 메시지이다.

예를 들어, 단순한 텍스트 기반의 리스트가 있다고 가정하자. 이 때 리스트에서 특정 item을 선택(push) 하 면 상세페이지로 전화되고 그 화면에 리스트 item을 전달하고 싶으면 어떻게 해야 할까? 이때 사용하는 넘이 Intent 다.

사용 예
- 상세 화면 Active 코드
Intent myIntent = new Intent();
myIntent.setClassName("com.example.helloandroid", "com.example.helloandroid.DetailView");
myIntent.putExtra("key", l.getItemAtPosition(position).toString());

startActivity(myIntent);

Mainfest.xml 설정
- mainfest.xml 안에 상세 화면 Activity 를 선언해야지 사용할 수 있다.
- 참조 :  http://developer.android.com/reference/android/content/Intent.html
<activity android:name=".DetailView"
          android:label="@string/app_name">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

'android' 카테고리의 다른 글

[android] - Log 사용하기  (0) 2010.06.30
[android] - XML 가지고 놀기  (0) 2010.06.29
[android] - AlertDialog 사용하기  (0) 2010.06.29
Posted by 짱가쟁이
이넘 저넘 찾아보다 쓸만한 방법을 찾음.



Class Root 에 /META-INF/cxf/org.apache.cxf.Logger 생성

추가
org.apache.cxf.common.logging.Log4jLogger

Posted by 짱가쟁이