Skip to content

Crear Diagrama UML en Papyrus a partir de archivo UML

Siguiendo lo que publiqué antes aquí, ahora estoy intentando crear también diagramas de secuencia y de actividad.

Considero de que debería ser mucho más fácil, pero al menos se puede hacer. Tengo la esperanza de que a futuro esto vaya mejorando y termine siendo más natural, pero por ahora es lo mejor que encontré (y eso que he estado probando muchas herramientas, desde Rational Software Architect, Enterprise Architect, Obeo UML Designer, Argo UML, etc., etc., .. y si no es por una cosa es por otra…).

 

Estoy usando la última versión de Papyrus (de febrero de 2013), en Eclipse Juno, con UML 2.4 (ya que en versiones anteriores he experimentado otros problemas como por ejemplo para poder aplicar estereotipos).

 

Los pasos son más o menos los mismos, ahora voy a agregar capturas de pantalla.

  • Hay que trabajar con la Papyrus Perspective. Para esto hay que ir a Windows -> Open Perspective -> Other – Papyrus, o seleccionarla si aparece en la lista de perspectivas.

p1

  • Seleccionar el archivo UML en el Package Explorer, y con ese elemento seleccionado ir al menú para Crear un modelo Papyrus, haciendo botón derecho sobre el archivo UML, o yendo a File -> New -> Papyrus Model. El nombre de archivo será el mismo que el del UML, pero con la extensión .di.
  • Abrir el modelo Papyrus (al crearlo queda abierto)
  • Ir al Papyrus Model Explorer (es una de las vistas que aparece en la perspectiva de Papyrus)
  • Botón derecho sobre la actividad que ya tenemos en el modelo UML -> New Diagram -> Create a new activity diagram, o el que necesitemos. En el caso de un diagrama de clases lo hacemos sobre el paquete seleccionado, si es un diagrama de secuencia también… hay que jugar un poco con esto para ver cómo queda mejor. En el caso de un diagrama de actividad, si no se hace sobre la actividad, entonces creará una actividad nueva.

p1

  • Arrastrar elementos desde el Model Explorer sobre el diagrama recién creado. Al hacer esto, los elementos serán cargados con sus relaciones y propiedades correspondientes. Hay que tener cuidado con el orden que se hace esto, porque por ejemplo en un diagrama de actividad no será el mismo resultado si se ponen primero las aristas y luego los nodos, es necesario poner los nodos y luego las aristas (esto claramente es un bug).

 

p1

 

Luego se puede seleccionar si mostrar algunos elementos del modelo con Filter -> show/ hide content.

p1En el ejemplo de la imagen estoy seleccionando que se muestren todas las operaciones y atributos en un diagrama de clases.

 

Ya que me dio tanto trabajo ir descubriendo las cosas, y no está documentado en ningún lado, espero que le sirva a alguien más que se pelee con Papyrus 🙂

 

A tener en cuenta al escribir

Algunos consejos de mi tutor para tener en cuenta al momento de escribir artículos

  1. A cada revisor le llegan 4 ó 5 papers y pueden verse agobiados de tiempo, por lo que es probable que quieran leerlos deprisa.
  2. Cuando revisan los papers, lo hacen sin cariño. Es decir, que prefieren encontrarles errores para poder tirarlos y hacer más rápidamente su trabajo antes que reconocer la posible excelencia del artículo.
  3. No debemos dar por supuesto que ya conocen lo que estamos contando, ni que van a entusiasmarse con nuestra creación de conocimiento: aunque a nosotros nos entusiasme, a ellos “no les pone”.
  4. Hay que dar una lectura fácil y, a la vez, científicamente valiosa, sin dar por supuesto nada.

Pruebas JUnit parametrizadas con cantidad variable de parámetros

Quiero poder tener pruebas JUnit parametrizadas (ver este link para ver un ejemplo simple) pero utilizando la facilidad de java de tener una cantidad variable de argumentos (ver este link para un ejemplo simple), ya que la cantidad de datos de prueba pueden variar, como por ejemplo, una factura la puedo crear con distintas cantidades de productos.

