/*******************************************************************************
* 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.gwt.user.client.Timer;
import com.google.inject.assistedinject.Assisted;
import org.eclipse.che.ide.util.loging.Log;
import javax.inject.Inject;
/**
* Web socket connection that can be established or reestablished with a delay
*
* @author Dmitry Kuleshov
*/
public class DelayableWebSocketConnection implements WebSocketConnection {
private final WebSocketPropertyManager propertyManager;
private final WebSocketEndpoint endpoint;
private final String url;
private WebSocketJsoWrapper webSocketJsoWrapper;
@Inject
public DelayableWebSocketConnection(WebSocketPropertyManager propertyManager, WebSocketEndpoint endpoint, @Assisted String url) {
this.propertyManager = propertyManager;
this.endpoint = endpoint;
this.url = url;
}
@Override
public void open() {
final int delay = propertyManager.getConnectionDelay(url);
if (isClosed() || isClosing()) {
if (delay == 0) {
webSocketJsoWrapper = WebSocketJsoWrapper.connect(url, endpoint);
} else {
new Timer() {
@Override
public void run() {
webSocketJsoWrapper = WebSocketJsoWrapper.connect(url, endpoint);
}
}.schedule(delay);
}
} else {
Log.warn(getClass(), "Opening already opened or connecting web socket.");
}
}
@Override
public void close() {
if (isOpen()) {
webSocketJsoWrapper.close();
} else {
Log.warn(getClass(), "Closing connection that is not opened.");
}
}
@Override
public void send(final String message) {
if (isOpen()) {
webSocketJsoWrapper.send(message);
} else {
Log.error(getClass(), "Sending message to not opened connection.");
}
}
@Override
public boolean isClosed() {
return webSocketJsoWrapper == null || webSocketJsoWrapper.isClosed();
}
@Override
public boolean isClosing() {
return webSocketJsoWrapper == null || webSocketJsoWrapper.isClosing();
}
@Override
public boolean isOpen() {
return webSocketJsoWrapper != null && webSocketJsoWrapper.isOpen();
}
@Override
public boolean isConnecting() {
return webSocketJsoWrapper != null && webSocketJsoWrapper.isConnecting();
}
}