[RSS]

Conociendo a NetBeans Platform: Introducción

Autor: Luis Enrique Funes
Adaptado desde http://mendozajug.com.ar/portal/index.php?option=com_content&task=view&id=64&Itemid=2


Con este artículo comenzamos a descubrir lo fácil que puede ser construir plugins para NetBeans desde el más pequeño hasta directamente construir aplicaciones enteras basadas en la infraestructura de NetBeans.

Daremos un repaso general por lo que es NetBeans Platform, veremos aplicaciones ya realizadas y aprenderemos como utilizar el IDE para desarrollar sobre la plataforma a partir de un pequeño ejemplo.



Que es NetBeans Platform?

Generalmente, cuando hablamos de NetBeans nos referimos al popular IDE sobre el cual desarrollan en la actualidad gran cantidad de usuarios a lo largo de todo el mundo (entre los que me incluyo), aunque formalmente posee el nombre de NetBeans IDE. A lo largo de este artículo nos referiremos a él indistintamente como “NetBeans IDE” ó simplemente “IDE”.

Por otro lado, NetBeans Platform es un framework con una amplia variedad de APIs que resuelven gran cantidad de problemas con los que nos encontramos a la hora de construir una aplicación. Él es el corazón sobre el cual se construye, entre otras aplicaciones, NetBeans IDE.

NetBeans Platform hace fuerte hincapié sobre la construcción del software de forma modular, módulo sobre módulo, y es ahí precisamente donde mayor provecho podremos sacar de esta plataforma, ya que nos ofrece implementados los mecanismos de descubrimiento de nuevos módulos (y de actualizaciones de los existentes) desde repositorios remotos, resolución de dependencias, activación/desactivación de módulos en caliente, comunicación entre los mismos, etc. permitiéndonos preocuparnos por la lógica y rápidamente desplegar nuestras aplicaciones, pudiendo ir extendiendo su funcionalidad a medida que pasa el tiempo.

Una gran ventaja de la construcción modular es que podemos crear una aplicación conformada por X cantidad de módulos diferentes, cada uno responsable de llevar a cabo determinadas responsabilidades, y según el rol de la persona que la va a utilizarla solo se carga en la aplicación los módulos que permiten cumplir con su tarea, permitiéndonos tener un abanico de aplicaciones sin tener que programar una sola línea de código adicional. Por ejemplo:

Otras características que hacen interesante la elección de NetBeans Platform como plataforma para nuestra aplicación son las siguientes:
  • Los proyectos desarrollados no dejan de ser multiplataforma, y poseen largadores (launchers) para cada plataforma.
  • Sistema de ventanas práctico para desarrollar las interfaces de usuario
  • Sistema de ficheros virtual en el cual se van montan los diferentes módulos con el cual se van adaptando automáticamente los menús, barra de herramientas, menús contextuales, etc. de la aplicación
  • Su licencia nos permite construir tanto aplicaciones open source como comerciales
  • Compatibilidad con Java Web Start
  • No es obligatorio que una aplicación deba tener interfaz de usuario grafica (GUI), ya que la plataforma permite dejar de lado la misma y seguir disfrutando del resto de los beneficio, por ejemplo la actualización de módulos desde un repositorio remoto.
  • Soporte completo para desarrollar desde NetBeans IDE, por lo que no necesitaremos otra herramienta adicional para el desarrollo



Algunas aplicaciones desarrolladas sobre NetBeans Platform


Además del IDE, existen una amplia variedad de aplicaciones desarrolladas sobre NetBeans Platform desde la edición de imágenes, pasando por aplicaciones de gestión, hasta herramientas para ingeniería. Algunos ejemplos de ellas son:

blueMarine

Proyecto open source para la organización y edición de fotografías.

Project Xemo (eXtensible Electronic Music Object architecture)

Proyecto open source para la edición musical.


Gentleware's Poseidon for UML


Herramienta CASE para UML

SysUpTime

