com.amthuc.view.ServerFrame.java Source code

Java tutorial

Introduction

Here is the source code for com.amthuc.view.ServerFrame.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 com.amthuc.view;

import com.amthuc.dao.BillDAO;
import com.amthuc.dao.CategoryDAO;
import com.amthuc.dao.DishDAO;
import com.amthuc.dao.OrderDAO;
import com.amthuc.dao.OrderDetailsDAO;
import com.amthuc.dao.TableDAO;
import com.amthuc.dao.UserDAO;
import com.amthuc.model.Table;
import com.amthuc.model.User;
import com.amthuc.server.Client;
import com.amthuc.server.Message;
import com.amthuc.utils.GLOBAL;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
//import com.jtattoo.plaf.bernstein.BernsteinLookAndFeel;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.logging.Level;
import java.util.logging.Logger;
import static javax.swing.JFrame.EXIT_ON_CLOSE;
import javax.swing.JSplitPane;
import javax.swing.UIManager;

/**
 *
 * @author Pia
 */
public class ServerFrame extends javax.swing.JFrame {

    /**
     * Creates new form MainFrame
     */
    public ServerFrame() {
        initComponents();
        menuPanel = new MenuPanel(this);
        try {
            // m cng n cc kt ni t client
            myServer = new ServerSocket(port);

            //            // Fake danh sch ng?i dung
            //            for (int i = 1; i <= 5; i++) {
            //                User user = new User(i, "Bi bn " + i, "123456", 1, 1);
            //                this.arrUsers.add(user);
            //            }
            System.out.print("Server is running ... ");
        } catch (Exception e) {
            e.printStackTrace();
            System.exit(1);
        }
    }

    public void listening() throws NullPointerException, IOException {
        // vng lp v hn, n cc kt ni m?i lc
        while (true) {
            // chp nhn kt ni t client
            Socket socket = myServer.accept();
            System.out.println(socket.getInetAddress() + " connected");
            // to 1 uuid  phn bit gia cc client vs nhau
            UUID uuid = UUID.randomUUID();
            // khi to 1 i tng i din cho client va kt ni ti
            // new ProcessMessage()
            Client client = new Client(this, socket, new ProcessMessage(), uuid);
            // start client ln
            client.start();
            // qun l cc client hin ang kt ni bng cch thm n vo mng cc client
            arrClients.add(client);
        }
    }

    /*
     Hm x l cc message  y
     */
    public void ProcessMessage(String msg, Client client) throws SQLException, ClassNotFoundException {
        System.out.println("D liu t client : ");
        System.out.println(msg);
        Gson gson = new GsonBuilder().create();
        // d liu t client theo nh dng Json, cn fai ?c d liu json bng hm fromJson v p kiu v? Message
        Message message = gson.fromJson(msg, Message.class);
        switch (message.getMsgID()) {
        case GLOBAL.FROM_CLIENT.CONNECT:
            confirmConnection(message, client);
            break;
        case GLOBAL.FROM_CLIENT.LOGIN:
            checkLogin(message, client);
            updateUsersList();
            break;

        case GLOBAL.FROM_CLIENT.LOGOUT:
            doLogout(message, client);
            updateUsersList();
            break;
        case GLOBAL.FROM_CLIENT.CHAT:
            sendChatMessage(message, client);
            break;

        case GLOBAL.FROM_CLIENT.LIST_CATEGORY:
            sendListCategory(message, client);
            break;

        case GLOBAL.FROM_CLIENT.LOAD_TABLES:
            sendListTable(message, client);
            break;

        case GLOBAL.FROM_CLIENT.RELOAD_TABLES:
            reloadTable(message, client);
            break;

        case GLOBAL.FROM_CLIENT.ADD_ORDER:
            addOrder(message, client);
            break;

        case GLOBAL.FROM_CLIENT.SHOW_ORDER:
            showOrder(message, client);
            break;

        case GLOBAL.FROM_CLIENT.UPDATE_ORDER:
            updateOrder(message, client);
            break;

        case GLOBAL.FROM_CLIENT.CANCEL_ORDER:
            cancelOrder(message, client);

        case GLOBAL.FROM_CLIENT.ADD_LINE_TO_ORDER:
            addLineOrder(message, client);
            break;

        case GLOBAL.FROM_CLIENT.UPDATE_LINE_OF_ORDER:
            //                updateLineOrder(message, client);
            break;

        case GLOBAL.FROM_CLIENT.DELETE_LINE_OF_ORDER:
            //                deleteLineOrder(message, client);
            break;

        case GLOBAL.FROM_CLIENT.LOAD_ORDER_DETAILS:
            loadOrderDetails(message, client);
            break;

        case GLOBAL.FROM_CLIENT.RELOAD_ORDER_DETAILS:
            reloadOrderDetails(message, client);
            break;

        case GLOBAL.FROM_CLIENT.UPDATE_ORDER_DETAILS_STATUS:
            updateOrderDetails(message, client);
            break;

        case GLOBAL.FROM_CLIENT.BILL:
            addBill(message, client);
            break;
        }
    }

