For sure @Johannes, here you are
package com.ingartek.cavwebapp.view.administrador;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import com.vaadin.data.util.BeanItemContainer;
import com.vaadin.navigator.View;
import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent;
import com.vaadin.server.FileDownloader;
import com.vaadin.server.FileResource;
import com.vaadin.server.VaadinService;
import com.vaadin.shared.ui.slider.SliderOrientation;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.Grid;
import com.vaadin.ui.Grid.SelectionMode;
import com.vaadin.ui.Notification.Type;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Notification;
import com.vaadin.ui.ProgressBar;
import com.vaadin.ui.Slider;
import com.vaadin.ui.TextField;
import com.vaadin.ui.UI;
import com.vaadin.ui.Upload;
import com.vaadin.ui.Upload.FailedEvent;
import com.vaadin.ui.Upload.FailedListener;
import com.vaadin.ui.Upload.ProgressListener;
import com.vaadin.ui.Upload.Receiver;
import com.vaadin.ui.Upload.StartedEvent;
import com.vaadin.ui.Upload.StartedListener;
import com.vaadin.ui.Upload.SucceededEvent;
import com.vaadin.ui.Upload.SucceededListener;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Window;
// More imports
// AdministradorCommonLayout is a custom vertical layout
public class FlotaView extends AdministradorCommonLayout implements View, ClickListener, Receiver, SucceededListener, FailedListener, ProgressListener, StartedListener {
/*
* Atributos
*/
private static final long serialVersionUID = 176950119470029284L;
public static final String NAME = "FlotaView";
private String basepath;
// Elementos de la UI
private UI theUI;
private VerticalLayout contenedor;
private HorizontalLayout fila;
private VerticalLayout layoutBotones;
private Button botonCargarFicheroVehiculos;
private Button botonBorrarVehiculo;
private Button botonAnadirVehiculo;
private VerticalLayout layoutTabla;
private Grid gridVehiculos;
// Ventana añadir vehiculo
private Window windowAnadirVehiculo;
private VerticalLayout layoutAnadirVehiculo;
private TextField anadirVehiculoMatricula;
private TextField anadirVehiculoNombre;
private Slider anadirVehiculoAsientos;
private HorizontalLayout layoutBotonesAnadirVehiculo;
private Button aceptarAnadirVehiculo;
// Cargar fichero:
private Window windowCargarFichero1;
private VerticalLayout layoutCargarFichero1;
private Upload uploadCargarFichero1;
private FileResource ficheroPlantillaCargarFichero1;
private FileDownloader descargadorPlantillaCargarFichero1;
private Button descargarFicheroButtonCargarFichero1;
private File ficheroVehiculos;
private ProgressBar progresoCargarFichero1;
private List<Vehiculo> vehiculosLeidosDelExcel;
// Ventana de carga de ficheros 2:
private Window windowCargarFichero2;
private VerticalLayout layoutCargarFichero2;
private Grid gridVehiculosCargarFichero2;
private Button cargarVehiculosButtonFichero2;
/*
* Métodos
*/
@Override
public void enter(ViewChangeEvent event) {
theUI = getUI();
// Encontramos el directorio base de la aplicación
basepath = VaadinService.getCurrent().getBaseDirectory().getAbsolutePath();
navigator = getUI().getNavigator();
UserTypeConnected usuarioConectado = (UserTypeConnected) session.getAttribute("usertype");
if(usuarioConectado == UserTypeConnected.Administrador){
super.initLayout();
initThisLayout();
}else{
navigator.navigateTo("");
}
}
private void initThisLayout(){
buildContenedorGridVehiculos();
bodyContent.addComponent(contenedor);
//addComponent(bodyContent);
}
private VerticalLayout buildContenedorGridVehiculos() {
// common part: create layout
contenedor = new VerticalLayout();
//contenedor.setCaption("contenedor");
contenedor.setImmediate(false);
contenedor.setWidth("100.0%");
contenedor.setHeight("100.0%");
contenedor.setMargin(true);
contenedor.setSpacing(true);
// fila
fila = buildFila();
contenedor.addComponent(fila);
contenedor.setExpandRatio(fila, 1.0f);
return contenedor;
}
private HorizontalLayout buildFila() {
// common part: create layout
fila = new HorizontalLayout();
//fila.setCaption("fila");
fila.setImmediate(false);
fila.setWidth("100.0%");
fila.setHeight("100.0%");
fila.setMargin(true);
fila.setSpacing(true);
// layoutTabla
layoutTabla = buildLayoutTabla();
fila.addComponent(layoutTabla);
fila.setExpandRatio(layoutTabla, 1.0f);
fila.setComponentAlignment(layoutTabla, new Alignment(48));
// layoutBotones
layoutBotones = buildLayoutBotones();
fila.addComponent(layoutBotones);
fila.setExpandRatio(layoutBotones, 1.0f);
fila.setComponentAlignment(layoutBotones, new Alignment(48));
return fila;
}
private VerticalLayout buildLayoutTabla() {
// common part: create layout
layoutTabla = new VerticalLayout();
//layoutTabla.setCaption("lay tabla");
layoutTabla.setImmediate(false);
layoutTabla.setWidth("100.0%");
layoutTabla.setHeight("-1px");
layoutTabla.setMargin(false);
// tablaVehiculos
PtDaoService ptDao = new PtDaoService();
ptDao.obtenerVehiculos();
BeanItemContainer<Vehiculo> container = new BeanItemContainer<Vehiculo>(Vehiculo.class, Flota.getInstance().getVehiculosList());
gridVehiculos = new Grid(container);
gridVehiculos.setSelectionMode(SelectionMode.MULTI);
gridVehiculos.setImmediate(false);
gridVehiculos.setWidth("-1px");
gridVehiculos.setHeight("-1px");
gridVehiculos.setColumnOrder("nombre", "matricula", "asientos", "asientosOcupados");
layoutTabla.addComponent(gridVehiculos);
return layoutTabla;
}
private VerticalLayout buildLayoutBotones() {
// common part: create layout
layoutBotones = new VerticalLayout();
//layoutBotones.setCaption("lay botones");
layoutBotones.setImmediate(false);
layoutBotones.setWidth("100.0%");
layoutBotones.setHeight("-1px");
layoutBotones.setMargin(false);
layoutBotones.setSpacing(true);
// botonAnadirVehiculo
botonAnadirVehiculo = new Button();
botonAnadirVehiculo.setCaption("Añadir vehículo");
botonAnadirVehiculo.setImmediate(false);
botonAnadirVehiculo.setWidth("-1px");
botonAnadirVehiculo.setHeight("-1px");
botonAnadirVehiculo.addClickListener(this);
layoutBotones.addComponent(botonAnadirVehiculo);
// botonBorrarVehiculo
botonBorrarVehiculo = new Button();
botonBorrarVehiculo.setCaption("Borrar vehículo");
botonBorrarVehiculo.setImmediate(false);
botonBorrarVehiculo.setWidth("-1px");
botonBorrarVehiculo.setHeight("-1px");
botonBorrarVehiculo.addClickListener(this);
layoutBotones.addComponent(botonBorrarVehiculo);
// botonCargarFicheroVehiculos
botonCargarFicheroVehiculos = new Button();
botonCargarFicheroVehiculos.setCaption("Cargar fichero vehículos");
botonCargarFicheroVehiculos.setImmediate(false);
botonCargarFicheroVehiculos.setWidth("-1px");
botonCargarFicheroVehiculos.setHeight("-1px");
botonCargarFicheroVehiculos.addClickListener(this);
layoutBotones.addComponent(botonCargarFicheroVehiculos);
// prepararCargarFichero1();
// layoutBotones.addComponent(panelCargarFicheroVehiculos);
return layoutBotones;
}
@Override
public void buttonClick(ClickEvent event){
if(event.getButton().equals(botonAnadirVehiculo)){
// Añadir vehiculo
System.out.println("Pulsado añadir vehículo");
windowAnadirVehiculo = new Window("Añadir Vehículo");
layoutAnadirVehiculo = new VerticalLayout();
layoutAnadirVehiculo.setMargin(true);
layoutAnadirVehiculo.setSpacing(true);
windowAnadirVehiculo.setContent(layoutAnadirVehiculo);
anadirVehiculoMatricula = new TextField("Matrícula");
anadirVehiculoMatricula.addValidator(new ValidadorMatriculaVehiculo());
anadirVehiculoMatricula.setImmediate(true);
anadirVehiculoMatricula.setRequired(true);
anadirVehiculoMatricula.focus();
anadirVehiculoNombre = new TextField("Nombre");
anadirVehiculoNombre.setRequired(true);
anadirVehiculoAsientos = new Slider("Asientos");
anadirVehiculoAsientos.setOrientation(SliderOrientation.HORIZONTAL);
anadirVehiculoAsientos.setMax(25);
anadirVehiculoAsientos.setMin(1);
anadirVehiculoAsientos.setResolution(0);
anadirVehiculoAsientos.setRequired(true);
layoutBotonesAnadirVehiculo = new HorizontalLayout();
layoutBotonesAnadirVehiculo.setMargin(true);
layoutBotonesAnadirVehiculo.setSpacing(true);
aceptarAnadirVehiculo = new Button("Aceptar", e -> {
// Aceptar añadir vehiculo
System.out.println("Pulsado aceptar en la ventana de añadir vehículo");
String matricula = anadirVehiculoMatricula.getValue();
String nombre = anadirVehiculoNombre.getValue();
double asientos = anadirVehiculoAsientos.getValue();
try {
Vehiculo v = new PtDaoService().anadirVehiculo(matricula, nombre, (int) asientos);
theUI.removeWindow(windowAnadirVehiculo);
} catch (ExisteVehiculoException ex) {
windowAnadirVehiculo.close();
Notification.show("Error al añadir vehículo", ex.getMessage(), Type.ERROR_MESSAGE);
}
});
layoutBotonesAnadirVehiculo.addComponent(aceptarAnadirVehiculo);
layoutAnadirVehiculo.addComponent(anadirVehiculoMatricula);
layoutAnadirVehiculo.addComponent(anadirVehiculoNombre);
layoutAnadirVehiculo.addComponent(anadirVehiculoAsientos);
layoutAnadirVehiculo.addComponent(layoutBotonesAnadirVehiculo);
// Center it in the browser window
windowAnadirVehiculo.center();
// Open it in the UI
theUI.addWindow(windowAnadirVehiculo);
}else if(event.getButton().equals(botonBorrarVehiculo)){
// Borrar vehículos
System.out.println("Borrar vehículos");
ArrayList<Vehiculo> vehiculos = new ArrayList<Vehiculo>();
for (Object object : gridVehiculos.getSelectedRows()) {
Vehiculo v = (Vehiculo) object;
vehiculos.add(v);
}
try {
PtDaoService ptDao = new PtDaoService();
ptDao.borrarVehiculos(vehiculos);
ptDao.obtenerVehiculos();
BeanItemContainer<Vehiculo> container = new BeanItemContainer<Vehiculo>(Vehiculo.class, Flota.getInstance().getVehiculosList());
gridVehiculos = new Grid(container);
} catch (BorrarVehiculoFallidoException e) {
Notification.show("Error al borrar vehículos", e.getMessage(), Type.ERROR_MESSAGE);
windowAnadirVehiculo.close();
}
}else if(event.getButton().equals(botonCargarFicheroVehiculos)){
// Cargar fichero de vehículos
System.out.println("Cargar fichero de vehículos");
prepararCargarFichero1();
theUI.addWindow(windowCargarFichero1);
}
}
private void prepararCargarFichero1(){
windowCargarFichero1 = new Window("Cargar fichero Excel");
layoutCargarFichero1 = new VerticalLayout();
layoutCargarFichero1.setMargin(true);
layoutCargarFichero1.setSpacing(true);
uploadCargarFichero1 = new Upload("Buscar", this);
uploadCargarFichero1.setButtonCaption("Subir");
uploadCargarFichero1.addSucceededListener(this);
uploadCargarFichero1.addProgressListener(this);
uploadCargarFichero1.addStartedListener(this);
uploadCargarFichero1.addFailedListener(this);
File uploads = new File(basepath + "/WEB-INF/tmp/uploads");
if (!uploads.exists() && !uploads.mkdir())
System.out.println("ERROR: No se ha podido crear el directorio de subida");
descargarFicheroButtonCargarFichero1 = new Button("Descargar plantilla vehículos");
ficheroPlantillaCargarFichero1 = crearFicheroPlantilla();
descargadorPlantillaCargarFichero1 = new FileDownloader(ficheroPlantillaCargarFichero1);
descargadorPlantillaCargarFichero1.extend(descargarFicheroButtonCargarFichero1);
layoutCargarFichero1.addComponent(uploadCargarFichero1);
layoutCargarFichero1.addComponent(descargarFicheroButtonCargarFichero1);
windowCargarFichero1.center();
windowCargarFichero1.setContent(layoutCargarFichero1);
}
/**
* <p>Generar el fichero de la plantilla para que luego se lo descargue el usuario.</p>
* @return
*/
private FileResource crearFicheroPlantilla(){
// Devolvemos el fichero
return new FileResource(new File(basepath + "/WEB-INF/templates/plantilla_añadir_vehiculos.xlsx"));
}
/**
* <p>Listener de la subida del fichero Excel</p>
*/
@Override
public OutputStream receiveUpload(String filename, String mimeType) {
// Para gestionar el fichero que se sube
System.out.println("receiveUpload");
// Create upload stream
FileOutputStream fos = null; // Stream to write to
try {
String time = new java.sql.Timestamp(Calendar.getInstance().getTime().getTime()).toString();
time = time.replace(":", "");
time = time.replace("-", "");
time = time.replace(".", "");
time = time.replace(" ", "");
ficheroVehiculos = new File(basepath + "/WEB-INF/tmp/uploads/" +
time +
filename
);
fos = new FileOutputStream(ficheroVehiculos);
} catch (final java.io.FileNotFoundException e) {
Notification.show("No se puede abrir el fichero", e.getMessage(), Type.ERROR_MESSAGE);
return null;
}
return fos; // Return the output stream to write to
}
/**
* <p>Listener de la subida para cuando es satisfactoria</p>
*/
@Override
public void uploadSucceeded(SucceededEvent event) {
/*
* Llegados a este punto, el fichero se ha subido bien.
* Ahora tendríamos que pillar el fichero y parsearlo, crear los elementos de la tabla del paso 2.
*/
System.out.println("receiveUpload: " + event.getFilename());
Notification.show("Fichero subido", "Fichero subido con éxito!", Type.HUMANIZED_MESSAGE);
progresoCargarFichero1.setVisible(false);
theUI.removeWindow(windowCargarFichero1);
try {
vehiculosLeidosDelExcel = ExcelHelper.leerVehiculosDeExcel(ficheroVehiculos);
System.out.println("Se han creado estos vehículos: " );
for (Vehiculo vehi : vehiculosLeidosDelExcel) {
System.out.println(vehi.toString());
}
prepararCargarFichero2();
} catch (FileNotFoundException e) {
Notification.show("Error al leer el fichero", "No se ha encontrado el fichero de vehículos", Type.ERROR_MESSAGE);
e.printStackTrace();
} catch (IOException e) {
Notification.show("Error al leer el fichero", "Error de lectura en el fichero de vehículos", Type.ERROR_MESSAGE);
e.printStackTrace();
} catch (Exception e) {
Notification.show("Error al leer el fichero", "Error genérico a la hora de leer el fichero de vehículos", Type.ERROR_MESSAGE);
e.printStackTrace();
}
}
/**
* <p>Listener de la subida para cuando ha ocurrido un fallo</p>
*/
@Override
public void uploadFailed(FailedEvent event) {
System.out.println("La subida ha fallado");
theUI.removeWindow(windowCargarFichero1);
Notification.show("Fichero subido", "La subida del fichero ha fallado: " + event.getReason(), Type.ERROR_MESSAGE);
progresoCargarFichero1.setVisible(false);
}
/**
* <p>Listener para ver cómo va la subida. Útil para meter un progressbar</p>
*/
@Override
public void updateProgress(long readBytes, long contentLength) {
System.out.println("Subiendo. Bytes leidos: " + readBytes + " de " + contentLength);
progresoCargarFichero1.setValue((float) readBytes);
}
/**
* <p>Listener para saber que la subida ha comenzado.</p>
*/
@Override
public void uploadStarted(StartedEvent event) {
System.out.println("La subida ha comenzado");
progresoCargarFichero1 = new ProgressBar(0);
progresoCargarFichero1.setVisible(true);
}
private void prepararCargarFichero2(){
// TODO
windowCargarFichero2 = new Window("Previsualizar vehículos importados");
}
}