next up previous contents
Siguiente: ConexionBD.java Subir: C'odigo principal del Web Anterior: C'odigo principal del Web   Índice General

Servidor.java

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();
      }
}



Daniel Moros 2010-05-05