Herramienta para la administración de sistemas/redes distribuidas.

DARPA Grand Challenger Vehicle Control

Interfaz de monitoreo de telemetría en vehículos no tripulados para competir en DARPA Grand Challenger
Hay varios ejemplos y screenshots más en el las páginas de documentación de NetBeans Platform (ver sección Más Info)


Tipos de Proyectos

Existen cuatro tipos de proyectos que podremos comenzar a crear en la versión 6.1 del IDE:
  • Module
  • Library Wrapper Module
  • Module Suite
  • NetBeans Platform Application

Veremos cada uno en detalle.

Module (Módulo)
Un módulo es simplemente un típico JAR (Java ARchive) con cierta metainformación almacenada en el manifiesto. Los módulos poseen la extensión NBM (NetBeans Module).

Entre la metainformación se encuentra la versión del módulo, las dependencias, descripción de funcionalidad, datos del autor, etc. Un módulo puede ser usado en cualquier proyecto desarrollado sobre NetBeans Platform (siempre que se cumplan las restricciones de dependencias del mismo), incluso sobre NetBeans IDE:

Library Wrapper Module (Módulo Envoltorio de Librería)

Un Library Wrapper Module permite que una librería externa (.JAR) sea vista desde los otros módulos como un módulo estándar. Básicamente se comporta igual que un Module, pero este no contendrá lógica alguna, simplemente expondrá la interfaz de la librería envuelta.


Tanto a los Module como a los Library Wrapper Module se los denomina de forma genérica como módulos o plugins.

Module Suite (Suite de Módulos)
Un Module Suite es una colección de módulos sobre la cual desarrollaremos nuestra aplicación. Por defecto, un Module Suite trae habilitados todos los módulos que conforman tanto a NetBeans Platform como a NetBeans IDE.

Nuestro trabajo consistirá en deshabilitar los módulos que no utilicemos y agregar los nuevos (Modules o Library Wrapper Module) para de esa forma crear nuestra aplicación.

NetBeans Platform Application (Aplicación sobre NetBeans Platform)
Básicamente también crea un Module Suite, pero por defecto viene configurado con la mínima cantidad de módulos habilitados necesarios para iniciar. Por su configuración inicial lo llamaremos también como “Module Suite vacío”.

De forma contraria a un Module Suite, nuestro trabajo consistirá en habilitar los módulos que vayamos requiriendo para que nuestros módulos (ya sean Modules o Library Wrapper Module) cumplan sus dependencias, y así crear nuestra aplicación.

Cualquier aplicación que se desarrolle comenzando con un Module Suite puede iniciarse con un NetBeans Platform Application, solo variará la forma de realizarlo.

De ser posible, siempre que desarrollemos una aplicación basada en NetBeans Platform es preferible hacerlo con un NetBeans Platform Application ya que nos evitará olvidar deshabilitar un módulo que realmente no utilizamos.


Proyectos de Ejemplo en NetBeans IDE

El IDE trae dos ejemplos con los cuales podremos observar aplicaciones construidas sobre la plataforma, manejo de módulos, uso de librerías externas y ver varios conceptos básicos aplicados.

Para acceder a ellos simplemente creamos un nuevo proyecto (File -> New Project...) y seleccionamos Samples -> NetBeans Modules en el dialogo:

Seleccionamos alguno de los proyectos, luego nos pedirá un nombre y un lugar donde crear el proyecto, y finalizamos el proceso, en ese momento ya estará listo para su estudio.

Paint Application
Pequeña aplicación que nos permite crear imágenes PNG a mano alzada.

El proyecto se compone de un Module Suite vacío en el cual se agregaron dos módulos:
  • ColorChooser: Library Wrapper Module que envuelve a la librería ColorChooser.jar
  • Paint: Module que implementa toda la lógica de la aplicación y los componentes visuales. Depende del módulo ColorChooser y de librerías propias de la plataforma.


Por lo que lo podemos resumir en:

Feed Reader
Pequeño lector de feeds.

