using System; using System.Collections.Generic; using System.Collections; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Diagnostics; using System.Globalization; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Security; using Microsoft.VisualBasic; using System.Windows; using System.Xml; using System.Web; //using System.Web.Caching; namespace Traffic { /// /// ''' Provides the functionality related to retrieving the list /// ''' of states for a system; //// reads an xml file /// ''' public static class StateManager { // Cache object that will be used to store and retrieve items from // the cache and constants used within this object // private static Cache myCache = System.Web.HttpRuntime.Cache(); private static string stateKey = "StateKey"; public static string applicationConstantsFileName = AppDomain.CurrentDomain.BaseDirectory + "State.xml"; // = Strings.Replace(System.AppDomain.CurrentDomain.BaseDirectory + "State.xml", "/", @"\"); // "States.config", "/", "\") private static state[] stateArray; private static ArrayList errorList; // Tells you whether or not any errors have occurred w/in the module public static bool hasErrors { get { if (errorList == null || errorList.Count == 0) return false; else return true; } } // Retrieves an array list of Exception objects public static ArrayList getErrors { get { return errorList; } } // Private method used to add errors to the errorList private static void addError(ref Exception e) { if (errorList == null) errorList = new ArrayList(); errorList.Add(e); } /// /// ''' Gets all the states /// ''' /// ''' An array of State objects public static state[] getStates() { //if (myCache[stateKey] == null) PopulateCache(); return stateArray; } /// /// ''' Takes the abbreviation given and returns the full name /// ''' /// ''' The full name for the abbreviation in /// ''' question private static string convertAbbreviationToName(ref string abbreviation) { XmlDocument xmlFile = new XmlDocument(); try { applicationConstantsFileName = applicationConstantsFileName.Replace("/", @"\"); xmlFile.Load(applicationConstantsFileName); XmlNode theNode = xmlFile.SelectSingleNode("descendant::state[@abbreviation='" + abbreviation + "']"); if (theNode != null) return theNode.Attributes.GetNamedItem("name").Value; } catch (Exception e) { addError(ref e); } return null; } /// /// ''' Gets the state object based on the full name /// ''' /// ''' The full name of the state to /// ''' retrieve /// ''' A State object for the name given public static state getStateByName(ref string name) { // if (myCache[stateKey + name] == null) PopulateCache(); //return state[stateKey + name]; return (state)Convert.ChangeType(stateKey, typeof(state[])); } /// /// ''' Gets the state object based on the abbreviation /// ''' /// ''' The abbreviation of the state /// ''' to retrieve /// ''' A State object for the abbreviation /// ''' given public static state getStateByAbbreviation(ref string abbreviation) { string name = convertAbbreviationToName(ref abbreviation); if (name != null) return getStateByName(ref name); else return null/* TODO Change to default(_) if this is not a reference type */; } /// The manager attempts to load the XML /// ''' file and store it in the cache with a dependency on the XML /// ''' file itself.' This means that any time the XML file changes, it /// ''' is removed from the cache. When the methods that return State /// ''' objects are called again, the XML file won't exist in memory /// ''' and the PopulateCache will be re-called. /// ''' private static void PopulateCache() { XmlDocument xmlFile = new XmlDocument(); // Dim theState As State XmlNode theNode; string theName, theAbbreviation; int i = 0; try { applicationConstantsFileName = applicationConstantsFileName.Replace("/", @"\"); xmlFile.Load(applicationConstantsFileName); // Attempt to find the element given the "key" for that tag XmlNodeList elementList = xmlFile.GetElementsByTagName("state"); if (elementList != null) { stateArray = (state[])Array.CreateInstance(typeof(state), elementList.Count); // Loop through each element that has the name we're looking for for (i = 0; i <= elementList.Count - 1; i++) { theNode = elementList[i]; // Get the name for that tag if (theNode.Attributes.GetNamedItem("name") != null) theName = theNode.Attributes.GetNamedItem("name").Value; else theName = null; // Get the abbreviation for that tag if (theNode.Attributes.GetNamedItem("abbreviation") != null) theAbbreviation = theNode.Attributes.GetNamedItem("abbreviation").Value; else theAbbreviation = null; // Populate that location in the array with the // values for the tag stateArray[i] = new state(ref theName, ref theAbbreviation); // Insert the state into cache //// myCache.Insert(stateKey + theName, stateArray[i], new CacheDependency(applicationConstantsFileName)); } // Insert the state array into cache //// myCache.Insert(stateKey, stateArray, new CacheDependency(applicationConstantsFileName)); } } catch (Exception e) { addError(ref e); } } } }