package com.neverwinterdp.tool.server; import java.util.HashMap; import java.util.Map; import com.neverwinterdp.util.FileUtil; abstract public class ServerSet<T extends Server> { private String serverType ; private String baseDir ; private int basePort ; private int idTracker = 0; private int numOfServers ; private Map<String, String> serverProperties = new HashMap<>() ; private Map<String, T> servers = new HashMap<>() ; public ServerSet(String serverType, String baseDir, int basePort, int numOfServers, Map<String, String> serverProperties) { this.serverType = serverType; this.baseDir = baseDir; this.basePort = basePort ; this.numOfServers = numOfServers; } public String getServerType() { return this.serverType ; } public String getBaseDir() { return baseDir; } public int getBasePort() { return basePort; } public String getConnectString() { StringBuilder b = new StringBuilder() ; for (T server : servers.values()) { if(b.length() > 0) b.append(","); b.append(server.getConnectString()); } return b.toString(); } synchronized public T getServer(String name) { return servers.get(name) ; } synchronized public T findServerByPort(int port) { for (T server : servers.values()) { if(server.getPort() == port) return server; } return null ; } synchronized public T addNewServer() { int id = ++idTracker; String serverName = serverType + id ; String serverDir = baseDir + "/" + serverName; T server = newServer(id, serverName, serverDir, basePort + (id - 1), serverProperties) ; servers.put(serverName, server); return server ; } synchronized public T remove(String serverName) { return servers.remove(serverName) ; } synchronized public T shutdownAndRemove(String serverName) { T server = servers.remove(serverName) ; if(server != null) server.shutdown(); return server ; } abstract protected T newServer(int id, String serverName, String serverDir, int serverPort, Map<String, String> props) ; synchronized public void clean() throws Exception { FileUtil.removeIfExist(baseDir, false); } synchronized public void start() throws Exception { for(int i = 0; i < numOfServers; i++) { addNewServer() ; } for (T server : servers.values()) { server.start(); } } synchronized public void shutdown() throws Exception { for (T server : servers.values()) { server.shutdown();; } } }