El proyecto se compone de un Module Suite vacío en el cual se agregaron cuatro módulos:
  • JDOM Library: Library Wrapper Module que envuelve a la librería jdom-1.0.jar
  • ROME Library: Library Wrapper Module que envuelve a la librería rome-0.6.jar. Depende del módulo JDOM Library
  • ROME Fetcher Library: Library Wrapper Module que envuelve a la librería rome-fetcher-0.6.jar. Depende del módulo ROME Library
  • Feed Reader: Module que implementa toda la lógica de la aplicación y los componentes visuales. Depende del módulo ROME Fetcher Library y de librerías propias de la plataforma.


Por lo que lo podemos resumir en:



Ejemplo práctico: Codificador de Colores

Para ver como se desarrolla un módulo desde el comienzo crearemos paso a paso un pequeño plugin para el IDE. Durante este ejemplo nos concentraremos en los mecanismos y uso del IDE para desarrollar el módulo, pero no nos detendremos a ver las APIs en detalle ya que lo haremos en próximos artículos.

Manos a la obra!!!

Paso 0: Pensar la idea
Primero que nada deberemos definir que es lo queremos que haga el módulo.

El plugin que realizaremos debe permitir que al estar editando un documento de java (.java) elijamos de una paleta un color y este inserte su equivalente en Java (mediante la clase java.awt.Color) donde se encuentre el cursor. Por ejemplo si seleccionamos un color conocido como el color rojo el plugin insertará “Color.RED”, pero si seleccionamos un color cualquiera insertará su correspondiente en RGB, de la forma “new Color(125, 124, 33)”

Paso 1: Abrir el IDE
Para este ejemplo utilizaremos NetBeans IDE versión 6.1

Paso 2: Crear un nuevo proyecto
Creamos un nuevo proyecto abriendo File->New Project...

Seleccionamos la categoría NetBeans Modules y de ahí la plantilla Module.

Hacemos click en Next.

Paso 3: Seleccionamos ubicación del módulo
Seleccionamos el nombre del proyecto y su ubicación en el disco. Luego debemos seleccionar entre dos opciones:
  • Standalone Module: Permite crear plugins para cualquier aplicación (incluido el IDE)
  • Add to Module Suite: Permite agregar un módulo a una aplicación especifica que estemos desarrollando

Como lo que queremos es crear un plugin para el IDE seleccionamos la primera opción y seleccionamos como plataforma de destino la actual (NetBeans IDE 6.1)

Paso 4: Configuración Básica del Modulo
Para finalizar el Wizard configuraremos aspectos generales del módulo, como son el nombre para mostrar del Module, el paquete base del mismo y la ubicación del Bundle de internacionalización.

Hacemos click en Finish para finalizar y crear el proyecto:

Paso 5: Editar la información del Module
Hacemos click derecho sobre el proyecto y seleccionamos Properties para ver la configuración del módulo.

Dentro de la categoría Sources podemos seleccionar para que maquina virtual será el código, ó para J2SE 1.4 ó para Java SE 5.0 (1.5). Dejamos seleccionado 1.5

Dentro de librerías podremos ver las dependencias de un módulo, en este caso aún no tenemos ninguna por lo que la dejaremos vacía.

Dentro de Display podremos la información que se mostrará de nuestro modulo al momento de instalarlo/desinstalarlo en el Plugin Manager. Llenamos los campos.

Como nuestro plugin puede ser administrado desde el Plugin Manager es importante que este seleccionado el checkbox inferior “Show in Plugin Manager”

La categoría API Versioning tiene la información que sirve para los otros módulos que vayan a utilizar a este, por lo que podemos indicar la versión, definir los paquetes públicos, etc. Por ahora lo dejaremos así.

Dentro de Compiling podemos observar la configuración del compilador. No modificaremos nada aquí.

Finalmente en Packaging tendremos la información referente a la instalación de nuestro módulo, como la licencia para utilización del mismo, datos del autor y si necesita luego de instalarlo reiniciar la aplicación antes de utilizarlo.

