edu.utn.frba.grupo5303.serverenviolibre.repository.CalificacionDAODynamo.java Source code

Java tutorial

Introduction

Here is the source code for edu.utn.frba.grupo5303.serverenviolibre.repository.CalificacionDAODynamo.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 edu.utn.frba.grupo5303.serverenviolibre.repository;

import com.amazonaws.ClientConfiguration;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.regions.Region;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper;
import com.amazonaws.services.dynamodbv2.model.AttributeValue;
import com.amazonaws.services.dynamodbv2.model.ScanRequest;
import com.amazonaws.services.dynamodbv2.model.ScanResult;
import edu.utn.frba.grupo5303.serverenviolibre.beans.CalificacionBean;
import edu.utn.frba.grupo5303.serverenviolibre.config.Constantes;
import edu.utn.frba.grupo5303.serverenviolibre.model.CalificacionDynamo;
import edu.utn.frba.grupo5303.serverenviolibre.model.Reputacion;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import org.springframework.stereotype.Repository;

/**
 *
 * @author flavio
 */
@Repository
public class CalificacionDAODynamo implements CalificacionDAO {

    private static AmazonDynamoDBClient ddb;
    private DynamoDBMapper mapper;

    public CalificacionDAODynamo() {

        String regionName = "us-west-2";

        Region region = Region.getRegion(Regions.fromName(regionName));
        ClientConfiguration clientConfiguration = new ClientConfiguration().withMaxErrorRetry(20);

        ddb = new AmazonDynamoDBClient(new ProfileCredentialsProvider(), clientConfiguration);

        ddb.setRegion(region);

        mapper = new DynamoDBMapper(ddb);
    }

    @Override
    public void guardarCalificacion(CalificacionDynamo calif) {
        mapper.save(calif);
    }

    @Override
    public CalificacionDynamo getCalificacionById(Integer id) {
        return mapper.load(CalificacionDynamo.class, id);
    }

    @Override
    public void borrarCalificacion(Integer id) {
        CalificacionDynamo calif = getCalificacionById(id);
        mapper.delete(calif);
    }

    @Override
    public Reputacion obtenerReputacionDeUsuario(String nombreUser) {
        int numberOfThreads = 8;
        System.out.println("Scanning Calificaciones using " + numberOfThreads + " threads");
        ExecutorService executor = Executors.newFixedThreadPool(numberOfThreads);

        ScanCantidadTask taskEnvNeg = new ScanCantidadTask(nombreUser, Constantes.RolesInteger.ENVIA.getValor(),
                Constantes.ValoracionInteger.NEGATIVO.getValor());
        ScanCantidadTask taskTraNeg = new ScanCantidadTask(nombreUser,
                Constantes.RolesInteger.TRANSPORTA.getValor(), Constantes.ValoracionInteger.NEGATIVO.getValor());
        ScanCantidadTask taskEnvNeu = new ScanCantidadTask(nombreUser, Constantes.RolesInteger.ENVIA.getValor(),
                Constantes.ValoracionInteger.NEUTRAL.getValor());
        ScanCantidadTask taskTraNeu = new ScanCantidadTask(nombreUser,
                Constantes.RolesInteger.TRANSPORTA.getValor(), Constantes.ValoracionInteger.NEUTRAL.getValor());
        ScanCantidadTask taskEnvPos = new ScanCantidadTask(nombreUser, Constantes.RolesInteger.ENVIA.getValor(),
                Constantes.ValoracionInteger.POSITIVO.getValor());
        ScanCantidadTask taskTraPos = new ScanCantidadTask(nombreUser,
                Constantes.RolesInteger.TRANSPORTA.getValor(), Constantes.ValoracionInteger.POSITIVO.getValor());
        ScanCalificacionesEnviaTask taskCalifEnv = new ScanCalificacionesEnviaTask(nombreUser);
        ScanCalificacionesTransportaTask taskCalifTrans = new ScanCalificacionesTransportaTask(nombreUser);

        // Execute the task
        executor.execute(taskEnvNeg);
        executor.execute(taskTraNeg);
        executor.execute(taskEnvNeu);
        executor.execute(taskTraNeu);
        executor.execute(taskEnvPos);
        executor.execute(taskTraPos);
        executor.execute(taskCalifEnv);
        executor.execute(taskCalifTrans);

        shutDownExecutorService(executor);

        Reputacion rep = new Reputacion();
        rep.setCantNegEnvia(taskEnvNeg.encontrados);
        rep.setCantNegTransporta(taskTraNeg.encontrados);
        rep.setCantNeuEnvia(taskEnvNeu.encontrados);
        rep.setCantNeuTransporta(taskTraNeu.encontrados);
        rep.setCantPosEnvia(taskEnvPos.encontrados);
        rep.setCantPosTransporta(taskTraPos.encontrados);

        List<CalificacionBean> calificacionesEnvio = new ArrayList<>();
        List<CalificacionBean> calificacionesTransporte = new ArrayList<>();

        for (Map<String, AttributeValue> map : taskCalifEnv.encontrados) {
            CalificacionBean cb = new CalificacionBean();
            cb.setComentario(map.get("Comentario").getS());
            cb.setIdEnvio(Integer.parseInt(map.get("IdEnvio").getN()));
            cb.setNombreCalifica(map.get("NombreCalifica").getS());
            cb.setNombreCalificado(taskCalifEnv.nombreUser);
            cb.setValoracion(Integer.parseInt(map.get("Valoracion").getN()));
            cb.setFechaCalificado(map.get("FechaCalificado").getS());

            calificacionesEnvio.add(cb);
        }

        for (Map<String, AttributeValue> map : taskCalifTrans.encontrados) {
            CalificacionBean cb = new CalificacionBean();
            cb.setComentario(map.get("Comentario").getS());
            cb.setIdEnvio(Integer.parseInt(map.get("IdEnvio").getN()));
            cb.setNombreCalifica(map.get("NombreCalifica").getS());
            cb.setNombreCalificado(taskCalifTrans.nombreUser);
            cb.setValoracion(Integer.parseInt(map.get("Valoracion").getN()));
            cb.setFechaCalificado(map.get("FechaCalificado").getS());

            calificacionesTransporte.add(cb);
        }

        rep.setCalificacionesEnvio(calificacionesEnvio);
        rep.setCalificacionesTransporte(calificacionesTransporte);

        return rep;
    }

