import java.util.List;
import java.io.*;
import org.jdom.Document;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;
/*
* Por Sergio G. Naranjo M.
* Decanato de Investigacion y Desarrollo
* Profesores Marlene Goncalves y Leonid Tineo
* Ultima Fecha Modificacion hecha por Sergio: 30 de marzo de 2006.
*
* Modificado por Daniel Moros y Yannixia Castellanos.
* Proyecto de Grado
* Tutor Kenyer Dominguez
* Ultima Fecha Modificacion: Febrero de 2010
* Notas:
* - Mejorada la eficiencia, mantenibilidad y escalabilidad.
* - Agregado sistema de Cache
* - Agregada Documentacion
* - Eliminado main que no tenia ningún tipo de funcionalidad
*
*/
/**
* La clase servidor es el programa principal del WS. Contiene solicitaUltimosDatos()
* que es la función exportada a los clientes WS. Para información \
sobre instalación
* ver archivo README.txt
*
* @author Yannixia Castellanos, Daniel Moros y Sergio Naranjo
*/
public class servidor {
/**
* solicitaUltimosDatos() Retorna un String - Con un XML formado con todas
* las actividades de ese grupo solicitado, desde la fecha solicitada
* hasta la actualidad.
*
* @param ultimaFechaActualizacion String - Desde qué fecha se desea
* que se realice la búsqueda actividades por Grupo. De la \
forma "YYYY-MM-DD"
* @param group String- Es un String con un número correspondiente al
* Grupo que solicita los datos.
* @return String - Con un XML formado con todas las actividades de ese grupo
* desde la fecha solicitada hasta la actualidad.
*/
public static String solicitaUltimosDatos(String ultimaFechaActualizacion, \
String group) {
System.out.println(ultimaFechaActualizacion);
System.out.println(group);
String t=null;
long validezCache = 300000; // 5 minutos en milisegundos
// long validezCache = 60000; // 1 min
File cache = new File("/tmp/"+ultimaFechaActualizacion+group+".xml");
if (esValidoElCache(cache, validezCache))
{
System.out.println("El cache es valido");
t=getContents(cache);
}
else
{
System.out.println("No estaba en cache :( ");
try{
List datos = ConexionBD.obtenerDatosDeMySQL(\
ultimaFechaActualizacion,group);
Document doc = TransformXML.transformarDatosAXML(datos);
Format formato = Format.getPrettyFormat();
XMLOutputter serializer = new XMLOutputter(\
formato.setEncoding("ISO-8859-1"));
t = serializer.outputString(doc);
}
catch(Exception e){
return "Ha existido un problema con la conexion a la \
base de datos. Intente m'as tarde.";
}
try{
// Create file
System.out.println("Guardando version nueva de cache\n\n");
FileWriter fstream = new FileWriter("/tmp/"+\
ultimaFechaActualizacion+group+".xml");
BufferedWriter out = new BufferedWriter(fstream);
out.write(t);
//Close the output stream
out.close();
}
catch(Exception e){System.out.println(e);}
}
return t;
}
/**
* Funcion que verifica si existe un archivo de caché disponible y\
no expirado
* para la fecha y el grupo solicitado. En caso de no ser válido \
el archivo
* por haber expirado, esta función borra el archivo.
* @param cache File con un posible archivo caché que quiere \
verificarse
* @param validezCache long con un tiempo en milisegundos en que es \
válido un
* archivo que está en el caché
* @return boolean con true si es válido el caché y false\
en caso de que no lo sea
*/
private static boolean esValidoElCache(File cache, long validezCache){
long ahora=System.currentTimeMillis();
System.out.println("Estamos en el "+ahora);
boolean exists = cache.exists();
if (exists)
{
System.out.println("Estaba en cache.");
long antiguedadArchivo = cache.lastModified();
System.out.println("El archivo fue modificado el "+\
antiguedadArchivo);
if((antiguedadArchivo) >ahora-validezCache)
{
System.out.println("El cache es valido");
return true;
}
else
{
if(cache.delete())
System.out.println("El cache es invalido y fue\
borrado el cache "+cache);
return false;
}
}
else
{
System.out.println("No habia cache de esta consulta");
return false;
}
}
/**
* Retorna un String con el contenido total del archivo pasado \
como parámetro
* @param aFile File que quiere ser retornado como String.
* @return String con el contenido del archivo pasado como \
parámetro
*/
static public String getContents(File aFile) {
StringBuilder contents = new StringBuilder();
try {
BufferedReader input = new BufferedReader(new FileReader(aFile));
try {
String line = null;
while (( line = input.readLine()) != null){
contents.append(line);
contents.append(System.getProperty("line.separator"));
}
}
finally {
input.close();
}
}
catch (IOException ex){
ex.printStackTrace();
}
return contents.toString();
}
}