Hacemos click en OK para aceptar todos los cambios.

Paso 6: Crear una Acción
Por medio de las acciones podemos agregar nuevos comportamientos a nuestra aplicación. En nuestro caso queremos agregar la acción que permita abrir el dialogo para elegir el color.

Primero creamos una nuevo Action haciendo click en File->New File.... Action se encuentra dentro de la categoría Module Development.

Hacemos click en Next.

Deberemos definir si la acción esta siempre habilitada o solo bajo una condición determinada. Elegimos que se habilite condicionalmente (Conditionally Enabled) cuando estemos parados con el cursor sobre un editor (EditorCookie), adicionalmente, solo puede estar seleccionado un solo editor (User Selects One Node).

Hacemos click en Next.

Existen cinco formas con las cuales una acción puede ser ejecutada:
  • Desde un elemento del menú
  • Desde un botón en el toolbar
  • Desde un elemento del menú contextual de un archivo
  • Desde un elemento del menú contextual del editor
  • Por medio de un atajo de teclado

En nuestro caso habilitaremos un elemento en el menú (dentro de Source) y en el menú contextual del editor (solo cuando sea un archivo .java)

En la categoría de nuestro módulo elegiremos Source, por ser el más representativo.

Hacemos click en Next.

Indicamos el nombre de la clase, en que paquete se almacena y su icono.

Hacemos click en Finish para terminar.

Nuestra acción se ha creado correctamente, aunque aún no posee comportamiento alguno.

Si observamos ahora las dependencias del módulo observaremos que se han agregado algunas:

Paso 7: Agregando código a la acción
Agregamos el código necesario a la acción recién creada y completando el método performAction (la única dependencia que aún no se cumplirá aun es a la clase DialogoColor):
//cadena a insertar
private String color = null;

//Dialogo para la seleccion del color
private final DialogoColor dc = new DialogoColor(this);

/**
* Asigna el color a mostrar
*
* @param color cadena que representa el color a mostrar
*/
public void setColor(final String color) {
    this.color = color;
}

protected void performAction(final Node[] activatedNodes) {
    //abre el dialogo de colores
    dc.setVisible(true);
    if (color != null) {
        //obtiene el gestor de editores actual
        final EditorCookie editorCookie = activatedNodes[0].getLookup().lookup(EditorCookie.class);
        //reemplaza el texto seleccionado en el editor por el color
        editorCookie.getOpenedPanes()[0].replaceSelection(color);
    }
}
Paso 8: Creando a DialogoColor
Creamos la clase llamada DialogoColor que será el dialogo que se abrirá a la hora de seleccionar el color.

Insertamos en él el siguiente código:
package ar.mendozajug.selectorcolor;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JPanel;

public class DialogoColor extends javax.swing.JDialog {

    //referencia a la accion
    private final SeleccionarColor cn;

    public DialogoColor(final SeleccionarColor cn) {
        super();

        this.cn = cn;

        inicializarInterfaz(); 
    }


    /**
    * cierra el dialogo sin elegir color
    * @return
    */
    private int cerrar() {
        return cerrar(null);
    }

