From 144c0133dcb107b30799a310ba51460d6479358d Mon Sep 17 00:00:00 2001 From: wbauer Date: Thu, 9 Oct 2008 13:14:45 +0000 Subject: Added an smcc retry function to make smartcard access more robust. git-svn-id: https://joinup.ec.europa.eu/svn/mocca/trunk@89 8a26b1a7-26f0-462f-b9ef-d0e30c41f5a4 --- .../at/gv/egiz/bku/smccstal/AbstractSMCCSTAL.java | 111 +++++++++++++-------- 1 file changed, 72 insertions(+), 39 deletions(-) (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 8ee70f1a..c453e06e 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 @@ -1,19 +1,19 @@ /* -* Copyright 2008 Federal Chancellery Austria and -* Graz University of Technology -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ + * Copyright 2008 Federal Chancellery Austria and + * Graz University of Technology + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package at.gv.egiz.bku.smccstal; import java.util.ArrayList; @@ -37,15 +37,19 @@ import at.gv.egiz.stal.SignRequest; public abstract class AbstractSMCCSTAL implements STAL { private static Log log = LogFactory.getLog(AbstractSMCCSTAL.class); + + public final static int DEFAULT_MAX_RETRIES = 3; protected Locale locale = Locale.getDefault(); -// protected SMCCHelper smccHelper = new SMCCHelper(); + // protected SMCCHelper smccHelper = new SMCCHelper(); protected SignatureCard signatureCard = null; protected static Map handlerMap = new HashMap(); + + protected int maxRetries = DEFAULT_MAX_RETRIES; static { addRequestHandler(InfoboxReadRequest.class, new InfoBoxReadRequestHandler()); -// addRequestHandler(SignRequest.class, new SignRequestHandler()); + // addRequestHandler(SignRequest.class, new SignRequestHandler()); } /** @@ -58,37 +62,61 @@ public abstract class AbstractSMCCSTAL implements STAL { protected abstract BKUGUIFacade getGUI(); @Override - public List handleRequest( - List requestList) { + 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()); - SMCCSTALRequestHandler handler = null; - handler = handlerMap.get(request.getClass().getSimpleName()); - if (handler != null) { - if (handler.requireCard()) { - if (waitForCard()) { - responseList.add(new ErrorResponse(6001)); - break; + 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 = handler.newInstance(); - handler.init(signatureCard, getGUI()); - STALResponse response = handler.handleRequest(request); - if (response != null) { - responseList.add(response); + try { + handler = handler.newInstance(); + handler.init(signatureCard, getGUI()); + STALResponse response = handler.handleRequest(request); + if (response != null) { + if (response instanceof ErrorResponse) { + log.info("Got an error response"); + if (++retryCounter < maxRetries) { + log.info("Retrying"); + 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 = null; + } else { + responseList.add(new ErrorResponse(6000)); + } } - } catch (Exception e) { - log.info("Error while handling STAL request:" + e); - responseList.add(new ErrorResponse(6000)); + } else { + log.error("Cannot find a handler for STAL request: " + request); + responseList.add(new ErrorResponse()); } - } else { - log.error("Cannot find a handler for STAL request: " + request); - responseList.add(new ErrorResponse()); } } return responseList; @@ -112,4 +140,9 @@ public abstract class AbstractSMCCSTAL implements STAL { } this.locale = locale; } + + public void setMaxRetries(int maxRetries) { + this.maxRetries = maxRetries; + } + } -- cgit v1.2.3