//------------------------------------------------------------------------------
//
// Copyright (c) Telligent Systems Corporation. All rights reserved.
//
//------------------------------------------------------------------------------
using System;
using System.Collections;
using System.Collections.Specialized;
using System.Diagnostics;
using System.Xml;
namespace CommunityServer.Components
{
///
/// Summary description for SiteUrlData.
///
public class SiteUrlsData
{
public SiteUrlsData(string siteUrlsXmlFile)
{
_paths = new NameValueCollection();
_reversePaths = new NameValueCollection();
//_locations = new NameValueCollection();
_tabUrls = new ArrayList();
Initialize(siteUrlsXmlFile);
}
protected XmlDocument CreateDoc(string siteUrlsXmlFile)
{
XmlDocument doc = new XmlDocument();
doc.Load( siteUrlsXmlFile );
return doc;
}
protected void Initialize(string siteUrlsXmlFile)
{
string globalPath = Globals.ApplicationPath;
if(globalPath != null)
globalPath = globalPath.Trim();
// Load SiteUrls from the SiteUrls.xml file
//
XmlDocument doc = CreateDoc(siteUrlsXmlFile);
XmlNode basePaths = doc.SelectSingleNode("SiteUrls/locations");
_locationSet = CreateLocationSet(basePaths, globalPath);
_locationFilter = _locationSet.Filter;
#region SiteUrls
XmlNode transformers = doc.SelectSingleNode("SiteUrls/transformers");
ListDictionary transforms = CreateTransformers(transformers);
XmlNode urls = doc.SelectSingleNode("SiteUrls/urls");
CreateUrls(urls, transforms);
#endregion
CreateNavigation(doc.SelectSingleNode("SiteUrls/navigation"));
CreateMappings(doc.SelectSingleNode("SiteUrls/mappings"), globalPath);
}
#region Mappings
private void CreateMappings(XmlNode maps, string globalPath)
{
if(maps != null)
{
foreach(XmlNode map in maps.ChildNodes)
{
if(map != null && map.NodeType != XmlNodeType.Comment)
{
XmlAttribute l = map.Attributes["location"];
XmlAttribute a = map.Attributes["path"];
if(l != null && a != null)
{
string path = (globalPath + "/" + a.Value).Replace("//","/");
ApplicationKeyMapping am = new ApplicationKeyMapping(l.Value, path);
_mappings.Add(am);
}
}
}
}
}
#endregion
#region Navigation
protected virtual void CreateNavigation(XmlNode nav)
{
if(nav != null)
{
foreach(XmlNode node in nav.ChildNodes)
{
if(node.NodeType != XmlNodeType.Comment)
{
XmlAttribute name = node.Attributes["name"];
XmlAttribute resourceUrl = node.Attributes["resourceUrl"];
XmlAttribute resourceName = node.Attributes["resourceName"];
XmlAttribute navigateUrl = node.Attributes["navigateUrl"];
XmlAttribute text = node.Attributes["text"];
XmlAttribute roles = node.Attributes["roles"];
XmlAttribute iNavType = node.Attributes["type"];
XmlAttribute appType = node.Attributes["applicationType"];
ApplicationType at = ApplicationType.Unknown;
if(appType != null)
{
at = (ApplicationType)Enum.Parse(typeof(ApplicationType),appType.Value,true);
}
CSApplicationData data = ApplicationSet.Applications[at];
if(data != null)
{
if(!data.Enabled)
continue;
}
// Set roles to "Everyone" if the attribute is null
string rolesValue;
if(roles == null)
rolesValue = "Everyone";
else
rolesValue = roles.Value;
string navType = null;
if(iNavType != null)
navType = iNavType.Value;
// Set the navigateUrl to a specified one if no resource entries are given
string urlValue;
if(resourceUrl == null)
urlValue = navigateUrl.Value;
else
urlValue = FormatUrl(resourceUrl.Value);
// Create the CSLink and add it
CSLink link = new CSLink(name.Value, (resourceName == null) ? null : resourceName.Value, (text == null) ? null : text.Value, urlValue, rolesValue, navType);
_tabUrls.Add(link);
}
}
}
}
#endregion
#region Transformers
private static ListDictionary CreateTransformers(XmlNode transformers)
{
ListDictionary transforms = new ListDictionary();
foreach(XmlNode n in transformers.ChildNodes)
{
if(n.NodeType != XmlNodeType.Comment)
{
string k = n.Attributes["key"].Value;
string v = n.Attributes["value"].Value;
if(!Globals.IsNullorEmpty(k))
{
transforms[k] = v;
}
}
}
return transforms;
}
#endregion
#region Urls
private void CreateUrls(XmlNode urls, ListDictionary transforms)
{
foreach (XmlNode n in urls.ChildNodes)
{
if (n.NodeType != XmlNodeType.Comment)
{
string name = n.Attributes["name"].Value;
XmlAttribute direct = n.Attributes["navigateUrl"];
if(direct != null)
{
_paths.Add(name,direct.Value);
}
else
{
string path = n.Attributes["path"].Value;
foreach(string key in transforms.Keys)
{
path = path.Replace(key,transforms[key].ToString());
}
string location = null;
XmlAttribute l = n.Attributes["location"];
if(l != null)
location = l.Value;
Location loc = _locationSet.FindLocationByName(location);
_paths.Add(name, loc.Path + path);
// Store the full path to avoid having key duplicates
//
string keyPath = loc.Path + path;
if (Globals.ApplicationPath.Length > 0)
keyPath = keyPath.Replace( Globals.ApplicationPath, "" ).ToLower();
_reversePaths.Add( keyPath, name );
XmlAttribute vanity = n.Attributes["vanity"];
XmlAttribute pattern = n.Attributes["pattern"];
//Store full paths like regular urls.
if(vanity != null && pattern != null)
{
// string p = loc.Path + pattern.Value;
// string v = loc.PhysicalPath + vanity.Value;
string p = (!pattern.Value.StartsWith("/") ? loc.Path : String.Empty ) + pattern.Value;
string v = (!vanity.Value.StartsWith("/") ? loc.PhysicalPath : String.Empty) + vanity.Value;
foreach(string key in transforms.Keys)
{
p = p.Replace(key,transforms[key].ToString());
v = v.Replace(key,transforms[key].ToString());
}
loc.Add(new ReWrittenUrl(location + "." + name,p,v));
}
}
}
}
}
#endregion
#region LocationSet
private LocationSet CreateLocationSet(XmlNode basePaths, string globalPath)
{
LocationSet ls = new LocationSet();
foreach(XmlNode n in basePaths.ChildNodes)
{
if(n.NodeType != XmlNodeType.Comment)
{
XmlAttribute name = n.Attributes["name"];
XmlAttribute path = n.Attributes["path"];
XmlAttribute physicalPath = n.Attributes["physicalPath"];
XmlAttribute exclude = n.Attributes["exclude"];
XmlAttribute ltype = n.Attributes["type"];
if(name != null && path != null)
{
string pp = null;
if(physicalPath != null)
{
pp = globalPath + physicalPath.Value;
}
bool isExeclude = (exclude != null && bool.Parse(exclude.Value));
Location l = null;
string vp = globalPath + path.Value;
if(ltype == null)
{
l = new Location(vp, pp, isExeclude);
}
else
{
Type t = Type.GetType(ltype.Value);
if(t == null)
{
CSException csEx = new CSException(CSExceptionType.UnknownError,"Type for custom location could not be loaded " + ltype.Value);
csEx.Log();
throw csEx;
}
l = Activator.CreateInstance(t,new object[]{vp,pp,isExeclude}) as Location;
if(l == null)
{
CSException csEx = new CSException(CSExceptionType.UnknownError,"Type for custom location could not be loaded as an instance of Location" + ltype.Value);
csEx.Log();
throw csEx;
}
}
ls.Add(name.Value,l);
}
}
}
return ls;
}
#endregion
public string FormatUrl(string name)
{
return FormatUrl(name,null);
}
public virtual string FormatUrl(string name, params object[] parameters)
{
if(parameters == null)
return this.Paths[name];
else
return string.Format(Paths[name],parameters);
}
#region Public Properties
protected NameValueCollection _paths = null;
protected NameValueCollection _reversePaths = null;
protected ArrayList _tabUrls = null;
protected string _locationFilter;
protected LocationSet _locationSet = null;
protected ArrayList _mappings = new ArrayList();
public ArrayList Mappings
{
get { return _mappings;}
}
public LocationSet LocationSet
{
get { return _locationSet;}
}
public string LocationFilter
{
get
{
return _locationFilter;
}
}
///
/// Property Paths (NameValueCollection)
///
public NameValueCollection Paths
{
get { return this._paths; }
}
///
/// Property Paths (NameValueCollection)
///
public NameValueCollection ReversePaths
{
get { return this._reversePaths; }
}
public ArrayList TabUrls
{
get
{
return _tabUrls;
}
}
#endregion
private static string ResolveUrl (string path)
{
if (Globals.ApplicationPath.Length > 0)
return Globals.ApplicationPath + path;
else
return path;
}
}
}