Hace algún tiempo ya conocí y trabajé con Gephi, una herramienta open source para realizar análisis de redes sociales o SNA por sus siglas en inglés. Gephi está construido sobre la plataforma de NetBeans, lo que le permite que sea extensible agregando nuevos plugins, de hecho existen ya varios plugins y siguen creciendo.
Es así como iniciamos la construcción de un plugin que nos permita visualizar el resultado de los análisis que se realizan en Gephi. El plugin lo denominamos Loxa Web Site Export y es un plugin que exporta el análisis realizado a un sitio Web, que es fácil de personalizar (a través de hojas de estilos) y enriquecer con descripciones de cada uno de los gráficos (editando un archivo JSON). Una imagen que muestra un sitio publicado con nuestro plugin:
Usámos Gephi para realizar un meta-análisis del proyecto TAEE aplicando análisis de redes sociales, y lo resultados los publicamos usando el plugin y lo publicamos aquí.
Obviamente el plugin fue desarrollado en JAVA usando las siguientes tecnologías:
JSOUP: para armar la página principal del sitio Web
GSON: para transformar un objeto a un archivo json
Seadragon: que nos permite crear imágenes con nivel de zoom-in bastante alto. Si bien no es tecnología Java, existe una implementación Java.
PDF-Renderer: que permite crear un documento pdf en memoria y luego usarlo para crear la imágenes que se usaran Seadragon
En el sitio Web generado se usan varios plugins de jQuery, json, etc.
En próximas entradas iré explicando como se usó algunas de las tecnologías para construir el plugin. Empezaremos explicando cómo generar una imagen que sirve de leyenda para explicar el significado de los colores que se usaron en un análisis.
Fue mi primera experiencia con la plataforma de NetBeans y me pareció una experiencia enriquecedora como programador
Uno de los API’s, dentro del mundo Java, que permiten trabajar con servicios Web basados en REST se denomina Jersey. Este API viene incluido con NetBeans desde ya hace algunas versiones atrás. Inclusive en el sitio de NetBeans existe documentación en donde se muestra como crear un servicio Web Rest basado en una tabla de una base de datos. Pero no existe ninguna documentación, al menos en sitio de NetBeans, que muestre como crear un cliente Jersey que consuma algún servicio Rest.
Otro ejemplo bastante sencillo, pero no menos ilustrativo se llama Yahoo Search Restful Client using Jersey, aquí se desarrolla un cliente que consume el servicio de búsqueda de Yahoo. Dicho servicio de búsqueda devuelve los resultados en XML así que es necesario usar JAXB Binding para obtener las clases que representaran la información.
No he encontrado un ejemplo en donde se trabaje con JSON, tomando en cuenta que ese formato es bastante popular hoy por hoy. Así que me decidí a elaborar un cliente Jersey que consuma el API de Google AJAX search que devuelve información en JSON. El código desarrollado es el siguiente:
package ecc.edu.utpl;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.WebResource;
import java.util.Scanner;
import javax.ws.rs.core.MediaType;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
/**
*
* @author jorgaf
*/
public class ClienteGoogle {
public static void main(String[] args) {
Scanner lector = new Scanner(System.in);
String consulta;
char opc = 'S';
String URI = "http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=";
Client cliente = Client.create();
do {
do {
System.out.print("Ingrese el texto a buscar: ");
consulta = lector.nextLine();
consulta = consulta.trim();
consulta = consulta.replace(" ", "%20");
} while (consulta == null || consulta.length() == 0);
URI += consulta;
WebResource recurso = cliente.resource(URI);
String result = recurso.accept(MediaType.APPLICATION_JSON).get(String.class);
try {
System.out.printf("---RESULTADOS:%s---\n", consulta);
mostarResultados(result);
System.out.printf("---%d páginas aprox.---\n",
obtenerTotalResultados(result));
} catch (JSONException ex) {
ex.printStackTrace();
}
System.out.println("\n-------------------------------");
System.out.println("¿Desea realizar otra búsqueda?");
System.out.print("Presione S(Si) o N(No): ");
opc = lector.next().charAt(0);
System.out.println();
} while (opc != 'N');
}
public static void mostarResultados(String respuesta) throws JSONException {
JSONObject objJSON = new JSONObject(respuesta);
JSONObject responseData = objJSON.getJSONObject("responseData");
JSONArray results = responseData.getJSONArray("results");
for (int i = 0; i < results.length(); i++) {
JSONObject link = results.getJSONObject(i);
System.out.printf("URL: %s\n", link.getString("url"));
System.out.printf("Title: %s\n", link.getString("title"));
System.out.printf("Contenido: %s\n", link.getString("content"));
System.out.println();
}
}
public static long obtenerTotalResultados(String respuesta){
long total = 0;
try {
JSONObject objJSON = new JSONObject(respuesta);
JSONObject responseData = objJSON.getJSONObject("responseData");
JSONObject cursor = responseData.getJSONObject("cursor");
total = cursor.getLong("estimatedResultCount");
} catch (JSONException ex) {
ex.printStackTrace();
}
return total;
}
}
Para poder realizar este cliente tuve que agregar las siguientes librerías adicionales:
Las tres primeras librerías se pueden descargar desde la Web haciendo clic en cada uno de los enlaces. Pero el último lo agregué desde NetBeans. La siguientes imágenes les guiarán en ese proceso.
Los métodos mostrarResultados y obtenerTotalResultados, son los encargados de trabajar con JSON. Para conocer la estructura JSON de la información devuelta por Google hagan clic aquí y busquen el tema «Entornos Flash y otros entornos que no utilizan JavaScript» que casi se encuentra al final.