package com.etcfg.etlaunch;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ETServer implements Comparable<ETServer> {
private String serverName;
private String ip;
private int port;
private String password;
private Map<String, String> additionalParametes = new HashMap<>();
private transient ServerStatus serverStatus;
private transient ServerStatus lastServertatus;
private transient PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(
this);
public transient static Pattern SERVER_PATTERN = Pattern
.compile("(/?connect)[\\s]+(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})?(\\b[\\w]+\\.[\\w]+(\\.[\\w]+)*)?(:\\d+)?(;\\s*password[\\s]+(.+))?");
public static ETServer parseServerFromString(String source) {
if (source == null || source.isEmpty()) {
return null;
}
source = source.trim();
if (source.startsWith("/connect ") || source.startsWith("connect ")) {
return parseAsCommand(source);
} else {
return parseAsPlain(source);
}
}
private static ETServer parseAsCommand(String source) {
// \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}
Matcher matcher = SERVER_PATTERN.matcher(source);
if (matcher.find()) {
StringBuilder adress = new StringBuilder();
if (matcher.group(2) != null) {
adress.append(matcher.group(2));
} else if (matcher.group(3) != null) {
adress.append(matcher.group(3));
}
if (matcher.group(5) != null) {
adress.append(matcher.group(5));
}
try {
ETServer etServer = parseAdress(adress.toString());
if (matcher.group(7) != null) {
etServer.setPassword(matcher.group(7));
}
return etServer;
} catch (Exception e) {
return null;
}
}
return null;
}
private static ETServer parseAdress(String adress)
throws URISyntaxException {
URI uri = new URI("http://" + adress);
ETServer etServer = new ETServer();
etServer.setIp(uri.getHost());
if (uri.getPort() > -1) {
etServer.setPort(uri.getPort());
} else {
etServer.setPort(27960);
}
return etServer;
}
private static ETServer parseAsPlain(String source) {
source = source.trim();
int indexOf = source.indexOf(" ");
if (indexOf < 0) {
indexOf = source.length();
}
try {
ETServer etServer = parseAdress(source.substring(0, indexOf));
if (indexOf != source.length()) {
etServer.setPassword(source.substring(indexOf + 1, source
.length()));
}
return etServer;
} catch (Exception e) {
}
return null;
}
public String getServerName() {
return serverName;
}
public void setServerName(String serverName) {
this.serverName = serverName;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public int getPort() {
return port;
}
public void setPort(int port) {
this.port = port;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public synchronized ServerStatus getServerStatus() {
return serverStatus;
}
public synchronized void setServerStatus(ServerStatus serverStatus) {
if (serverStatus == null || serverStatus.getPing() == 999) {
if (this.serverStatus != null && this.serverStatus.getPing() < 999) {
lastServertatus = this.serverStatus;
}
}
this.serverStatus = serverStatus;
if (serverStatus != null && serverStatus.getName() != null) {
setServerName(serverStatus.getName());
}
firePropertyChange("serverStatus", null, serverStatus);
}
public Map<String, String> getAdditionalParametes() {
return additionalParametes;
}
public void setAdditionalParametes(Map<String, String> additionalParametes) {
this.additionalParametes = additionalParametes;
}
public int compareTo(ETServer o) {
return o.compareTo(this);
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((ip == null) ? 0 : ip.hashCode());
result = prime * result + port;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
ETServer other = (ETServer) obj;
if (ip == null) {
if (other.ip != null) {
return false;
}
} else if (!ip.equals(other.ip)) {
return false;
}
if (port != other.port) {
return false;
}
return true;
}
@Override
public String toString() {
return "ETServer [ip=" + ip + ", password=" + password + ", port="
+ port + ", serverName=" + serverName + ", serverStatus="
+ serverStatus + "]";
}
public void addPropertyChangeListener(PropertyChangeListener listener) {
propertyChangeSupport.addPropertyChangeListener(listener);
}
public void addPropertyChangeListener(String propertyName,
PropertyChangeListener listener) {
propertyChangeSupport.addPropertyChangeListener(propertyName, listener);
}
public void fireIndexedPropertyChange(String propertyName, int index,
boolean oldValue, boolean newValue) {
propertyChangeSupport.fireIndexedPropertyChange(propertyName, index,
oldValue, newValue);
}
public void fireIndexedPropertyChange(String propertyName, int index,
int oldValue, int newValue) {
propertyChangeSupport.fireIndexedPropertyChange(propertyName, index,
oldValue, newValue);
}
public void fireIndexedPropertyChange(String propertyName, int index,
Object oldValue, Object newValue) {
propertyChangeSupport.fireIndexedPropertyChange(propertyName, index,
oldValue, newValue);
}
public void firePropertyChange(PropertyChangeEvent evt) {
propertyChangeSupport.firePropertyChange(evt);
}
public void firePropertyChange(String propertyName, boolean oldValue,
boolean newValue) {
propertyChangeSupport.firePropertyChange(propertyName, oldValue,
newValue);
}
public void firePropertyChange(String propertyName, int oldValue,
int newValue) {
propertyChangeSupport.firePropertyChange(propertyName, oldValue,
newValue);
}
public void firePropertyChange(String propertyName, Object oldValue,
Object newValue) {
propertyChangeSupport.firePropertyChange(propertyName, oldValue,
newValue);
}
public PropertyChangeListener[] getPropertyChangeListeners() {
return propertyChangeSupport.getPropertyChangeListeners();
}
public PropertyChangeListener[] getPropertyChangeListeners(
String propertyName) {
return propertyChangeSupport.getPropertyChangeListeners(propertyName);
}
public boolean hasListeners(String propertyName) {
return propertyChangeSupport.hasListeners(propertyName);
}
public void removePropertyChangeListener(PropertyChangeListener listener) {
propertyChangeSupport.removePropertyChangeListener(listener);
}
public void removePropertyChangeListener(String propertyName,
PropertyChangeListener listener) {
propertyChangeSupport.removePropertyChangeListener(propertyName,
listener);
}
public ServerStatus getLastServerStatus() {
return lastServertatus;
}
}