E' un observable che notifica ai suoi observer l'aggiunta o la rimozione di una connessione.
L'istanza di questa classe potrebbe rappresentare una regione critica per l'accesso concorrente che vi fanno il thread lanciato da BtServer e il thread lanciato da ClientProcessor. Dichiarando alcuni metodi come synchronized si garantisce la mutua esclusione ad essi e si evitano, quindi, possibili race conditions (un possibile scenario in cui si potrebbe avere una race condition è il seguente: ConnectionProcessor thread rimuove una connessione per un errore di IO e concorrenzialmente BtServer falseil get di quella stessa connessione
Definizione alla linea 35 del file ConnectionSet.java.
Membri pubblici | |
ConnectionSet (ConnectionObserver observer) | |
Creates a new instance of ConnectionSet. | |
synchronized void | addConnection (StreamConnection conn) |
synchronized void | removeConnection (StreamConnection conn) |
synchronized StreamConnection | getConnection (int index) |
synchronized StreamConnection[] | getConnection (RemoteDevice rd) |
Ritrova le connessioni relative ad una certa remote device. | |
synchronized int | connectionsCount () |
ritorna il numero di connessioni non pendenti | |
synchronized void | closeAll () throws BtIOException |
Chiude tutte le connessioni del set e svuota il Vector connections. | |
synchronized void | addObserver (Observer o) |
Aggiunge un nuovo Observer all'insieme di Observer per questo oggetto, a patto che l'Observer che si sta inserendo non sia già prensente nell'insieme. | |
synchronized void | deleteObserver (Observer o) |
Elimina un Observer dal'insieme. | |
void | notifyObservers () |
Se l'oggetto è cambiato (hasChanged() ritorna true), notifica tale cambiamento agli obervers effettuando la chiamata al loro metodo update ). | |
void | notifyObservers (Object arg) |
Se l'oggetto è cambiato (hasChanged() ritorna true) , notifica tale cambiamento agli obervers effettuando la chiamata al loro metodo update . | |
synchronized void | deleteObservers () |
effettua il clear della lista degli observers | |
synchronized boolean | hasChanged () |
Verifica se l'oggetto è cambiato. | |
synchronized int | countObservers () |
Ritorna il numero di observer per questo oggetto. | |
Membri protetti | |
synchronized void | setChanged () |
Marca questo oggetto Observable come changed. | |
synchronized void | clearChanged () |
Indica che gli observer sono stati notificati dell'ultimo cambiamento. | |
Attributi privati | |
Vector | connections |
int | event |
|
Creates a new instance of ConnectionSet.
Definizione alla linea 41 del file ConnectionSet.java. Riferimenti org.jaebi.midlet.bt.ConnectionSet.connections. 00041 { 00042 connections = new Vector(); 00043 this.addObserver((Observer)observer); 00044 }
|
|
Definizione alla linea 47 del file ConnectionSet.java. Riferimenti org.jaebi.midlet.bt.ConnectionSet.connections, org.jaebi.midlet.bt.ConnectionSet.event, e org.jaebi.midlet.util.Observable.notifyObservers(). Referenziato da org.jaebi.midlet.bt.BtServer.run(). 00047 { 00048 ConnectionEvent event = new ConnectionEvent(ConnectionEvent.CONNECTION_ADDED, conn); 00049 00050 connections.addElement(conn); 00051 this.setChanged(); 00052 notifyObservers(event); 00053 }
Questo è il grafo delle chiamate per questa funzione: ![]() |
|
Aggiunge un nuovo Observer all'insieme di Observer per questo oggetto, a patto che l'Observer che si sta inserendo non sia già prensente nell'insieme. Il metodo è dichiarato synchronized per evitare che, nel caso di multithreading, si verifichino race conditions che portino ad inserire ugualmente due volte lo stesso Observer
Definizione alla linea 39 del file Observable.java. Riferimenti org.jaebi.midlet.util.Observable.obs. 00039 { 00040 if (o == null) 00041 throw new NullPointerException(); 00042 if (!obs.contains(o)) { 00043 obs.addElement(o); 00044 } 00045 }
|
|
Indica che gli observer sono stati notificati dell'ultimo cambiamento.
il metodo
Definizione alla linea 136 del file Observable.java. Riferimenti org.jaebi.midlet.util.Observable.changed. Referenziato da org.jaebi.midlet.util.Observable.notifyObservers(). 00136 { 00137 changed = false; 00138 }
|
|
Chiude tutte le connessioni del set e svuota il Vector connections.
Definizione alla linea 123 del file ConnectionSet.java. Riferimenti org.jaebi.midlet.bt.ConnectionSet.connections. 00123 { 00124 Enumeration en; 00125 en = connections.elements(); 00126 while(en.hasMoreElements()){ 00127 try{ 00128 ((StreamConnection)en.nextElement()).close(); 00129 } catch(IOException e){ 00130 throw new BtIOException(); 00131 } 00132 } 00133 connections.removeAllElements(); 00134 }
|
|
ritorna il numero di connessioni non pendenti
Definizione alla linea 116 del file ConnectionSet.java. Riferimenti org.jaebi.midlet.bt.ConnectionSet.connections. 00116 { 00117 return connections.size(); 00118 }
|
|
Ritorna il numero di observer per questo oggetto.
Definizione alla linea 159 del file Observable.java. Riferimenti org.jaebi.midlet.util.Observable.obs. 00159 { 00160 return obs.size(); 00161 }
|
|
Elimina un Observer dal'insieme.
Definizione alla linea 52 del file Observable.java. Riferimenti org.jaebi.midlet.util.Observable.obs. 00052 { 00053 obs.removeElement(o); 00054 }
|
|
effettua il clear della lista degli observers
Definizione alla linea 116 del file Observable.java. Riferimenti org.jaebi.midlet.util.Observable.obs. 00116 { 00117 obs.removeAllElements(); 00118 }
|
|
Ritrova le connessioni relative ad una certa remote device.
Definizione alla linea 78 del file ConnectionSet.java. Riferimenti org.jaebi.midlet.bt.ConnectionSet.connections. 00078 { 00079 Vector outTemp = new Vector(); 00080 StreamConnection out[]; 00081 Enumeration en = connections.elements(); 00082 00083 while (en.hasMoreElements()){ 00084 StreamConnection conn = (StreamConnection)en.nextElement(); 00085 RemoteDevice temp = null; 00086 00087 try{ 00088 temp = RemoteDevice.getRemoteDevice(conn); 00089 if (temp.equals(conn)) 00090 outTemp.addElement(conn); 00091 } 00092 catch(IOException e){ 00093 ; 00094 /* non faccio nulla perchè non posso compromettere la ricerca se 00095 * per una certa connessione non riesco a recuperare la 00096 * remoteDevice 00097 */ 00098 } 00099 00100 } 00101 00102 out = new StreamConnection[outTemp.size()]; 00103 00104 for (int i=0; i<outTemp.size(); i++){ 00105 out[i] = (StreamConnection)outTemp.elementAt(i); 00106 } 00107 00108 outTemp.removeAllElements(); 00109 return out; 00110 }
|
|
Definizione alla linea 71 del file ConnectionSet.java. Riferimenti org.jaebi.midlet.bt.ConnectionSet.connections. 00071 { 00072 return (StreamConnection)connections.elementAt(index); 00073 }
|
|
Verifica se l'oggetto è cambiato.
Definizione alla linea 150 del file Observable.java. Riferimenti org.jaebi.midlet.util.Observable.changed. 00150 { 00151 return changed; 00152 }
|
|
Se l'oggetto è cambiato (
Una volta effettuata la notifica, viene chiamato il metodo
Definizione alla linea 80 del file Observable.java. Riferimenti org.jaebi.midlet.util.Observable.changed, org.jaebi.midlet.util.Observable.clearChanged(), e org.jaebi.midlet.util.Observable.obs. 00080 { 00081 /* 00082 *Collezione degli observer usata come snapshot dello stato degli observer correnti 00083 */ 00084 Enumeration observers; 00085 00086 synchronized (this) { 00087 /* 00088 * Il codice incaricato di estrarre la lista degli observer da notificare 00089 * necessita di sincronizzazione ma la notifica vera e propria no (non dovrebbe) 00090 * Il peggior risultato di una qualsiasi race-condition che possa verificarsi qui (in assenza di sincronizzazione 00091 * è il seguente: 00092 * 1) a newly-added Observer will miss a 00093 * notification in progress: siccome anche il metododo addObserver() è 00094 * dichiarato sinchronized non può verificarsi che un flusso di controllo aggiunga un nuovo observer 00095 * mentre un altro sta recuperando la lista degli observer per effettuare la notifica 00096 * 2) a recently unregistered Observer will be 00097 * wrongly notified when it doesn't care: non può verificarsi che un flusso di controllo 00098 * stia rimuovendo un observer mentre un altro sta recuperando 00099 * la lista delgi observer a cui inviare la notifica (il metodo deleteObserver() è dichiarato anch'esso 00100 * synchronized 00101 */ 00102 if (!changed) 00103 return; 00104 observers = obs.elements(); 00105 clearChanged(); 00106 } 00107 00108 while (observers.hasMoreElements()) 00109 ((Observer)observers.nextElement()).update(this, arg); 00110 00111 }
Questo è il grafo delle chiamate per questa funzione: ![]() |
|
Se l'oggetto è cambiato (
Una volta effettuata la notifica, viene chiamato il metodo
Definizione alla linea 65 del file Observable.java. Referenziato da org.jaebi.midlet.bt.ConnectionSet.addConnection(), org.jaebi.midlet.bt.ConnectionSet.removeConnection(), org.jaebi.midlet.bt.Discoverer.run(), org.jaebi.midlet.bt.Discoverer.searchServices(), e org.jaebi.midlet.bt.Discoverer.serviceSearchCompleted(). 00065 { 00066 notifyObservers(null); 00067 }
|
|
Definizione alla linea 56 del file ConnectionSet.java. Riferimenti org.jaebi.midlet.bt.ConnectionSet.connections, org.jaebi.midlet.bt.ConnectionSet.event, e org.jaebi.midlet.util.Observable.notifyObservers(). 00056 { 00057 ConnectionEvent event = new ConnectionEvent(ConnectionEvent.CONNECTION_REMOVED, conn); 00058 00059 try{ 00060 conn.close(); 00061 } catch (IOException e){ 00062 System.err.println("Errore durante la chiusura della connessione"); 00063 } 00064 00065 connections.removeElement(conn); 00066 this.setChanged(); 00067 notifyObservers(event); 00068 00069 }
Questo è il grafo delle chiamate per questa funzione: ![]() |
|
Marca questo oggetto
Definizione alla linea 123 del file Observable.java. Riferimenti org.jaebi.midlet.util.Observable.changed. Referenziato da org.jaebi.midlet.bt.Discoverer.setState(). 00123 { 00124 changed = true; 00125 }
|
|
|
Definizione alla linea 38 del file ConnectionSet.java. Referenziato da org.jaebi.midlet.bt.ConnectionSet.addConnection(), e org.jaebi.midlet.bt.ConnectionSet.removeConnection(). |