cap.05.concepto lookup

Upload: enrique-gonzalez-ortiz

Post on 19-Jul-2015

320 views

Category:

Documents


0 download

TRANSCRIPT

El Concepto LookupConceptualmente, el Lookup es tan importante como simple. Usado profusamente en las aplicaciones basadas en la Plataforma Netbeans, permite la comunicacin de un mdulo con lo dems. Este captulo muestra los tpicos casos de uso y cmo funciona el concepto de Lookup.

FuncionalidadEl Lookup es un componente central y un concepto usado comunmente en la Plataforma NetBeans para la gestin de instancias de objetos. De manera muy simple, el Lookup en un Map, con objetos Class como claves e instancias de esos objetos Class como valores. La idea principal que subyace detrs del concepto de Looukp es el desacoplamiento de componentes. Esto permite a los mdulos comunicarse unos con otros, lo que juega un papel muy importante en los sistemas basados en componentes, tales como las aplicaciones basadas en la Plataforma NetBeans. Por una parte, lo mdulos pueden proveer objetos; por otra, los mdulos pueden buscar y usar objetos con el Lookup.

NOTA El concepto de Lookup est implementado en el mdulo Lookup API. ste proporciona una interfaz sencilla y clara. El mdulo Looukup API es bastante usado en la Plataforma NetBeans (a menudo indirectamente tambin). Esta es la piedra angular del concepto de modularidad de la Plataforma NetBeans. Por cierto, el mdulo Lookup API trabaja de forma desentendida y no tiene dependencia alguna con otros mdulos. Es decir, podemos emplear el mdulo Lookup API en cualquier aplicacin Java, incluso si no ha sido desarrollada basndose en la Plataforma NetBeans.

La ventaja del Lookup es su seguridad de tipos, logro alcanzado empleando para las claves objetos Class en vez de cadenas. De esta forma, la clave define el tipo de la instancia que debe ser devuelta. As, es imposible solicitar una instancia cuyo tipo sea desconocido en el mdulo. Este patrn se traduce en una aplicacin ms robusta, desde el momento en que errores del tipo ClassCastException no pueden ocurrir. El Lookup es usado tambin para recuperar y gestionar mltiples instancias de una clave, lo cual es como decir de un tipo de instancia. Esta gestin centralizada de diferentes tipos de instancias es usada para mltiple propsitos. El Lookup es empleado para descubrir proveedores de servicios que soportan la adicin declarativa y el lazyloading de instancias. Adems de esto, puedes pasar instancias via Lookup desde un mdulo hasta otro, sin que uno tenga conocimiento del otro. De esta forma, una comunicacin intermodular queda establecida. Incluso acciones sensibles al contexto pueden ser realizadas usando el compenente Lookup. Para aclarar algunos malentendidos frecuentes, dentro de una aplicacin sencilla es posible tener ms de un Lookup. El ms usado comunmente es el Lookup global, facilitado de forma predeterminada por la Plataforma NetBeans. Adems, hay componentes, tales como TopComponent, que tienen su propio Lookup. Estos son Lookups locales. Como se describe en la seccin Comunicacin Inter-mdulos, es posible crear tus propios Lookups y equipar tus componentes con un Lookup. El concepto de Lookup es sencillo, eficiente y conveniente. Una vez que te hayas familiarizado con este patrn, encontrars sus posibilidades de aplicacin en muy diferentes reas. En las siguientes secciones, el utilizacin de Lookup ser mostrado con detalle.

Servicios y Puntos de Extensin

Una de las principales aplicaciones de el Lookup es el descubrimiento y aprovisionamiento de servicios. El rol de Lookup en este escenario es el de localizador dinmico de servicios, permitiendo la separacin entre la interfaz del servicio y el proveedor del ste. Un mdulo hace uso de funcionalidades de otro sin conocer nada sobre su implementacin. De esta forma de consigue un bajo acoplamiento entre los mdulos. Usando el Lookup y una interfaz de servicio, es sencillo definir un punto de extensin para componentes grficos. Un buen ejemplo puede ser la barra de estado de NetBeans, definiendo la interfaz StatusLineElementProvider. Con esta interfaz y el registro de un proveedor de servicio, la barra de estado es extendida usando componentes definidos por el usuario( un ejemplo de esto se describe en la seccin Barra de Estado del Captulo 5) sin que la barra de estado tenga conocimiento de estos componentes o tenga dependencia de ellos. Para un abastecimiento flexible y dinmico y un intercambio de servicios, stos (los servicios) son aadidos de forma declarativa a el Lookup, mejor que programados en el cdigo fuente. Esto se consigue por uno de esto dos mtodos: aadiendo la implementacin de un servicio en el fichero de Servicio de Configuracin de Proveedores en el directorio /META-INF/services, o usando el fichero layer de tu mdulo. Ambos sern mostrados en la seccin Registro de Proveedores de Servicios ms adelante en este captulo. La Plataforma NetBeans proporciona un Lookup global que puede ser recobrado usando el mtodo esttico Lookup.getDefault(). Este Lookup global se utiliza para descubrir servicios (aadidos con el uso de uno de los registros declarativos disponibles). Se puede utilizar este enfoque para registrar ms de una implementacin de un servicio simple. El registro declarativo permite la instanciacin de implementaciones la primera vez que son solicitadas. Este patrn es conocido como lazy loading. Para un mejor entendimiento de este patrn de aprovisionamiento y requerimiento de servicios, y para conseguier una perspectiva ms prctica, este captulo ilustrar la creacin de una bsqueda de listas de ficheros MP3.

