Java tutorial
/* * 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(); } } }