blob: 79bffd3b2178b1a9eb644414e92b27b61c5bc4cc [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.tuscany.sca.endpoint.hazelcast;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Properties;
/**
* Utility to parse the config properties.
*
* bind - ip[:port] - defines the local bind address and port, it defaults to the network interface with the widest
* class (ie class A is wider than class B) on port 14820 and if that port in use it will try
* incrementing by one till a free port is found.
*
* multicast - groupip:port | off - defines if multicast discovery is used and if so what multicast ip group and port is used
* defaults to 224.5.12.10:51482. A value of off means multicast is disabled.
*
* wka - ip[:port] - a comma separated list of ip address and port for remote nodes in the domain group. The port defaults to 14820.
*
* userid - is the userid other nodes must use to connect to this domain group. The default is the default domain name.
*
* password - is the password other nodes must use to connect to this domain group. The default is 'tuscany'.
*
* client - true means this is an SCAClient call
*
*/
public class RegistryConfig {
private String bindAddress = "*";
private int bindPort = 14820;
private boolean multicastDisabled = false;
private String multicastAddress = "224.5.12.10";
private int multicastPort = 51482;
private List<String> wkas = new ArrayList<String>();
private String userid;
private String password;
boolean client;
public RegistryConfig(Properties properties) {
init(properties);
}
private void init(Properties properties) {
String bindValue = properties.getProperty("bind");
if (bindValue == null) {
InetAddress addr = chooseLocalAddress();
if (addr != null) {
this.bindAddress = addr.getHostAddress();
}
} else {
if (bindValue.indexOf(":") == -1) {
this.bindAddress = bindValue;
} else {
String[] addr = bindValue.split(":");
this.bindAddress = addr[0];
this.bindPort = Integer.parseInt(addr[1]);
}
}
String multicastValue = properties.getProperty("multicast");
if (multicastValue != null) {
if ("off".equalsIgnoreCase(multicastValue)) {
this.multicastDisabled = true;
} else {
if (multicastValue.indexOf(":") == -1) {
this.multicastAddress = multicastValue;
} else {
String[] addr = multicastValue.split(":");
this.multicastAddress = addr[0];
this.multicastPort = Integer.parseInt(addr[1]);
}
}
}
String wkaValue = properties.getProperty("wka");
if (wkaValue != null) {
String[] ips = wkaValue.split(",");
for (String ip : ips) {
if (ip.indexOf(":") == -1) {
wkas.add(ip + ":14820");
} else {
wkas.add(ip);
}
}
}
this.client = Boolean.parseBoolean(properties.getProperty("client", "false"));
this.password = properties.getProperty("password", "tuscany");
this.userid = properties.getProperty("userid", properties.getProperty("defaultDomainName", "default"));
}
public String getBindAddress() {
return bindAddress;
}
public int getBindPort() {
return bindPort;
}
public boolean isMulticastDisabled() {
return multicastDisabled;
}
public String getMulticastAddress() {
return multicastAddress;
}
public int getMulticastPort() {
return multicastPort;
}
public List<String> getWKAs() {
return wkas;
}
public String getUserid() {
return userid;
}
public String getPassword() {
return password;
}
/**
* Use the NIC address with the widest class, ie class A instead of class B or C.
* Bit crude but in a lot of environments a class A address (eg 10.x.x.x) is likely
* a better choice than a class C address (eg 192.x.x.x). And the alternative to
* this is to just choose the first address of the first network interface which
* likely isn't a better choice than this approach.
*/
protected InetAddress chooseLocalAddress() {
InetAddress chosen = null;
try {
Enumeration<NetworkInterface> nis = NetworkInterface.getNetworkInterfaces();
while (nis.hasMoreElements()) {
NetworkInterface ni = nis.nextElement();
Enumeration<InetAddress> ips = ni.getInetAddresses();
while (ips.hasMoreElements()) {
InetAddress addr = ips.nextElement();
if (!addr.isLoopbackAddress()) {
if (chosen == null) {
chosen = addr;
} else {
if (((int) addr.getAddress()[0] & 0xFF) < ((int) chosen.getAddress()[0] & 0xFF)) {
chosen = addr;
}
}
}
}
}
} catch (Exception e) {
// ignore
}
return chosen;
}
}