001 package org.cumulus4j.keymanager.api.internal.local; 002 003 import java.io.IOException; 004 005 import org.cumulus4j.keymanager.AppServer; 006 import org.cumulus4j.keymanager.api.AuthenticationException; 007 import org.cumulus4j.keymanager.api.CryptoSession; 008 009 /** 010 * @author Marco หงุ่ยตระกูล-Schulze - marco at nightlabs dot de 011 */ 012 public class LocalCryptoSession implements CryptoSession 013 { 014 private LocalKeyManagerAPI localKeyManagerAPI; 015 016 private AppServer appServer; 017 018 public LocalCryptoSession(LocalKeyManagerAPI localKeyManagerAPI, AppServer appServer) 019 { 020 if (localKeyManagerAPI == null) 021 throw new IllegalArgumentException("localKeyManagerAPI == null"); 022 023 this.localKeyManagerAPI = localKeyManagerAPI; 024 this.appServer = appServer; 025 } 026 027 @Override 028 public String getAppServerID() { 029 return appServer.getAppServerID(); 030 } 031 032 @Override 033 public String getAppServerBaseURL() { 034 return appServer.getAppServerBaseURL(); 035 } 036 037 // @Override 038 // public String getCryptoSessionID() throws AuthenticationException, IOException 039 // { 040 // org.cumulus4j.keymanager.Session rs = realSession; 041 // if (rs == null) 042 // return null; 043 // else 044 // return rs.getCryptoSessionID(); 045 //// try { 046 //// return appServer.getSessionManager().openSession(localKeyManagerAPI.getAuthUserName(), localKeyManagerAPI.getAuthPassword()).getCryptoSessionID(); 047 //// } catch (org.cumulus4j.keystore.AuthenticationException e) { 048 //// throw new AuthenticationException(e); 049 //// } 050 // } 051 052 private int unlockCounter = 0; 053 054 private org.cumulus4j.keymanager.Session realSession = null; 055 056 @Override 057 public synchronized String acquire() throws AuthenticationException, IOException 058 { 059 ++unlockCounter; 060 if (realSession == null) { 061 try { 062 realSession = appServer.getSessionManager().acquireSession(localKeyManagerAPI.getAuthUserName(), localKeyManagerAPI.getAuthPassword()); 063 } catch (org.cumulus4j.keystore.AuthenticationException e) { 064 throw new AuthenticationException(e); 065 } 066 } 067 else { 068 realSession.reacquire(); 069 } 070 return realSession.getCryptoSessionID(); 071 } 072 073 @Override 074 public synchronized void release() throws AuthenticationException, IOException 075 { 076 int counter = --unlockCounter; 077 078 if (counter < 0) 079 throw new IllegalStateException("lock() called more often than unlock()!!!"); 080 081 if (counter > 0) 082 return; 083 084 if (realSession == null) 085 throw new IllegalStateException("unlockCounter inconsistent with realSession! realSession is null!"); 086 realSession.release(); 087 realSession = null; 088 } 089 090 // @Override 091 // public void close() { 092 // org.cumulus4j.keymanager.Session underlyingSession = appServer.getSessionManager().getSessionForUserName(localKeyManagerAPI.getAuthUserName()); 093 // if (underlyingSession != null) 094 // underlyingSession.close(); 095 // } 096 097 }