package app;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import javax.swing.JFrame;
import netP5.NetAddress;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import org.json.JSONException;
import org.json.JSONObject;
import org.smslib.OutboundMessage;
import oscP5.OscMessage;
import oscP5.OscP5;
import processing.core.PApplet;
import servers.Google;
import servers.ImageSearcher;
import servers.Modem;
import servers.ImageSearchListener;
import servers.ImageSearchClient;
import servers.ModemListener;
import servers.Sql;
import servers.Visitor;
import servers.VisitorListener;
import utils.ConsoleIO;
/**
*
* @author diex
* @version 1.0
*
*
*/
public class SerLiquidoCore implements ModemListener, KeyListener, VisitorListener, Runnable{
private Logger logger = Logger.getLogger(SerLiquidoCore.class);
/**
* el thread sobre el cual corre el core
*
*/
private Thread runner;
/**
* Ventana de interfase gr�fica
usada para levantar el teclado y mostrar data
*/
JFrame frame = new JFrame("SER LIQUIDO CORE");
/**
* Modem
*/
private Modem modem;
private boolean using_modem = true;
/**
* administrador de la base de datos
*/
private Sql sql;
/**
* visitantes activos
*/
private ArrayList<Visitor> visitors;
/**
* cliente OSC
*/
private OscP5 oscGateway;
private int oscInputPort = 7601;
private NetAddress oscTerminalLocation;
private NetAddress oscVisualLocation;
private int oscTerminalPort = 7600;
private int oscVisualPort = 8600;
public static void main (String args[]){
new SerLiquidoCore();
}
/**
* constructor publico
*/
public SerLiquidoCore(){
PropertyConfigurator.configure("./data/logs/logger.properties");
logger.info("+++++++++++++++++++++++++++++++");
logger.info("+++++++++++++++++++++++++++++++");
logger.info("SerLiquidoCore():");
frame.setFocusable(true);
frame.requestFocus();
frame.addKeyListener(this);
frame.setVisible(true);
frame.setSize(320, 240);
// inicializo los visitantes
visitors = new ArrayList<Visitor>();
// conexion con el modem
modem = new Modem(this, using_modem);
// conexion con la base de datos
sql = new Sql();
// en que puerto escucho mis mensajes
oscGateway = new OscP5(this, oscInputPort);
// hacia donde mando mensajes
oscTerminalLocation = new NetAddress("192.168.1.101", oscTerminalPort);
oscVisualLocation = new NetAddress("127.0.0.1", oscVisualPort);
// el thread en el que voy a correr la GUI
runner = new Thread(this, "Ser Liquido Core");
runner.start();
}
/**
* metodo invocado cuando recibo un mensaje OSC
* En general recibe mensajes desde la terminal de acceso.
*
*/
void oscEvent(OscMessage theOscMessage) {
logger.info("oscEvent()");
logger.info("++ addrpattern: "+ theOscMessage.addrPattern());
logger.info("++ typetag: " + theOscMessage.typetag());
if(theOscMessage.checkAddrPattern("/codeEntered")) { codeEntered(theOscMessage); }
else if(theOscMessage.checkAddrPattern("/timeOut")){ }
// TODO agregar metodo timeOut();
// detengo la visualizacion
// espero a que el visitante salga.
}
/**
* flitros de texto
* @param name
* @return
*/
String checkName(String name){
String output = "";
for(int i = 0; i < name.length(); i++){
output += ( validLetter(name.charAt(i)) );
}
return output;
}
String alphabet = "abcdefghijklmnopqrstuvwxyz ";
char validLetter(char aLetter){
for (int i=0;i<alphabet.length();i++){
if (Character.toLowerCase(aLetter) == alphabet.charAt(i)) return Character.toLowerCase(aLetter);
}
return '+';
}
/**
* callBack invocado por el modem cuando recibe un mensaje nuevo
* este metodo se encarga de filtrar los mensajes segun el estado
* del visitante
*
*/
public void modemEvent(JSONObject message) {
logger.info("modemEvent()");
String originator = null;
String date = null;
String text = null;
// TODO Validar que sea un mensaje valido...
// que haya algo en el campo texto sino salen imagenes gigantes
try {
logger.info("++ parsing message: ");
// si hay algun problema con el mensaje va a saltar la e.
originator = message.getString("originator");
date = message.getString("date");
text = checkName(message.getString("text"));
// si tengo un originator valido
// me fijo si el visitante ya existe en la base de datos
if(sql.rowExists("originator", originator)){
logger.info("++ visitor exists ");
// creo un objeto visitor en el array
// Al visitor le paso como referencia this para que sepa
// que me tiene que avisar a mi cuando termine de hacer algo
visitors.add(sql.getVisitor(originator, this));
Visitor visitor = visitors.get(visitors.size() - 1);
// agrego el texto como segundo nombre
visitor.setName2((String) message.get("text"));
// y luego veo que tengo que hacer
visitorExists(visitor);
}else{
logger.info("++ visitor dont exists ");
// el visitante no existe
// creo un objeto visitor en el array temporal
// tomo el ultimo siempre
visitors.add(new Visitor(this));
Visitor v = visitors.get(visitors.size() - 1);
// agrego los datos al visitor
v.setOriginator((String) message.get("originator"));
v.setName1((String) message.get("text"));
// y luego veo que tengo que hacer
visitorDontExist(v);
}
// por alguna razon no puede abrir el mensaje de texto
} catch (JSONException e) {
logger.error("READING MESSAGE: " , e);
}
}
private void visitorExists(Visitor visitor) {
logger.info("visitorExists()");
// en funcion de su estado hago algo.
// si ya recibio el codigo se lo vuelvo a enviar
if(visitor.getStatus().equals(Visitor.READY)){
// envio el mensaje de confirmacion
// con el codigo de acceso
OutboundMessage msg = new OutboundMessage(visitor.getOriginator(), "S.E.R.L.I.Q.U.I.D.O. dice: Y4 pu3d3 1ngr3s4r. Su c0dig0 de 4cc3s0 3s: " + visitor.getCode());
modem.sendMessage(msg);
// lo borro de la lista temporal
visitors.remove(visitor);
}else{
// actualizo el visitante en la base de datos
sql.updateVisitor(visitor);
// sale a buscar mas imagenes
visitor.searchImages();
}
}
private void visitorDontExist(Visitor v) {
// inserto el visitante en la base de datos
sql.insertVisitor(v);
// habilito al visitor a buscar imagenes.
// cuando termine de buscar va a llamar al metodo imageSearchFinished
v.searchImages();
}
/**
* Metodo invocado por los visitors
* cuando terminan de buscar imagenes
*/
public void visitorEvent(Visitor visitor) {
// me fijo en que estado esta este Visitor
if(visitor.getStatus().equals(Visitor.NAME)){
// envio el primer mensaje de confirmacion
OutboundMessage msg = new OutboundMessage(visitor.getOriginator(), "S.E.R.L.I.Q.U.I.D.O. dice: H0l4 " + visitor.getName1() + " �Qu13n t3 gu5t4r1a 53r?");
modem.sendMessage(msg);
// actualizo el visitor en la base de datos
sql.updateVisitor(visitor);
// lo borro de la lista
visitors.remove(visitor);
};
if(visitor.getStatus().equals(Visitor.READY)){
// genero el codigo
visitor.setCode(sql.getCode());
// actualizo el visitor en la base de datos
// TODO esto esta mal
// deberia tener un solo metodo para actualizar el visitor
sql.updateVisitor(visitor);
//sql.updateVisitorStatus(visitor);
//sql.updateVisitorCode(visitor);
// envio el mensaje de confirmacion
OutboundMessage msg = new OutboundMessage(visitor.getOriginator(), "S.E.R.L.I.Q.U.I.D.O. dice: Y4 pu3d3 1ngr3s4r. Su c0d1g0 d3 4cc3s0 3s: " + visitor.getCode());
modem.sendMessage(msg);
// lo borro de la lista
visitors.remove(visitor);
};
}
private void codeEntered(OscMessage theOscMessage){
logger.info("codeEntered() ");
String codeReceived = theOscMessage.get(0).stringValue();
//validacion del codigo
// lo busco en la base de datos
// me aseguro primero que el visitante existe
if(sql.rowExists("code", codeReceived)){
logger.info("VISITOR EXISTS");
// si el visitante existe,
// significa que esta en condiciones de ingresar a la carpa
visitors.add(sql.getVisitorFromCode(codeReceived, this));
Visitor v = visitors.get(visitors.size() - 1);
// le aviso a la aplicacion para que cargue las fotos en memoria
// y se prepare para recibir al visitante
// El mismo mensaje lo mando a la terminal
logger.info("SENDING AKG TO VISUAL + TERMINAL");
OscMessage myMessage = new OscMessage("/visitorReady");
myMessage.add(v.getName1());
myMessage.add(v.getName2());
oscGateway.send(myMessage, oscVisualLocation);
oscGateway.send(myMessage, oscTerminalLocation);
}else{
logger.info("VISITOR DOESNT EXISTS");
// el codigo ingresado es incorrecto
// responde negativo solo a la terminal
OscMessage myMessage = new OscMessage("/visitorError");
oscGateway.send(myMessage, oscTerminalLocation);
}
}
public void keyPressed(KeyEvent e) {
if(e.getKeyChar() == 'n') modem.dummyMessage();
}
public void keyReleased(KeyEvent e) {
}
public void keyTyped(KeyEvent e) {
}
public void run() {
while(true){
}
}
}