/*******************************************************************************
* 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.api.jsonrpc;
import com.google.gwt.user.client.Timer;
import com.google.inject.Inject;
import org.eclipse.che.ide.api.app.AppContext;
import org.eclipse.che.ide.jsonrpc.JsonRpcInitializer;
import org.eclipse.che.ide.util.loging.Log;
import javax.inject.Singleton;
import static com.google.gwt.user.client.Window.Location.getHost;
import static com.google.gwt.user.client.Window.Location.getProtocol;
import static java.util.Collections.singletonMap;
/**
* Initializes json rpc connection to workspace master
*/
@Singleton
public class WorkspaceMasterJsonRpcInitializer {
private final JsonRpcInitializer initializer;
private final AppContext appContext;
@Inject
public WorkspaceMasterJsonRpcInitializer(JsonRpcInitializer initializer, AppContext appContext) {
this.initializer = initializer;
this.appContext = appContext;
internalInitialize();
}
private static native String getWebsocketContext() /*-{
if ($wnd.IDE && $wnd.IDE.config) {
return $wnd.IDE.config.websocketContext;
} else {
return null;
}
}-*/;
public void initialize() {
Log.debug(WorkspaceMasterJsonRpcInitializer.class, "Initializing JSON RPC websocket connection to workspace master");
try {
internalInitialize();
} catch (Exception e) {
Log.debug(WorkspaceMasterJsonRpcInitializer.class, "Failed, will try one more time.");
new Timer() {
@Override
public void run() {
internalInitialize();
}
}.schedule(1_000);
}
}
private void internalInitialize() {
String protocol = "https:".equals(getProtocol()) ? "wss://" : "ws://";
String host = getHost();
String context = getWebsocketContext() + "/";
String workspaceMasterUrl = protocol + host + context + appContext.getAppId();
initializer.initialize("ws-master", singletonMap("url", workspaceMasterUrl));
}
public void terminate() {
initializer.terminate("ws-master");
}
}