Questa specializzazione della classe UserContainerImpl estende le funzionalita' del Container originale, associando ad ogni Session un <u>Timestamp</u>: il Timestamp indica l'ultimo istante in cui lo User ha eseguito una qualche operazione sul Server.
Quando il Timestamp scade (cioe' quando viene superato un determinato Timeout, selezionato all'istanziazione del Container), lo User e la relativa Session vengono rimossi dal Server forzatamente.
Tutto cio' e' stato realizzato perche' l'interfacciamente a JAEBI, malgrado esser basato su autenticazione, non e' "<i>connection-oriented</i>": basandosi su "<i><b>Web Services-over-HTTP</b></i>" (l'unica tipologia di WS attualemente utilizzata), non esiste una Connessione fisica basata su <u>Socket</u> (come, ad esempio, in un Server FTP).
E' quindi necessaria una sorta di "<i>Garbage-Collecting</i>" degli User non piu' attivi ma che non hanno richiesto esplicitamente il logout.
La Classe implementa Runnable e, nel costruttore, fa partire un Thread con un ciclo infinito che controlla continuamente (ma con una pausa fissata per evitare inutile sovraccarico del Sistema) che non ci siano User che hanno superato il Timeout.
Definizione alla linea 46 del file TimeoutThreadedUserContainer.java.
Membri pubblici | |
TimeoutThreadedUserContainer (long userTimeOut, long timeOutCheckIntervall) | |
Costruttore TimeoutThreadedUserContainer. | |
synchronized boolean | addUser (User newUser) |
Aggiunge uno User. | |
synchronized boolean | addUser (String nick, Session session, String type) |
Aggiunge uno User. | |
synchronized boolean | removeUser (Session session) |
Gestisce anche la rimozione del relativo oggetto SessionLastAccessTimestamp. | |
synchronized User | getUser (Session session) |
Gestisce anche l'aggiornamento del relativo oggetto SessionLastAccessTimestamp. | |
void | run () |
Flusso di Controllo per l'eliminazione degli User che non si connettono da troppo tempo. | |
synchronized boolean | contains (Session session) |
Verifica se uno User con quel Session e' presente. | |
synchronized ArrayList | getUsersByNick (String nick) |
Testare questo metodo e verificare che non apporti cambiamenti al Container. | |
synchronized ArrayList | getUsersByType (String type) |
Testare questo metodo e verificare che non apporti cambiamenti al Container. | |
synchronized int | size () |
Numero di User presenti nel Container. | |
synchronized void | clear () |
Rimuove tutti gli User presenti. | |
synchronized boolean | isEmpty () |
Verifica che non ci siano User. | |
synchronized Collection | toCollection () |
Converte il Container in una Collection di User. | |
String | toString () |
Converte il contenuto del Container in Stringa. | |
Attributi protetti | |
final HashMap | container |
La scelta del Container e' caduta su una HashMap per una questione di prestazioni. | |
Attributi privati | |
final HashMap | timedSessions |
HashMap che contiene oggetti di tipo SessionLastAccessTimestamp. | |
final long | timeOutCheckIntervall |
Intervallo tra un controllo sul Timeout User e il successivo. | |
final long | userTimeOut |
Tempo di Timeout per gli User. | |
Attributi privati statici | |
static final long | sleepTime = 10000 |
Tempo di Sleep del Thread di "Garbage-Collecting". | |
Composti | |
class | SessionLastAccessTimestamp |
Classe Container utile ad associare un Timestamp di "ultimo accesso" ad una Session di uno User. Continua... |
|
Costruttore TimeoutThreadedUserContainer.
Definizione alla linea 109 del file TimeoutThreadedUserContainer.java. Riferimenti org.jaebi.server.core.TimeoutThreadedUserContainer.timedSessions. 00109 { 00110 super(); 00111 00112 timedSessions = new HashMap(); 00113 this.userTimeOut = userTimeOut; 00114 this.timeOutCheckIntervall = timeOutCheckIntervall; 00115 new Thread(this).start(); 00116 }
|
|
Aggiunge uno User. Gestisce anche la creazione del relativo oggetto SessionLastAccessTimestamp.
Reimplementa org.jaebi.server.core.UserContainerImpl. Definizione alla linea 142 del file TimeoutThreadedUserContainer.java. Riferimenti org.jaebi.server.core.TimeoutThreadedUserContainer.timedSessions. 00142 { 00143 timedSessions.put( 00144 nick, 00145 new SessionLastAccessTimestamp( session ) 00146 ); 00147 00148 return super.addUser( nick, session, type); 00149 }
|
|
Aggiunge uno User. Gestisce anche la creazione del relativo oggetto SessionLastAccessTimestamp.
Reimplementa org.jaebi.server.core.UserContainerImpl. Definizione alla linea 126 del file TimeoutThreadedUserContainer.java. Riferimenti org.jaebi.server.core.User.getNick(), org.jaebi.server.core.User.getSession(), e org.jaebi.server.core.TimeoutThreadedUserContainer.timedSessions. 00126 { 00127 timedSessions.put( 00128 newUser.getNick(), 00129 new SessionLastAccessTimestamp( newUser.getSession() ) 00130 ); 00131 return super.addUser( newUser ); 00132 }
Questo è il grafo delle chiamate per questa funzione: ![]() |
|
Rimuove tutti gli User presenti.
Implementa org.jaebi.server.core.UserContainer. Definizione alla linea 106 del file UserContainerImpl.java. Riferimenti org.jaebi.server.core.UserContainerImpl.container. 00106 { container.clear(); }
|
|
Verifica se uno User con quel Session e' presente.
Implementa org.jaebi.server.core.UserContainer. Definizione alla linea 62 del file UserContainerImpl.java. Riferimenti org.jaebi.server.core.UserContainerImpl.container. Referenziato da org.jaebi.server.core.UserContainerImpl.addUser(). 00062 { 00063 return container.containsKey(session); 00064 }
|
|
Gestisce anche l'aggiornamento del relativo oggetto SessionLastAccessTimestamp.
Reimplementa org.jaebi.server.core.UserContainerImpl. Definizione alla linea 169 del file TimeoutThreadedUserContainer.java. Riferimenti org.jaebi.server.core.User.getNick(), org.jaebi.server.core.TimeoutThreadedUserContainer.timedSessions, e org.jaebi.server.core.TimeoutThreadedUserContainer.SessionLastAccessTimestamp.update(). 00169 { 00170 User user = super.getUser(session); 00171 if ( user != null ) { 00172 SessionLastAccessTimestamp sessionLastAccess = 00173 (SessionLastAccessTimestamp)timedSessions.get( user.getNick() ); 00174 00175 sessionLastAccess.update(); 00176 } 00177 00178 return user; 00179 }
Questo è il grafo delle chiamate per questa funzione: ![]() |
|
Testare questo metodo e verificare che non apporti cambiamenti al Container.
Implementa org.jaebi.server.core.UserContainer. Definizione alla linea 73 del file UserContainerImpl.java. Riferimenti org.jaebi.server.core.UserContainerImpl.container, e org.jaebi.server.core.User.getNick(). 00073 { 00074 Collection allUsers = container.values(); 00075 ArrayList selected = new ArrayList(); 00076 Iterator iter = allUsers.iterator(); 00077 00078 while( iter.hasNext() ) { 00079 User currUser = (User)iter.next(); 00080 if ( currUser.getNick().equals(nick) ) 00081 selected.add(currUser); 00082 } 00083 00084 return selected; 00085 }
Questo è il grafo delle chiamate per questa funzione: ![]() |
|
Testare questo metodo e verificare che non apporti cambiamenti al Container.
Implementa org.jaebi.server.core.UserContainer. Definizione alla linea 90 del file UserContainerImpl.java. Riferimenti org.jaebi.server.core.UserContainerImpl.container, e org.jaebi.server.core.User.getType(). 00090 { 00091 Collection allUsers = container.values(); 00092 ArrayList selected = new ArrayList(); 00093 Iterator iter = allUsers.iterator(); 00094 00095 while( iter.hasNext() ) { 00096 User currUser = (User)iter.next(); 00097 if ( currUser.getType().equals(type) ) 00098 selected.add(currUser); 00099 } 00100 00101 return selected; 00102 }
Questo è il grafo delle chiamate per questa funzione: ![]() |
|
Verifica che non ci siano User.
Implementa org.jaebi.server.core.UserContainer. Definizione alla linea 108 del file UserContainerImpl.java. Riferimenti org.jaebi.server.core.UserContainerImpl.container. 00108 { return container.isEmpty(); }
|
|
Gestisce anche la rimozione del relativo oggetto SessionLastAccessTimestamp.
Reimplementa org.jaebi.server.core.UserContainerImpl. Definizione alla linea 156 del file TimeoutThreadedUserContainer.java. Riferimenti org.jaebi.server.core.User.getNick(), e org.jaebi.server.core.TimeoutThreadedUserContainer.timedSessions. Referenziato da org.jaebi.server.core.TimeoutThreadedUserContainer.run(). 00156 { 00157 User user = super.getUser(session); 00158 if ( user != null ) 00159 timedSessions.remove( user.getNick() ); 00160 00161 return super.removeUser(session); 00162 }
Questo è il grafo delle chiamate per questa funzione: ![]() |
|
Flusso di Controllo per l'eliminazione degli User che non si connettono da troppo tempo. Controlla i Timestamp relativi all'ultimo accesso degli User e, se troppo inveriore rispetto al Timestamp corrente, lo User viene eliminato. Definizione alla linea 189 del file TimeoutThreadedUserContainer.java. Riferimenti org.jaebi.server.core.TimeoutThreadedUserContainer.SessionLastAccessTimestamp.getLastAccessTimestamp(), org.jaebi.server.core.TimeoutThreadedUserContainer.SessionLastAccessTimestamp.getSession(), org.jaebi.server.core.TimeoutThreadedUserContainer.removeUser(), e org.jaebi.server.core.TimeoutThreadedUserContainer.timedSessions. 00189 { 00190 // Recupero Set contenente tutte le SessionLastAccessTimestamp registrate 00191 Collection timedSessionsColl = timedSessions.values(); 00192 Iterator iter; 00193 SessionLastAccessTimestamp currSessionLastAccess; 00194 long actualTimestamp; 00195 // Collezione delle Sessioni degli User da eliminare 00196 ArrayList toDelete = new ArrayList(); 00197 00198 // Ciclo Indefinito: continua sino alla distruzione dell'Istanza 00199 while ( true ) { 00200 // Iteratore sugli oggetti SessionLastAccessTimestamp 00201 iter = timedSessionsColl.iterator(); 00202 // Timestamp attuale in millisecondi 00203 actualTimestamp = new GregorianCalendar().getTimeInMillis(); 00204 // Iteriamo sui SessionLastAccessTimestamp 00205 while ( iter.hasNext() ) { 00206 currSessionLastAccess = (SessionLastAccessTimestamp)iter.next(); 00207 // Se lo User e' inattivo da troppo tempo 00208 if ( 00209 ( actualTimestamp - 00210 currSessionLastAccess.getLastAccessTimestamp() ) 00211 >= this.userTimeOut 00212 ) { 00213 // Conservazione della Session da Eliminare 00214 toDelete.add( currSessionLastAccess.getSession() ); 00215 } 00216 } 00217 00218 // Iteratore sugli oggetti Session da Eliminare 00219 iter = toDelete.iterator(); 00220 while ( iter.hasNext() ) { 00221 // Rimozione User relativo alla Session "scaduta" 00222 removeUser( (Session)iter.next() ); 00223 } 00224 // Pulizia della lista di Session da Eliminare 00225 toDelete.clear(); 00226 // Suggerimento per la JVM di pulire la memoria 00227 System.gc(); 00228 00229 try { 00230 Thread.sleep(TimeoutThreadedUserContainer.sleepTime); 00231 } catch (InterruptedException e) { } 00232 } 00233 }
Questo è il grafo delle chiamate per questa funzione: ![]() |
|
Numero di User presenti nel Container.
Implementa org.jaebi.server.core.UserContainer. Definizione alla linea 104 del file UserContainerImpl.java. Riferimenti org.jaebi.server.core.UserContainerImpl.container. 00104 { return container.size(); }
|
|
Converte il Container in una Collection di User. I cambiamenti esequiti sulla Collection generato si riflettono sugli User presenti nel Container.
Implementa org.jaebi.server.core.UserContainer. Definizione alla linea 110 del file UserContainerImpl.java. Riferimenti org.jaebi.server.core.UserContainerImpl.container. 00110 { 00111 return (Collection)container.values(); 00112 }
|
|
Converte il contenuto del Container in Stringa. Utile per l'auto conversione in String.
Implementa org.jaebi.server.core.UserContainer. Definizione alla linea 114 del file UserContainerImpl.java. Riferimenti org.jaebi.server.core.UserContainerImpl.container. 00114 { 00115 Iterator iter = container.values().iterator(); 00116 StringBuffer buffer = new StringBuffer(); 00117 00118 while ( iter.hasNext() ) { 00119 buffer.append( iter.next().toString() + "\n"); 00120 } 00121 return buffer.toString(); 00122 }
|
|
|
Tempo di Sleep del Thread di "Garbage-Collecting".
Definizione alla linea 99 del file TimeoutThreadedUserContainer.java. |
|
HashMap che contiene oggetti di tipo SessionLastAccessTimestamp. Questi oggetti saranno indicizzati in base al nome degli User per velocizzare il loro recupero. Definizione alla linea 91 del file TimeoutThreadedUserContainer.java. Referenziato da org.jaebi.server.core.TimeoutThreadedUserContainer.addUser(), org.jaebi.server.core.TimeoutThreadedUserContainer.getUser(), org.jaebi.server.core.TimeoutThreadedUserContainer.removeUser(), org.jaebi.server.core.TimeoutThreadedUserContainer.run(), e org.jaebi.server.core.TimeoutThreadedUserContainer.TimeoutThreadedUserContainer(). |
|
Intervallo tra un controllo sul Timeout User e il successivo.
Definizione alla linea 95 del file TimeoutThreadedUserContainer.java. |
|
Tempo di Timeout per gli User.
Definizione alla linea 97 del file TimeoutThreadedUserContainer.java. |