/*******************************************************************************
* 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 org.eclipse.che.ide.util.loging.Log;
import javax.inject.Singleton;
import java.util.HashMap;
import java.util.Map;
import static java.lang.Boolean.FALSE;
import static java.lang.Boolean.TRUE;
import static org.eclipse.che.ide.websocket.impl.WebSocketPropertyManager.Properties.ATTEMPTS;
import static org.eclipse.che.ide.websocket.impl.WebSocketPropertyManager.Properties.DELAY;
import static org.eclipse.che.ide.websocket.impl.WebSocketPropertyManager.Properties.SUSTAINER_ENABLED;
import static org.eclipse.che.ide.websocket.impl.WebSocketPropertyManager.Properties.URL;
/**
* Singleton implementation of properties manager to keep all web socket
* connections properties in a one handy place. Basically is a wrapper with
* some additional functionality around a map. Each entry is represented by a
* key - web socket connection url and a value - a map of properties related
* to a connection.
*
* @author Dmitry Kuleshov
*/
@Singleton
public class WebSocketPropertyManager {
/**
* Map to store properties.
* Key - web socket url identifying a connection
* Value - map of connection properties
*/
private final Map<String, Map<String, String>> properties = new HashMap<>();
/**
* Initialized default properties for a connection. The implementation of
* web socket infrastructure is implemented in such way that this method
* must be necessarily called before any interactions with a connection.
* Default values are:
* <ul>
* <li>URL - url of this connection</li>
* <li>Reconnection delay: 0</li>
* <li>Reconnection attempts: 0</li>
* <li>Sustainer status: enabled</li>
* </ul>
*
* @param url
* identifier of a web socket connection
*/
public void initializeConnection(String url) {
final HashMap<String, String> properties = new HashMap<>();
properties.put(URL, url);
properties.put(DELAY, "0");
properties.put(ATTEMPTS, "0");
properties.put(SUSTAINER_ENABLED, TRUE.toString());
this.properties.put(url, properties);
}
/**
* Sets a string value of a property
*
* @param url
* identifier that corresponds to a connection
* @param key
* key
* @param value
* value
*/
public void setProperty(String url, String key, String value) {
getPropertiesMap(url).put(key, value);
}
/**
* Gets a value of a property
*
* @param url
* identifier that corresponds to a connection
* @param key
* key
*
* @return value of a propery
*/
public String getProperty(String url, String key) {
return getPropertiesMap(url).get(key);
}
public String getUrl(String url) {
return getProperty(url, URL);
}
public void setReConnectionAttempts(String url, int attempts) {
setProperty(url, ATTEMPTS, Integer.toString(attempts));
}
public int getReConnectionAttempts(String url) {
return Integer.valueOf(getProperty(url, ATTEMPTS));
}
public void setConnectionDelay(String url, int delay) {
setProperty(url, DELAY, Integer.toString(delay));
}
public int getConnectionDelay(String url) {
return Integer.valueOf(getProperty(url, DELAY));
}
public void enableSustainer(String url) {
setProperty(url, SUSTAINER_ENABLED, TRUE.toString());
}
public void disableSustainer(String url) {
setProperty(url, SUSTAINER_ENABLED, FALSE.toString());
}
public boolean sustainerEnabled(String url) {
return Boolean.valueOf(getProperty(url, SUSTAINER_ENABLED));
}
private Map<String, String> getPropertiesMap(String url) {
if (properties.containsKey(url)) {
return properties.get(url);
}
final String error = "Connection is not properly initialized, no properties set. Call 'initializedConnection' first";
Log.error(getClass(), error);
throw new IllegalStateException(error);
}
interface Properties {
/**
* Defines a delay in milliseconds for connection/reconnection
*/
String DELAY = "delay";
/**
* Defines current number of reconnection attempts
*/
String ATTEMPTS = "attempts";
/**
* Url of the connection
*/
String URL = "url";
/**
* Current connection sustainer status
*/
String SUSTAINER_ENABLED = "sustainer-status";
}
}