Esta pregunta en StackOverflow fue de gran ayuda.

@RunWith(value = Parameterized.class)
publicclass invoice_test {
    private String id;
    private String date;
    private String clientName;
    private String subtotal;
    private ArrayList<String> lines = new ArrayList<String>();

    public invoice_test(String id, String date, String clientName,
                 String subtotal, String... invoiceLine) {
      this.id = id; this.date = date;
      this.clientName = clientName; this.subtotal = subtotal;
      for (String s : invoiceLine) {
        this.lines.add(s);
      }
    }
    @Parameters
    publicstatic Collection<Object[]> data() throws Exception {
      return getData();
    }

public List<Object[]> getData() throws Exception{

  BufferedReader br = null;
  String linea = null;
  br=new BufferedReader(new FileReader(new File("testdata.txt")));
  List<Object[]> result = new ArrayList<Object[]> ();
  while((linea=br.readLine())!=null){
    Object[] parse = processLine(linea.split(";"));
    result.add(parse);
  }
  br.close();
  return result;
}
private Object[] processLine(String[] split) {
  ArrayList<Object> result = new ArrayList<Object>();
  for(String s : split){
    if (s.contains("&")){
      result.add(s.split("&"));
    }
    else{
      result.add(s);
    }
  }
  return result.toArray();
}

...

@Test
publicvoid tc001_invoice() throws Exception {
   ...
   interface.CreateInvoice(id,date,clientName,subtotal,lines);
   ...
}


Y mi archivo de datos contiene líneas como esta:
id; date; ClientName; subtotal; 5*apple&1*banana&2*peach

getStereotype en Acceleo

Se ve que nadie necesitó esto antes, porque no lo encontré en ningún lado por la web, así que por las dudas que a futuro le venga bien a alguien, acá dejo el código Acceleo que me sirve para encontrar un estereotipo de un profile aplicado al modelo

[query public getStereotype(nameSt : String) : Stereotype = 
 ProfileApplication.allInstances().appliedProfile.ownedElement->filter(Stereotype)
 ->select(name=nameSt)->asSequence()->first() 
/]

Esto es luego útil para usarlo de parámetro en isStereotypeApplied sobre cualquier elemento.

Add ATL Nature

No se por qué, pero no me aparecía en el menú contextual sobre el proyecto la opción de agregar ATLNature a un proyecto existente, entonces lo hice editando el “.project”. Es necesario agregar estas dos secciones donde corresponde

 

<buildSpec>
        <buildCommand>
                <name>org.eclipse.m2m.atl.adt.builder.atlBuilder</name>
               <arguments>
               </arguments>
        </buildCommand>
</buildSpec>

 

<natures>
                <nature>org.eclipse.m2m.atl.adt.builder.atlNature</nature>
</natures>

Ejecutar ATL desde código

No es algo muy complicado de lograr, a menos que se esté utilizando UML y estereotipos. En ese caso es necesario considerar lo que aparece en este foro. Agradezco nuevamente a Mauro y Darío por su colaboración 🙂

Es importante agregar esta línea

 resourceSet = ((EMFModelFactory)modelFactory).getResourceSet();
 init(resourceSet);

donde “init” es el método tal como está explicado en el foro.

También es recomendable, para mayor facilidad al hacer el código, construir primero una transformación ATL, y luego a partir de ella crear un nuevo proyecto tipo Plugin ATL, y de esa forma se creará una clase “transformation.java” (donde “transformation” es el nombre de nuestra transformación, o sea, le dimos de entrada un “transformation.atl”) que contiene código que podemos usar para invocar nuestra transformación desde java, o línea de comandos.

Para instalar MOFScript

Como ya no está accesible MOFscript, voy a respaldarme los archivos que tenía de mi versión anterior de Eclipse. Ahora me pasé a Eclipse Juno, copié los archivos y aparentemente funciona bien.

http://rapidshare.com/files/3164696472/mofscript.zip

Al intentar instalar MOFScript con el update site me da este error:

No repository found at http://download.eclipse.org/modeling/gmt/mofscript/update/.