/**
* Copyright (c) 2010-2016 by the respective copyright holders.
*
* 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
*/
package org.openhab.binding.lcn.connection;
import java.util.Dictionary;
import org.openhab.binding.lcn.common.LcnDefs;
/**
* Settings for a connection to LCN-PCHK.
*
* @author Tobias Jüttner
*/
public class ConnectionSettings {
/** Unique identifier for this connection. */
private final String id;
/** The user name for authentication. */
private final String username;
/** The password for authentication. */
private final String password;
/** The TCP/IP address or IP of the connection. */
private final String address;
/** The TCP/IP port of the connection. */
private final int port;
/** The dimming mode to use. */
private final LcnDefs.OutputPortDimMode dimMode;
/** The status-messages mode to use. */
private final LcnDefs.OutputPortStatusMode statusMode;
/** The default timeout to use for requests. Worst case: Requesting threshold 4-4 takes at least 1.8s */
private static final long DEFAULT_TIMEOUT_MSEC = 3500;
/** Timeout for requests. */
private final long timeoutMSec;
/**
* Constructor.
*
* @param id the connnection's unique identifier
* @param address the connection's TCP/IP address or IP
* @param port the connection's TCP/IP port
* @param username the user name for authentication
* @param password the password for authentication
* @param dimMode the dimming mode
* @param statusMode the status-messages mode
* @param timeout the request timeout
*/
private ConnectionSettings(String id, String address, int port, String username, String password,
LcnDefs.OutputPortDimMode dimMode, LcnDefs.OutputPortStatusMode statusMode, int timeout) {
this.id = id;
this.address = address;
this.port = port;
this.username = username;
this.password = password;
this.dimMode = dimMode;
this.statusMode = statusMode;
this.timeoutMSec = timeout;
}
/**
* Gets the unique identifier for the connection.
*
* @return the unique identifier
*/
public String getId() {
return this.id;
}
/**
* Gets the user name used for authentication.
*
* @return the user name
*/
public String getUsername() {
return this.username;
}
/**
* Gets the password used for authentication.
*
* @return the password
*/
public String getPassword() {
return this.password;
}
/**
* Gets the TCP/IP address or IP of the connection.
*
* @return the address or IP
*/
public String getAddress() {
return this.address;
}
/**
* Gets the TCP/IP port of the connection.
*
* @return the port
*/
public int getPort() {
return this.port;
}
/**
* Gets the dimming mode to use for the connection.
*
* @return the dimming mode
*/
public LcnDefs.OutputPortDimMode getDimMode() {
return this.dimMode;
}
/**
* Gets the status-messages mode to use for the connection.
*
* @return the status-messages mode
*/
public LcnDefs.OutputPortStatusMode getStatusMode() {
return this.statusMode;
}
/**
* Gets the request timeout.
*
* @return the timeout in milliseconds
*/
public long getTimeout() {
return this.timeoutMSec;
}
/**
* Tries to parse LCN-PCHK connection settings from the given openHAB configuration.
*
* @param config the binding's configuration
* @param counter 0..x (1..x+1 in actual configuration file)
* @return the connection settings on success or null
*/
public static ConnectionSettings tryParse(Dictionary<String, ?> config, int counter) {
if (config == null) {
return null;
}
String id = (String) config.get("id" + (counter + 1));
id = id == null ? "" : id.trim();
String addressWithOptPort = (String) config.get("address" + (counter + 1));
addressWithOptPort = addressWithOptPort == null ? "" : addressWithOptPort.trim();
String username = (String) config.get("username" + (counter + 1));
username = username == null ? "" : username.trim();
String password = (String) config.get("password" + (counter + 1));
password = password == null ? "" : password.trim();
String mode = (String) config.get("mode" + (counter + 1));
mode = mode == null ? "" : mode.trim();
if (id.isEmpty() || addressWithOptPort.isEmpty() || username.isEmpty() || password.isEmpty()
|| mode.isEmpty()) {
return null;
}
String dataRequestTimeout = (String) config.get("timeout" + (counter + 1));
dataRequestTimeout = dataRequestTimeout == null ? Long.valueOf(DEFAULT_TIMEOUT_MSEC).toString()
: dataRequestTimeout.trim();
try {
String address = addressWithOptPort.contains(":") ? addressWithOptPort.split(":")[0] : addressWithOptPort;
int port = addressWithOptPort.contains(":") ? Integer.parseInt(addressWithOptPort.split(":")[1]) : 4114;
LcnDefs.OutputPortDimMode dimMode = mode.equalsIgnoreCase("percent200")
|| mode.equalsIgnoreCase("native200") ? LcnDefs.OutputPortDimMode.STEPS200
: LcnDefs.OutputPortDimMode.STEPS50;
LcnDefs.OutputPortStatusMode statusMode = mode.equalsIgnoreCase("percent50")
|| mode.equalsIgnoreCase("percent200") ? LcnDefs.OutputPortStatusMode.PERCENT
: LcnDefs.OutputPortStatusMode.NATIVE;
int timeout = Integer.parseInt(dataRequestTimeout);
return new ConnectionSettings(id, address, port, username, password, dimMode, statusMode, timeout);
} catch (NumberFormatException ex) {
}
return null;
}
/** {@inheritDoc} */
@Override
public boolean equals(Object o) {
if (!(o instanceof ConnectionSettings)) {
return false;
}
ConnectionSettings other = (ConnectionSettings) o;
return this.id.equals(other.id) && this.address.equals(other.address) && this.port == other.port
&& this.username.equals(other.username) && this.password.equals(other.password)
&& this.dimMode == other.dimMode && this.statusMode == other.statusMode
&& this.timeoutMSec == other.timeoutMSec;
}
}