I am creating a web application for an enterprise and I would like to improve my way of coding, know what I do wrong and what I do well. I'll leave the main class' code here:package com.puntobile;import com.google.gson.Gson;import com.google.gson.JsonIOException;import com.google.gson.JsonSyntaxException;import com.google.gson.reflect.TypeToken;import com.google.gwt.event.dom.client.KeyPressHandler;import com.vaadin.annotations.Theme;import com.vaadin.client.ui.layout.Margins;import com.vaadin.data.Property.ValueChangeEvent;import com.vaadin.data.Property.ValueChangeListener;import com.vaadin.data.util.IndexedContainer;import com.vaadin.event.Action;import com.vaadin.event.Action.Handler;import com.vaadin.event.ShortcutAction;import com.vaadin.server.*;import com.vaadin.shared.ui.datefield.Resolution;import com.vaadin.ui.*;import com.vaadin.ui.Button.ClickEvent;import com.vaadin.ui.Button.ClickListener;import com.vaadin.ui.Upload.Receiver;import com.vaadin.ui.Upload.SucceededEvent;import com.vaadin.ui.Upload.SucceededListener;import java.io.BufferedWriter;import java.io.FileNotFoundException;import java.io.IOException;import java.io.OutputStream;import java.util.*;import java.io.*;import java.lang.reflect.Type;import org.quartz.*;@Theme(puntobiletheme)public class PuntobileUI extends UI implements Receiver, SucceededListener {    private static final long serialVersionUID = 1L;    private final String[] fieldNames = { Nombre, IP, Directorio,    Estado };    public static PuntobileUI INSTANCE;    Table signs = new Table(Signs);    IndexedContainer signsContainer = new IndexedContainer();    List<Sign> signList = new ArrayList<Sign>();    Table schedule = new Table();    String owner = guest;    List<User> userList = new ArrayList<User>();    @Override    protected void init(VaadinRequest request) {        INSTANCE = this;        loadUsers();        FormLayout loginLayout = new FormLayout();        this.setContent(loginLayout);        Label lblLogin = new Label(Iniciar sesin);        lblLogin.setStyleName(boldLabel);        final TextField username = new TextField(Nombre de usuario: );        final PasswordField password = new PasswordField(Contrasea: );        Button btnLogin = new Button(Iniciar sesin);        btnLogin.addClickListener(new ClickListener() {            private static final long serialVersionUID = 8727890390426574530L;            @Override            public void buttonClick(ClickEvent event) {                boolean worked = false;                for(User u : userList)                    if ((username.getValue().equals(u.username) && password                            .getValue().equals(u.password))) {                        initLayout(username.getValue());                        initSigns();                        initSchedule();                        worked = true;                    } else {                    }                if(!worked) Notification.show(Usuario o contrasea errneos,                        Notification.Type.WARNING_MESSAGE);            }        });        loginLayout.setMargin(true);        loginLayout.addComponent(lblLogin);        loginLayout.addComponent(username);        loginLayout.addComponent(password);        loginLayout.addComponent(btnLogin);    }    @SuppressWarnings(serial)    private void initLayout(final String owner) {        this.owner = owner;        HorizontalSplitPanel splitPanel = new HorizontalSplitPanel();        this.setContent(splitPanel);        VerticalLayout leftLayout = new VerticalLayout();        leftLayout.addComponent(signs);        Button btnManage = new Button(Administrar cuentas);        BrowserWindowOpener popupOpener = new BrowserWindowOpener(UserManager.class);        popupOpener.extend(btnManage);        Button btnDel = new Button(Borrar);        btnDel.addClickListener(new ClickListener() {            @Override            public void buttonClick(ClickEvent event) {                if(signs.getValue() != null)                    signList.remove(((Integer) signs.getValue()) - 1);                refreshSigns();            }        });        HorizontalLayout bottomLayout = new HorizontalLayout();        bottomLayout.addComponent(btnDel);        if (this.owner.equals(PuntoBile))            bottomLayout.addComponent(btnManage);        leftLayout.addComponent(bottomLayout);        splitPanel.addComponent(leftLayout);        signs.setSizeFull();        VerticalLayout rightLayout = new VerticalLayout();        splitPanel.addComponent(rightLayout);        rightLayout.setMargin(true);        FormLayout addLayout = new FormLayout();        addLayout.setMargin(true);        rightLayout.addComponent(addLayout);        Label lblAdd = new Label(Aadir);        lblAdd.setStyleName(boldLabel);        addLayout.addComponent(lblAdd);        final TextField txtIP = new TextField(IP: );        final TextField txtName = new TextField(Nombre: );        final TextField txtRoot = new TextField(Directorio: );        Button btnAdd = new Button(Aadir);        btnAdd.addClickListener(new ClickListener() {            @Override            public void buttonClick(ClickEvent event) {                signList.add(new Sign(txtIP.getValue(), txtName.getValue(),                        new File(txtRoot.getValue()), owner));                txtIP.setValue();                txtName.setValue();                txtRoot.setValue();                refreshSigns();                saveSigns();            }        });        addLayout.addComponent(txtName);        addLayout.addComponent(txtRoot);        addLayout.addComponent(txtIP);        addLayout.addComponent(btnAdd);        VerticalLayout scheduleLayout = new VerticalLayout();        Label lblSchedule = new Label(Programacin);        lblSchedule.setStyleName(boldLabel);        scheduleLayout.addComponent(lblSchedule);        scheduleLayout.addComponent(schedule);        rightLayout.addComponent(scheduleLayout);        FormLayout uploadLayout = new FormLayout();        Label lblUpload = new Label(Subir vdeo);        lblUpload.setStyleName(boldLabel);        uploadLayout.addComponent(lblUpload);        Upload upload = new Upload(null, this);        upload.setButtonCaption(Subir);        upload.addSucceededListener(this);        uploadLayout.addComponent(upload);        rightLayout.addComponent(uploadLayout);        FormLayout schedulePlayLayout = new FormLayout();        Label lblSchedulePlay = new Label(Programar un vdeo);        lblSchedulePlay.setStyleName(boldLabel);        schedulePlayLayout.addComponent(lblSchedulePlay);        final ComboBox cbVideos = new ComboBox(Elige un vdeo: );        signs.addValueChangeListener(new ValueChangeListener() {            @Override            public void valueChange(ValueChangeEvent event) {                cbVideos.removeAllItems();                if (signs.getValue() != null && signList.get((Integer) signs.getValue() - 1).root                        .listFiles() != null)                    for (File f : signList.get((Integer) signs.getValue() - 1).root                            .listFiles())                        cbVideos.addItem(f.getName());            }        });        schedulePlayLayout.addComponent(cbVideos);        final InlineDateField date = new InlineDateField(Horario: );        date.setValue(new Date());        date.setResolution(Resolution.MINUTE);        schedulePlayLayout.addComponent(date);        ComboBox cbRepeat = new ComboBox(Repetir: );        cbRepeat.addItem(Nunca);        cbRepeat.addItem(Cada 24 horas);        Button btnAddSchedule = new Button(Aadir);        btnAddSchedule.addClickListener(new ClickListener() {            @Override            public void buttonClick(ClickEvent event) {                //TODO: Add schedules            }        });        rightLayout.addComponent(schedulePlayLayout);    }    private void initSigns() {        this.signsContainer.addContainerProperty(fieldNames[0], String.class,                fieldNames[0]);        this.signsContainer.addContainerProperty(fieldNames[1], String.class,                fieldNames[1]);        this.signsContainer.addContainerProperty(fieldNames[2], String.class,                fieldNames[2]);        this.signsContainer        .addContainerProperty(fieldNames[3], Image.class, new Image(                Conectado, new ThemeResource(icons/accept16.png)));        signs.setContainerDataSource(signsContainer);        signs.setVisibleColumns(fieldNames);        signs.setSelectable(true);        loadSigns();    }    private void initSchedule() {        schedule.addContainerProperty(Horario, String.class, Horario);        schedule.addContainerProperty(Video, String.class, Video);        schedule.setVisibleColumns(new String[] { Horario, Video });        schedule.setSizeFull();        schedule.setSortEnabled(false);        schedule.setPageLength(schedule.size());        schedule.addValueChangeListener(new ValueChangeListener() {            private static final long serialVersionUID = 1L;            @Override            public void valueChange(ValueChangeEvent event) {                schedule.removeAllItems();            }        });    }    @SuppressWarnings(unchecked)    private void refreshSigns() {        signs.removeAllItems();        signsContainer = new IndexedContainer();        this.signsContainer.addContainerProperty(fieldNames[0], String.class,                fieldNames[0]);        this.signsContainer.addContainerProperty(fieldNames[1], String.class,                fieldNames[1]);        this.signsContainer.addContainerProperty(fieldNames[2], String.class,                fieldNames[2]);        this.signsContainer        .addContainerProperty(fieldNames[3], Image.class, new Image(                Conectado, new ThemeResource(icons/accept16.png)));        signs.setContainerDataSource(signsContainer);        for (Sign s : signList) {            if (s.owner.equals(this.owner) || this.owner.equals(PuntoBile)) {                Object id = signsContainer.addItem();                this.signsContainer.getContainerProperty(id, fieldNames[0])                .setValue(s.nickname);                this.signsContainer.getContainerProperty(id, fieldNames[1])                .setValue(s.url);                this.signsContainer.getContainerProperty(id, fieldNames[2])                .setValue(s.root.getPath());                if (s.isOnline())                    this.signsContainer.getContainerProperty(id, fieldNames[3])                    .setValue(                            new Image(Conectado, new ThemeResource(                                    icons/accept16.png)));                else                    this.signsContainer.getContainerProperty(id, fieldNames[3])                    .setValue(                            new Image(Conectado, new ThemeResource(                                    icons/stop16.png)));            }        }    }    private void saveSigns() {        File f = new File(signs.json);        try {            BufferedWriter bw = new BufferedWriter(new FileWriter(f));            bw.write(new Gson().toJson(this.signList));            bw.close();        } catch (IOException e) {            Notification.show(Error al crear la base de datos en                     + f.getAbsolutePath());            e.printStackTrace();        }    }    private void loadSigns() {        try {            Type t = new TypeToken<ArrayList<Sign>>() {            }.getType();            signList = new Gson().fromJson(new FileReader(signs.json), t);            if (signList == null)                signList = new ArrayList<Sign>();            refreshSigns();        } catch (JsonIOException e) {            e.printStackTrace();        } catch (JsonSyntaxException e) {            e.printStackTrace();        } catch (FileNotFoundException e) {            e.printStackTrace();        }    }    public void saveUsers() {        File f = new File(users.json);        try {            BufferedWriter bw = new BufferedWriter(new FileWriter(f));            bw.write(new Gson().toJson(this.userList));            bw.close();        } catch (IOException e) {            Notification.show(Error al crear la base de datos en                     + f.getAbsolutePath());            e.printStackTrace();        }    }    private void loadUsers() {        try {            Type t = new TypeToken<ArrayList<User>>() {            }.getType();            userList = new Gson().fromJson(new FileReader(users.json), t);            if (userList == null)                userList = new ArrayList<User>();            refreshSigns();        } catch (JsonIOException e) {            e.printStackTrace();        } catch (JsonSyntaxException e) {            e.printStackTrace();        } catch (FileNotFoundException e) {            e.printStackTrace();        }    }    File file;    @Override    public OutputStream receiveUpload(String filename, String mimeType) {        FileOutputStream fos = null;        try {            file = new File(/tmp/uploads/ + filename);            fos = new FileOutputStream(file);        } catch (final java.io.FileNotFoundException e) {            Notification.show(No se ha podido encontrar el archivo,                    Notification.Type.ERROR_MESSAGE);            return null;        }        return fos;    }    @Override    public void uploadSucceeded(SucceededEvent event) {        file.renameTo(new File(                signList.get((Integer) signs.getValue() - 1).root                + File.separator + file.getName()));        Notification.show(Video subido);    }}
Vaadin web application
java