Entradas etiquetadas: java

Tutorial de MaintainJ

Por , 13 diciembre 2006 1:01

En esta entrada voy a hablar de una mini-biblioteca para java bastante util, MaintainJ

para el que no la conozca, es una pequenia utilidad que usa aspectos para monitorizar aplicaciones java, capturando informacion de las llamadas de unas clases a otras y generando, a partir de esta informacion, diagramas de secuencia y de clases

esto tiene varias utilidades: permite entender que es lo que hace determinada aplicacion a simple vista y si, por algun casual, la aplicacion esta documentada, permite saber si esta documentacion esta al dia con la aplicacion o si ha habido cambios…

en resumen, sirve para que un desarrollador al que le encargan mantener una aplicacion existente empiece a enterarse como funciona el asunto sin necesidad de largas horas de debugging y ejecucion paso a paso para ver quien llama a quien y cuando

conoci esta biblioteca hace unos meses, pero entre unas cosas y otras he ido dejando lo de ponerme a ver como funciona, ahora me encuentro en una posicion en la que tengo tiempo y tengo que encargarme de varias aplicaciones que no solo no estan documentadas en absoluto sino que el desarrollador que las hizo tenia ideas extranias con respecto a esto de la programacion, es decir, una oportunidad perfecta para jugar un poco y ver de que es capaz

la verdad es que me ha parecido muy util, no es la panacea, veo un monton de sitios por donde se podria mejorar, pero el caso es que en muy poco tiempo tienes unos diagramas bastante decentes y utiles

como las instrucciones de la pagina del proyecto dejan algo que desear, voy a hacer aqui un mini-tutorial para generar diagramas en una aplicacion web, para el que quiera probarlo, ademas, sirve como ejemplo practico de las ventajas que puede aportar la programacion orientada a aspectos:

0: Requisitos

Lo primero, aunque no se necesita eclipse para que la biblioteca haga su trabajo, si que es necesario para abrir y modificar los diagramas, para ello es necesario tener eclipse instalado con el framework de edicion grafica, ambos son faciles de instalar y estan extensamente documentados, asi que no creo que haga falta decir nada

a lo largo de este tutorial voy a suponer que el eclipse esta instalado y que el proyecto a monitorizar esta importado, si no se tiene algun proyecto web a mano, en la pagina del MaintainJ tienen uno de ejemplo o puedes usar PetStore, una aplicacion de ejemplo de sun.

ya que esta instalado el eclipse, se puede aprovechar e instalar tambien las herramientas de desarrollo de aspectJ, no son estrictamente necesarias, pero simplificara un poco la labor
es un plugin estandar, por lo que lo unico que hay que hacer es bajarlo e instalarlo en el directorio plugins del eclipse

1: Instalacion

