예제 #1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="variableNames"></param>
        /// <param name="fetchAllVariables"></param>
        /// <returns></returns>
        public virtual IDictionary <string, IVariableInstance> GetVariableInstances(IEnumerable <string> variableNames, bool fetchAllVariables)
        {
            IDictionary <string, IVariableInstance> requestedVariables = new Dictionary <string, IVariableInstance>();
            ISet <string> variableNamesToFetch = new HashSet <string>(variableNames);

            // The values in the fetch-cache will be more recent, so they can override any existing ones
            foreach (string variableName in variableNames)
            {
                if (transientVariabes != null && transientVariabes.ContainsKey(variableName))
                {
                    requestedVariables[variableName] = transientVariabes[variableName];
                    variableNamesToFetch.Remove(variableName);
                }
                else if (usedVariablesCache.ContainsKey(variableName))
                {
                    requestedVariables[variableName] = usedVariablesCache[variableName];
                    variableNamesToFetch.Remove(variableName);
                }
            }

            if (fetchAllVariables)
            {
                // getVariables() will go up the execution hierarchy, no need to do it here
                // also, the cached values will already be applied too
                IDictionary <string, IVariableInstance> allVariables = VariableInstances;
                foreach (string variableName in variableNamesToFetch)
                {
                    requestedVariables[variableName] = allVariables[variableName];
                }
                return(requestedVariables);
            }
            else
            {
                // Go up if needed
                IVariableScope parent = ParentVariableScope;
                if (parent != null)
                {
                    requestedVariables.PutAll(parent.GetVariableInstances(variableNamesToFetch, fetchAllVariables));
                }

                // Fetch variables on this scope
                IList <IVariableInstanceEntity> variables = GetSpecificVariables(variableNamesToFetch);
                foreach (IVariableInstanceEntity variable in variables)
                {
                    requestedVariables[variable.Name] = variable;
                }

                return(requestedVariables);
            }
        }