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 py.una.pol.ii.tareaweb2.ejb; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.List; import javax.annotation.Resource; import javax.ejb.EJB; import javax.ejb.EJBContext; import javax.ejb.EJBTransactionRolledbackException; import javax.ejb.LocalBean; import javax.ejb.Stateless; import javax.ejb.TransactionAttribute; import javax.ejb.TransactionAttributeType; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.PersistenceException; import org.hibernate.exception.ConstraintViolationException; import py.una.pol.ii.tareaweb2.helper.FiltersHelper; import py.una.pol.ii.tareaweb2.model.Cliente; import py.una.pol.ii.tareaweb2.model.Producto; import py.una.pol.ii.tareaweb2.model.Venta; import py.una.pol.ii.tareaweb2.model.VentaDetalle; import com.google.gson.FieldNamingPolicy; import com.google.gson.Gson; import com.google.gson.GsonBuilder; @Stateless @LocalBean public class VentaLogic { @PersistenceContext(unitName = "AppPersistence") EntityManager entityManager; @EJB ClienteLogic clienteLogic; @EJB ProductoLogic productoLogic; @EJB VentaLogic ventaLogic; @Resource private EJBContext context; public List<Venta> filtrar(FiltersHelper filtros) { return entityManager.createQuery(filtros.filterQuery(), Venta.class).setFirstResult(filtros.getPage()) .setMaxResults(filtros.getPageSize()).getResultList(); } public Long countVentas(FiltersHelper filtros) { return entityManager.createQuery(filtros.countQuery(), Long.class).getSingleResult(); } @TransactionAttribute(TransactionAttributeType.REQUIRED) public String create(Venta venta) throws EJBTransactionRolledbackException { Cliente cliente = null; Long montoTotal = 0L; String errores = ""; if ((cliente = clienteLogic.read(venta.getCliente().getId())) == null) { errores = errores + "Cliente invalido. "; } venta.setCliente(cliente); if (venta.getDetalles() == null || venta.getDetalles().isEmpty()) { errores = errores + "No contiene detalles. "; } for (VentaDetalle detalle : venta.getDetalles()) { detalle.setVenta(venta); if (detalle.getCantidad() <= 0) { errores = errores + "Cantidad menor o igual a 0. "; } Producto producto; if (detalle.getProducto() == null || (producto = entityManager.find(Producto.class, detalle.getProducto().getId())) == null) { errores = errores + "Producto invalido. "; } else { Long nuevaCantidad = producto.getCantidad() - detalle.getCantidad(); if (nuevaCantidad < 0) { errores = errores + "Saldo Insuficiente (Producto " + producto.getId() + "). "; } producto.setCantidad(producto.getCantidad() - detalle.getCantidad()); montoTotal += (detalle.getCantidad() * producto.getPrecioUnitario()); } } venta.setMontoTotal(montoTotal); entityManager.persist(venta); if ("".equals(errores)) return "Venta Creada --" + venta.getId(); return errores; } public static class ClienteNotFoundException extends Exception { private static final long serialVersionUID = -9154044367057213272L; public ClienteNotFoundException() { } } public Venta read(Long id) { return entityManager.find(Venta.class, id); } public String ventaUnica(Venta venta) { String errores = ""; errores = ventaLogic.create(venta); if (errores.contains("Cantidad menor o igual a 0. ")) { try { entityManager.flush(); } catch (PersistenceException e) { Throwable t = e.getCause(); while ((t != null) && !(t instanceof ConstraintViolationException)) { t = t.getCause(); } if (t instanceof ConstraintViolationException) { errores = errores + " Violacin de restriccin."; } else { errores = errores + " Error interno."; } } return errores; } else if (!errores.contains("--")) { context.setRollbackOnly(); } return errores; } public String cargaMasiva(String path) throws FileNotFoundException, IOException { FileReader fr; BufferedReader br; File f; Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd") .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create(); String line; String erroresDetectados = ""; path = "/tmp/" + path; f = new File(path); fr = new FileReader(f); br = new BufferedReader(fr); int contadorErrores = 0; int contadorLineas = 0; boolean error = false; boolean constraintError = false; String respuesta; while (br.ready()) { line = br.readLine(); contadorLineas++; Venta toPersist = new Venta(); Venta fromJson; try { fromJson = gson.fromJson(line, Venta.class); if (fromJson.getCliente() == null || fromJson.getCliente().getId() == null) { erroresDetectados = erroresDetectados + "Lnea " + contadorLineas + ": Cliente invalido\n"; error = true; contadorErrores++; } if (fromJson.getFecha() == null) { erroresDetectados = erroresDetectados + "Lnea " + contadorLineas + ": Fecha nula\n"; error = true; contadorErrores++; } if (fromJson.getMontoTotal() == null) { erroresDetectados = erroresDetectados + "Lnea " + contadorLineas + ": Monto Total nulo\n"; error = true; contadorErrores++; } if (fromJson.getDetalles() == null || fromJson.getDetalles().isEmpty()) { erroresDetectados = erroresDetectados + "Lnea " + contadorLineas + ": No contiene detalles\n"; error = true; contadorErrores++; } toPersist.setCliente(fromJson.getCliente()); toPersist.setDetalles(fromJson.getDetalles()); toPersist.setFactura(fromJson.getFactura()); toPersist.setFecha(fromJson.getFecha()); toPersist.setMontoTotal(fromJson.getMontoTotal()); if (!error) { try { if (!(respuesta = ventaLogic.create(toPersist)).contains("Venta Creada --")) { if (!constraintError && respuesta.contains("Cantidad menor o igual a 0. ")) constraintError = true; erroresDetectados = erroresDetectados + "Lnea " + contadorLineas + ": " + respuesta + "\n"; contadorErrores++; } } catch (Exception e) { erroresDetectados = erroresDetectados + "Lnea " + contadorLineas + ": Error al intentar persistir\n"; contadorErrores++; } } } catch (Exception e) { erroresDetectados = erroresDetectados + "Lnea " + contadorLineas + ": Json malformado\n"; contadorErrores++; } error = false; } br.close(); System.out.println("Total de lneas: " + contadorLineas); System.out.println("Errores detectados: " + contadorErrores); System.out.println("Descripcin de los errores: " + erroresDetectados); if (constraintError) { try { entityManager.flush();// se fuerza a que ocurra el error de restriccion } catch (PersistenceException e) { Throwable t = e.getCause(); while ((t != null) && !(t instanceof ConstraintViolationException)) { t = t.getCause(); } if (t instanceof ConstraintViolationException) { erroresDetectados = erroresDetectados + "\n Violacin de restriccin atrapada."; } else { erroresDetectados = erroresDetectados + " Error interno."; } return erroresDetectados; } } else if (contadorErrores > 0) { context.setRollbackOnly(); //al decir que haga rollback ya no se violara el constraint de la base de datos por lo que no podra capturarse directamente. return erroresDetectados; } return "Carga masiva Exitosa, " + contadorLineas + " ventas cargadas"; } }