Riferimenti per la classe org.jaebi.server.core.TimeoutThreadedUserContainer

Diagramma delle classi per org.jaebi.server.core.TimeoutThreadedUserContainer

Inheritance graph
[legenda]
Diagramma di collaborazione per org.jaebi.server.core.TimeoutThreadedUserContainer:

Collaboration graph
[legenda]
Lista di tutti i membri.

Descrizione Dettagliata

Autore:
detro

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...


Documentazione dei costruttori e dei distruttori

org.jaebi.server.core.TimeoutThreadedUserContainer.TimeoutThreadedUserContainer long  userTimeOut,
long  timeOutCheckIntervall
 

Costruttore TimeoutThreadedUserContainer.

Parametri:
checkTimeIntervall Intervallo di tempo che scandisce quando controllare se gli User hanno superato il tempo Max di TimeOut per essere automaticamente eliminati. In millisecondi.
userTimeOut Tempo di TimeOut. In millisecondi.

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         }


Documentazione delle funzioni membro

synchronized boolean org.jaebi.server.core.TimeoutThreadedUserContainer.addUser String  nick,
Session  session,
String  type
 

Aggiunge uno User.

Gestisce anche la creazione del relativo oggetto SessionLastAccessTimestamp.

Vedi anche:
UserContainer

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         }

synchronized boolean org.jaebi.server.core.TimeoutThreadedUserContainer.addUser User  newUser  ) 
 

Aggiunge uno User.

Gestisce anche la creazione del relativo oggetto SessionLastAccessTimestamp.

Vedi anche:
UserContainer

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:

synchronized void org.jaebi.server.core.UserContainerImpl.clear  )  [inherited]
 

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(); }

synchronized boolean org.jaebi.server.core.UserContainerImpl.contains Session  session  )  [inherited]
 

Verifica se uno User con quel Session e' presente.

Restituisce:
"true" se lo User e' presente, "false" altrimenti

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     }

synchronized User org.jaebi.server.core.TimeoutThreadedUserContainer.getUser Session  session  ) 
 

Gestisce anche l'aggiornamento del relativo oggetto SessionLastAccessTimestamp.

Vedi anche:
UserContainer

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:

synchronized ArrayList org.jaebi.server.core.UserContainerImpl.getUsersByNick String  nick  )  [inherited]
 

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:

synchronized ArrayList org.jaebi.server.core.UserContainerImpl.getUsersByType String  type  )  [inherited]
 

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:

synchronized boolean org.jaebi.server.core.UserContainerImpl.isEmpty  )  [inherited]
 

Verifica che non ci siano User.

Restituisce:
"true" se non ci sono User, "false" altrimenti

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(); }

synchronized boolean org.jaebi.server.core.TimeoutThreadedUserContainer.removeUser Session  session  ) 
 

Gestisce anche la rimozione del relativo oggetto SessionLastAccessTimestamp.

Vedi anche:
UserContainer

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:

void org.jaebi.server.core.TimeoutThreadedUserContainer.run  ) 
 

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:

synchronized int org.jaebi.server.core.UserContainerImpl.size  )  [inherited]
 

Numero di User presenti nel Container.

Restituisce:
Numero di User 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(); }

synchronized Collection org.jaebi.server.core.UserContainerImpl.toCollection  )  [inherited]
 

Converte il Container in una Collection di User.

I cambiamenti esequiti sulla Collection generato si riflettono sugli User presenti nel Container.

Restituisce:
Collection di tutti gli User presenti

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     }

String org.jaebi.server.core.UserContainerImpl.toString  )  [inherited]
 

Converte il contenuto del Container in Stringa.

Utile per l'auto conversione in String.

Restituisce:
Stringa contenuti del Container

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     }


Documentazione dei dati membri

final HashMap org.jaebi.server.core.UserContainerImpl.container [protected, inherited]
 

La scelta del Container e' caduta su una HashMap per una questione di prestazioni.

Poiche' la maggior parte delle operazioni sul Container saranno di 1)Inserimento, 2)Ricerca e 3)Cancellazione, e queste saranno quasi sempre eseguite in base al Session identificativo, e' sembrata una buona scelta <u>indicizzare gli User</u> in base all'oggetto Session stesso. HashMap (che utilizza una funzione di Hashing per l'indicizzazione) si presta ottimamente a questo scopo, fornendo <u>tempi di accesso costanti</u>.

Definizione alla linea 34 del file UserContainerImpl.java.

Referenziato da org.jaebi.server.core.UserContainerImpl.addUser(), org.jaebi.server.core.UserContainerImpl.clear(), org.jaebi.server.core.UserContainerImpl.contains(), org.jaebi.server.core.UserContainerImpl.getUser(), org.jaebi.server.core.UserContainerImpl.getUsersByNick(), org.jaebi.server.core.UserContainerImpl.getUsersByType(), org.jaebi.server.core.UserContainerImpl.isEmpty(), org.jaebi.server.core.UserContainerImpl.removeUser(), org.jaebi.server.core.UserContainerImpl.size(), org.jaebi.server.core.UserContainerImpl.toCollection(), org.jaebi.server.core.UserContainerImpl.toString(), e org.jaebi.server.core.UserContainerImpl.UserContainerImpl().

final long org.jaebi.server.core.TimeoutThreadedUserContainer.sleepTime = 10000 [static, private]
 

Tempo di Sleep del Thread di "Garbage-Collecting".

Definizione alla linea 99 del file TimeoutThreadedUserContainer.java.

final HashMap org.jaebi.server.core.TimeoutThreadedUserContainer.timedSessions [private]
 

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().

final long org.jaebi.server.core.TimeoutThreadedUserContainer.timeOutCheckIntervall [private]
 

Intervallo tra un controllo sul Timeout User e il successivo.

Definizione alla linea 95 del file TimeoutThreadedUserContainer.java.

final long org.jaebi.server.core.TimeoutThreadedUserContainer.userTimeOut [private]
 

Tempo di Timeout per gli User.

Definizione alla linea 97 del file TimeoutThreadedUserContainer.java.


La documentazione per questa classe è stata generata a partire dal seguente file:
Generato il Mon Jun 27 22:50:39 2005 per JAEBI - JAva Enterprice BackEnd Interfacement da  doxygen 1.4.3