Java Magazine Agosto 2012 nos muestra el artículo «Developer Power» que describe 6 categorías de herramientas de productividad que hoy por hoy son factores importantes de administración de tiempo, calidad y carga de trajo en ambientes de desarrollo Java Enterprise al rededor del mundo.

Click para acceder al artículo:
www.oracle.com/javamagazine look inside
Cover
Developer Power

Graphviz es una herramienta que agrupa varios programas que generan distintos tipos de grafos a partir de archivos con un lenguaje definido. o tambien a travez de una api. (ejemplo de uso de graphviz desde C# para dibujar árbol binario, ejemplo de graphviz para dibujar un arbol B)

primero te descargas el paquete de graphviz y lo instalas
http://www.graphviz.org/Download_windows.php 

eso crea en archivos de programa una carpeta

C:\Archivos de programa\Graphviz 2.28\bin

ahi estan los ejecutables que nos interesan, en este caso por lo que planteas vamos a usar dot.exe que es para dibujar grafos dirigidos jerarquicos.

algo mas del lenguaje dot

http://www.graphviz.org/Documentation/dotguide.pdf

un ejemplo de grafo simple

grafo1.txt

Código:

digraph G
{
    node1;
    node2;
    node3;

    node1 -> node2 [label="linea1"];
    node1 -> node3 [label="linea2"];
    node2 -> node3 [label="linea3"];
}






otro mas

grafo2.txt

Código: 

digraph G
{
    main->parse->execute
    main->init;
    main->cleanup;
    execute->make_string;
    execute->printf
    init->make_string;
    main->printf;
    execute->compare;
}






ahora para generar un jpg a partir de estos codigos, digamos que tenes dos archivos. grafo1.txt y grafo2.txt

se debe invocar en la consola el siguiente comando

Código: 

...path_de_dot...\dot.exe -Tjpg archivo_de_entrada -o archivo_de_salida
a lo mas concreto para nuestros archivos de prueba

Código:

C:\Archivos de programa\Graphviz 2.28\bin\dot.exe -Tjpg grafo1.txt -o grafo1.jpg

y

Código: 

C:\Archivos de programa\Graphviz 2.21\bin\dot.exe -Tjpg grafo2.txt -o grafo2.jpg
ahora para hacer esto desde java. vas a tener que generar el texto que representa el grafo para luego invocar a dot.exe desde java y que te genere el jpg y luego jalar el jpg y mostrarlo en java. (esto es solo una forma, si conseguis el api de graphviz para java, mejor pero ya es otro metodo)

lo que vas a hacer para invocar la generacion es usar Runtime.getRuntime().exec() de java para invocar a dot.exe y mandarle los parametros de tus archivos que queres pasar a jpg.

Código: 






public class Main {
public static void main(String[] args) {
System.out.println("Hola Mundo");
try {

String dotPath = "c:\\Archivos de programa\\Graphviz 2.28\\bin\\dot.exe";

String fileInputPath = "c:\\grafo1.txt";
String fileOutputPath = "c:\\grafo1.jpg";

String tParam = "-Tjpg";
String tOParam = "-o";

String[] cmd = new String[5];
cmd[0] = dotPath;
cmd[1] = tParam;
cmd[2] = fileInputPath;
cmd[3] = tOParam;
cmd[4] = fileOutputPath;

Runtime rt = Runtime.getRuntime();

rt.exec( cmd );

} catch (Exception ex) {
ex.printStackTrace();
} finally {
}

}
}

Solo tenes que ver donde generas tus archivos de texto para representar los grafos, y luego invocar a dot y que te genere los jpgs. ya de ahi usas los jpgs donde sea necesario…

otros links de referencia

http://java.sun.com/developer/JDCTechTips/2003/tt0304.html

http://blog.taragana.com/index.php/archive/java-runtimeexec-guide/es/

http://www.ibm.com/developerworks/library/l-graphvis/

Es una representación abstracta de la sintaxis de un código fuente y es abstracta por qué representa con detalle la sintaxis de un lenguaje de programación
La Idea de una AST es que cada nodo se refiere a una construcción del código fuente por ejemplo existe el nodo If, While, asiganción. etc.
Al final de las hojas se encuentran los terminales de una gramática por ejemplo las variables, operadores, literales etc.
Ahora, porque AST y no colocar las acciones semánticas en la gramática:
  1. que todo necesitamos de las Acciones Semánticas para construir el árbol (pero para nada más)
  2. Raramente las herramientas para generar parser soportan atributos heredados y trasformar la gramática o utilizar la una pila es un tanto complicado.
  3. si se quiere interpretar un lenguaje la única forma (sin quebrarnos la cabeza) es con el AST.
  4. si se tiene N gramáticas es más fácil escribir acciones semánticas para construir el AST que traducir directamente.
Así por ejemplo el árbol de la gramática (usual) de asignación
asingacion::= ID ‘=’ Exp:a1 {:RESULT=new NodoAsignacion(ID,a1);:}
exp::= Exp:a1 ‘+’ literal:a2 {:RESULT=new NodoExp(a1,’+’,a2) :} //el Símbolo + podría cambiar por cualquier operador binario. se construye de la misma manera
|literal:a3
literal::= Num {:RESULT=new NodoLiteral(Num);:}
|ID {:RESULT=new NodoLiteral(ID);:}
Se podría agregar información extra (A las clases) como por ejemplo el No Línea, No Columna para poder identificar los Errores cuando se esté generando código o interpretando. Así como también apuntadores a la Tabla de Símbolos y al manejador de Errores.
c=a+5;
El árbol quedaría de la siguiente manera:

Note que el árbol se construirá de acuerdo a la gramática del lenguaje. Ahora para poder interpretar o genera código se haría un recorrido (o varios) en orden del AST.
He aquí un repositorio de un ejemplo (espero bastante completo) para que se hagan una idea de cómo implementa un AST de acuerdo a sus necesidades.
http://code.google.com/p/compi2jbattleship/
Acerca del ejemplo es un juego de naves que compila un subconjunto del lenguaje de Java hacia Código de 3 direcciones (TAC: Three Address Code) y luego interpreta El TAC para poder jugar de acuerdo el código.

Un problema muy común de la generación de logs con las utilidades propias de la maquina virtual de Java (la que utiliza Glassfish) es la política de rotación de logs, Glassfish 2.1 por ejemplo no tiene ningún valor configurado y Seguir leyendo

Para invocar un ejecutable externo basta hacer uso de las utilidades de la maquina virtual, en este caso java.lang.Runtime, por ejemplo si queremos tener una clase que ejecute un comando y capturar la salida del mismo podemos utilizar la siguiente Seguir leyendo