From 16b188bae57cfc10c94a0e251a815ab35345e113 Mon Sep 17 00:00:00 2001 From: wbauer Date: Mon, 3 Nov 2008 11:11:30 +0000 Subject: git-svn-id: https://joinup.ec.europa.eu/svn/mocca/trunk@139 8a26b1a7-26f0-462f-b9ef-d0e30c41f5a4 --- .../at/gv/egiz/bku/smccstal/AbstractSMCCSTAL.java | 127 ++++++++++++--------- .../java/at/gv/egiz/smcc/AbstractSMCCSTALTest.java | 110 ++++++++++++++++++ 2 files changed, 183 insertions(+), 54 deletions(-) create mode 100644 smccSTAL/src/test/java/at/gv/egiz/smcc/AbstractSMCCSTALTest.java (limited to 'smccSTAL') diff --git a/smccSTAL/src/main/java/at/gv/egiz/bku/smccstal/AbstractSMCCSTAL.java b/smccSTAL/src/main/java/at/gv/egiz/bku/smccstal/AbstractSMCCSTAL.java index cf524737..f310dd42 100644 --- a/smccSTAL/src/main/java/at/gv/egiz/bku/smccstal/AbstractSMCCSTAL.java +++ b/smccSTAL/src/main/java/at/gv/egiz/bku/smccstal/AbstractSMCCSTAL.java @@ -18,22 +18,22 @@ package at.gv.egiz.bku.smccstal; import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.Set; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import at.gv.egiz.bku.gui.BKUGUIFacade; import at.gv.egiz.smcc.SignatureCard; -import at.gv.egiz.smcc.util.SMCCHelper; import at.gv.egiz.stal.ErrorResponse; import at.gv.egiz.stal.InfoboxReadRequest; import at.gv.egiz.stal.STAL; import at.gv.egiz.stal.STALRequest; import at.gv.egiz.stal.STALResponse; -import at.gv.egiz.stal.SignRequest; public abstract class AbstractSMCCSTAL implements STAL { private static Log log = LogFactory.getLog(AbstractSMCCSTAL.class); @@ -45,9 +45,11 @@ public abstract class AbstractSMCCSTAL implements STAL { protected Map handlerMap = new HashMap(); protected int maxRetries = DEFAULT_MAX_RETRIES; + protected Set unrecoverableErrors = new HashSet(); protected AbstractSMCCSTAL() { addRequestHandler(InfoboxReadRequest.class, new InfoBoxReadRequestHandler()); + unrecoverableErrors.add(6001); } /** @@ -59,66 +61,76 @@ public abstract class AbstractSMCCSTAL implements STAL { protected abstract BKUGUIFacade getGUI(); + private STALResponse getRespone(STALRequest request) { + log.info("Processing: " + request.getClass()); + int retryCounter = 0; + while (retryCounter < maxRetries) { + log.info("Retry #" + retryCounter + " of " + maxRetries); + SMCCSTALRequestHandler handler = null; + handler = handlerMap.get(request.getClass().getSimpleName()); + if (handler != null) { + if (handler.requireCard()) { + if (waitForCard()) { + return new ErrorResponse(6001); + } + } + try { + handler.init(signatureCard, getGUI()); + STALResponse response = handler.handleRequest(request); + if (response != null) { + if (response instanceof ErrorResponse) { + log.info("Got an error response"); + ErrorResponse err = (ErrorResponse) response; + if (unrecoverableErrors.contains(err.getErrorCode())) { + return response; + } + if ((++retryCounter < maxRetries) && (handler.requireCard())) { + signatureCard.disconnect(true); + signatureCard = null; + } else { + log.info("Exceeded max retries, returning error " + + err.getErrorMessage()); + return response; + } + } else { + return response; + } + } else { + log.info("Got null response from handler, assuming quit"); + return null; + } + } catch (Exception e) { + log.info("Error while handling STAL request:" + e); + if (++retryCounter < maxRetries) { + signatureCard.disconnect(true); + signatureCard = null; + } else { + log.info("Exceeded max retries, returning error."); + return new ErrorResponse(6000); + } + } + } else { + log.error("Cannot find a handler for STAL request: " + request); + return new ErrorResponse(); + } + } + return new ErrorResponse(6000); + } + @Override public List handleRequest(List requestList) { log.debug("Got request list containing " + requestList.size() + " STAL requests"); List responseList = new ArrayList(requestList .size()); - for (STALRequest request : requestList) { log.info("Processing: " + request.getClass()); - int retryCounter = 0; - while (retryCounter < maxRetries) { - log.info("Number of retries: " + retryCounter); - SMCCSTALRequestHandler handler = null; - handler = handlerMap.get(request.getClass().getSimpleName()); - if (handler != null) { - if (handler.requireCard()) { - if (waitForCard()) { - responseList.add(new ErrorResponse(6001)); - break; - } - } - try { - handler.init(signatureCard, getGUI()); - STALResponse response = handler.handleRequest(request); - if (response != null) { - if (response instanceof ErrorResponse) { - log.info("Got an error response"); - ErrorResponse err = (ErrorResponse) response; - if (err.getErrorCode() == 6001) { - retryCounter = Integer.MAX_VALUE - 1; - } - if (++retryCounter < maxRetries) { - log.info("Retrying"); - signatureCard.disconnect(true); - signatureCard = null; - } else { - responseList.add(response); - } - } else { - responseList.add(response); - retryCounter = Integer.MAX_VALUE; - break; - } - } else { - log.info("Got null response from handler, assuming quit"); - retryCounter = Integer.MAX_VALUE; - } - } catch (Exception e) { - log.info("Error while handling STAL request:" + e); - if (++retryCounter < maxRetries) { - log.info("Retrying"); - signatureCard.disconnect(true); - signatureCard = null; - } else { - responseList.add(new ErrorResponse(6000)); - } - } - } else { - log.error("Cannot find a handler for STAL request: " + request); - responseList.add(new ErrorResponse()); + STALResponse response = getRespone(request); + if (response != null) { + responseList.add(response); + if (response instanceof ErrorResponse) { + log.info("Got an error response, don't process remaining requests"); + break; } } } @@ -148,4 +160,11 @@ public abstract class AbstractSMCCSTAL implements STAL { this.maxRetries = maxRetries; } + public Set getUnrecoverableErrors() { + return unrecoverableErrors; + } + + public void setUnrecoverableErrors(Set unrecoverableErrors) { + this.unrecoverableErrors = unrecoverableErrors; + } } diff --git a/smccSTAL/src/test/java/at/gv/egiz/smcc/AbstractSMCCSTALTest.java b/smccSTAL/src/test/java/at/gv/egiz/smcc/AbstractSMCCSTALTest.java new file mode 100644 index 00000000..59ea141c --- /dev/null +++ b/smccSTAL/src/test/java/at/gv/egiz/smcc/AbstractSMCCSTALTest.java @@ -0,0 +1,110 @@ +package at.gv.egiz.smcc; + +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +import javax.smartcardio.Card; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import at.gv.egiz.bku.gui.BKUGUIFacade; +import at.gv.egiz.bku.smccstal.AbstractSMCCSTAL; +import at.gv.egiz.bku.smccstal.SMCCSTALRequestHandler; +import at.gv.egiz.stal.ErrorResponse; +import at.gv.egiz.stal.InfoboxReadRequest; +import at.gv.egiz.stal.InfoboxReadResponse; +import at.gv.egiz.stal.STALRequest; +import at.gv.egiz.stal.STALResponse; + +public class AbstractSMCCSTALTest extends AbstractSMCCSTAL implements + SMCCSTALRequestHandler { + private int errorConter; + + @Override + protected BKUGUIFacade getGUI() { + // TODO Auto-generated method stub + return null; + } + + @Override + protected boolean waitForCard() { + signatureCard = new SignatureCard() { + + @Override + public byte[] createSignature(byte[] hash, KeyboxName keyboxName, + PINProvider provider) throws SignatureCardException { + // TODO Auto-generated method stub + return null; + } + + @Override + public void disconnect(boolean reset) { + // TODO Auto-generated method stub + + } + + @Override + public byte[] getCertificate(KeyboxName keyboxName) + throws SignatureCardException { + // TODO Auto-generated method stub + return null; + } + + @Override + public byte[] getInfobox(String infobox, PINProvider provider, + String domainId) throws SignatureCardException { + // TODO Auto-generated method stub + return null; + } + + @Override + public void init(Card card) { + // TODO Auto-generated method stub + + } + + @Override + public void setLocale(Locale locale) { + // TODO Auto-generated method stub + + } + + }; + return false; + } + + @Before + public void setUp() { + addRequestHandler(InfoboxReadRequest.class, this); + } + + @Test + public void testRetry() { + InfoboxReadRequest irr = new InfoboxReadRequest(); + List irrl = new ArrayList(); + irrl.add(irr); + List list = handleRequest(irrl); + Assert.assertFalse(list.get(0) instanceof ErrorResponse); + } + + @Override + public STALResponse handleRequest(STALRequest request) { + if (++errorConter < 3) { + return new ErrorResponse(400); + } + return new InfoboxReadResponse(); + } + + @Override + public void init(SignatureCard sc, BKUGUIFacade gui) { + } + + @Override + public boolean requireCard() { + return true; + } + +} -- cgit v1.2.3