package edu.stanford.prpl.phoneIdp.server.impl; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import edu.stanford.prpl.phoneIdp.common.PhoneIdpCommon; import edu.stanford.prpl.phoneIdp.server.api.AccountEntry; import edu.stanford.prpl.phoneIdp.server.api.AccountStore; import edu.stanford.prpl.phoneIdp.server.api.AuthCode; import edu.stanford.prpl.phoneIdp.server.api.AuthCodeCache; import edu.stanford.prpl.phoneIdp.server.api.AuthCodeCacheEntry; public class AuthCodeCacheImpl extends AuthCodeCache { private static final Log log = LogFactory.getLog(AuthCodeCacheImpl.class); private static AuthCodeCacheImpl theInstance = null; private AuthCodeCacheImpl() { authCodeOidMap = new HashMap<String, AuthCodeCacheEntry>(); accountStore_ = AccountStoreImpl.getInstance(); } public synchronized static AuthCodeCacheImpl getInstance() { if (theInstance == null) { theInstance = new AuthCodeCacheImpl(); } return theInstance; } @Override public boolean add(String authCode, String oid) { boolean result = false; AuthCodeCacheEntry entry = new AuthCodeCacheEntryImpl(authCode, oid); authCodeOidMap.put(authCode, entry); result = true; log.info("AuthCodeCacheImpl.add: New size is: " + authCodeOidMap.size()); return result; } @Override public void deactivateUsed() { //todo. may not need it } public void deactivate(String authCode) { AuthCodeCacheEntry cacheEntry = authCodeOidMap.get(authCode); authCodeOidMap.remove(authCode); log.info("AuthCodeCacheImpl.deactivate: New size is: " + authCodeOidMap.size()); } @Override public void deactivateExpired() { //Step thru authcodes, delete the ones that are order Iterator<String> it = authCodeOidMap.keySet().iterator(); while (it.hasNext()) { String authCode = it.next(); AuthCodeCacheEntry cacheEntry = authCodeOidMap.get(authCode); Date now = new Date(); AuthCode acode = cacheEntry.getAuthCode_(); String oid = cacheEntry.getOid_(); Date entryDate = acode.getIssueDateTime(); Long elapsed = now.getTime() - entryDate.getTime(); if (elapsed > PhoneIdpCommon.AUTHCODE_VALID_DURATION_MS) { //Delete overhead elsewhere //Update the credential if (accountStore_ != null) { accountStore_.validateAuthCode(oid, acode); } authCodeOidMap.remove(authCode); log.info("AuthCodeCacheImpl.deactivateExpired: New size is: " + authCodeOidMap.size()); } } } @Override public AuthCodeCacheEntry get(String authCode) { return authCodeOidMap.get(authCode); } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub } @Override public void printEntries() { for (Iterator<String> it = authCodeOidMap.keySet().iterator(); it.hasNext();) { String entry = it.next(); log.info("AuthCodeCache: AuthCode" + entry + ", " + authCodeOidMap.get(entry).toString()); } } }