MaintainJ es una biblioteca y un plugin para eclipse (que solo sirve para visualizar los diagramas generados, asi que empezaremos bajandonoslo de la pagina del proyecto y descomprimiendolo en el directorio de plugins de eclipse, reiniciamos este para que coja las modificaciones

por otro lado, estamos hablando de una aplicacion web, asi que hay que copiar las bibliotecas de AspectJ (aspectjrt.jar) y MaintainJ (MaintainJAspect.jar) en el directorio de bibliotecas del servidor, en mi caso, con Jboss 4, el directorio en cuestion es:

<carpeta de instalacion de jBoss>/server/<instancia del servidor>/lib

en la pagina del proyecto hay informacion para los servidores mas comunes

2: Configuracion

No hay demasiado que configurar, el servidor ya tiene las bibliotecas, en cuanto al proyecto en si, hay que aniadirle el template de proyecto de aspectJ, para eso selecciona el proyecto, haz click con el boton derecho, selecciona “AspectJ Tools” y “Convert to AspectJ Project”

seguramente aparecera una pantalla de aviso diciendote que para que funcione tienes que configurar el servidor con las bibliotecas de aspectJ, pero ya lo hemos hecho antes, asi que no hace falta hacer nada.

3: El aspecto monitor

Una vez hemos indicado que el proyecto puede usar aspectos, es necesario crear uno (SimpleAspect.aj) donde indicaremos que llamadas se capturaran, dicho aspecto heredara de SequenceAspect y puede ser tan simple como el siguiente:

public aspect SimpleAspect extends SequenceAspect
{
public pointcut anyCall():
(call(* sammael.proj..*(..)) ||
call(sammael.proj..*.new(..)));

public pointcut anyExecution():
(execution(* sammael.proj..*(..)) ||
execution(sammael.proj..*.new(..)));
}

con esto definimos que capture todas las llamadas y ejecuciones de todas las clases que comiencen por “sammael.proj”, que, en mi caso, es el prefijo que tienen todos los paquetes de mi aplicacion y habra que modificar de acuerdo con la aplicacion que este usando cada uno

lo mejor, para no tocar demasiado el proyecto a monitorizar es crear un nuevo proyecto de AspectJ y crear ahi los aspectos necesarios, durante el resto del tutorial voy a dar por hecho que esta es la opcion elegida

4: El proyecto a monitorizar

Una vez creado el aspecto, hay que decirle al proyecto que lo use, para eso seleccionamos en la carpeta del proyecto con el boton derecho y seleccionamos “Properties”
En la ventana que aparece, seleccionaremos “AspectJ Build” y la pestaña “Aspect Path”, click en el boton “Add Class Folder” y seleccionaremos la carpeta “bin” del proyecto donde hemos creado el aspecto.
en la propiedad “Java Build Path” seleccionaremos la pestaña “Projects” y añadiremos el proyecto con el aspecto
una vez hecho esto, haz click en “OK”

ahora, si abrimos cualquier clase cuyo paquete empiece por la ruta que hemos definido en el aspecto, veremos un icono al lado del nombre de la clase y de todos los metodos, indicando que ese metodo usara un aspecto, si ponemos la flecha del raton encima aparecera una ventana informandonos de que aspecto va a usar (en nuestro caso sera SequenceAspect.aj, el aspecto de MaintainJ)

En MaintainJ, por defecto, no se monitoriza la aplicacion, es necesario indicar explicitamente cuando se debe empezar y parar el proceso, vamos a añadir lo necesario para que lo podamos hacer de una manera sencilla

Para esto, vamos a crear un servlet llamado AspectServlet:

public class AspectServlet extends HttpServlet
{
public void service(HttpServletRequest req,
HttpServletResponse resp)
throws ServletException, java.io.IOException
{
String nextAction = req.getParameter(“nextAction”);
if(nextAction != null && nextAction.equals(“start”)){
JoinPointList.clear();
JoinPointList.setAddJoinPoint(true);
} else if(nextAction != null && nextAction.equals(“stop”)){
String useCase = req.getParameter(“useCase”);
JoinPointList.setAddJoinPoint(false);
JoinPointList.writeToFile(useCase + “.ser”);
}
req.setAttribute(“nextAction”, nextAction);
RequestDispatcher dispatcher =
req.getRequestDispatcher(“/aspect.jsp”);
dispatcher.forward(req, resp);
}
}

Este servlet se encargara de indicarle a MaintainJ cuando debe iniciar la monitorizacion (“JoinPointList.setAddJoinPoint(true)”) y cunado debe parar (“JoinPointList.setAddJoinPoint(false)”)

Ahora le indicaremos a la aplicacion que debe de usar ese servlet y que mapeo tendra, abrimos el fichero “web.xml” dentro de “WEB-INF” y añadimos lo siguiente:

<servlet>
<servlet-name>AspectServlet</servlet-name>
<servlet-class>maintainj.AspectServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>AspectServlet</servlet-name>
<url-pattern>maintainj/AspectServlet</url-pattern>
</servlet-mapping>

solo queda crear una pagina jsp para tener a mano los controles, de acuerdo con el servlet, tendremos un formulario con dos parametros:

nextAction: indicando cual es la siguiente accion a realizar, tiene dos valores posibles, “start” y “stop”
useCase: el path completo y el nombre del archivo donde se almacenara toda la informacion, un posible valor puede ser “C:\\testCase”, que generara el archivo testCase.ser en C:\

con esto en mente, el formulario podria ser algo asi:

<FORM name=”sequence”>
<input type=”hidden” name=”nextAction” />
File name:
<INPUT type=”text” name=”useCase” size=”30″>
<INPUT type=”button” name=”start”
value=”Start” onClick=”javascript:submitPage(‘start’)”>
<INPUT type=”button” name=”stop” value=”Stop”
onClick=”javascript:submitPage(‘stop’)”>
</FORM>

Solo queda añadir la funcion javascript que se encarga del submit y listo:

function submitPage(param){
document.sequence.nextAction.value = param;
document.sequence.nextAction.action = “/AspectServlet”;
document.sequence.submit();
}

ya esta, hacemos el deploy de la aplicacion en el servidor (ya sea un .war, un .ear o el directorio a pelo), reiniciamos este si es necesario y listo.

a partir de ahora podras acceder al servlet poniendo en la barra de direcciones:

http://<path hasta tu aplicacion>/maintainj/AspectServlet

para empezar a grabar las llamadas, simplemente pulsa “start” y en otra ventana haz lo que quieras monitorizar de la aplicacion (el proceso de login, crear un nuevo registro, lo que sea), cuando quieras parar, introduce el nombre del fichero y pulsa “stop”, si lo haces sin haber introducido un nombre de fichero, saltara una excepcion pero podras continuar usando tanto el monitor como la aplicacion sin problemas.

PD: este tutorial esta basado en la guia que hay en la pagina web del proyecto, pero traducido, ordenado y con comentarios especificos de como lo he llevado yo a cabo

Entrada publicada originalmente en Barrapunto

Panorama Theme by Themocracy