Métodos de Actualización
Un contexto se actualiza usando las siguientes operaciones:
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);
}