Exemplo n.º 1
0
        /// <summary>
        /// Creates and configures the shared variables specified in the provided XML document for the specified blackboard
        /// </summary>
        /// <param name="doc">XML document which contains shared variables initialization data</param>
        /// <param name="blackboard">Blackboard object in which the shared variables will be configured</param>
        private static void SetupSharedVariables(XmlDocument doc, Blackboard blackboard)
        {
            if ((doc == null) || (blackboard == null))
                throw new ArgumentNullException();
            if (blackboard.virtualModule == null)
                throw new Exception("Uninitialized blackboard");

            int i, j;
            ILogWriter log;
            XmlDocument tmpDoc;
            XmlNode node;
            XmlNodeList xmlVarList;
            XmlNodeList xmlWriterModuleList;
            SharedVariable shVar;
            List<string> writers;
            string shVarName;
            string shVarType;
            string shVarValue;
            bool shVarIsArray;
            int bracketPos;

            log = blackboard.log;
            tmpDoc = new XmlDocument();

            if (doc.GetElementsByTagName("sharedVariables").Count < 1)
            {
                log.WriteLine(1, "No shared variables was defined in XML file.");
                return;
            }
            tmpDoc.LoadXml(doc.GetElementsByTagName("sharedVariables")[0].OuterXml);

            #region Load of shared variables
            // Load of shared variables
            log.WriteLine(1, "Reading shared variables");
            xmlVarList = tmpDoc.GetElementsByTagName("var");
            for (i = 0; i < xmlVarList.Count; ++i)
            {
                #region Get variable Name
                node = xmlVarList[i];
                if ((node == null) || (node.Name != "var") || (node.Attributes["name"] == null))
                    continue;
                shVarName = node.Attributes["name"].InnerText;
                shVarType = (node.Attributes["type"] != null) ? node.Attributes["type"].InnerText : "var";
                if (String.IsNullOrEmpty(shVarType) || !SharedVariable.RxVarTypeValidator.IsMatch(shVarType))
                    shVarType = "var";
                bracketPos = shVarType.IndexOf("[");
                if (shVarIsArray = (bracketPos != -1))
                    shVarType = shVarType.Remove(bracketPos);
                if (blackboard.VirtualModule.SharedVariables.Contains(shVarName))
                {
                    log.WriteLine(2, "Error loading shared variable " + shVarName + ". Variable already exists.");
                    continue;
                }

                #endregion

                #region Get variable initial value
                shVarValue = "";
                if (node.Attributes["value"] != null)
                {
                    shVarValue = node.Attributes["value"].Value;
                }
                else if (node.Attributes["fromFile"] != null)
                {
                    shVarValue = node.Attributes["fromFile"].Value;
                    if (File.Exists(shVarValue))
                    {
                        try
                        {
                            shVarValue = File.ReadAllText(shVarValue);
                        }
                        catch
                        {
                            log.WriteLine(2, "Error loading variable content from file " + shVarValue + " for the shared variable " + shVarName + ". Variable was set to null");
                            shVarValue = "";
                        }
                    }
                }
                #endregion

                #region Get list of modules with write permission

                writers = new List<string>();
                tmpDoc = new XmlDocument();
                tmpDoc.LoadXml(node.OuterXml);
                xmlWriterModuleList = tmpDoc.GetElementsByTagName("writers");
                if (xmlWriterModuleList.Count == 1)
                {
                    writers.Add(blackboard.VirtualModule.Name);
                    tmpDoc = new XmlDocument();
                    tmpDoc.LoadXml(xmlWriterModuleList[0].OuterXml);
                    xmlWriterModuleList = tmpDoc.GetElementsByTagName("writer");
                    for (j = 0; j < xmlWriterModuleList.Count; ++j)
                    {
                        node = xmlWriterModuleList[j];
                        if (node.InnerText == "*")
                        {
                            writers.Clear();
                            writers.Add("*");
                            break;
                        }
                        if (!blackboard.modules.Contains(node.InnerText))
                            continue;
                        else
                            writers.Add(node.InnerText);
                        /*
                        if (!writers.Contains(node.InnerText))
                            writers.Add(node.InnerText);
                        */
                    }
                }
                else
                    writers.Add("*");

                #endregion

                #region Create and add the shared variable

                shVar = new SharedVariable(blackboard.VirtualModule, shVarType, shVarName, shVarIsArray, -1);
                //shVar.Data = shVarValue;
                shVar.WriteStringData(blackboard.VirtualModule, shVarType, -1, shVarValue);
                writers.Sort();
                shVar.AllowedWriters = writers;
                blackboard.VirtualModule.SharedVariables.Add(shVar);
                log.WriteLine(4, "Added shared variable " + shVarType +" "+ shVarName);

                #endregion
            }
            #endregion
        }