Cache.Servidor.java Source code

Java tutorial

Introduction

Here is the source code for Cache.Servidor.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package Cache;

import java.io.FileReader;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;
//PROCESAMIENTO
import java.io.StringReader;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;
import org.json.simple.JSONObject;

/**
 *
 * @author Xiao
 */
public class Servidor {

    public static LRUCache lru_cache1; //Declaramos atributos
    public static LRUCache lru_cache2;
    public static LRUCache lru_cache3;
    public static CacheEstatico cestatico;

    public Servidor(int tamCache) //Constructor
    {
    }

    // ===== Mtodo hash =====
    // Retorna un nmero consistente (siempre el mismo) para un string.
    public static long hash(String hashKey) {
        int b = 378551;
        int a = 63689;
        long hash = 0;
        for (int i = 0; i < hashKey.length(); i++) {
            hash = hash * a + hashKey.charAt(i);
            a = a * b;
        }
        return Math.abs(hash);
    }//=======================

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        // Se calcula el tamao de las particiones del cache
        // de manera que la relacin sea
        // 25% Esttico y 75% Dinmico,
        // siendo la porcin dinmica particionada en 3 partes.

        Lector l = new Lector(); // Obtener tamao total del cache.
        int tamCache = l.leerTamCache("config.txt");
        //===================================
        int tamCaches = 0;
        if (tamCache % 4 == 0) { // Asegura que el nro sea divisible por 4.
            tamCaches = tamCache / 4;
        } else { // Si no, suma para que lo sea.
            tamCaches = (tamCache - (tamCache) % 4 + 4) / 4;
        } // y divide por 4.

        System.out.println("Tamao total Cache: " + (int) tamCache); // imprimir tamao cache.
        System.out.println("Tamao particiones y parte esttica: " + tamCaches); // imprimir tamao particiones.
        //===================================

        lru_cache1 = new LRUCache(tamCaches); //Instanciar atributos.

        lru_cache2 = new LRUCache(tamCaches);
        lru_cache3 = new LRUCache(tamCaches);
        cestatico = new CacheEstatico(tamCaches);
        cestatico.addEntryToCache("query3", "respuesta cacheEstatico a query 3");
        cestatico.addEntryToCache("query7", "respuesta cacheEstatico a query 7");

        try {
            ServerSocket servidor = new ServerSocket(4500); // Crear un servidor en pausa hasta que un cliente llegue.
            while (true) {
                Socket clienteNuevo = servidor.accept();// Si llega se acepta.
                // Queda en pausa otra vez hasta que un objeto llegue.
                ObjectInputStream entrada = new ObjectInputStream(clienteNuevo.getInputStream());

                System.out.println("Objeto llego");
                //===================================
                Cache1 hilox1 = new Cache1(); // Instanciar hebras.
                Cache2 hilox2 = new Cache2();
                Cache3 hilox3 = new Cache3();

                // Leer el objeto, es un String.
                JSONObject request = (JSONObject) entrada.readObject();
                String b = (String) request.get("busqueda");

                //*************************Actualizar CACHE**************************************
                int actualizar = (int) request.get("actualizacion");
                // Si vienen el objeto que llego viene del Index es que va a actualizar el cache
                if (actualizar == 1) {
                    int lleno = cestatico.lleno();
                    if (lleno == 0) {
                        cestatico.addEntryToCache((String) request.get("busqueda"),
                                (String) request.get("respuesta"));
                    } else {
                        // si el cache estatico esta lleno
                        //agrego l cache dinamico

                        if (hash(b) % 3 == 0) {
                            lru_cache1.addEntryToCache((String) request.get("busqueda"),
                                    (String) request.get("respuesta"));
                        } else {
                            if (hash(b) % 3 == 1) {
                                lru_cache2.addEntryToCache((String) request.get("busqueda"),
                                        (String) request.get("respuesta"));

                            } else {
                                lru_cache3.addEntryToCache((String) request.get("busqueda"),
                                        (String) request.get("respuesta"));

                            }
                        }

                    }
                } //***************************************************************
                else {

                    // Para cada request del arreglo se distribuye
                    // en Cache 1 2 o 3 segn su hash.
                    JSONObject respuesta = new JSONObject();
                    if (hash(b) % 3 == 0) {
                        respuesta = hilox1.fn(request); //Y corre la funcin de una hebra.
                    } else {
                        if (hash(b) % 3 == 1) {
                            respuesta = hilox2.fn(request);
                        } else {
                            respuesta = hilox3.fn(request);
                        }
                    }

                    //RESPONDER DESDE EL SERVIDOR
                    ObjectOutputStream resp = new ObjectOutputStream(clienteNuevo.getOutputStream());// obtengo el output del cliente para mandarle un msj
                    resp.writeObject(respuesta);
                    System.out.println("msj enviado desde el servidor");

                    //clienteNuevo.close();
                    //servidor.close();
                }

            }
        } catch (IOException ex) {
            Logger.getLogger(Servidor.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}