    // Tarea para obtener cantidades de calificaciones
    private static class ScanCantidadTask implements Runnable {

        private String nombreUser;

        private int rol;

        private int valor;

        private int encontrados;

        public ScanCantidadTask(String nombreUser, int rol, int valor) {
            this.nombreUser = nombreUser;
            this.rol = rol;
            this.valor = valor;
        }

        @Override
        public void run() {
            System.out.println("Scanning user " + nombreUser + " buscando rol " + rol + " con valoracion " + valor);

            encontrados = obtenerCalificacionesDeUsuarioPorValorYRol(nombreUser, rol, valor);
        }

        public Integer obtenerCalificacionesDeUsuarioPorValorYRol(String username, Integer rol, Integer valor) {
            Map<String, AttributeValue> expressionAttributeValues = new HashMap<String, AttributeValue>();
            expressionAttributeValues.put(":nombreUser", new AttributeValue().withS(username));
            expressionAttributeValues.put(":rol", new AttributeValue().withN(rol.toString()));
            expressionAttributeValues.put(":valor", new AttributeValue().withN(valor.toString()));

            ScanRequest scanRequest = new ScanRequest().withTableName("Calificaciones")
                    .withFilterExpression("NombreCalificado = :nombreUser AND Rol = :rol AND Valoracion = :valor")
                    .withProjectionExpression("IdEnvio").withExpressionAttributeValues(expressionAttributeValues);

            ScanResult result = ddb.scan(scanRequest);

            return result.getCount();
        }
    }

    // Tarea para obtener la lista de calificaciones publicando
    private static class ScanCalificacionesEnviaTask implements Runnable {

        private String nombreUser;

        private List<Map<String, AttributeValue>> encontrados;

        public ScanCalificacionesEnviaTask(String nombreUser) {
            this.nombreUser = nombreUser;
        }

        @Override
        public void run() {
            System.out.println("Scanning user " + nombreUser + " buscando lista de comentarios como publicador");

            encontrados = obtenerListaCalificacionesEnviando(nombreUser);
        }

        public List<Map<String, AttributeValue>> obtenerListaCalificacionesEnviando(String nombreUser) {
            Map<String, AttributeValue> expressionAttributeValues = new HashMap<String, AttributeValue>();
            expressionAttributeValues.put(":nombreUser", new AttributeValue().withS(nombreUser));
            expressionAttributeValues.put(":rol",
                    new AttributeValue().withN(Constantes.RolesInteger.ENVIA.getValor().toString()));

            ScanRequest scanRequest = new ScanRequest().withTableName("Calificaciones")
                    .withFilterExpression("NombreCalificado = :nombreUser AND Rol = :rol")
                    .withProjectionExpression("IdEnvio, Comentario, Valoracion, NombreCalifica, FechaCalificado")
                    .withExpressionAttributeValues(expressionAttributeValues);

            ScanResult result = ddb.scan(scanRequest);

            return result.getItems();
        }
    }

    // Tarea para obtener la lista de calificaciones transportando
    private static class ScanCalificacionesTransportaTask implements Runnable {

        private String nombreUser;

        private List<Map<String, AttributeValue>> encontrados;

        public ScanCalificacionesTransportaTask(String nombreUser) {
            this.nombreUser = nombreUser;
        }

        @Override
        public void run() {
            System.out.println("Scanning user " + nombreUser + " buscando lista de comentarios como transportista");

            encontrados = obtenerListaCalificacionesTransportando(nombreUser);
        }

        public List<Map<String, AttributeValue>> obtenerListaCalificacionesTransportando(String nombreUser) {
            Map<String, AttributeValue> expressionAttributeValues = new HashMap<String, AttributeValue>();
            expressionAttributeValues.put(":nombreUser", new AttributeValue().withS(nombreUser));
            expressionAttributeValues.put(":rol",
                    new AttributeValue().withN(Constantes.RolesInteger.TRANSPORTA.getValor().toString()));

            ScanRequest scanRequest = new ScanRequest().withTableName("Calificaciones")
                    .withFilterExpression("NombreCalificado = :nombreUser AND Rol = :rol")
                    .withProjectionExpression("IdEnvio, Comentario, Valoracion, NombreCalifica, FechaCalificado")
                    .withExpressionAttributeValues(expressionAttributeValues);

            ScanResult result = ddb.scan(scanRequest);

            return result.getItems();
        }
    }

    private static void shutDownExecutorService(ExecutorService executor) {
        executor.shutdown();
        try {
            if (!executor.awaitTermination(10, TimeUnit.SECONDS)) {
                executor.shutdownNow();
            }
        } catch (InterruptedException e) {
            executor.shutdownNow();

            // Preserve interrupt status
            Thread.currentThread().interrupt();
        }
    }

}