Esempio n. 1
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;
 }
Esempio n. 2
0
 public Operation(string name, OperationKind kind, string[] signature, int operandsCount, IOperationCalculator calculator)
     : this(name, kind, signature, operandsCount, calculator, 0)
 {
     //
 }
Esempio n. 3
0
 public Operation(string name, OperationKind kind, string[] signature, int operandsCount, IOperationCalculator calculator)
     : this(name, kind, signature, operandsCount, calculator, 0) {
     //
 }
Esempio n. 4
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));
                    }
                }
            }
        }