Un contexto se actualiza usando las siguientes operaciones:
- bind(Name name, Object obj)
- rebind(Name name, Object obj)
- unbind(Name name)
- rename(Name oldname, Name newname)
- createSubcontext(Name name)
- destroySubcontext(Name name)
Si estos m�todos son soportados y c�mo depende del servicio de nombres/directorio subyacente. Una implementaci�n de contexto real actualizar�a el servicio de nombres/directorio subyacente. Una implementaci�n de contexto para un servicio de s�lo lectura, por ejemplo, no soportar�a ninguno de estos m�todos. Una para un espacio de nombres plano, como el ejemplo del espacio de nombres plano no soportar�a createSubcontext() ni destroySubcontext().
|
Truco de Implementaci�n:
bind() y rebind() pueden aceptar null como el par�metro objeto si la implementaci�n de contexto s�lo acepta a�adir un nombre a un espacio de nombres sin un objeto asociado. |
En el ejemplo del espacio de nombres plano, bind(), rebind(), y unbind() est�n implementadas casi como lookup(), excepto en que actualizan la estructura de datos interna en lugar de leer de ella. Aqu� tenemos la definici�n de rebind():
public void rebind(Name name, Object obj) throws NamingException {
if (name.isEmpty()) {
throw new InvalidNameException("Cannot bind empty name");
}
// Extract the components that belong to this namespace
String nm = getMyComponents(name);
// Add the object to the internal hash table
bindings.put(nm, obj);
}
�Renombrar
rename() nos permite renombrar entre diferentes contextos. Una implementaci�n real podr�a tener problemas al soportar esto totalmente porque el servicio de nombres/directorio subyacente podr�a no sopotarla. Algunos servicios podr�a soportar s�lo el renombrado dentro del mismo contexto. En este caso, el propio servicio podr�a indicar un error y resultar�a en una excepci�n espec�fica del servicio; o, la implementaci�n de contexto podr�a detectar el problema y lanzar una OperationNotSupportedException.
Aqu� tenemos la definici�n de rename() para el ejemplo del espacio de nombres plano:
public void rename(Name oldname, Name newname) throws NamingException {
if (oldname.isEmpty() || newname.isEmpty()) {
throw new InvalidNameException("Cannot rename empty name");
}
// Extract the components that belong to this namespace
String oldnm = getMyComponents(oldname);
String newnm = getMyComponents(newname);
// Check whether the new name exists
if (bindings.get(newnm) != null) {
throw new NameAlreadyBoundException(newname.toString() +
" is already bound");
}
// Check whether the old name is bound
Object oldBinding = bindings.remove(oldnm);
if (oldBinding == null) {
throw new NameNotFoundException(oldname.toString() + " not bound");
}
bindings.put(newnm, oldBinding);
}