/* * Created by Andrey Cherkashin (acherkashin) * http://acherkashin.me * * License * Copyright (c) 2015 Andrey Cherkashin * The project released under the MIT license: http://opensource.org/licenses/MIT */ package ragefist; import com.juniform.JUniform; import com.juniform.JUniformObject; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.logging.Level; import java.util.logging.Logger; import javax.naming.directory.InvalidAttributesException; import ragefist.core.distribution.DistributedServer; import ragefist.core.distribution.DistributedServer.DistributedServerBuilder; import ragefist.core.distribution.DistributedServerGroup; import ragefist.core.distribution.DistributedServerGroup.DistributedServerGroupBuilder; import ragefist.core.distribution.SelectionPolicy; /** * * @author acherkashin */ public class Config { // ---------------------------------------------------------------------- // // CONFIG FILES // ---------------------------------------------------------------------- // public static final String CONFIG_FILE_SERVER = "./config/Server.json"; // ---------------------------------------------------------------------- // // CONFIG VARIABLES // ---------------------------------------------------------------------- // public static String LuaEnvironmentConnectorFile; public static String LuaEnvironmentMainFile; public static String ServerGroup; public static int ServerId; public static String RPCPacketFormat; public static String ClientPacketFormat; public static String HTTPClientPacketFormat; public static HashMap<String,DistributedServerGroup> ServerGroups = new HashMap<>(); public static DistributedServerGroup CurrentServerGroup; public static DistributedServer CurrentServer; public static String[] Extensions; public static boolean DisableCrossEnvironmentInteraction; public static boolean IsTestServer; // ---------------------------------------------------------------------- // // LOADING // ---------------------------------------------------------------------- // public static void load() { final JUniformObject serverCfg = _loadConfigByFileName(CONFIG_FILE_SERVER); // LUA LuaEnvironmentConnectorFile = serverCfg.getProperty("LuaEnvironmentConnectorFile").toStringDefault("Connector.lua"); LuaEnvironmentMainFile = serverCfg.getProperty("LuaEnvironmentMainFile").toStringDefault("Loader.lua"); // Server Settings ServerId = serverCfg.getProperty("ServerId").toIntegerDefault(0); ServerGroup = serverCfg.getProperty("ServerGroup").toString(); if (ServerGroup == null) { Logger.getLogger(Config.class.getName()).severe("There is no ServerGroup param in ["+CONFIG_FILE_SERVER+"] file"); return; } // Packet Formats RPCPacketFormat = serverCfg.getProperty("RPCPacketFormat").toStringDefault(JUniform.PACKER_TYPE_JSON); ClientPacketFormat = serverCfg.getProperty("ClientPacketFormat").toStringDefault(JUniform.PACKER_TYPE_JSON); HTTPClientPacketFormat = serverCfg.getProperty("HTTPClientPacketFormat").toStringDefault(JUniform.PACKER_TYPE_JSON); DisableCrossEnvironmentInteraction = serverCfg.getProperty("DisableCrossEnvironmentInteraction").toBooleanDefault(false); IsTestServer = serverCfg.getProperty("IsTestServer").toBooleanDefault(false); // ------------------------------ // // Extensions // ------------------------------ // ArrayList<String> extensions = new ArrayList<>(); Iterator<JUniformObject> extensionsIt = serverCfg.getProperty("Extensions").iterator(); while(extensionsIt.hasNext()) { extensions.add(extensionsIt.next().toString()); } Config.Extensions = new String[extensions.size()]; extensions.toArray(Config.Extensions); // ------------------------------ // // PARSING SERVER GROUPS // ------------------------------ // DistributedServerGroupBuilder serverGroupBuilder = new DistributedServerGroupBuilder(); DistributedServerBuilder serverBuilder = new DistributedServerBuilder(); // Server groups JUniformObject serverGroupsNode = serverCfg.getProperty("ServerGroups"); if (serverGroupsNode.isNull()) { Logger.getLogger(Config.class.getName()).severe("There is no ServerGroups param in ["+CONFIG_FILE_SERVER+"] file"); return; } Iterator<JUniformObject> serverGroupsIt = serverGroupsNode.iterator(); while(serverGroupsIt.hasNext()) { // Reset builder serverGroupBuilder.code = null; serverGroupBuilder.servers = new ArrayList<>(); // Parse JUniformObject serverGroupNode = serverGroupsIt.next(); serverGroupBuilder.code = serverGroupNode.getProperty("Code").toString(); if (serverGroupBuilder.code == null) { Logger.getLogger(Config.class.getName()).severe("GroupName param for ServerGroup item is not specified in ["+CONFIG_FILE_SERVER+"] file"); return; } JUniformObject serverSelectionPolicyNode = serverGroupNode.getProperty("SelectionPolicy"); try { serverGroupBuilder.selectionPolicy = SelectionPolicy.newInstance(serverSelectionPolicyNode); } catch (InvalidAttributesException ex) { Logger.getLogger(Config.class.getName()).log(Level.SEVERE, "Failed to determine what environment selection policy should be used in ServerGroup ["+serverGroupBuilder.code+"]", ex ); return; } JUniformObject serversNode = serverGroupNode.getProperty("Servers"); if (serversNode == null) { Logger.getLogger(Config.class.getName()).severe("GroupName param for ServerGroup item is not specified in ["+CONFIG_FILE_SERVER+"] file"); return; } int serverId = 0; Iterator<JUniformObject> serversIt = serversNode.iterator(); while(serversIt.hasNext()) { JUniformObject serverNode = serversIt.next(); // Server's config int environmentCount = serverNode.getProperty("EnvironmentCount").toIntegerDefault(1); JUniformObject environmentSelectionPolicyNode = serverNode.getProperty("SelectionPolicy"); try { serverBuilder.selectionPolicy = SelectionPolicy.newInstance(environmentSelectionPolicyNode); } catch (InvalidAttributesException ex) { Logger.getLogger(Config.class.getName()).log(Level.SEVERE, "Failed to determine what environment selection policy should be used in ServerGroup ["+serverGroupBuilder.code+"]", ex ); return; } // Builder serverBuilder.id = serverId++; serverBuilder.environmentCount = environmentCount; serverBuilder.rpcHost = serverNode.getProperty("RPCServerHost").toStringDefault("127.0.0.1"); serverBuilder.rpcPort = serverNode.getProperty("RPCServerPort").toIntegerDefault(15600); serverBuilder.rpcPacketFormat = RPCPacketFormat; serverBuilder.consoleHost = serverNode.getProperty("ConsoleServerHost").toStringDefault("127.0.0.1"); serverBuilder.consolePort = serverNode.getProperty("ConsoleServerPort").toIntegerDefault(15600); serverBuilder.clientHost = serverNode.getProperty("ClientServerHost").toStringDefault("127.0.0.1"); serverBuilder.clientPort = serverNode.getProperty("ClientServerPort").toIntegerDefault(16000); serverBuilder.clientPacketFormat = ClientPacketFormat; serverBuilder.httpClientHost = serverNode.getProperty("HTTPClientServerHost").toStringDefault(null); serverBuilder.httpClientPort = serverNode.getProperty("HTTPClientServerPort").toIntegerDefault(0); serverBuilder.httpClientPacketFormat = HTTPClientPacketFormat; serverBuilder.environmentLuaConnectorFile = Config.LuaEnvironmentConnectorFile; serverBuilder.environmentLuaMainFile = Config.LuaEnvironmentMainFile; // Create a server try { serverGroupBuilder.servers.add(serverBuilder.build()); } catch (IllegalArgumentException ex) { Logger.getLogger(Config.class.getName()).log(Level.SEVERE, "Failed to build DistributedServer", ex); return; } } DistributedServerGroup serverGroup; try { // Constructing server group serverGroup = serverGroupBuilder.build(); } catch (InvalidAttributesException ex) { Logger.getLogger(Config.class.getName()).log(Level.SEVERE, "Failed to build DistributedServerGroup", ex); return; } // Save groups ServerGroups.put(serverGroup.getCode(), serverGroup); } // Get current server's data CurrentServerGroup = ServerGroups.get(ServerGroup); if (CurrentServerGroup == null) { Logger.getLogger(Config.class.getName()).log(Level.SEVERE, "Failed to find CurrentServerGroup"); return; } CurrentServer = CurrentServerGroup.getServers().get(ServerId); if (CurrentServer == null) { Logger.getLogger(Config.class.getName()).log(Level.SEVERE, "Failed to find CurrentServer"); return; } } // ---------------------------------------------------------------------- // // PRIVATE // ---------------------------------------------------------------------- // private static JUniformObject _loadConfigByFileName(String fileName) { File file = new File(fileName); try (FileInputStream fileInputStream = new FileInputStream(file)) { return JUniform.getPackerInstance(JUniform.PACKER_TYPE_JSON).toUniformObjectFromStream(fileInputStream); } catch (IOException e) { Logger.getLogger(Config.class.getName()).warning("[" + file.getName() + "] Failed to load JSON config due to the reason: " + e.getMessage()); } return null; } }