📄 placenameservice.java
字号:
package SOMA.naming.place;
import java.io.*;
import java.util.*;
import java.net.InetAddress;
import SOMA.naming.*;
import SOMA.network.connection.*;
import SOMA.Environment;
/** Servizio di nomi di place, <B>PNS</B>.
*
* <P> Il servizio realizza la metafora di una tabella in cui vengono memorizzate
* le {@link PlaceInfo}. La chiave di ricerca e' di tipo
* {@link PlaceID}, identificatore del place.
*
* <P> Affinche' un place entri a far parte di un dominio e' necessario che il PNS del place
* si <B>registri</B> presso il PNS del <B>default place</B> del dominio.
*
* <P> In ogni momento il PNS puo' richiedere l'aggiornamento della tabella dei place
* del dominio sia al default place, sia a un place qualsiasi, ove questo sia necessario.
*
* @see PNSExplorerItem
* @see SOMA.naming.domain.DomainNameService
*
* @author Livio Profiri
*/
public class PlaceNameService implements Serializable
{
/** @serial*/
transient protected Environment env;
/** @serial*/
protected Hashtable places = new Hashtable();
/** Costruttore.
* @param env L'environment del place.
*/
public PlaceNameService( SOMA.Environment env )
{
this.env = env;
}
/** Restituisce la <code>PlaceInfo</code> corrispondente a <code>placeID</code>,
* o <code>null</code> se non trovata.
*/
synchronized public PlaceInfo getPlace( PlaceID placeID )
{
return (PlaceInfo)places.get( placeID );
}
/** Inserisce una <code>PlaceInfo</code>.
*
* <P> Se e' un default place e <code>PlaceInfo</code> e' nuova, aggiorna gli altri place.
* <BR>
* @return Il vecchio valore memorizzato o <code>null</code> se si tratta di un nuovo place.
*/
synchronized public PlaceInfo putPlace( PlaceInfo newPlaceInfo )
{
PlaceInfo oldPlaceInfo = (PlaceInfo)places.put( newPlaceInfo.placeID, newPlaceInfo );
if( env.placeID.isDomain() && (! newPlaceInfo.equals( oldPlaceInfo )) )
sendToAllPlaces( new PutPlaceCommand( newPlaceInfo ), newPlaceInfo.placeID );
return oldPlaceInfo;
}
/** Elimina la <code>placeInfo</code> corrispondente a <code>aPlaceID</code>.
*
* <P> Se e' un default place e <code>aPlaceID</code> e' presente, aggiorna gli altri place.
* <BR>
*
* @return Il vecchio valore memorizzato o <code>null</code> se si tratta di un nuovo place.
*/
synchronized public PlaceInfo removePlace( PlaceID aPlaceID )
{
PlaceInfo oldPlaceInfo = (PlaceInfo)places.remove( aPlaceID ); // Restituisce il vecchio valore o null.
env.networkManager.connectionStore.removeConnection( aPlaceID );
if( env.placeID.isDomain() && (oldPlaceInfo != null) )
sendToAllPlaces( new RemovePlaceCommand( aPlaceID ) );
return oldPlaceInfo;
}
/** Stampa la lista di tutti i place del dominio su <code>out</code>.*/
public void listPlaces( PrintStream out )
{
out.println( "I know " + places.size() + " places:" );
out.println();
int i;
Enumeration list;
for( i = 1, list = places.elements(); list.hasMoreElements(); )
out.println( " " + i++ + ") " + list.nextElement().toString() );
out.println();
}
/** Registrazione presso il PNS del default place del dominio.
*
* <P>Viene inviato un {@link PlaceRegisterCommand} al default place, individuato dalla coppia
* <B>host:port</B>.
*/
public boolean register( InetAddress host, int port )
{
return env.networkManager.sendCommand( host, port,
new PlaceRegisterCommand( env.networkManager.placeInfo ) );
}
/** Richiesta di refresh della tabella al PNS del default place.
*
* <P>Viene inviato un {@link PlaceRefreshCommand.Request} al PNS del default place.
*/
public boolean refresh()
{
if( env.placeID.isDomain() )
{
env.err.println( "Can't refresh a default place!" );
return false;
}
else
{
return env.networkManager.sendCommand( env.placeID.getDomainID(),
new PlaceRefreshCommand.Request() );
}
}
/** Richiesta di refresh della tabella al PNS di un place qualsiasi.
*
* <P>Viene inviato un {@link PlaceRefreshCommand.Request} al PNS del place
* individuato dalla coppia<B>host:port</B>.
*/
public boolean refresh( InetAddress host, int port )
{
return env.networkManager.sendCommand( host, port,
new PlaceRefreshCommand.Request() );
}
/** Spedisce un comando a tutti i place della tabella. */
public void sendToAllPlaces( Command command )
{
sendToAllPlaces( command, null );
}
/** Spedisce un comando a tutti i place della tabella, escluso il place <code>DontSendMe</code>.
*/
// Salto il place DontSendMe
public void sendToAllPlaces( Command command, PlaceID DontSendMe )
{
env.out.println( " Sending " + command + " to every place in my domain:" );
env.out.println();
int i;
Enumeration list;
list = places.elements();
for( i = 1; list.hasMoreElements(); )
{
PlaceInfo dest = (PlaceInfo)list.nextElement();
// Attenzione: il metodo sendcommand che usa il PlaceInfo
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -