Archivo

Archivo para la Categoría "Java"

JQL (Java Query Language)

Hace un tiempo atrás conocí YQL, un servicio de Yahoo! que permite hacer consultas tipo SQL a sus APIs o a sitios webs… Buscando algo así para Java no encontré nada parecido, por lo que empece a hacerlo yo. El resultado fueron unas cuantas lineas de código que permiten filtrar ,manipular y unificar datos de páginas Web , simplemente con una consulta tipo SQL muy similar a YQL.

Por ejemplo si quisiera filtar los datos de una página web debería usar una conexión, obtener la página , filtarla usando expresiones regulares y devolver los datos que quisiera. Con ésta librería es tan simple como crear una consulta SQL:

Ejemplo:
Acá obtengo los resultados de búsqueda de goear.com

//Creo la consulta SQL
String sql = "SELECT href,title FROM html WHERE url='http://goear.com/search.php?q=rafaga' AND xpath=\"//a[@class='b1']\"";
//Creo un objeto de la clase JQL y le paso como parametro la query sql y el tipo que quiero que devuelva (JSON)
JQL jql = new JQL(sql,JQLResultType.JSON);
//Agrego un listener para que sea lanzado cuando me devuelva los resultados
jql.addJQLResultListener(new JQLResultListener() {
	//Implemento el método jqlResult para obtener los resultados
	public void jqlResult(JQLResultEvent event) {
	    //Imprimo los resultados de mi consulta
	    System.out.println(event.getJqlResult());
	}
});
//creo un hilo y le paso como parametro el objeto JQL
Thread th = new Thread(jql);
//lanzo el hilo
th.start();

Simplemente Selecciono el href y el titulo de los links de goear donde la url de donde sacare esos datos sea la página de goear y le paso el xpath de donde están los elementos que quiero obtener. Al hacer correr ese codigo me devuelve un String con JSON listo para ser manipulado:

run:
{
        "query": {
        "count": "10",
        "created": "2010-05-23T10:19:48Z",
        "lang": "en-US",
        "diagnostics": {
                "url": {
                        "execution-time": "4072",
                        "proxy": "DEFAULT",
                        "content": "http://goear.com/search.php?q=rafaga"
                }
        },
        "results": {
                "a": [
                        {"href":"listen/c77464e/rafaga-radio-andalucia-(1)-radio-andalucia-informacion","title":"Escuchar Rafaga Radio Andalucia (1) de radio andalucia informacion"},
                        {"href":"listen/6d87274/una-rafaga-de-amor-rafaga","title":"Escuchar Una rafaga de amor de rafaga"},
                        {"href":"listen/fd1b84c/una-rafaga-de-amor-rafaga","title":"Escuchar Una Rafaga De Amor de rafaga"},
                        {"href":"listen/3b043de/jambo-jambo---rafaga-sunshine-rafaga-sunshine","title":"Escuchar JAMBO JAMBO - Rafaga Sunshine de rafaga sunshine"},
                        {"href":"listen/1dbcd0b/una-rafaga-de-amor-rafaga","title":"Escuchar una rafaga de amor de rafaga"},
                        {"href":"listen/71b1c55/una-rafaga-de-amor---calidad-media---faviomundo.pe.kz-rafaga","title":"Escuchar Una Rafaga De Amor - Calidad Media - FavioMundo.Pe.Kz de rafaga"},
                        {"href":"listen/9ff4361/una-rafaga-de-amorr-rafaga","title":"Escuchar una rafaga de amorr de rafaga"},
                        {"href":"listen/b9cdad7/rafaga-feat-korekt---sabes(((-www.robney.com.pe-)))-rafaga-feat-korekt---sabes","title":"Escuchar Rafaga Feat Korekt - Sabes((( wWw.Robney.CoM.Pe ))) de Rafaga Feat Korekt - Sabes"},
                        {"href":"listen/1286fa6/rafaga---mentirosa-(danny-romero-remix)-rafaga---mentirosa-(danny-romero-remix)","title":"Escuchar Rafaga - Mentirosa (Danny Romero Remix) de Rafaga - Mentirosa (Danny Romero Remix)"},
                        {"href":"listen/b229d9c/no-te-vallas-remix-rafaga-dj-efexts-rafaga-dj-efexts","title":"Escuchar No Te Vallas Remix Rafaga Dj Efexts de Rafaga Dj Efexts"}
                ]
        }
        }
}

La librería solo es un prototipo de lo que va a ser. La idea es poder obtener Objetos Java como Map o Document para manipularlo aun mas fácil desde Java.

Además se podrá definir el método HTTP de la consulta (GET o POST) para aumentar aun mas su funcionalidad. La idea es poder hacer la mayoría de los comando SQL que funcionen en JQL.

Bueno acá les dejo el link de la librería si quieres aportar:
http://kenai.com/projects/javaquerylanguage/

PD: El código esta muy desordenado D:

Saludos!

ACTUALIZACIÓN 01 (25/05/2010):
- Puede devolver Map y String con JSON.
- Ordenado el Código y programado Orientado a Objetos.
- Mejorado el codigo para parsear las consultas

Categorías:Java, Proyectos Etiquetas: , , , ,

Java Persistence: Crea Aplicaciones Rapidamente [Netbeans+Java+Mysql+TopLink]

Supongamos que tenemos una base de datos y de las tablas de esa base de datos queremos armar una aplicación.
Las Tablas son 2:

  • pais
  • ciudad

CREATE TABLE pais (
	p_id VARCHAR(3) NOT NULL,
	p_nombre VARCHAR(25),
	PRIMARY KEY (p_id)
);
CREATE TABLE ciudad (
	c_id VARCHAR(2) NOT NULL,
	c_nombre VARCHAR(25),
	p_id VARCHAR(3) ,
	c_habitantes INT,
	PRIMARY KEY (c_id) ,
	FOREIGN KEY(p_id) REFERENCES pais(p_id)
);

Esas tablas contienen los siguientes registros:

INSERT INTO pais VALUES('001','Chile');
INSERT INTO pais VALUES('002','Venezuela');
INSERT INTO pais VALUES('003','EEUU');
INSERT INTO pais VALUES('004','Francia');

INSERT INTO ciudad VALUES('01','Concepcion','001',222232);
INSERT INTO ciudad VALUES('02','La serena','001',234445);
INSERT INTO ciudad VALUES('03','Valparaiso','001',123434);
INSERT INTO ciudad VALUES('04','Maracaibo','002',89212);
INSERT INTO ciudad VALUES('05','Caracas','002',233456);
INSERT INTO ciudad VALUES('06','Nueva York','003',445212);
INSERT INTO ciudad VALUES('07','Washington','003',235211);
INSERT INTO ciudad VALUES('08','Paris','004',232452);
INSERT INTO ciudad VALUES('09','San Huano','003',445212);

Para crear una aplicación en Java deberiamos comunmente armar un sistema en 3 capas y crear clases para conexión, manipulacion de datos, etc… como lo hacia en este post: http://estebanfuentealba.wordpress.com/2009/03/12/mysql-java-netbeans-conectar-a-una-base-de-datos-con-java/

Bueno en este post mostraré como crear una aplicacion en simples pasos sin necesidad de mucho programar con Java Persistence.

1.- Creamos un proyecto Java Aplication

2.- Le Asignamos un Nombre a nuestro proyecto y Finalizamos

3.- Ahora agregaremos a nuestro proyecto una conexión a nuestra base de datos, Para eso vamos a la pestaña Services, damos click derecho a Databases y presionamos New Connection…

4.- Ahora Configuramos; Seleccionamos el driver de MYSQL y completamos con los datos de la base de dato yFinalizamos.

5.- Ahora vamos a la pestaña Proyects, click derecho en Libraries y Add Library...

Agregaremos el Driver de MySQL y TopLink


Ahora ya podemos empezar a trabajar. Ahora agregaremos clases a nuestro proyecto. TopLink puede mapear la base de datos y transformar bd relacional a programación objetual. Para eso agregamos a nuestro proyecto una clase mapeada de la base de datos llamada Entity Clases From Data Base…

Nos pedirá la conexión y según ésta nos mostrará las tablas. Agregamos las tablas que deseamos ocupar en nuestro Proyecto y damos a Next.

Las tablas se mapearán y se convertirán en Clases , ahora nos pedirá el nombre que tendrán esas Clases mapeadas… Luego configuramos Persistence Unit… (Necesario para percistence)

Seleccionamos TopLink como Persistence Library y precionamos Create

Por Último presionamos Finish

Si todo sale Bien se habrán creado las clases que fueron mapeadas desde la base de datos

Ahora podemos empezar a programar :P , en este mini tutorial crearé el siguiente programa.

Un combobox con todos los países de la base de datos, al seleccionar algún país mostrará todas las ciudades asociadas a ese país.

Agregamos a nuestro proyecto un JFrame Form y agregamos JComboBox,JList y los JLabel’s correspondientes.

Agregamos los siguientes Atributos al JFrame Form:

    private EntityManagerFactory emf;
    private EntityManager em;

Ahora en el constructor del JFrame Form agregamos las siguientes lineas

    public NewJFrame() {
        initComponents();
        //inicializamos el EntityManagerFactory
        emf = Persistence.createEntityManagerFactory("TestPU");
        //inicializamos entity manager
        em = emf.createEntityManager();
        //Agregamos un Model al JList
        jList1.setModel(new DefaultListModel());
        //Posicionamos la ventana en el centro
        this.setLocationRelativeTo(null);
        //Llamamos al metodo que llena el combobox con paises
        loadComboBox();
    }

Ahora creamos el método loadComboBox que carga los países al combobox.

    public void loadComboBox() {
        //Creamos una Query
        //"Pais.findAll" es una query que fue definida automaticamente gracias al mapeo de la db
        //Luego obtenemos los resultados y los recorremos
        Iterator it = em.createNamedQuery("Pais.findAll").getResultList().iterator();
        while(it.hasNext()) {
            //Agrego el resultado al Combobox
            this.jComboBox1.addItem(((Pais)it.next()));
        }
    }

Ahora agregamos un evento al JCombobox para que al seleccionar cualquier Item llene el JList con las ciudades del País Seleccionado. El evento que usaremos es itemStateChanged

    private void jComboBox1ItemStateChanged(java.awt.event.ItemEvent evt) {
        if(evt.getStateChange() == 1) {
            //Creamos una Query con una consulta ya definida ""Ciudad.findByPId"
            Query query = em.createNamedQuery("Ciudad.findByPId");
            //Esa query requiere pasarle un valor "pId" , la id del Pais
            query.setParameter("pId", ((Pais)this.jComboBox1.getSelectedItem()).getPId());
            //Elimino todos los elementos agregados al Modelo del JList
            ((DefaultListModel)jList1.getModel()).removeAllElements();
            //Recorro los resultados de la Query
            Iterator it = query.getResultList().iterator();
            while(it.hasNext()) {
                //Agrego el resultado a la JList
                ((DefaultListModel)jList1.getModel()).addElement(((Ciudad)it.next()));
            }
        }
    }

Ahora cambiamos los metodos toString() de Ciudad y Pais para que muestre los nombres de Ciudad y Pais respectivamente.

Con eso ya tenemos una aplicación funcional, sin tocar SQL ya podemos manipular los datos de nuestra base de datos.

Con esto también podemos Agregar datos a la base de datos con solo crear objetos de las Entity Class y hacer otro tipo de consultas.

Espero que sirva de algo este mini tutorial, ahora pueden investigar mas sobre Java Persistence.

Codigo de Fuente: Test.Persistence.EstebanFuentealba.rar

Saludos

Categorías:Java Etiquetas: , , , , , ,

Proyecto Mp3Spider 2010 Open Source (Java)

Hola los quiero invitar a un proyecto en el que estoy trabajando, es Mp3Spider un meta buscador de música con el que se supone podrás buscar, reproducir, descargar?, discografias, discos, etc.
La idea es crear el mayor programa de música gratuito.
Éste proyecto se basará buscando mp3 en servidores conocidos de archivos como goear.com,esnips.com,wrzuta.pl,etc. además de usar apis (lastfm.es,youtube,google) para tener informacion y cosas relacionadas.

El proyecto lo subí a :
http://kenai.com/projects/mp3spider/

Lo puedes descargar con Netbeans, en el menu “Equipo/Kenai/Abrir Proyecto kenai…” ahí buscan mp3spider . Deben estar registrados en Kenai.com para poder chatear en la sala de chat del proyecto.
Estoy usando SVN

¿En que puedes ayudar?
en verdad hasta el momento solo he hecho un motor de busqueda, claramente no está optimizado, pero realmente es bueno
Falta gente para crear la interfaz gráfica,  el reproductor de musica, servidor, que den ideas o que simplemente den páginas que conoscan donde hallan mp3 para así crear mas motores de búsqueda

¿ Que aprenderas ?
- Expresiones Regulares
- Conexiones (Protocolo HTTP)
- java.media
- java GUI (substance)
- POO
- Muchas cosas mas xD
Al wiki del Proyecto iré subiendo información

wiki: http://kenai.com/projects/mp3spider/pages/Home

Java Validar Formularios

Aca les dejo una clase que hice para validar si los Formularios están vacios

import java.awt.*;
import javax.swing.*;

public class EFValidacion {
	public static final int INTEGER=0;
	public static final int BYTE=1;
	public static final int LONG=2;
	public static final int DOUBLE=3;
	
	public static boolean isVacioForm(Component[] cs) {
		for(Component c : cs) {
			if(c instanceof JTextField) {
				if(((JTextField)c).isEnabled())
					if(((JTextField)c).getText().length()<1) return true;
			} else if(c instanceof JComboBox) {
				if(((JComboBox)c).getSelectedIndex() == 0) return true;
			} else if(c instanceof JPanel) {
				if(isVacioForm(((JPanel)c).getComponents())) return true;
			}
		}
		return false;
	}
	public static boolean is(String v,int w) {
		try {
			switch(w) {
				case 0: Integer.parseInt(v); break;
				case 1: Byte.parseByte(v); break;
				case 2: Long.parseLong(v); break;
				case 3: Double.parseDouble(v); break;
			}
			return true;
		} catch(Exception e) {}
		return false;
	}
}

Forma de Uso:

if(EFValidacion.isVacioForm(getContentPane().getComponents())){
	JOptionPane.showMessageDialog(null,"Existen campos vacios");
	return;
}else {
	//...
}

NOTA: Los JCombobox deben tener en la primera posición la descripción y luego los valores
Ejemplo:

Para usar el metodo is es necesario un String y el tipo de dato que se quiere comprobar,
Ejemplo:

if(!EFValidacion.is("CACA",EFValidacion.INTEGER)) {
	System.out.println("No es Numero");
}

Espero que les sirva,

Saludos!

Categorías:Java Etiquetas: , , , , , ,

Java Recorrer Colecciones [ Map ] usando for/while Parte 2

noviembre 29, 2009 1 Comentario

En el Post Anterior Mostre tres formas de recorrer una Collection ahora dejo como recorrer un Map.

En si un Map tiene una Clave y un Valor, por eso es un poco mas complicado recorrerlo

Iterator

Primero Mostrare como recorrer con Iterator

Iterator it = mapList.entrySet().iterator();
    	while(it.hasNext()) {
    		Map.Entry ent = (Map.Entry)it.next();
    		Persona p = (Persona)ent.getValue();
    		System.out.println(p);
    	}

Lo diferente esta en el Map.Entry , esto me permitirá acceder a la key y al value. (Recordemos que el value es el objeto completo).

Simple For

En si, Map no tiene un indice numérico por defecto, como si lo tienen los List, es por eso que para recorrer un Map usando for NO se podrá decir “quiero el objeto en la posición x” pero hay una forma de poder hacerlo, esta forma es convertir el map en array (arreglo) , Esto lo muestro a continuación

for(int i=0; i<mapList.size(); i++) {
    System.out.println(mapList.values().toArray()[i]);
}

Del Map tome todos los valores con el metodo values() esto em devuelve un Set, como no tiene un indice lo convierto a Array y de ese array saco el objeto en la posición “i”

 

Foreach

:

Por ultimo dejo el foreach

for(Persona p : mapList.values()) {
    System.out.println(p);
}

La forma mas sencilla de recorrer un Map…

Acá les dejo el codigo con las tres formas de Recorrer

/**
 * @(#)Persona.java
 *
 *
 * @author Esteban Fuentealba
 * @version 1.00 2009/11/29
 */

import java.util.*;

public class Persona {
	private String rut;
	private String nombre;

	public Persona() {}
    public Persona(String rut,String nombre) {
    	this.rut 	= rut;
    	this.nombre = nombre;
    }
    public void setRut(String val) {
    	this.rut = val;
    }
    public void setNombre(String val) {
    	this.nombre = val;
    }
    public String getRut() {
    	return this.rut;
    }
    public String getNombre() {
    	return this.nombre;
    }

    public String toString() {
    	return "[Rut: "+this.getRut()+"] [Nombre: "+this.getNombre()+"]";
    }
    public static void main(String[] args) {

    	Map<String,Persona> mapList = new HashMap<String,Persona>();
    		Persona pA = new Persona("111-1","Juan");
    		Persona pB = new Persona("222-2","Pedro");
    		Persona pC = new Persona("333-3","Luis");
    	mapList.put(pA.getRut(),pA);
    	mapList.put(pB.getRut(),pB);
    	mapList.put(pC.getRut(),pC);

    	System.out.println("Recorrer Map con Iterator:");
    	Iterator it = mapList.entrySet().iterator();
    	while(it.hasNext()) {
    		Map.Entry ent = (Map.Entry)it.next();
    		Persona p = (Persona)ent.getValue();
    		System.out.println(p);
    	}
    	System.out.println("Recorrer Map con simple for:");
    	for(int i=0; i<mapList.size(); i++) {
    		System.out.println(mapList.values().toArray()[i]);
    	}

    	System.out.println("Recorrer Map con foreach:");
    	for(Persona p : mapList.values()) {
    		System.out.println(p);
    	}

    }
}

Espero que les sirva,

Saludos!

Categorías:Java Etiquetas: , , , , , , , ,
Seguir

Get every new post delivered to your Inbox.