Eventos de Nombrado
Después de que un NamespaceChangeListener
o un ObjectChangeListener
hayan sido registrados con una fuente, obtendrán notificaciones de eventos en
la forma de NamingEvents.
Un ejemplar de esta clase contiene información sobre el evento, como su tipo y
la fuente del evento, e información sobre el objeto que causó el disparo del
evento. Normalmente, una fuente de evento crea un ejemplar de NamingEvent
y se lo pasa a los oyentes de nombrado. Estos oyentes pueden usar los métodos
de acceso del ejemplar de NamingEvent para obtener información
sobre el evento.
Tipo de Evento
Un NamingEvent contiene un tipo que identifica el tipo
del evento. Un tipo de evento podría ser, por ejemplo object-added
o object-changed. Los tipos de eventos están divididos entre
aquellos que afectan al espacio de nombres (como el tipo object-added) y
aquello que no le afectan (como un tipo object-changed). Aquí tenemos
los tipos de eventos definidos por la clase NamingEvent.
- NamingEvent.OBJECT_CHANGED.
Un contenido de un objeto ha cambiado. Por ejemplo, uno de sus atributos se ha
eliminado o quizás su unión ha sido reemplazada.
- NamingEvent.OBJECT_ADDED.
Se ha añadido un nuevo objeto al espacio de nombres.
- NamingEvent.OBJECT_REMOVED.
Se ha eliminado un objeto existente del espacio de nombres
- NamingEvent.OBJECT_RENAMED.
Se le ha dado otro nombre a un objeto existente. Observa que no todos los
servicios de nombrado soportan la generación de eventos rename. Por
ejemplo, un objeto que está siendo renombrado podría manifestarse como un
objeto que está siendo eliminado y otro que está siendo añadido.
El tipo de evento se obtiene usando getType().
Fuente de Evento
Una fuente de evento es la entidad que disparó el evento en el objeto con el
que el oyente está registrado. Es un ejemplar de EventContext
o EventDirContext.
Puedes ir a la sección Registro de Oyentes para más
infomación sobre estos dos interfaces.
La fuente de evento se obtiene usando getEventContext()
o java.util.EventObject.getSource().
Estos métodos sólo se diferencian en que getEventContext()
devuelve el resultado como un EventContext mientras que getSource()
devuelve el resultado en un java.lang.Object.
Podemos usar la fuente de evento para obtener más información sobre el
objeto u objetos que lo lanzaron. Si usamos este método, debemos sincronizar su
acceso. Esto es porque las implementaciones de Context
no están garantizadas para ser seguras antes los threads (y EventContext
es un subinterface de Context).
Aquí hay un código de oyente que usa la fuente de eventos.
Attributes attrs;
// Get the event source
EventContext ctx = evt.getEventContext();
// Get the name of the object that changed
// Should really check for null binding first.
String which = evt.getNewBinding().getName();
// Lock the event source
synchronized(ctx) {
attrs = ctx.getAttributes(which, new String[]{"objectclass"});
}
// Do something useful with attrs
Otra Información
Un NamingEvent contiene, además del tipo de evento y la fuente,
las uniones nueva y vieja del objeto que causó el evento, así como otra
información adicional. Usamos getNewBinding()
para obtener un ejemplar de Binding
que describe el estado del objeto después del evento ocurrido. El Binding
contiene el nombre del objeto, el propio objeto, y sus atributos. Cualquiera de
estos datos podría no existir si el proveedor de servicios no puede
suministrarlos.
Usamos getOldBinding()
para obtener información similar sobre el objeto antes de que ocurriera
el evento.
Observa que el nombre de las úniones nueva y vieja está en relación a la
fuente del evento. Por ejemplo, supongamos que nuestro programa usa el siguiente
código para registrar un oyente.
EventContext ctx = (EventContext)
(new InitialContext(env).lookup("ou=People"));
// Create the listener
NamingListener listener = new SampleNCListener("nc1");
// Register the listener for namespace change events
ctx.addNamingListener("ou=Objects,cn=John Smith",
EventContext.ONELEVEL_SCOPE, listener);
Cuando se añade el objeto "cn=String" bajo "ou=Objects",
el nombre en la unión del NamingEvent tiene el nombre "cn=String,
ou=Objects, cn=John Smith".
Además, podemos usar getChangeInfo()
para obtener cualquier información de cambio que el servidor o el proveedor de
servicio haya suministrado. Por ejemplo, el servidor podría enviar un
identifiador que identifica el cambio.