/// <summary> /// Returns a Response XML element with all the property names /// and property values of the visible properties. /// </summary> /// <param name="url"></param> /// <param name="calendarResourceId">Name of the resource</param> /// <param name="additionalProperties">List of additional requested properties (key=name; value=namespace)</param> /// <returns></returns> private async Task <XmlTreeStructure> AllPropFillTree(string url, string calendarResourceId, List <KeyValuePair <string, string> > additionalProperties) { #region Adding the response of the collection or resource. //Adding standard structure for a "response" element. var treeChild = new XmlTreeStructure("response", "DAV:"); #region Adding the <D:href>/api/v1/collections/users|groups/principalId/{collectionName}/{calendarResourceId}?</D:href> var href = new XmlTreeStructure("href", "DAV:"); href.AddValue(SystemProperties._baseUrl + url); treeChild.AddChild(href); #endregion #region Adding the propstat #region Selecting properties var propertiesCol = new List <XmlTreeStructure>(); var propertiesOk = new List <XmlTreeStructure>(); var propertiesWrong = new List <XmlTreeStructure>(); var errorStack = new Stack <string>(); //Here all visible properties are retrieve plus a collection of extra properties that can be //defined in the request body. if (calendarResourceId == null) { var properties = await _collectionRepository.GetAllProperties(url); foreach (var property in properties) { //TODO: Check that the property is accessible beyond its visibility. var tempTree = property.Value == null ? new XmlTreeStructure(property.Name, property.Namespace) { Value = "" } : XmlTreeStructure.Parse(property.Value); propertiesCol.Add((XmlTreeStructure)tempTree); } //looking for additional properties if (additionalProperties != null && additionalProperties.Count > 0) { foreach (var addProperty in additionalProperties) { //gets the property from database var property = await _collectionRepository.GetProperty(url, addProperty); //Builds the xmlTreeExtructure checking that if the value is null thats because //the property was not found. IXMLTreeStructure prop; if (property != null) { prop = property.Value == null ? new XmlTreeStructure(property.Name, property.Namespace) { Value = "" } } : XmlTreeStructure.Parse(property.Value); else { prop = new XmlTreeStructure(addProperty.Key, addProperty.Value); } propertiesCol.Add((XmlTreeStructure)prop); } } } else { var properties = await _resourceRespository.GetAllProperties(url); foreach (var property in properties) { //TODO: Check that the property is accessible beyond its visibility. var tempTree = property.Value == null ? new XmlTreeStructure(property.Name, property.Namespace) { Value = "" } : XmlTreeStructure.Parse(property.Value); propertiesCol.Add((XmlTreeStructure)tempTree); } //looking for additional properties if (additionalProperties != null && additionalProperties.Count > 0) { foreach (var addProperty in additionalProperties) { //gets the property from database var property = await _resourceRespository.GetProperty(url, addProperty); //Builds the xmlTreeExtructure checking that if the value is null thats because //the property was not found. IXMLTreeStructure prop; if (property != null) { prop = property.Value == null ? new XmlTreeStructure(property.Name, property.Namespace) { Value = "" } } : XmlTreeStructure.Parse(property.Value); else { prop = new XmlTreeStructure(addProperty.Key, addProperty.Value); } propertiesCol.Add((XmlTreeStructure)prop); } } } //Here there are divided all properties between recovered and error recovering foreach (var propTree in propertiesCol) { if (propTree.Value != null) { propertiesOk.Add(propTree); } else { propertiesWrong.Add(propTree); } } #endregion #region Adding nested propOK //This procedure has been explained in another method. //Here the retrieve properties are grouped. var propstatOk = new XmlTreeStructure("propstat", "DAV:"); var propOk = new XmlTreeStructure("prop", "DAV:"); //Here i add all properties to the prop. foreach (var property in propertiesOk) { propOk.AddChild(property); } propstatOk.AddChild(propOk); #region Adding nested status OK var statusOk = new XmlTreeStructure("status", "DAV:"); statusOk.AddValue("HTTP/1.1 200 OK"); propstatOk.AddChild(statusOk); #endregion #endregion #region Adding nested propWrong //Here the properties that could not be retrieved are grouped. var propstatWrong = new XmlTreeStructure("propstat", "DAV:"); var propWrong = new XmlTreeStructure("prop", "DAV:"); //Here i add all properties to the prop. foreach (var property in propertiesWrong) { propWrong.AddChild(property); } propstatWrong.AddChild(propWrong); #region Adding nested status Not Found var statusWrong = new XmlTreeStructure("status", "DAV:"); statusWrong.AddValue("HTTP/1.1 400 Not Found"); propstatWrong.AddChild(statusWrong); #endregion #region Adding responseDescription when wrong //Here i add an description for explain the errors. //This should be aplied in all method with an similar structure but for the moment is only used here. //However this is not required. var responseDescrpWrong = new XmlTreeStructure("responsedescription", "DAV:"); responseDescrpWrong.AddValue("The properties doesn't exist"); propstatWrong.AddChild(responseDescrpWrong); #endregion #endregion //If any of the "status" group is empty, it is not included. if (propertiesOk.Count > 0) { treeChild.AddChild(propstatOk); } if (propertiesWrong.Count > 0) { treeChild.AddChild(propstatWrong); } #endregion return(treeChild); #endregion }