/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.infotechservice.smartcard.service;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import javax.smartcardio.CardException;
import javax.smartcardio.CardTerminal;
import javax.smartcardio.CardTerminals;
import javax.smartcardio.TerminalFactory;
/**
* Инкапсулирует терминалы считывателей карт
* @author Axe
*/
class Terminals {
private CardTerminals terminals = attach();
private synchronized CardTerminals attach() {
if (terminals != null) {
return terminals;
}
TerminalFactory factory = TerminalFactory.getDefault();
terminals = factory.terminals();
return terminals;
}
/**
* Отключается от списка терминалов
*/
public synchronized void detach() {
terminals = null;
}
public synchronized List<CardTerminal> getTerminals() throws CardException {
CardTerminals term = attach();
if(term != null) {
return term.list();
}
return new LinkedList<CardTerminal>();
}
/**
* Возвращает терминалы со вставленной картой
* @return
* @throws CardException
*/
public synchronized List<CardTerminal> getTerminalsWithCard() throws CardException {
CardTerminals term = attach();
if(term != null) {
return term.list(CardTerminals.State.CARD_PRESENT);
}
return new LinkedList<CardTerminal>();
}
/**
* Ожидаение события на одном из доступных терминалов
* Блокирующийся метод.
* @param timeout время в миллисекундах
* @return список терминалов со вставленной картой
* @throws CardException
*/
public List<CardTerminal> waitForEvent(long timeout) throws CardException {
CardTerminals term = attach();
if (term != null && term.waitForChange(timeout)) {
try {
List<CardTerminal> all = new ArrayList<CardTerminal>();
List<CardTerminal> inserted = term.list(CardTerminals.State.CARD_INSERTION);
List<CardTerminal> removed = term.list(CardTerminals.State.CARD_REMOVAL);
if(inserted != null) {
for (CardTerminal cardTerminal : inserted) {
System.out.println("insert card in: " + cardTerminal.getName());
}
all.addAll(inserted);
}
if(removed != null) {
for (CardTerminal cardTerminal : removed) {
System.out.println("remove card from: " + cardTerminal.getName());
}
all.addAll(removed);
}
return all;
} catch (CardException ex) {
// nothing to do
}
}
return new LinkedList<CardTerminal>();
}
}