Definiendo la Interfaz de ServicioEl mdulo A es un mdulo que proporciona una interfaz de usuario que permite al usuario buscar ficheros MP3 por un criterio de bsqueda concreto. El resultado de la bsqueda se mostrar en una lista. Para manterner la independencia del algoritmo de bsqueda y asegurar el uso dinmico de mltiples variables de bsqueda (los cuales pueden ser modificados en tiempo de ejecucin), especificaremos la interfaz de servicio Mp3Finder en el mdulo A. Este servicio define la interfaz de bsqueda para ficheros MP3. El actual algoritmo de bsqueda ser implementado en un mdulo separado, el mdulo B, proporcionado va registro declarativo.

Servicio de Aprovisionamiento Relajado (Loose Service Provisioning)El mdulo B es un proveedor de servicios para la implementacin de la interfaz Mp3Finder. En este ejemplo, asumiremos que estamos buscando ficheros MP3 en una base de datos. Esto permitir que diferentes implementaciones del proveedor de servicio puedan ser registradas. Todas las implementaciones pueden estar tanto en uno, como en ms de uno, mdulos separados. Para crear una implementacin Mp3DatabaseFinder de la interfaz Mp3Finder del mdulo A, el mdulo B debe definir una dependencia sobre ese mdulo. Sin embargo, el mdulo A, la interfaz de usuario de la bsqueda de listas, no necesita dependencias sobre el mdulo B. Esto es as porque el Lookup proporciona el servicio basado en la interfaz (alojada en el mdulo A) ms que en la implementacin (que reside en el mdulo B). De este modo, el mdulo A es completamente independiente de la implementacin del servicio (ver figura 5-1) y puede usarse de forma transparente. FIGURA 5-1

En el mdulo A, se especifica la interfaz del servicio Mp3Finder y se implementa una interfaz de usuario para la bsqueda y presentacin de ficheros MP3 (ver listado 5-1). Un proveedor de servicios es devuelto pasndole el objeto Class de la interfaz Mp3Finder al Lookup, retornando una instancia que casa con el tipo requerido. La interfaz Mp3Finder es tambin conocida como un punto de extensin del mdulo A. Cualquier mdulo puede resgistrar implementaciones para ello. Listado 5-1. Modulo A: Buscador MP3 public interface Mp3Finder { public List find(String search); } public class Mp3SearchList { public void doSearch(String search) { Mp3Finder finder = Lookup.getDefault().Lookup(Mp3Finder.class); List list = finder.find(search); } } El mdulo B proporciona un proveedor de servicios permitiendo buscar ficheros MP3 en una base de datos. Esto se hace implementando la interfaz Mp3Finder, especificada en el mdulo A (ver listado 5-2). As, el mdulo B es una extensin del mdulo A en el punto de extensin Mp3Finder. El recientemente creado proveedor de servicios debe ser registrado, de este modo podr ser descubierto usando Lookup. Para este propsito emplearemos la anotacin ServiceProvider. Listing 5-2. Module B: MP3 Finder import org.openide.util.Lookup.ServiceProvider; ... @ServiceProvider(service = Mp3Finder.class) public class Mp3DatabaseFinder implements Mp3Finder { public List find(String search) { // search in database for mp3 files } }

Proporcionando Implementaciones de Mltples ServiciosSera til habilitar el registro de mltiples implementaciones de buscadores de ficheros MP3. Fcil. Simplemente crearemos ms implementaciones de la interfaz Mp3Finder. De nuevo stas tienen que ser registradas mediante una anotacin. Una implementacin como la que acabamos de indicar podra ser la siguiente: import org.openide.util.Lookup.ServiceProvider; ... @ServiceProvider(service = Mp3Finder.class)

public class Mp3FilesystemFinder implements Mp3Finder { public List find(String search) { // search in local filesystem for mp3 files } } Para usar todas las implementaciones de un servicio, utilizaremos el Lookup para que explore y descubra todos los servicios. En este caso, mejor que utilizar el mtodo Lookup(), emplearemos LookupAll() para que nos devuelva todas las implementaciones registradas de un servicio. Podemos llamar al mtodo find() de todos los servicios decubiertos de la siguiente forma: public class Mp3SearchList { public void doSearch(String search) { Collection