public Operation(string name, OperationKind kind, string[] signature, int operandsCount, IOperationCalculator calculator, int priority) { if (name == null) { throw new ArgumentNullException("name"); } if (name.Length == 0) { throw new ArgumentException("Empty name.", "name"); } if (signature == null) { throw new ArgumentNullException("signature"); } if (signature.Length == 0) { throw new ArgumentException("Signature is empty.", "signature"); } if (calculator == null) { throw new ArgumentNullException("calculator"); } if ((kind == OperationKind.Operator) && (operandsCount > 1) && (signature.Length != operandsCount - 1)) { throw new ArgumentException("Invalid array length.", "signature"); } if ((kind == OperationKind.Function) && (signature.Length != 1)) { throw new InvalidOperationException("Signature of function must contain one string item."); } // if (kind == OperationKind.Operator) { this.priority = priority; } this.kind = kind; this.name = name; this.calculator = calculator; this.operandsCount = operandsCount; this.signature = signature; }
public Operation(string name, OperationKind kind, string[] signature, int operandsCount, IOperationCalculator calculator) : this(name, kind, signature, operandsCount, calculator, 0) { // }
public Operation(string name, OperationKind kind, string[] signature, int operandsCount, IOperationCalculator calculator, int priority) { if (name == null) throw new ArgumentNullException("name"); if (name.Length == 0) throw new ArgumentException("Empty name.", "name"); if (signature == null) throw new ArgumentNullException("signature"); if (signature.Length == 0) throw new ArgumentException("Signature is empty.", "signature"); if (calculator == null) throw new ArgumentNullException("calculator"); if ((kind == OperationKind.Operator) && (operandsCount > 1) && (signature.Length != operandsCount - 1)) throw new ArgumentException("Invalid array length.", "signature"); if ((kind == OperationKind.Function) && (signature.Length != 1)) throw new InvalidOperationException("Signature of function must contain one string item."); // if (kind == OperationKind.Operator) this.priority = priority; this.kind = kind; this.name = name; this.calculator = calculator; this.operandsCount = operandsCount; this.signature = signature; }
/// <summary> /// Load configuration from embedded resource xml. /// </summary> private void initializeFromConfigurationXml() { const string documentPath = "Operations.xml"; const string schemaPath = "Operations.xsd"; Assembly assembly = Assembly.GetExecutingAssembly(); AssemblyName assemblyName = assembly.GetName(); using (Stream stream = assembly.GetManifestResourceStream(assemblyName.Name + "." + documentPath)) { if (stream == null) { throw new InvalidOperationException(String.Format("Could not load '{0}' configuration resource from assembly.", documentPath)); } XmlDocument document = new XmlDocument(); document.Load(stream); // Validating schema XmlSchema schema; using (Stream streamSchema = assembly.GetManifestResourceStream(assemblyName.Name + "." + schemaPath)) { if (streamSchema == null) { throw new InvalidOperationException("Could not load schema resource from assembly."); } schema = XmlSchema.Read(streamSchema, validationSchema); } document.Schemas.Add(schema); document.Validate(documentValidation); XmlNamespaceManager namespaceManager = new XmlNamespaceManager(document.NameTable); namespaceManager.AddNamespace("main", schema.TargetNamespace); XmlNodeList prioritiesNodeList = document.SelectNodes("main:operations/main:priorities/main:priority", namespaceManager); if (prioritiesNodeList == null) { throw new InvalidOperationException("Could not load priorities from configuration."); } foreach (XmlNode priorityNode in prioritiesNodeList) { int priorityValue = Convert.ToInt32(priorityNode.Attributes["value"].Value); PriorityAssociation priorityAssociation = (priorityNode.Attributes["association"].Value == "left") ? PriorityAssociation.LeftAssociated : PriorityAssociation.RightAssociated; priorityAssociationsDictionary.Add(priorityValue, priorityAssociation); } XmlNodeList operationsNodeList = document.SelectNodes("main:operations/main:operations/main:operation", namespaceManager); if (operationsNodeList == null) { throw new InvalidOperationException("Could not load operations from configuration."); } foreach (XmlNode operationNode in operationsNodeList) { string operationName = operationNode.Attributes["name"].Value; int operationOperandsCount = Convert.ToInt32(operationNode.Attributes["operands"].Value); OperationKind operationKind = (operationNode.Attributes["kind"].Value == "operator") ? OperationKind.Operator : OperationKind.Function; int operationPriority; if (operationKind == OperationKind.Operator) { operationPriority = Convert.ToInt32(operationNode.Attributes["priority"].Value); } else { operationPriority = 0; } List <SerializedSignature> signaturesOrderedList = new List <SerializedSignature>(); XmlNode signaturesNode = operationNode["signatures"]; if (signaturesNode == null) { throw new InvalidOperationException("No signatures found during parsing operation."); } foreach (XmlNode signatureNode in signaturesNode.ChildNodes) { signaturesOrderedList.Add(new SerializedSignature( signatureNode.Attributes["value"].Value, Int32.Parse(signatureNode.Attributes["number"].Value))); } signaturesOrderedList.Sort(new Comparison <SerializedSignature>(SerializedSignature.Compare)); string[] operationSignatures = new string[signaturesOrderedList.Count]; for (int i = 0; i < signaturesOrderedList.Count; i++) { operationSignatures[i] = signaturesOrderedList[i].Signature; } XmlNode calculatorNode = operationNode["calculator"]; if (calculatorNode == null) { throw new InvalidOperationException("No calculator specified."); } string calculatorType = calculatorNode.Attributes["type"].Value; if (String.IsNullOrEmpty(calculatorType)) { throw new InvalidOperationException("Empty calculator type string."); } string[] calculatorTypeParts = calculatorType.Split(','); if (calculatorTypeParts.Length != 2) { throw new InvalidOperationException("Invalid type declarations syntax."); } string calculatorTypeName = calculatorTypeParts[0]; string calculatorAssemblyName = calculatorTypeParts[1]; Assembly calculatorAssembly = Assembly.Load(calculatorAssemblyName); IOperationCalculator operationCalculator = (IOperationCalculator)calculatorAssembly.CreateInstance(calculatorTypeName, false); if (operationKind == OperationKind.Operator) { operationsList.Add(new Operation(operationName, OperationKind.Operator, operationSignatures, operationOperandsCount, operationCalculator, operationPriority)); } else { operationsList.Add(new Operation(operationName, OperationKind.Function, operationSignatures, operationOperandsCount, operationCalculator)); } } } }