virnet.experiment.webSocket.hndler.MainSystemWebSocketHandler.java Source code

Java tutorial

Introduction

Here is the source code for virnet.experiment.webSocket.hndler.MainSystemWebSocketHandler.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 virnet.experiment.webSocket.hndler;

import java.io.IOException;
import java.util.ArrayList;
import java.util.concurrent.ConcurrentHashMap;

import org.springframework.stereotype.Component;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.WebSocketMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;

import net.sf.json.JSONObject;
import virnet.experiment.assistantapi.ExperimentSave;
import virnet.experiment.assistantapi.FacilityOutPut;
import virnet.experiment.assistantapi.PCConfigureInfo;
import virnet.experiment.assistantapi.PingVerify;
import virnet.experiment.operationapi.FacilityConfigure;
import virnet.experiment.operationapi.NTCEdit;
import virnet.experiment.operationapi.PCExecute;
import virnet.experiment.resourceapi.ResourceAllocate;
import virnet.experiment.resourceapi.ResourceRelease;
import virnet.management.combinedao.CabinetTempletDeviceInfoCDAO;
import virnet.management.combinedao.TaskInfoCDAO;
import virnet.experiment.combinedao.ExpConnectCDAO;
import virnet.experiment.combinedao.ExpTopoCDAO;
import virnet.experiment.combinedao.ExpTopoPositionCDAO;
import virnet.experiment.combinedao.ExpVerifyCDAO;
import virnet.experiment.combinedao.ExpVerifyPingCDAO;
import virnet.experiment.combinedao.ResultConnectCDAO;
import virnet.experiment.combinedao.ResultTaskCDAO;
import virnet.experiment.combinedao.ResultTopoCDAO;
import virnet.experiment.combinedao.ResultTopoPositionCDAO;
import virnet.experiment.combinedao.ResultVerifyCDAO;
import virnet.experiment.combinedao.ResultVerifyPingCDAO;
import virnet.experiment.dao.ExpTopoDAO;
import virnet.experiment.entity.ExpTopo;;

//import virnet.assistantapi.ExperimentInit;
//import virnet.resourceapi.ResourceAllocate;
@Component
public class MainSystemWebSocketHandler extends TextWebSocketHandler implements WebSocketHandler {

    private static final ArrayList<WebSocketSession> arrangeUsers;
    static {
        arrangeUsers = new ArrayList<>();
    }

    private static final ArrayList<WebSocketSession> expUsers;
    static {
        expUsers = new ArrayList<>();
    }

    private static final ArrayList<String> groupExisted = new ArrayList<>();

    //??????
    public static int newGroupNum = 0;

    //???
    public static int cc = 0;

    //???????
    private static int onlineCount = 0;

    //???????
    private WebSocketSession session;

    //???session???
    private static ConcurrentHashMap<WebSocketSession, String> arrangeUserName = new ConcurrentHashMap<WebSocketSession, String>();

    //map????
    private static ConcurrentHashMap<WebSocketSession, String> userGroupMap = new ConcurrentHashMap<WebSocketSession, String>();

    //??map
    private static ConcurrentHashMap<WebSocketSession, String> userGroupMapPro = new ConcurrentHashMap<WebSocketSession, String>();

    //?map,
    private static ConcurrentHashMap<WebSocketSession, String> userMap = new ConcurrentHashMap<WebSocketSession, String>();

    //group?map
    private static ConcurrentHashMap<String, String> MapEquipment = new ConcurrentHashMap<String, String>();

    //groupFacilityConfiguremap
    private static ConcurrentHashMap<String, FacilityConfigure> groupFacilityConfigureMap = new ConcurrentHashMap<String, FacilityConfigure>();

    //groupFacilityConfiguremap
    private static ConcurrentHashMap<String, FacilityOutPut> groupFacilityOutPut = new ConcurrentHashMap<String, FacilityOutPut>();

    //groupFacilityConfiguremap
    private static ConcurrentHashMap<String, PCExecute> groupPcConfigureMap = new ConcurrentHashMap<String, PCExecute>();

    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        System.out.println("connect to the websocket success......");