    /**
    * cierra el dialogo con el color especificado
    *
    * @param color color seleccionado
    * @return
    */
    private int cerrar(final Color color) {
        String cad = null;
        if (color != null) {
            if (color.equals(Color.WHITE)) {
                cad = "Color.WHITE";
            } else if (color.equals(Color.BLACK)) {
                cad = "Color.BLACK";
            } else if (color.equals(Color.BLUE)) {
                cad = "Color.BLUE";
            } else if (color.equals(Color.CYAN)) {
                cad = "Color.CYAN";
            } else if (color.equals(Color.DARK_GRAY)) {
                cad = "Color.DARK_GRAY";
            } else if (color.equals(Color.GRAY)) {
                cad = "Color.GRAY";
            } else if (color.equals(Color.GREEN)) {
                cad = "Color.GREEN";
            } else if (color.equals(Color.LIGHT_GRAY)) {
                cad = "Color.LIGHT_GRAY";
            } else if (color.equals(Color.MAGENTA)) {
                cad = "Color.MAGENTA";
            } else if (color.equals(Color.ORANGE)) {
                cad = "Color.ORANGE";
            } else if (color.equals(Color.PINK)) {
                cad = "Color.PINK";
            } else if (color.equals(Color.RED)) {
                cad = "Color.RED";
            } else if (color.equals(Color.YELLOW)) {
                cad = "Color.YELLOW";
            } else {
                cad = "new Color(" + color.getRed() + ", " + color.getGreen() +
                    ", " + color.getBlue() + ")";
            }
        }

        //se indica la cadena que se mostrara en el editor
        cn.setColor(cad);

        //ocualta el panel
        setVisible(false);

        return 0;
    }

    private void inicializarInterfaz() {
        //configuracion general del dialogo
        setModal(true);
        setTitle("Elegir Color a Insertar");
        setDefaultCloseOperation(HIDE_ON_CLOSE);

        //asignamos layout
        setLayout(new BorderLayout());

        //incluimos el selector de color en el dialogo
        final JColorChooser cc = new JColorChooser();
        add(cc, BorderLayout.CENTER);

        //creamos panel inferior
        final JPanel jp = new JPanel(new BorderLayout());

        //insertamos en panel boton de seleccion
        final JButton btSeleccionar = new JButton("Seleccionar");
        btSeleccionar.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                //cierra el dialogo con el color elegido en el selector de colores
                cerrar(cc.getColor());
            }
        });
        jp.add(btSeleccionar, BorderLayout.WEST);

        //insertamos en panel boton de cerrar
        final JButton btCerrar = new JButton("Cerrar");
        btCerrar.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                //cierra el dialogo sin seleccionar ningun color adicional
                cerrar();
            }
        });
        jp.add(btCerrar, BorderLayout.EAST);

        //agregamos al dialogo el panel en la parte inferior
        add(jp, BorderLayout.SOUTH);

        //configuracion final del dialogo
        pack();
        setLocationRelativeTo(null);
    }
}
Para hacernos una idea de la interfaz, esto es lo que realizamos:

Paso 9: Compilando el proyecto
Seleccionamos en el menú Build->Build Main Project (o simplemente presionamos F11) para compilar el proyecto. Si lo hace correctamente ya estamos en condiciones de empezar a probar nuestro módulo (en caso contrario revisar especialmente los import).

Paso 10: Probando el módulo
Para probar el módulo tenemos dos opciones, ó lo probamos en la instancia del IDE que tenemos abierta (Development IDE) ó abrimos una nueva instancia de NetBeans (Target Platform) con el plugin ya cargado.

Yo recomiendo abrirlo aparte (si los recursos nos acompañan) para así poder trabajar tranquilo y evitar que ante una falla del plugin se no bloquee la instancia de desarrollo.

Una vez que el plugin se haya cargado (bajo cualquiera de las opciones anteriores) lo comprobaremos abriendo el menú Source:

Como podemos observar se encuentra deshabilitado porque en el editor no tenemos seleccionado ningún archivo .java.

Abrimos un proyecto y de él un archivo .java cualquiera (en mi caso cree un proyecto nuevo con solo el main). Hacemos click en algún lugar del código donde queremos insertar el color y elegimos ahora el menú, que debe ya estar habilitado. Recordemos también que habíamos colocado en el menú contextual del editor la acción:

De cualquiera de las dos formas se abrirá el dialogo para pedirnos elegir un color, seleccionamos uno y vemos que sucede:

Por lo que el módulo funciono como era esperado.

Paso 11: Distribuyendo nuestros desarrollos
Una vez que nos aseguramos que todo está funcionando bien podemos construir el archivo .NBM para compartir nuestro desarrollo con quien queramos, para ello debemos seleccionar:

