¿Cómo utilizar VSCode y Moose para analizar proyectos Java?

VSCode es una increíble herramienta de edición. Gracias a sus extensiones, se puede desarrollar utilizando muchos lenguajes de programación. Sin embargo, ¿qué pasa con el análisis de un sistema de software utilizando VSCode? En este artículo, le mostraremos cómo utilizar VSCode con Moose para analizar el código Java. Utilizamos Christopher Fuhrman como ejemplo.

Aunque podemos realizar algunos análisis desde VSCode, utilizar la herramienta Moose de forma nativa proporciona una mejor experiencia de usuario. No obstante, pensamos que esto puede ser de interés para las personas que sólo utilizan la herramienta VSCode.

Descargue e instale las herramientas necesarias

Para realizar el análisis, utilizaremos la versión interna de VSCode. Actualmente, sólo esta versión soporta la función de NoteBook que utilizaremos. Así que, como primer paso, instala la última versión insider de VSCode. También necesitaremos una imagen de Moose y una VM de Pharo. Para esta entrada del blog, utilizaremos una imagen de Moose 8 basada en Pharo 8.

  • Descargue la última imagen de Moose 8 para VSCode y extráigala.
  • Descargue la correspondiente VM de Pharo y extráigala.

Consejo: No tome la versión sin cabeza (no ha sido probada)

Una vez que hayas descargado VSCode, Moose 8, y la VM de Pharo, instalaremos la extensión en VSCode.

  • Descargar la extensión
  • Abrir VSCode insider
  • Abra la carpeta en la que se encuentra el archivo de extensión
  • Haga clic con el botón derecho del ratón en el archivo y ejecute Instalar la extensión
  • Cerrar VSCode

A partir de ahora, debes iniciar VSCode insider con los siguientes parámetros (-enable-proposed-api badetitou.pharo-language-server). Esto permite a VSCode utilizar la API de Notebook. Ejecute el siguiente comando en un terminal:

  • code-insiders -enable-proposed-api badetitou.pharo-language-server

O en Windows:

  • code-insiders.cmd -enable-proposed-api badetitou.pharo-language-server

Configurar VSCode

Ahora necesitamos configurar la extensión de Pharo Language Server. Para ello:

  • Vaya en la configuración de VSCode (Ctrl + ,).
  • Buscar en la configuración de Pharo
  • Establecer el campo Ruta de acceso a la imagen con la ruta de la imagen que has descargado
    D:|Users\benoit.verhaeghe\documents\Pharo\images\LSP4\LSP4.image
  • Establecer el campo Ruta de acceso a la VM con la ruta de acceso a la VM que has descargado
    D:|Users\benoit.verhaeghe\Documents\Pharo\vms\80-x64\Pharo.exe
  • Reinicie VSCode (para asegurarse de que la configuración está bien guardada)

Consejo: Si utiliza Windows, es posible que tenga que eliminar todos los caracteres de espacio en la ruta.

Una vez realizada la configuración, puedes crear un nuevo archivo llamado oo-analysis.moosebook. Debería abrirse como un cuaderno VSCode y una imagen Pharo (puede reducir la imagen Pharo, pero no lo cierre).

Establecer el análisis de un nuevo proyecto

Para configurar el análisis de un nuevo proyecto hay que tener en cuenta varios pasos.

Clone el proyecto Java que desea analizar

En primer lugar, vamos a descargar el proyecto de GitHub que queremos analizar. Para ello, creamos un nuevo celda de código en VSCode con el siguiente código:
javaProjectFileRef := MooseEasyUtility cloneGitHubRepo: 'https://github.com/bethrobson/Head-First-Design-Patterns'.

Este trozo de código descargará el proyecto bajo nuestra carpeta de imágenes de Pharo. Para ejecutar la celda, presione la flecha de ejecución al lado de la celda. En caso de éxito, aparece un pequeño tick y la ruta al proyecto clonado tiene salida de la celda.

Analizar el código Java para hacer el modelo FAMIX

Como en la entrada original del blog de Christopher, ahora analizaremos el proyecto Java y crearemos un modelo FAMIX. Para parsear el proyecto Java, usamos VerveineJ v1.x.x (v1.x.x trabaja con Moose 8, mientras que v2.x.x está bajo modificación para trabajar con el futuro Moose 9).
Al contrario que en la entrada original del blog, vamos a descargar VerveineJ v1.0.2 (y no v1.0.1). Incluye buenas correcciones.

  • Cree una nueva celda de código con el siguiente fragmento de código para descargar la última versión de VerveineJ y extraerla
