org.opencron.server.websocket.TerminalHandler.java Source code

Java tutorial

Introduction

Here is the source code for org.opencron.server.websocket.TerminalHandler.java

Source

/**
 * Copyright 2016 benjobs
 * <p>
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements. See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership. The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License. You may obtain a copy of the License at
 * <p>
 * http://www.apache.org/licenses/LICENSE-2.0
 * <p>
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied. See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

package org.opencron.server.websocket;

import java.io.IOException;

import org.opencron.server.domain.Terminal;
import org.opencron.server.job.OpencronTools;
import static org.opencron.server.service.TerminalService.*;

import org.opencron.server.service.TerminalService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;

public class TerminalHandler extends TextWebSocketHandler {

    private TerminalClient terminalClient;

    @Autowired
    private TerminalService terminalService;

    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        super.afterConnectionEstablished(session);
        String sshSessionId = OpencronTools.getSshSessionId();
        if (sshSessionId != null) {
            final Terminal terminal = TerminalContext.remove(sshSessionId);
            if (terminal != null) {
                try {
                    session.sendMessage(new TextMessage("Welcome to Opencron Terminal! Connect Starting."));
                    getClient(session, terminal);
                    int cols = Integer.parseInt(session.getAttributes().get("cols").toString());
                    int rows = Integer.parseInt(session.getAttributes().get("rows").toString());
                    int width = Integer.parseInt(session.getAttributes().get("width").toString());
                    int height = Integer.parseInt(session.getAttributes().get("height").toString());
                    terminalClient.openTerminal(cols, rows, width, height);
                    terminalService.login(terminal);
                } catch (Exception e) {
                    if (e.getLocalizedMessage().replaceAll("\\s+", "").contentEquals("Operationtimedout")) {
                        session.sendMessage(new TextMessage("Sorry! Connect timed out, please try again. "));
                    } else {
                        session.sendMessage(new TextMessage("Sorry! Operation error, please try again. "));
                    }
                    terminalClient.disconnect();
                    session.close();
                }
            } else {
                this.terminalClient.disconnect();
                session.sendMessage(new TextMessage("Sorry! Connect failed, please try again. "));
                session.close();
            }
        }
    }

    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        super.handleTextMessage(session, message);
        try {
            getClient(session, null);
            if (this.terminalClient != null) {
                if (!terminalClient.isClosed()) {
                    terminalClient.write(message.getPayload());
                } else {
                    session.close();
                }
            }
        } catch (Exception e) {
            session.sendMessage(new TextMessage("Sorry! Opencron Terminal was closed, please try again. "));
            terminalClient.disconnect();
            session.close();
        }
    }

    @Override
    public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
        super.handleTransportError(session, exception);
        this.closeTerminal(session);
        session.close();
    }

    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
        super.afterConnectionClosed(session, status);
        this.closeTerminal(session);
    }

    private TerminalClient getClient(WebSocketSession session, Terminal terminal) {
        this.terminalClient = TerminalSession.get(session);
        if (this.terminalClient == null && terminal != null) {
            this.terminalClient = new TerminalClient(session, terminal);
            TerminalSession.put(session, this.terminalClient);
        }
        return this.terminalClient;
    }

    private void closeTerminal(WebSocketSession session) throws IOException {
        terminalClient = TerminalSession.remove(session);
        if (terminalClient != null) {
            terminalClient.disconnect();
        }
    }

}