/// <summary> /// Write a configuration resource node. /// </summary> /// <param name="writer">XML Writer</param> /// <param name="node">Resource Node</param> private void WriteResourceNode(XmlWriter writer, ConfigResourceNode node) { writer.WriteStartElement(ConstXmlResourceNode.XML_CONFIG_NODE_RESOURCE); { writer.WriteAttributeString(ConstXmlResourceNode.XML_CONFIG_ATTR_RESOURCE_NAME, node.ResourceName); writer.WriteAttributeString(ConstXmlResourceNode.XML_CONFIG_ATTR_RESOURCE_TYPE, node.Type.ToString()); writer.WriteStartElement(ConstXmlResourceNode.XML_CONFIG_NODE_RESOURCE_URL); writer.WriteString(node.Location.ToString()); writer.WriteEndElement(); } writer.WriteEndElement(); }
/// <summary> /// Get a File/Blob resource as a stream. Method is applicable only for File Resources. /// </summary> /// <param name="configuration">Configuration instance.</param> /// <param name="path">Search path for the resource node.</param> /// <returns>Stream Reader</returns> public static StreamReader GetResourceStream(this Configuration configuration, string path) { Preconditions.CheckArgument(configuration); Preconditions.CheckArgument(path); AbstractConfigNode node = configuration.Find(path); if (node != null && typeof(ConfigResourceNode).IsAssignableFrom(node.GetType())) { ConfigResourceNode rnode = (ConfigResourceNode)node; if (rnode.GetType() == typeof(ConfigResourceFile)) { ConfigResourceFile fnode = (ConfigResourceFile)rnode; if (fnode.Downloaded) { if (fnode.File == null) { throw new ConfigurationException(String.Format("Invalid File Resource Node: File is NULL. [path={0}]", fnode.GetSearchPath())); } FileInfo fi = new FileInfo(fnode.File.FullName); if (!fi.Exists) { throw new ConfigurationException(String.Format("Invalid File Resource Node: File not found. [file={0}]", fi.FullName)); } return(new StreamReader(fi.FullName)); } else { lock (fnode) { DownloadResource(fnode); if (fnode.Type == EResourceType.ZIP) { UnzipResource((ConfigResourceZip)fnode); } } FileInfo file = new FileInfo(fnode.File.FullName); if (!file.Exists) { throw new ConfigurationException(String.Format("Invalid File Resource Node: File not found. [file={0}]", file.FullName)); } return(new StreamReader(file.FullName)); } } } return(null); }
/// <summary> /// Get a File/Blob resource as a stream. Method is applicable only for Zip/Directory Resources. /// </summary> /// <param name="configuration">Configuration instance.</param> /// <param name="path">Search path for the resource node.</param> /// <param name="file">Sub-path for the file</param> /// <returns>Stream Reader</returns> public static StreamReader GetResourceStream(this Configuration configuration, string path, string file) { Preconditions.CheckArgument(configuration); Preconditions.CheckArgument(path); Preconditions.CheckArgument(file); AbstractConfigNode node = configuration.Find(path); if (node != null && typeof(ConfigResourceNode).IsAssignableFrom(node.GetType())) { ConfigResourceNode rnode = (ConfigResourceNode)node; if (rnode.GetType() == typeof(ConfigResourceZip)) { ConfigResourceZip fnode = (ConfigResourceZip)rnode; if (fnode.Downloaded) { Conditions.NotNull(fnode.File); FileInfo fi = new FileInfo(fnode.File.FullName); if (!fi.Exists) { throw new ConfigurationException(String.Format("Invalid File Resource Node: File not found. [file={0}]", fi.FullName)); } string filename = String.Format("{0}/{1}", fi.FullName, file); fi = new FileInfo(filename); if (!fi.Exists) { throw new ConfigurationException(String.Format("File not found. [file={0}]", fi.FullName)); } return(new StreamReader(fi.FullName)); } else { lock (fnode) { DownloadResource(fnode); UnzipResource(fnode); } string filename = String.Format("{0}/{1}", fnode.Directory.FullName, file); FileInfo fi = new FileInfo(filename); if (!fi.Exists) { throw new ConfigurationException(String.Format("Invalid File Resource Node: File not found. [file={0}]", fi.FullName)); } return(new StreamReader(fi.FullName)); } } else if (rnode.GetType() == typeof(ConfigDirectoryResource)) { ConfigDirectoryResource dnode = (ConfigDirectoryResource)rnode; if (!dnode.Directory.Exists) { throw new ConfigurationException(String.Format("Directory not found. [file={0}]", dnode.Directory.FullName)); } string filename = String.Format("{0}/{1}", dnode.Directory.FullName, file); FileInfo fi = new FileInfo(filename); if (!fi.Exists) { throw new ConfigurationException(String.Format("Invalid File Resource Node: File not found. [file={0}]", fi.FullName)); } return(new StreamReader(fi.FullName)); } } return(null); }
/// <summary> /// Create a Resource node instance. /// </summary> /// <param name="parent">Parent Config node</param> /// <param name="elem">XML Element</param> private void AddResourceNode(ConfigPathNode parent, XmlElement elem) { string resourceName = elem.GetAttribute(ConstXmlResourceNode.XML_CONFIG_ATTR_RESOURCE_NAME); if (String.IsNullOrWhiteSpace(resourceName)) { throw ConfigurationException.PropertyMissingException(ConstXmlResourceNode.XML_CONFIG_ATTR_RESOURCE_NAME); } string st = elem.GetAttribute(ConstXmlResourceNode.XML_CONFIG_ATTR_RESOURCE_TYPE); if (String.IsNullOrWhiteSpace(st)) { throw ConfigurationException.PropertyMissingException(ConstXmlResourceNode.XML_CONFIG_ATTR_RESOURCE_TYPE); } EResourceType type = Enum.Parse <EResourceType>(st); if (type == EResourceType.NONE) { throw ConfigurationException.PropertyMissingException(ConstXmlResourceNode.XML_CONFIG_ATTR_RESOURCE_TYPE); } Uri uri = null; if (elem.HasChildNodes) { foreach (XmlNode nn in elem.ChildNodes) { if (nn.NodeType == XmlNodeType.Element && nn.Name == ConstXmlResourceNode.XML_CONFIG_NODE_RESOURCE_URL) { string su = nn.InnerText; if (String.IsNullOrWhiteSpace(su)) { throw ConfigurationException.PropertyMissingException(ConstXmlResourceNode.XML_CONFIG_NODE_RESOURCE_URL); } uri = new Uri(su); break; } } } if (uri == null) { throw ConfigurationException.PropertyMissingException(ConstXmlResourceNode.XML_CONFIG_NODE_RESOURCE_URL); } ConfigResourceNode node = null; switch (type) { case EResourceType.FILE: node = new ConfigResourceFile(configuration, parent); break; case EResourceType.DIRECTORY: node = new ConfigDirectoryResource(configuration, parent); break; case EResourceType.ZIP: node = new ConfigResourceZip(configuration, parent); break; } node.Name = elem.Name; node.Type = type; node.Location = uri; node.ResourceName = resourceName; if (settings.DownloadOptions == EDownloadOptions.LoadRemoteResourcesOnStartup) { if (type == EResourceType.ZIP || type == EResourceType.FILE) { ConfigResourceFile fnode = (ConfigResourceFile)node; ConfigResourceHelper.DownloadResource(fnode); } } if (type == EResourceType.DIRECTORY) { ConfigDirectoryResource dnode = (ConfigDirectoryResource)node; if (!dnode.Location.IsFile) { throw new ConfigurationException(String.Format("Invalid URI: Must be a local/mounted directory. [uri={0}]", dnode.Location.ToString())); } string dir = dnode.Location.LocalPath; DirectoryInfo di = new DirectoryInfo(dir); if (di.Exists) { throw new ConfigurationException(String.Format("Invalid URI: Directory not found. [uri={0}]", dnode.Location.ToString())); } dnode.Downloaded = true; dnode.Directory = di; } parent.AddChildNode(node); }
/// <summary> /// Write a configuration node. /// </summary> /// <param name="writer">XML Writer</param> /// <param name="node">Node To write</param> /// <param name="settings">Configuration Settings.</param> private void WriteNode(XmlWriter writer, AbstractConfigNode node, ConfigurationSettings settings) { if (node.GetType() == typeof(ConfigPathNode)) { ConfigPathNode pnode = (ConfigPathNode)node; writer.WriteStartElement(node.Name); { ConfigAttributesNode attrs = pnode.GetAttributes(); if (attrs != null) { Dictionary <string, ConfigValueNode> values = attrs.GetValues(); if (values != null && values.Count > 0) { foreach (string key in values.Keys) { ConfigValueNode vn = values[key]; if (vn != null) { writer.WriteAttributeString(vn.Name, vn.GetValue()); } } } } Dictionary <string, AbstractConfigNode> nodes = pnode.GetChildren(); foreach (string key in nodes.Keys) { AbstractConfigNode cnode = nodes[key]; if (cnode.Name == settings.AttributesNodeName) { continue; } WriteNode(writer, cnode, settings); } } writer.WriteEndElement(); } else if (node.GetType() == typeof(ConfigValueNode)) { ConfigValueNode vn = (ConfigValueNode)node; writer.WriteStartElement(vn.Name); writer.WriteString(vn.GetValue()); writer.WriteEndElement(); } else if (node.GetType() == typeof(ConfigParametersNode) || node.GetType() == typeof(ConfigPropertiesNode)) { string name = null; if (node.GetType() == typeof(ConfigParametersNode)) { name = settings.ParametersNodeName; } else { name = settings.PropertiesNodeName; } ConfigKeyValueNode kvnode = (ConfigKeyValueNode)node; WriteKeyValueNode(writer, kvnode, name); } else if (node.GetType() == typeof(ConfigListValueNode)) { WriteListValueNode(writer, (ConfigListValueNode)node); } else if (node.GetType() == typeof(ConfigElementListNode)) { WriteListElementNode(writer, (ConfigElementListNode)node, settings); } else if (node.GetType() == typeof(ConfigIncludeNode)) { ConfigIncludeNode inode = (ConfigIncludeNode)node; WriteNode(writer, inode.Node, settings); } else if (typeof(ConfigResourceNode).IsAssignableFrom(node.GetType())) { ConfigResourceNode rnode = (ConfigResourceNode)node; WriteResourceNode(writer, rnode); } }