cliente :=ZnClient nuevo. cliente signalProgress: falso; url: 'https://github.com/moosetechnology/VerveineJ/archive/v1.0.2.zip'; descargar a:FileLocatorimageDirectory. cliente isSuccess ifTrue: [ ZipArchive nuevo leerDe: (FileLocatorimageDirectory/ 'v1.0.2.zip') asFileReferencepathString ; extraerTodo:FileLocatorimageDirectory."Como los permisos no se conservan con ZipArchive#extractAllTo:""Esta línea no es necesaria en el sistema Windows"LibCrunCommand: 'chmod u+x ', (FileLocatorimageDirectory/ 'VerveineJ-1.0.1/verveinej.sh') asFileReferencepathString ] ifFalse: [ Errorseñal: 'Descarga fallida.' ]
  • Entonces, preguntaremos MooseEasyFamixMaker para analizar el proyecto Java utilizando VerveineJ y crear un .mse para nosotros. De nuevo, en otra celda, ejecuta el siguiente fragmento de código.
mago := MooseEasyFamixMaker
generarMSETo: 'tmp/HFDP.mse' asFileReference
el análisis sintáctico: 'tmp/MooseEasyRepos/bethrobson__Head-First-Design-Patterns' asFileReference
con: (FileLocator imageDirectory / 'VerveineJ-1.0.2/verveinej.bat') asFileReference.
mago generarMSE.

.mse es un formato de archivo utilizado por Moosetechnology para representar su modelo y metamodelo. Existen otros formatos.

Cargar el modelo

El último paso es cargar el modelo en la imagen de Moose (la que estamos controlando mediante VSCode). En una nueva celda, ejecutar:

mseFileRef := 'tmp/HFDP.mse' asFileReference. "Generado por FamixMaker"
mseStream := mseFileRef readStream.
mseStream
ifNotNil: [
alceModelo := MooseModel importFromMSEStream: mseStream.
alceModelo rootFolder:
'tmp/MooseEasyRepos/bethrobson__Head-First-Design-Patterns'.
mseStream cerrar. ]
ifNil: [ auto error:
'No se pudo cargar el archivo MSE en Moose: ' , mseFileRef asString ].
mseStream.
alceModelo instalar

La salida de la célula debe ser a MooseModelo #HFDP(30946).
¡Felicidades! Ya lo has configurado todo. Ahora es el momento de analizar el proyecto :cohete:

Análisis

Para visualizar los paquetes Java usando PlantUML. Primero instalamos el conector PlantUML de Pharo (PlantUMLPharoGizmo). Para ello, basta con crear una nueva celda de código con el script de instalación y ejecutarlo.

"Instalar PlantUMLPharo"
versión := 'maestro'.
Metacello nuevo
depósito: github://fuhrmanator/PlantUMLPharoGizmo:' , versión, '/src';
de la línea de fondo: 'PUGizmo';
carga.

Luego, puede visualizar las clases de un paquete ejecutando un Script de Pharo.

atributo := verdadero.
método := falso.
herencia := verdadero.
agregación := verdadero.
createCheckBox := falso.

preferencia := 'set namespaceSeparator ::' , Cadena cr
  , "ocultar los miembros vacíos , Cadena cr , "escala 1 , Cadena cr
  , "dirección de izquierda a derecha , Cadena cr.

artículos := alceModelo allModelClasses seleccionar: [:cada uno | cada uno Nombre del alce comienzaCon: 'headfirst::designpatterns::combining::decorator' ].


pUMLSource := PUGizmo
  plantUMLSourceForMooseJavaClasses: artículos
  conPreferencia: preferencia
  conRelaciones:
   {atributo.
   método.
   herencia.
   agregación.
   createCheckBox}.

plantKey := pUMLSource asPlantUMLKey.
serverUrl := 'https://www.plantuml.com/plantuml/img/', plantKey.  
imageMorph := (ZnEasy getPng: serverUrl asUrl).

En el ejemplo anterior, al igual que en la entrada original del blog, nos centramos en el paquete: headfirst::designpatterns::combining::decorator y mostramos los atributos de las clases, las herencias y la agregación. Al ejecutar el código se obtiene la siguiente imagen como salida de la celda VSCode.

Realiza un análisis de Moose con Pharo

También es posible ejecutar algún código clásico de Pharo. Podemos solicitar la lista de clases que implementan más de una interfaz.

"Consultar todas las clases que tienen más de dos superclases directas FAMIX"
classesImplementingMoreThanOneInterface := alceModelo allModelClasses 
 seleccionar: [ :Cada uno |
  cada directSuperclasses tamaño > 2 ].
Cadena streamContents: [ :stream | classesImplementingMoreThanOneInterface hacer: [:clase | flujo << clase nombre ] separadoBy: [stream << ', ' ] ]

Visualización con Roassal

Por último, se puede utilizar Roassal2 (o Roassal3 en Pharo 9) para crear una visualización personalizada. Es posible utilizar la visualización pre-construida que viene de Moose, como el mapa de anidamiento del sistema:

ver := RTView nuevo.
FAMIXSystemNestingMap nuevo
  viewNamespaces: (alceModelo allNamespaces seleccionar: [ :cada uno | cada uno allClasses cualquierSatisfacer: [ :c | c isStub no ] ])
  destacando: {}
  onRaw: vista.
ver

O cualquier otra visualización de Roassal.

Recursos

Más ...

Scroll al inicio