Y el archivo que distribuiremos se generará dentro del directorio build de nuestro proyecto, en este caso se llama ar-mendozajug-selectorcolor.nbm

Paso 12: Instalando nuestro módulo NBM
Cuando queramos instalar el módulo simplemente nos vamos a Tools->Plugin, y en la pestaña Downloaded seleccionamos Add Plugins... Buscamos l ubicación del modulo a instalar y hacemos click en Open. Ahora el módulo se encuentra listo para instalarse:

Hacemos click en Install y completamos el instalador (advertirá que el plugin no ha sido verificado por NetBeans, simplemente lo aceptamos).

Finalmente el modulo se encontrará instalado, lo cual podemos verificar en la pestaña Installed:

Desde este mismo lugar se puede desinstalar o deshabilitar temporalmente el plugin.


Proceso de desarrollo de un nuevo módulo

Para finalizar vamos a repasar rápidamente los pasos para realizar el nuevo módulo:
  1. Crear el proyecto
  2. Configurar información general del modulo
  3. Utilizar plantillas para construir acciones, menus, ventanas, etc.
  4. Agregar la lógica al módulo
  5. Compilar, Debug y Prueba.
  6. Distribuir



Más Info




Bibliografía Recomendada

Rich Client Programming – Plugging into NetBeans Platform
Boudreau – Tulach – Wielenga
Prentice Hall – 2007
http://www.prenhallprofessional.com

Attachments

01.jpg Info on 01.jpg 24901 bytes
02.jpg Info on 02.jpg 70599 bytes
03.jpg Info on 03.jpg 47491 bytes
04.jpg Info on 04.jpg 18641 bytes
05.jpg Info on 05.jpg 20463 bytes
06.jpg Info on 06.jpg 24094 bytes
07.jpg Info on 07.jpg 25448 bytes
08.jpg Info on 08.jpg 50738 bytes
09.jpg Info on 09.jpg 8971 bytes
10.jpg Info on 10.jpg 47828 bytes
11.jpg Info on 11.jpg 43087 bytes
12.jpg Info on 12.jpg 46202 bytes
13.jpg Info on 13.jpg 41241 bytes
14.jpg Info on 14.jpg 56477 bytes
15.jpg Info on 15.jpg 73257 bytes
16.jpg Info on 16.jpg 17736 bytes
17.jpg Info on 17.jpg 38473 bytes
18.jpg Info on 18.jpg 49859 bytes
19.jpg Info on 19.jpg 36461 bytes
20.jpg Info on 20.jpg 68075 bytes
21.jpg Info on 21.jpg 58440 bytes
22.jpg Info on 22.jpg 62439 bytes
23.jpg Info on 23.jpg 50650 bytes
24.jpg Info on 24.jpg 27788 bytes
25.jpg Info on 25.jpg 36612 bytes
26.jpg Info on 26.jpg 41965 bytes
27.jpg Info on 27.jpg 56996 bytes
28.jpg Info on 28.jpg 49111 bytes
29.jpg Info on 29.jpg 31208 bytes
30.jpg Info on 30.jpg 35001 bytes
31.jpg Info on 31.jpg 80450 bytes
32.jpg Info on 32.jpg 29853 bytes
33.jpg Info on 33.jpg 73270 bytes
34.jpg Info on 34.jpg 57052 bytes
35.jpg Info on 35.jpg 38251 bytes
36.jpg Info on 36.jpg 8076 bytes
37.jpg Info on 37.jpg 40155 bytes
38.jpg Info on 38.jpg 93913 bytes
39.jpg Info on 39.jpg 88761 bytes
40.jpg Info on 40.jpg 23929 bytes
41.jpg Info on 41.jpg 40399 bytes
42.jpg Info on 42.jpg 50462 bytes
43.jpg Info on 43.jpg 46759 bytes
44.jpg Info on 44.jpg 89104 bytes
45.jpg Info on 45.jpg 134887 bytes