/******************************************************************************* * Copyright (c) 2012-2017 Codenvy, S.A. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Codenvy, S.A. - initial API and implementation *******************************************************************************/ package org.eclipse.che.ide.websocket.impl; import com.google.inject.Inject; import org.eclipse.che.ide.util.loging.Log; import javax.inject.Singleton; import java.util.HashMap; import java.util.Map; /** * Manages all connection related high level processes. Acts as a facade to low level web socket * components. * * @author Dmitry Kuleshov */ @Singleton public class WebSocketConnectionManager { private final WebSocketFactory webSocketFactory; private final Map<String, WebSocketConnection> connectionsRegistry = new HashMap<>(); @Inject public WebSocketConnectionManager(WebSocketFactory webSocketFactory) { this.webSocketFactory = webSocketFactory; } /** * Initialize a connection. Performs all necessary preparations except for properties management. Must be called before * any interactions with a web socket connection. * * @param url * url of a web socket connection that is to be initialized */ public void initializeConnection(String url) { connectionsRegistry.put(url, webSocketFactory.create(url)); } /** * Establishes a web socket connection to an endpoint defined by a URL parameter * * @param url * url of a web socket connection that is to be established */ public void establishConnection(String url) { final WebSocketConnection webSocketConnection = connectionsRegistry.get(url); if (webSocketConnection == null) { final String error = "No connection with url: " + url + "is initialized. Run 'initializedConnection' first."; Log.error(getClass(), error); throw new IllegalStateException(error); } webSocketConnection.open(); Log.debug(getClass(), "Opening connection. Url: " + url); } /** * Close a web socket connection to an endpoint defined by a URL parameter * * @param url * url of a connection to be closed */ public void closeConnection(String url) { final WebSocketConnection webSocketConnection = connectionsRegistry.get(url); if (webSocketConnection == null) { final String warning = "Closing connection that is not registered and seem like does not exist"; Log.warn(getClass(), warning); throw new IllegalStateException(warning); } webSocketConnection.close(); Log.debug(WebSocketConnectionManager.class, "Closing connection."); } /** * Sends a message to a specified endpoint over web socket connection. * * @param url * url of an endpoint the message is adressed to * @param message * plain text message */ public void sendMessage(String url, String message) { final WebSocketConnection webSocketConnection = connectionsRegistry.get(url); if (webSocketConnection == null) { final String error = "No connection with url: " + url + "is initialized. Run 'initializedConnection' first."; Log.error(getClass(), error); throw new IllegalStateException(error); } webSocketConnection.send(message); Log.debug(getClass(), "Sending message: " + message); } /** * Checks if a connection is opened at the moment * * @param url * url of a web socket connection to be checked * * @return connection status: true if opened, false if else */ public boolean isConnectionOpen(String url) { final WebSocketConnection webSocketConnection = connectionsRegistry.get(url); return webSocketConnection != null && webSocketConnection.isOpen(); } }