        //web socket session???
        String userName = (String) session.getAttributes().get("WS_USER_Name");
        String workgroup = (String) session.getAttributes().get("WS_USER_WorkGroup");
        String pageType = (String) session.getAttributes().get("WS_USER_pageType");

        if (pageType.equals("experiment")) {
            expUsers.add(session);
            userMap.put(session, workgroup); //?map
            //   userNameMap.put(session, userName);
        }
        if (pageType.equals("arrange")) {
            userGroupMapPro.put(session, workgroup);
            arrangeUsers.add(session);
            arrangeUserName.put(session, userName);
        }
        this.session = session;
        //webSocketMap.put(this.session,this);     //?map
        //userGroupMap.put(this.session,workgroup);  //?map
        //session.sendMessage(new TextMessage("Server:connected OK!"));
    }

    @Override
    public void handleMessage(WebSocketSession wss, WebSocketMessage<?> wsm) throws Exception {
        String message = wsm.getPayload().toString();
        System.out.println("message:" + message);
        //json ?
        JSONObject jsonString = JSONObject.fromObject(message);

        //??
        if (jsonString.getString("flag").equals("arrange")) {
            String arrangeStatus = jsonString.getString("arrangeStatus");

            if (arrangeStatus.equals("true")) {
                userGroupMap.put(wss, userGroupMapPro.get(wss)); //?map
                queueingLogic(1, jsonString); //
                //endPointQueueingLogic(4,3,jsonString)
            }
        }
        //????
        if (jsonString.getString("flag").equals("experiment")) {
            //???
            if (jsonString.getString("type").equals("requestEquipment")) {
                //Id?
                String expId = jsonString.getString("expId");
                CabinetTempletDeviceInfoCDAO ctdDAO = new CabinetTempletDeviceInfoCDAO();

                //?
                Integer equipmentNumber = ctdDAO.equipmentNumber(expId);

                //??##?????(RT##SW2##SW2#SW3#PC##PC)
                String name_Str = ctdDAO.equipment(expId);

                //
                TaskInfoCDAO tcDAO = new TaskInfoCDAO();
                Integer taskNum = tcDAO.taskNum(expId);

                jsonString.put("equipmentNumber", "" + equipmentNumber);
                jsonString.put("equipmentName", name_Str);
                jsonString.put("expTaskNum", "" + taskNum);
                String mess = jsonString.toString();
                wss.sendMessage(new TextMessage(mess));
            }

            //??
            if (jsonString.getString("experimentStatus").equals("start")) {
                JSONObject ss = jsonString;

                cc++;
                if (cc == 1) {
                    /*??*/
                    String cabinet_num = "";
                    //??##?????(RT##SW2##SW2#SW3#PC##PC)
                    String expId = jsonString.getString("expId");
                    CabinetTempletDeviceInfoCDAO ctdDAO = new CabinetTempletDeviceInfoCDAO();
                    String name_Str = ctdDAO.equipment(expId);
                    String duration = "90"; //?(90)
                    long start = System.currentTimeMillis();
                    ResourceAllocate resourceAllocate = new ResourceAllocate(name_Str, duration);
                    if (resourceAllocate.allocate()) {
                        cabinet_num = resourceAllocate.getCabinetNum(); //?
                        String num_str = resourceAllocate.getNumStr(); //??
                        String port_str = resourceAllocate.getPortInfoStr();//??????(1@2@3@4@5@6##1@2@3@4@6##1##1@2@3@4@5@6##1@2@3@4@5@6)
                        //experimentInit.setCabinet_num(cabinet_num);   //??*/

                        //??
                        jsonString.put("type", "sendEquipment");
                        jsonString.put("equipmentName", name_Str);
                        jsonString.put("equipmentNumStr", num_str);
                        jsonString.put("equipmentPortStr", port_str);
                        jsonString.put("cabinet_num", cabinet_num);
                        sendToGroup(wss, jsonString);
                        System.out.println("?" + cabinet_num);
                        System.out.println("??" + num_str);
                        //System.out.println(port_str);
                    } else {
                        System.out.println("false!");
                        System.out.println(resourceAllocate.getReturnDetail());
                    }
                    long end = System.currentTimeMillis();
                    System.out.println("??" + (end - start) + "ms");

                    //?map
                    MapEquipment.put(userMap.get(wss), cabinet_num);

                    jsonString.put("experimentStatus", "");

                    //??

                    //??
                    String leftNUM_Str = "";
                    String rightNUM_Str = "";
                    String leftport_Str = "";
                    String rightport_Str = "";
                    String position = "";

                    //              String expId = jsonString.getString("expId");
                    ExpTopoDAO tDAO = new ExpTopoDAO();
                    String para[] = { "expId", expId, "expTaskOrder", "0" };
                    ExpTopo topo = (ExpTopo) tDAO.getByNProperty(para);
                    //??
                    if (topo == null) {
                        //??
                        ExpTopoPositionCDAO tpDAO = new ExpTopoPositionCDAO();
                        //?????
                        position = tpDAO.defaultPosition(name_Str);
                        ss.put("position", position);
                        ss.put("type", "equipConnectionInfo");
                        String mess1 = ss.toString();
                        //???
                        wss.sendMessage(new TextMessage(mess1));

                    }
                    //?
                    else {

                        //????Id
                        ExpTopoPositionCDAO tpDAO = new ExpTopoPositionCDAO();
                        position = tpDAO.position(topo.getExpTopoId());

                        ExpConnectCDAO ctDAO = new ExpConnectCDAO();
                        String connectInfo = ctDAO.connectInfo(topo.getExpTopoId());

                        String connect[] = connectInfo.split(",");
                        //
                        leftNUM_Str = connect[0];
                        //?
                        rightNUM_Str = connect[1];
                        //?
                        leftport_Str = connect[2];
                        //??
                        rightport_Str = connect[3];

                        ss.put("position", position);
                        ss.put("leftNUM_Str", leftNUM_Str);
                        ss.put("rightNUM_Str", rightNUM_Str);
                        ss.put("leftport_Str", leftport_Str);
                        ss.put("rightport_Str", rightport_Str);

                        ss.put("type", "equipConnectionInfo");
                        String mess1 = ss.toString();
                        wss.sendMessage(new TextMessage(mess1));
                    }
                }
            }

            //Jtopu???
            if (jsonString.getString("type").equals("topoedit")) {

                JSONObject ss = jsonString;

                long start = System.currentTimeMillis();
                String cabinet_NUM = MapEquipment.get(userMap.get(wss)); //?       
                String leftNUM_Str = jsonString.getString("leftNUM_Str"); //??##?
                String rightNUM_Str = jsonString.getString("rightNUM_Str"); //???##?
                String leftport_Str = jsonString.getString("leftport_Str"); //???##?
                String rightport_Str = jsonString.getString("rightport_Str"); //????##?
                System.out.println("leftNUM_Str:" + leftNUM_Str + "----rightNUM_Str:" + rightNUM_Str
                        + "----leftport_Str:" + leftport_Str + "----rightport_Str:" + rightport_Str);
                NTCEdit ntcEdit = new NTCEdit(cabinet_NUM, leftNUM_Str, rightNUM_Str, leftport_Str, rightport_Str);
                if (ntcEdit.edit()) {
                    String connection_str = leftNUM_Str + "%%" + rightNUM_Str + "%%" + leftNUM_Str + "%%"
                            + rightport_Str;
                    System.out.println(connection_str);
                    jsonString.put("success", true);
                } else {
                    jsonString.put("success", false);
                    System.out.println("false!");
                    System.out.println(ntcEdit.getReturnDetail());
                }
                long end = System.currentTimeMillis();
                System.out.println("" + (end - start) + "ms");
                String mess1 = jsonString.toString();
                wss.sendMessage(new TextMessage(mess1));

                ss.put("type", "equipConnectionInfo");
                String mess2 = ss.toString();
                String groupid = userMap.get(wss);
                for (WebSocketSession user : expUsers) {
                    try {
                        if (user.isOpen() && (userMap.get(user).equals(groupid)) && (!user.equals(wss))) {
                            System.out.println(user.equals(wss));
                            user.sendMessage(new TextMessage(mess2));
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            //??0?
            if (jsonString.getString("type").equals("topoSaveToDatabase")) {

                String leftNUM_Str = jsonString.getString("leftNUM_Str"); //??##?
                String rightNUM_Str = jsonString.getString("rightNUM_Str"); //???##?
                String leftport_Str = jsonString.getString("leftport_Str"); //???##?
                String rightport_Str = jsonString.getString("rightport_Str"); //????##?
                String position = jsonString.getString("position"); //? XY???
                String expId = jsonString.getString("expId");
                String expTaskOrder = jsonString.getString("expTaskOrder");
                String expCaseId = jsonString.getString("expCaseId");
                String expRole = jsonString.getString("expRole");

                //?
                if (expRole.equals("stu")) {

                    //
                    ResultTaskCDAO taskcDAO = new ResultTaskCDAO();
                    Integer resultTaskId = taskcDAO.getResultTaskId(expCaseId, expId, expTaskOrder);

                    if (resultTaskId != 0) {
                        ResultTopoCDAO rtcDAO = new ResultTopoCDAO();
                        Integer resultTopoId = rtcDAO.edit(resultTaskId, leftNUM_Str);

                        if (resultTopoId != 0) {

                            //
                            ResultConnectCDAO rcCDAO = new ResultConnectCDAO();
                            boolean connectSuccess = rcCDAO.edit(resultTopoId, leftNUM_Str, rightNUM_Str,
                                    leftport_Str, rightport_Str);

                            //?
                            ResultTopoPositionCDAO rtpcDAO = new ResultTopoPositionCDAO();
                            boolean positionSuccess = rtpcDAO.edit(resultTopoId, position);

                            if (connectSuccess && positionSuccess)
                                jsonString.put("success", true);
                            else
                                jsonString.put("success", false);
                        } else
                            jsonString.put("success", false);
                    } else
                        jsonString.put("success", false);
                }

                //???
                else if (expRole.equals("GM")) {

                    //?
                    ExpTopoCDAO tcDAO = new ExpTopoCDAO();
                    Integer ExpTopoId = tcDAO.edit(expId, expTaskOrder, leftNUM_Str);
                    if (ExpTopoId != 0) {
                        //?
                        ExpConnectCDAO cCDAO = new ExpConnectCDAO();
                        boolean connectSuccess = cCDAO.edit(ExpTopoId, leftNUM_Str, rightNUM_Str, leftport_Str,
                                rightport_Str);

                        //??
                        ExpTopoPositionCDAO tpCDAO = new ExpTopoPositionCDAO();
                        boolean positionSuccess = tpCDAO.edit(ExpTopoId, position);

                        if (connectSuccess && positionSuccess)
                            jsonString.put("success", true);
                        else
                            jsonString.put("success", false);
                    } else {
                        System.out.println("false");
                        jsonString.put("success", false);
                    }
                } else
                    jsonString.put("success", false);

                String mess = jsonString.toString();
                //???
                wss.sendMessage(new TextMessage(mess));
            }

            //?
            if (jsonString.getString("type").equals("command")) {
                JSONObject ss = jsonString;
                String equipmentNumber = jsonString.getString("inputEquipmentNumber");
                String commandDetail = jsonString.getString("content");
                String[] sourceStrArray = jsonString.getString("equipmentName").split("##");
                if (sourceStrArray[Integer.parseInt(jsonString.getString("inputEquipmentNumber"))].equals("PC")) {

                    String groupid = userMap.get(wss);
                    ss.put("content", "Administrator:/>" + commandDetail + "\n");
                    String mess1 = ss.toString();
                    for (WebSocketSession user : expUsers) {
                        try {
                            if (user.isOpen() && (userMap.get(user).equals(groupid))) {
                                user.sendMessage(new TextMessage(mess1));
                            }
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                    pcCommandConfigure(equipmentNumber, commandDetail, wss);
                } else {
                    FacilityCommandConfigure(equipmentNumber, commandDetail, wss);
                }
            }

            //???
            if (jsonString.getString("type").equals("communication")) {
                String groupid = userMap.get(wss);
                String mess = jsonString.toString();
                for (WebSocketSession user : expUsers) {
                    try {
                        if (user.isOpen() && (userMap.get(user).equals(groupid))) {
                            user.sendMessage(new TextMessage(mess));
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }

            //?
            if (jsonString.getString("type").equals("lock")) {
                String[] sourceStrArray = jsonString.getString("equipmentName").split("##");
                if (sourceStrArray[Integer.parseInt(jsonString.getString("inputEquipmentNumber"))].equals("PC")) {
                    if (jsonString.getString("lock").equals("lock")) {
                        pcInitial(jsonString.getString("inputEquipmentNumber"), wss, jsonString);
                    }
                    if (jsonString.getString("lock").equals("unlock")) {
                        pcCancel(jsonString.getString("inputEquipmentNumber"), wss, jsonString);
                    }
                } else {
                    if (jsonString.getString("lock").equals("lock")) {
                        FacilityInitial(jsonString.getString("inputEquipmentNumber"), wss, jsonString);
                    }
                    if (jsonString.getString("lock").equals("unlock")) {
                        FacilityCancel(jsonString.getString("inputEquipmentNumber"), wss, jsonString);
                    }
                }
                String groupid = userMap.get(wss);
                String mess = jsonString.toString();
                for (WebSocketSession user : expUsers) {
                    try {
                        if (user.isOpen() && (userMap.get(user).equals(groupid) && (!user.equals(wss)))) {
                            user.sendMessage(new TextMessage(mess));
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            //??
            if (jsonString.getString("type").equals("saveConfigureFile")) {
                String cabinet_num = jsonString.getString("cabinet_num");
                String expId = jsonString.getString("expId");
                String expTaskOrder = jsonString.getString("expTaskOrder");
                String equipmentNumber = jsonString.getString("equipmentNumber");
                String expRole = jsonString.getString("expRole");

                boolean success = false;
                //?
                if (expRole.equals("stu")) {

                    String expCaseId = jsonString.getString("expCaseId");
                    ResultTaskCDAO taskcDAO = new ResultTaskCDAO();
                    Integer resultTaskId = taskcDAO.getResultTaskId(expCaseId, expId, expTaskOrder);

                    ExperimentSave es = new ExperimentSave(cabinet_num, expId, expTaskOrder, equipmentNumber,
                            expRole, resultTaskId);
                    success = es.save();

                }
                //??
                else if (expRole.equals("GM")) {

                    //??????
                    ExperimentSave es = new ExperimentSave(cabinet_num, expId, expTaskOrder, equipmentNumber,
                            expRole, 0);
                    success = es.save();
                } else {
                    success = false;
                }

                jsonString.put("success", success);
                String mess = jsonString.toString();
                //???
                wss.sendMessage(new TextMessage(mess));
            }
            //ping?
            if (jsonString.getString("type").equals("pingVerify")) {

                boolean success = true;

                String cabinet_num = jsonString.getString("cabinet_num");
                String expId = jsonString.getString("expId");
                String expTaskOrder = jsonString.getString("expTaskOrder");
                String equipmentNumber = jsonString.getString("equipmentNumber");

                String leftNUM_Str = jsonString.getString("leftNUM_Str"); //??##?
                String rightNUM_Str = jsonString.getString("rightNUM_Str"); //???##?
                String leftport_Str = jsonString.getString("leftport_Str"); //???##?
                String rightport_Str = jsonString.getString("rightport_Str"); //????##?

                String expRole = jsonString.getString("expRole");

                //???ip?
                PCConfigureInfo pcInfo = new PCConfigureInfo(cabinet_num, Integer.parseInt(equipmentNumber));
                //??
                String[] pcip = pcInfo.getIpAddress();
                if (pcip[0].equals("fail"))
                    //??
                    success = false;
                else {
                    //?
                    PingVerify pv = new PingVerify(cabinet_num, Integer.parseInt(equipmentNumber));
                    String verifyResult[] = pv.getVerifyResult(pcip);

                    if (verifyResult[0].equals("fail"))
                        //?
                        success = false;
                    else {

                        Integer VerifyId = 0;

                        if (expRole.equals("GM")) { //?
                            //??
                            ExpVerifyCDAO vcDAO = new ExpVerifyCDAO();
                            VerifyId = vcDAO.edit(expId, expTaskOrder);

                            if (VerifyId == 0)
                                //?
                                success = false;
                            else {
                                //?ping?
                                ExpVerifyPingCDAO vpCDAO = new ExpVerifyPingCDAO();
                                vpCDAO.delete(VerifyId);

                                boolean write = vpCDAO.edit(VerifyId, equipmentNumber, pcip, verifyResult,
                                        leftNUM_Str, rightNUM_Str, leftport_Str, rightport_Str);
                                if (write)
                                    success = true;
                                else
                                    success = false;
                            }
                        }

                        else if (expRole.equals("stu")) { //

                            //?ID
                            String expCaseId = jsonString.getString("expCaseId");
                            ResultTaskCDAO taskcDAO = new ResultTaskCDAO();
                            Integer resultTaskId = taskcDAO.getResultTaskId(expCaseId, expId, expTaskOrder);

                            //?
                            ResultVerifyCDAO rvcDAO = new ResultVerifyCDAO();
                            VerifyId = rvcDAO.edit(resultTaskId);

                            if (VerifyId == 0)
                                //?
                                success = false;
                            else {
                                //?ping?
                                ResultVerifyPingCDAO rvpCDAO = new ResultVerifyPingCDAO();
                                rvpCDAO.delete(VerifyId);

                                boolean write = rvpCDAO.edit(VerifyId, equipmentNumber, pcip, verifyResult,
                                        leftNUM_Str, rightNUM_Str, leftport_Str, rightport_Str);
                                if (write)
                                    success = true;
                                else
                                    success = false;
                            }
                        } else
                            success = false;

                    }
                }
                jsonString.put("success", success);
                String mess = jsonString.toString();
                //???
                wss.sendMessage(new TextMessage(mess));
            }
            //?
            if (jsonString.getString("type").equals("release")) {
                releaseEquipment(wss, jsonString);
            }
        }

    }

    @Override
    public void handleTransportError(WebSocketSession wss, Throwable thrwbl) throws Exception {
        if (wss.isOpen()) {
            if (expUsers.contains(wss))
                expUsers.remove(wss);
            else
                arrangeUsers.remove(wss);
            wss.close();
        }
        System.out.println("websocket connection closed......ERROR");
    }

    @Override
    public void afterConnectionClosed(WebSocketSession wss, CloseStatus cs) throws Exception {
        if (expUsers.contains(wss))
            expUsers.remove(wss);
        else
            arrangeUsers.remove(wss);
        wss.close();
        System.out.println("websocket connection closed......CLOSE");
    }

    @Override
    public boolean supportsPartialMessages() {
        return false;
    }

    /**
     * 
     */
    public void sendMessageo(String message) throws IOException {
        this.session.sendMessage(new TextMessage(message));
    }

    public static synchronized int getOnlineCount() {
        return onlineCount;
    }

    public static synchronized void addOnlineCount() {
        MainSystemWebSocketHandler.onlineCount++;
    }

    public static synchronized void subOnlineCount() {
        MainSystemWebSocketHandler.onlineCount--;
    }

    //    
    public static synchronized void queueingLogic(int minNumber, JSONObject jsonString) throws IOException {
        System.out.println("enter the method!");
        for (WebSocketSession tmp : arrangeUsers) {
            String group = userGroupMap.get(tmp);
            int number = 0;
            if (!groupExisted.contains(group)) {
                for (ConcurrentHashMap.Entry<WebSocketSession, String> entry : userGroupMap.entrySet()) {
                    if (entry.getValue().equals(group)) {
                        number++;
                    }
                }
                if (number >= minNumber) {
                    for (ConcurrentHashMap.Entry<WebSocketSession, String> entry : userGroupMap.entrySet()) {
                        if (entry.getValue().equals(group)) {
                            System.out.println("ready to send");
                            sendStatausToGroup(jsonString, entry.getKey(), group);
                            userGroupMap.remove(entry.getKey());
                        }
                    }
                    groupExisted.add(group);
                }
            } else {
                if (userGroupMap.remove(tmp) != null) {
                    sendStatausToGroup(jsonString, tmp, group);
                }
            }
        }
    }

    //?
    public static void endPointQueueingLogic(int standardNumber, int minNumber, JSONObject jsonString)
            throws IOException {
        for (WebSocketSession tmp : arrangeUsers) {
            String group = userGroupMap.get(tmp);

            if (groupExisted.contains(group)) {
                if (userGroupMap.remove(tmp) != null) {
                    sendStatausToGroup(jsonString, tmp, group);
                }
            } else {
                //
                if (userGroupMap.size() >= standardNumber) {
                    int number = userGroupMap.size() / standardNumber;
                    int i = 0;
                    for (ConcurrentHashMap.Entry<WebSocketSession, String> entry : userGroupMap.entrySet()) {
                        i++;
                        if (i <= number * standardNumber)
                            ;
                        {
                            int record = ((i - 1) / standardNumber) + 1;
                            sendStatausToGroup(jsonString, entry.getKey(), "new" + record);
                            userGroupMap.remove(entry.getKey());
                            newGroupNum = record;
                        }
                    }
                }
                //??
                else if (userGroupMap.size() >= minNumber) {
                    int number = userGroupMap.size() / minNumber;
                    int i = 0;
                    for (ConcurrentHashMap.Entry<WebSocketSession, String> entry : userGroupMap.entrySet()) {
                        i++;
                        if (i <= number * minNumber)
                            ;
                        {
                            int record = newGroupNum + ((i - 1) / standardNumber) + 1;
                            sendStatausToGroup(jsonString, entry.getKey(), "new" + record);
                            userGroupMap.remove(entry.getKey());
                        }
                    }
                }
            }
        }
    }

    //????
    public static synchronized void sendStatausToGroup(JSONObject jsonString, WebSocketSession webSS,
            String finalGroup) throws IOException {
        System.out.println("send");
        jsonString.put("ready", "true");
        System.out.println(jsonString.getString("ready"));
        jsonString.put("finalGroup", finalGroup);
        System.out.println(jsonString.getString("finalGroup"));
        System.out.println("before jump:");
        jsonString.put("userName", arrangeUserName.get(webSS));
        String mess = jsonString.toString();
        webSS.sendMessage(new TextMessage(mess));
    }

    public void job1() {
        System.out.println("loading");
    }

    public void sendToGroup(WebSocketSession wss, JSONObject jsonString) {

        String groupid = userMap.get(wss);
        String mess = jsonString.toString();
        System.out.println(groupid);

        for (WebSocketSession user : expUsers) {
            try {
                if (user.isOpen() && (userMap.get(user).equals(groupid))) {
                    user.sendMessage(new TextMessage(mess));
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

    //?
    public void FacilityInitial(String equipmentNumber, WebSocketSession wss, JSONObject jsonString) {
        String cabinet_NUM = MapEquipment.get(userMap.get(wss)); //?
        String facility_NUM = (Integer.parseInt(equipmentNumber) + 1) + "";
        System.out.println("cabinet_NUM:" + cabinet_NUM);
        System.out.println("facility_NUM:" + facility_NUM);
        FacilityConfigure facilityConfigure = new FacilityConfigure(cabinet_NUM, facility_NUM);
        if (facilityConfigure.connect()) {
            FacilityOutPut facilityOutPutThread = new FacilityOutPut(facilityConfigure.getInputStream(), wss,
                    jsonString, expUsers, userMap);
            facilityOutPutThread.start();
            groupFacilityConfigureMap.put(userMap.get(wss) + equipmentNumber, facilityConfigure);
            groupFacilityOutPut.put(userMap.get(wss) + equipmentNumber, facilityOutPutThread);

        } else {
            System.out.println("false!");
            System.out.println(facilityConfigure.getReturnDetail());
        }
    }

    //
    public void FacilityCancel(String equipmentNumber, WebSocketSession wss, JSONObject jsonString) {
        FacilityConfigure facilityConfigure = groupFacilityConfigureMap.get(userMap.get(wss) + equipmentNumber);
        FacilityOutPut facilityOutPutThread = groupFacilityOutPut.get(userMap.get(wss) + equipmentNumber);
        facilityOutPutThread.stopThread();
        System.out.println("??");
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        facilityConfigure.end();
        groupFacilityConfigureMap.remove(userMap.get(wss) + equipmentNumber);
        groupFacilityOutPut.remove(userMap.get(wss) + equipmentNumber);
    }

    //PC
    public void pcInitial(String equipmentNumber, WebSocketSession wss, JSONObject jsonString) {
        String cabinet_NUM = MapEquipment.get(userMap.get(wss)); //?
        String facility_NUM = (Integer.parseInt(equipmentNumber) + 1) + "";
        PCExecute pcExecute = new PCExecute(cabinet_NUM, facility_NUM);
        if (pcExecute.connect()) {
            FacilityOutPut facilityOutPutThread = new FacilityOutPut(pcExecute.getInputStream(), wss, jsonString,
                    expUsers, userMap);
            facilityOutPutThread.start();
            groupPcConfigureMap.put(userMap.get(wss) + equipmentNumber, pcExecute);
            groupFacilityOutPut.put(userMap.get(wss) + equipmentNumber, facilityOutPutThread);

        } else {
            System.out.println("false!");
            System.out.println(pcExecute.getReturnDetail());
        }
    }

    public void pcCancel(String equipmentNumber, WebSocketSession wss, JSONObject jsonString) {
        PCExecute pcExecute = groupPcConfigureMap.get(userMap.get(wss) + equipmentNumber);
        FacilityOutPut facilityOutPutThread = groupFacilityOutPut.get(userMap.get(wss) + equipmentNumber);
        facilityOutPutThread.stopThread();
        System.out.println("??");
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        pcExecute.end();
        groupFacilityConfigureMap.remove(userMap.get(wss) + equipmentNumber);
        groupPcConfigureMap.remove(userMap.get(wss) + equipmentNumber);
    }

    //
    public void FacilityCommandConfigure(String equipmentNumber, String commandDetail, WebSocketSession wss) {
        FacilityConfigure facilityConfigure = groupFacilityConfigureMap.get(userMap.get(wss) + equipmentNumber);
        if (commandDetail.equals("end")) {
        }
        if (commandDetail.equals("")) {
            commandDetail = "NEWLINE";
        }
        facilityConfigure.configure(commandDetail);
    }

    //PC
    public void pcCommandConfigure(String equipmentNumber, String commandDetail, WebSocketSession wss) {
        PCExecute pcExecute = groupPcConfigureMap.get(userMap.get(wss) + equipmentNumber);
        if (commandDetail.equals("end")) {
        }
        if (commandDetail.equals("")) {
            commandDetail = "NEWLINE";
        }
        pcExecute.execute(commandDetail);
    }

    //?
    public void releaseEquipment(WebSocketSession wss, JSONObject jsonString) {
        long start = System.currentTimeMillis();
        String cabinet_NUM = MapEquipment.get(userMap.get(wss)); //?
        ResourceRelease resourceRelease = new ResourceRelease(cabinet_NUM);
        if (resourceRelease.release()) {
            System.out.println("??");
            jsonString.put("success", true);
        } else {
            System.out.println("false!");
            System.out.println(resourceRelease.getReturnDetail());
            jsonString.put("success", false);
        }
        long end = System.currentTimeMillis();
        System.out.println("?" + (end - start) + "ms");
        String mess = jsonString.toString();
        try {
            wss.sendMessage(new TextMessage(mess));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}