    public void sendChatMessage(Message message, Client client) {
        try {
            System.out.println(message.getUser().getUsername() + " Gi tin nhn n ng?i dng "
                    + message.getTarget().getUsername());
            for (Client cl : arrClients) {
                if (cl.getUser().getUsername().equals(message.getTarget().getUsername())) {
                    message.setMsgID(GLOBAL.TO_CLIENT.RECEIVED_CHAT_MESSAGE);
                    cl.sendMessage(message);
                    break;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void checkLogin(Message msg, Client client) throws SQLException, ClassNotFoundException {
        Message rs = new Message();
        User user = userDao.login(msg.getUser());
        rs.setMsgID(GLOBAL.TO_CLIENT.LOGIN);
        if (user != null) {
            rs.setMsg(GLOBAL.CONFIG.SUCCESS);
            user.setStatus(1);
            user.setPassword("");
            rs.setUser(user);
            client.setUser(user);
            this.arrUsers.add(user);
            System.out.println("Them nguoi choi " + arrUsers.size());
        } else {
            rs.setMsg(GLOBAL.CONFIG.FAIL);
            rs.setUser(user);
        }
        sendMessageToClient(rs, client);
    }

    private void doLogout(Message msg, Client client) {
        System.out.println("Ng?i dng ng xut");
        System.out.println(client.getUser().toString());
        for (User user : arrUsers) {
            if (user.getUsername().equals(client.getUser().getUsername())) {
                arrUsers.remove(user);
                break;
            }
        }
    }

    public void removeDisconnectedClient(Client client) {
        System.out.println(
                "Disconneted " + client.getClient().getInetAddress() + " - " + client.getClient().getPort());
        for (User user : arrUsers) {
            if (user.getUsername().equals(client.getUser().getUsername())) {
                arrUsers.remove(user);
                break;
            }
        }
        this.arrClients.remove(client);
        updateUsersList();
    }

    private void updateUsersList() {
        System.out.println("Cp nht danh sch ng?i dng ( " + arrUsers.size() + " ) : ");
        for (User player : arrUsers) {
            System.out.println("  " + player.getId() + " - " + player.getUsername());
        }
        System.out.println("Cp nht s kt ni ( " + arrClients.size() + ") : ");
        for (Client client : arrClients) {
            System.out
                    .println("  " + client.getClient().getInetAddress() + " - " + client.getClient().getPort());
            Message msg = new Message();
            msg.setArrUsers(arrUsers);
            msg.setMsgID(GLOBAL.TO_CLIENT.UPDATE_USERS);
            sendMessageToClient(msg, client);
        }
    }

    private void confirmConnection(Message msg, Client client) {
        sendMessageToClient(new Message(GLOBAL.TO_CLIENT.CONNECT, GLOBAL.CONFIG.SUCCESS), client);
    }

    private void sendMessageToClient(Message msg, Client client) {
        client.sendMessage(msg);
    }

    private void sendListCategory(Message message, Client client) throws ClassNotFoundException, SQLException {
        Message mes = new Message();
        mes.setMsgID(GLOBAL.TO_CLIENT.LIST_CATEGORY);
        mes.setArrCategories(categoryDAO.getAll());
        sendMessageToClient(mes, client);
    }

    private void sendListTable(Message message, Client client) throws ClassNotFoundException, SQLException {
        Message mes = new Message();
        mes.setMsgID(GLOBAL.TO_CLIENT.LOAD_TABLES);
        mes.setArrTables(MenuPanel.allTables);
        sendMessageToClient(mes, client);
    }

    private void addOrder(Message message, Client client) {
        Message mes = new Message();
        mes.setMsgID(GLOBAL.TO_CLIENT.ADD_ORDER);
        try {
            orderDAO.insert(message.getOrder());
            mes.setMsg(GLOBAL.CONFIG.SUCCESS);
            for (int i = 0; i < MenuPanel.allTables.size(); i++) {
                if (MenuPanel.allTables.get(i).getId() == message.getOrder().getOrderTable().getId()) {
                    MenuPanel.allTables.set(i, message.getOrder().getOrderTable());
                }
            }
            // reinit tables
            menuPanel.initAgain();
            // send to client list of new order details
            reloadOrderDetails(message, client);
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(ServerFrame.class.getName()).log(Level.SEVERE, null, ex);
            mes.setMsg(GLOBAL.CONFIG.FAIL);
        } catch (SQLException ex) {
            Logger.getLogger(ServerFrame.class.getName()).log(Level.SEVERE, null, ex);
            mes.setMsg(GLOBAL.CONFIG.FAIL);
        } finally {
            sendMessageToClient(mes, client);
        }
    }

    private void updateOrder(Message message, Client client) {
        Message mes = new Message();
        mes.setMsgID(GLOBAL.TO_CLIENT.UPDATE_ORDER);
        try {
            orderDAO.update(message.getOrder());
            mes.setMsg(GLOBAL.CONFIG.SUCCESS);
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(ServerFrame.class.getName()).log(Level.SEVERE, null, ex);
            mes.setMsg(GLOBAL.CONFIG.FAIL);
        } catch (SQLException ex) {
            Logger.getLogger(ServerFrame.class.getName()).log(Level.SEVERE, null, ex);
            mes.setMsg(GLOBAL.CONFIG.FAIL);
        } finally {
            sendMessageToClient(mes, client);
        }
    }

    //    private void addLineOrder(Message message, Client client) {
    //        Message mes = new Message();
    //        mes.setMsgID(GLOBAL.TO_CLIENT.ADD_LINE_TO_ORDER);
    //        try {
    //            orderDetailsDAO.insert(message.getOrderDetails());
    //            mes.setMsg(GLOBAL.CONFIG.SUCCESS);
    //        } catch (ClassNotFoundException ex) {
    //            Logger.getLogger(ServerFrame.class.getName()).log(Level.SEVERE, null, ex);
    //            mes.setMsg(GLOBAL.CONFIG.FAIL);
    //        } catch (SQLException ex) {
    //            Logger.getLogger(ServerFrame.class.getName()).log(Level.SEVERE, null, ex);
    //            mes.setMsg(GLOBAL.CONFIG.FAIL);
    //        } finally {
    //            sendMessageToClient(mes, client);
    //        }
    //    }
    private void updateLineOrder(Message message, Client client) {
        Message mes = new Message();
        mes.setMsgID(GLOBAL.TO_CLIENT.UPDATE_LINE_OF_ORDER);
        try {
            orderDetailsDAO.update(message.getOrderDetails());
            mes.setMsg(GLOBAL.CONFIG.SUCCESS);
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(ServerFrame.class.getName()).log(Level.SEVERE, null, ex);
            mes.setMsg(GLOBAL.CONFIG.FAIL);
        } catch (SQLException ex) {
            Logger.getLogger(ServerFrame.class.getName()).log(Level.SEVERE, null, ex);
            mes.setMsg(GLOBAL.CONFIG.FAIL);
        } finally {
            sendMessageToClient(mes, client);
        }
    }

    private void deleteLineOrder(Message message, Client client) {
        Message mes = new Message();
        mes.setMsgID(GLOBAL.TO_CLIENT.DELETE_LINE_OF_ORDER);
        try {
            orderDetailsDAO.delete(message.getOrderDetails());
            mes.setMsg(GLOBAL.CONFIG.SUCCESS);
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(ServerFrame.class.getName()).log(Level.SEVERE, null, ex);
            mes.setMsg(GLOBAL.CONFIG.FAIL);
        } catch (SQLException ex) {
            Logger.getLogger(ServerFrame.class.getName()).log(Level.SEVERE, null, ex);
            mes.setMsg(GLOBAL.CONFIG.FAIL);
        } finally {
            sendMessageToClient(mes, client);
        }
    }

    private void reloadTable(Message message, Client client) {
        if (message.getArrTables() != null && message.getArrTables().size() > 0) {
            MenuPanel.allTables = message.getArrTables();
            // reinit tables
            menuPanel.initAgain();
            for (Client c : arrClients) {
                System.out.println("  " + c.getClient().getInetAddress() + " - " + c.getClient().getPort());
                Message msg = new Message();
                msg.setMsgID(GLOBAL.TO_CLIENT.RELOAD_TABLES);
                msg.setArrTables(MenuPanel.allTables);
                sendMessageToClient(msg, client);

            }
        }
    }

    private void showOrder(Message message, Client client) {
        Message mes = new Message();
        mes.setMsgID(GLOBAL.TO_CLIENT.SHOW_ORDER);
        try {
            int tableId = Integer.parseInt(message.getMsg().trim());
            mes.setMsg(GLOBAL.CONFIG.SUCCESS);
            mes.setOrder(orderDAO.getOrderByTableID(tableId));
        } catch (Exception ex) {
            mes.setMsg(GLOBAL.CONFIG.FAIL);
        } finally {
            client.sendMessage(mes);
        }
    }

    private void cancelOrder(Message message, Client client) {
        Message mes = new Message();
        mes.setMsgID(GLOBAL.TO_CLIENT.CANCEL_ORDER);
        try {
            orderDAO.cancel(message.getOrder());
            mes.setMsg(GLOBAL.CONFIG.SUCCESS);
            for (int i = 0; i < MenuPanel.allTables.size(); i++) {
                if (MenuPanel.allTables.get(i).getId() == message.getOrder().getOrderTable().getId()) {
                    MenuPanel.allTables.set(i, message.getOrder().getOrderTable());
                }
            }
            reloadTable(message, client);
            reloadOrderDetails(message, client);
        } catch (Exception ex) {
            mes.setMsg(GLOBAL.CONFIG.FAIL);
        } finally {
            client.sendMessage(mes);
        }
    }

    private void addBill(Message message, Client client) {
        Message mes = new Message();
        mes.setMsgID(GLOBAL.TO_CLIENT.BILL);
        try {
            billDAO.insert(message.getBill());
            message.getBill().getOrder().setStatus(GLOBAL.ORDER_AND_TABLE_STATUS.ORDER_BILLED);
            orderDAO.update(message.getBill().getOrder());
            mes.setMsg(GLOBAL.CONFIG.SUCCESS);
        } catch (Exception ex) {
            mes.setMsg(GLOBAL.CONFIG.FAIL);
        } finally {
            client.sendMessage(mes);
        }
    }

    private void addLineOrder(Message message, Client client) {
        Message mes = new Message();
        mes.setMsgID(GLOBAL.TO_CLIENT.ADD_LINE_TO_ORDER);

    }

    private void loadOrderDetails(Message message, Client client) throws ClassNotFoundException, SQLException {
        Message mes = new Message();
        mes.setMsgID(GLOBAL.TO_CLIENT.LOAD_ORDER_DETAILS);
        mes.setArrOrderDetails(orderDetailsDAO.getAll());
        sendMessageToClient(mes, client);
    }

    private void updateOrderDetails(Message message, Client client) {
        Message mes = new Message();
        mes.setMsgID(GLOBAL.TO_CLIENT.UPDATE_ORDER_DETAILS_STATUS);
        try {
            orderDetailsDAO.update(message.getOrderDetails());
            mes.setMsg(GLOBAL.CONFIG.SUCCESS);
            mes.setOrderDetails(message.getOrderDetails());
        } catch (Exception ex) {
            mes.setMsg(GLOBAL.CONFIG.FAIL);
        } finally {
            sendMessageToClient(mes, client);
        }
    }

    private void reloadOrderDetails(Message message, Client client) throws ClassNotFoundException, SQLException {
        for (Client c : arrClients) {
            System.out.println("  " + c.getClient().getInetAddress() + " - " + c.getClient().getPort());
            Message msg = new Message();
            msg.setMsgID(GLOBAL.TO_CLIENT.LOAD_ORDER_DETAILS);
            msg.setArrOrderDetails(orderDetailsDAO.getAll());
            sendMessageToClient(msg, client);
        }
    }

    /*
     Inner class ProcessMessage, override method MessageReceived trong interface onMessageReceived
      lng nghe s kin message gi dn t client
     */
    public class ProcessMessage implements Client.onMessageReceived {

        public void MessageReceived(String msg, Client uuid) {
            try {
                ProcessMessage(msg, uuid);
            } catch (SQLException ex) {
                Logger.getLogger(ServerFrame.class.getName()).log(Level.SEVERE, null, ex);
            } catch (ClassNotFoundException ex) {
                Logger.getLogger(ServerFrame.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        mainSplitPane = new javax.swing.JSplitPane();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addComponent(mainSplitPane, javax.swing.GroupLayout.DEFAULT_SIZE, 980, Short.MAX_VALUE));
        layout.setVerticalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addComponent(mainSplitPane, javax.swing.GroupLayout.DEFAULT_SIZE, 600, Short.MAX_VALUE));

        mainSplitPane.getAccessibleContext().setAccessibleName("");

        pack();
    }// </editor-fold>//GEN-END:initComponents

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        //        try {
        //            UIManager.setLookAndFeel(new BernsteinLookAndFeel());
        //        } catch (Exception e) {
        //            e.printStackTrace();
        //        }
        try {
            ServerFrame server = null;
            server = new ServerFrame();
            server.setVisible(true);
            server.setDefaultCloseOperation(EXIT_ON_CLOSE);
            server.setResizable(false);
            server.setLocationRelativeTo(null);
            server.listening();
        } catch (NullPointerException ex) {
            Logger.getLogger(ServerFrame.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(ServerFrame.class.getName()).log(Level.SEVERE, null, ex);
        }
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
        * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
        */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(ServerFrame.class.getName()).log(java.util.logging.Level.SEVERE,
                    null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(ServerFrame.class.getName()).log(java.util.logging.Level.SEVERE,
                    null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(ServerFrame.class.getName()).log(java.util.logging.Level.SEVERE,
                    null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(ServerFrame.class.getName()).log(java.util.logging.Level.SEVERE,
                    null, ex);
        }
        //</editor-fold>
        //</editor-fold>

        /* Create and display the form */
        //            java.awt.EventQueue.invokeLater(new Runnable() {
        //                public void run() {
        //                    
        //                }
        //            });
        //</editor-fold>
        //</editor-fold>
    }

    public JSplitPane getMainSplitPane() {
        return mainSplitPane;
    }

    public void setMainSplitPane(JSplitPane mainSplitPane) {
        this.mainSplitPane = mainSplitPane;
    }

    private MenuPanel menuPanel;
    private int port = 2015;
    private ServerSocket myServer;
    private ArrayList<Client> arrClients = new ArrayList<Client>();
    private ArrayList<User> arrUsers = new ArrayList<User>();
    private UserDAO userDao = new UserDAO();
    private CategoryDAO categoryDAO = new CategoryDAO();
    private DishDAO dishDAO = new DishDAO();
    private TableDAO tableDAO = new TableDAO();
    private OrderDAO orderDAO = new OrderDAO();
    private OrderDetailsDAO orderDetailsDAO = new OrderDetailsDAO();
    private BillDAO billDAO = new BillDAO();
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JSplitPane mainSplitPane;
    // End of variables declaration//GEN-END:variables
}