/// <summary> /// Generates a new ParameterFactory from the given ConfigNode. /// </summary> /// <param name="parameterConfig">ConfigNode to use in the generation.</param> /// <param name="contractType">ContractType that this parameter factory falls under</param> /// <param name="paramFactory">The ParameterFactory object.</param> /// <param name="parent">ParameterFactory to use as the parent</param> /// <returns>Whether the load was successful</returns> public static bool GenerateParameterFactory(ConfigNode parameterConfig, ContractType contractType, out ParameterFactory paramFactory, ParameterFactory parent = null) { // Logging on LoggingUtil.CaptureLog = true; bool valid = true; // Get the type string type = parameterConfig.GetValue("type"); string name = parameterConfig.HasValue("name") ? parameterConfig.GetValue("name") : type; if (string.IsNullOrEmpty(type)) { LoggingUtil.LogError(typeof(ParameterFactory), "CONTRACT_TYPE '" + contractType.name + "'," + "PARAMETER '" + parameterConfig.GetValue("name") + "' does not specify the mandatory 'type' attribute."); paramFactory = new InvalidParameterFactory(); valid = false; } else if (!factories.ContainsKey(type)) { LoggingUtil.LogError(typeof(ParameterFactory), "CONTRACT_TYPE '" + contractType.name + "'," + "PARAMETER '" + parameterConfig.GetValue("name") + "' of type '" + parameterConfig.GetValue("type") + "': " + "Unknown parameter '" + type + "'."); paramFactory = new InvalidParameterFactory(); valid = false; } else { // Create an instance of the factory paramFactory = (ParameterFactory)Activator.CreateInstance(factories[type]); } // Set attributes paramFactory.parent = parent; paramFactory.contractType = contractType; paramFactory.dataNode = new DataNode(name, parent != null ? parent.dataNode : contractType.dataNode, paramFactory); // Load child requirements foreach (ConfigNode childNode in ConfigNodeUtil.GetChildNodes(parameterConfig, "REQUIREMENT")) { ContractRequirement req = null; valid &= ContractRequirement.GenerateRequirement(childNode, contractType, out req, paramFactory); if (req != null) { paramFactory.requirements.Add(req); if (req.hasWarnings) { paramFactory.hasWarnings = true; } } } // Load config if (!paramFactory.Load(parameterConfig)) { // If there was a load failure, check if there are requirements if (paramFactory.requirements.Count > 0) { LoggingUtil.LogWarning(paramFactory, "Ignoring failed parameter with child requirements."); } else { valid = false; } } // Late initialize for iterator keys valid &= DataNode.InitializeIteratorKey(parameterConfig, paramFactory); // Check for unexpected values - always do this last if (paramFactory.GetType() != typeof(InvalidParameterFactory)) { valid &= ConfigNodeUtil.ValidateUnexpectedValues(parameterConfig, paramFactory); } paramFactory.log = LoggingUtil.capturedLog; LoggingUtil.CaptureLog = false; // Load child nodes foreach (ConfigNode childNode in ConfigNodeUtil.GetChildNodes(parameterConfig, "PARAMETER")) { ParameterFactory child = null; valid &= ParameterFactory.GenerateParameterFactory(childNode, contractType, out child, paramFactory); if (child != null) { paramFactory.childNodes.Add(child); if (child.hasWarnings) { paramFactory.hasWarnings = true; } } } paramFactory.enabled = valid; return(valid); }
/// <summary> /// Generates a new ParameterFactory from the given ConfigNode. /// </summary> /// <param name="parameterConfig">ConfigNode to use in the generation.</param> /// <param name="contractType">ContractType that this parameter factory falls under</param> /// <param name="paramFactory">The ParameterFactory object.</param> /// <param name="parent">ParameterFactory to use as the parent</param> /// <returns>Whether the load was successful</returns> public static bool GenerateParameterFactory(ConfigNode parameterConfig, ContractType contractType, out ParameterFactory paramFactory, ParameterFactory parent = null) { // Logging on LoggingUtil.CaptureLog = true; bool valid = true; // Get the type string type = parameterConfig.GetValue("type"); string name = parameterConfig.HasValue("name") ? parameterConfig.GetValue("name") : type; if (string.IsNullOrEmpty(type)) { LoggingUtil.LogError(typeof(ParameterFactory), "CONTRACT_TYPE '" + contractType.name + "'," + "PARAMETER '" + parameterConfig.GetValue("name") + "' does not specify the mandatory 'type' attribute."); paramFactory = new InvalidParameterFactory(); valid = false; } else if (!factories.ContainsKey(type)) { LoggingUtil.LogError(typeof(ParameterFactory), "CONTRACT_TYPE '" + contractType.name + "'," + "PARAMETER '" + parameterConfig.GetValue("name") + "' of type '" + parameterConfig.GetValue("type") + "': " + "Unknown parameter '" + type + "'."); paramFactory = new InvalidParameterFactory(); valid = false; } else { // Create an instance of the factory paramFactory = (ParameterFactory)Activator.CreateInstance(factories[type]); } // Set attributes paramFactory.parent = parent; paramFactory.contractType = contractType; paramFactory.dataNode = new DataNode(name, parent != null ? parent.dataNode : contractType.dataNode, paramFactory); // Load child requirements foreach (ConfigNode childNode in ConfigNodeUtil.GetChildNodes(parameterConfig, "REQUIREMENT")) { ContractRequirement req = null; valid &= ContractRequirement.GenerateRequirement(childNode, contractType, out req, paramFactory); if (req != null) { paramFactory.requirements.Add(req); if (req.hasWarnings) { paramFactory.hasWarnings = true; } } } // Load config if (!paramFactory.Load(parameterConfig)) { // If there was a load failure, check if there are requirements if (paramFactory.requirements.Count > 0) { LoggingUtil.LogWarning(paramFactory, "Ignoring failed parameter with child requirements."); } else { valid = false; } } // Check for unexpected values - always do this last if (paramFactory.GetType() != typeof(InvalidParameterFactory)) { valid &= ConfigNodeUtil.ValidateUnexpectedValues(parameterConfig, paramFactory); } paramFactory.log = LoggingUtil.capturedLog; LoggingUtil.CaptureLog = false; // Load child nodes foreach (ConfigNode childNode in ConfigNodeUtil.GetChildNodes(parameterConfig, "PARAMETER")) { ParameterFactory child = null; valid &= ParameterFactory.GenerateParameterFactory(childNode, contractType, out child, paramFactory); if (child != null) { paramFactory.childNodes.Add(child); if (child.hasWarnings) { paramFactory.hasWarnings = true; } } } paramFactory.enabled = valid; return valid; }