public RmResource CreateResource(GetResponse getResponse)
{
if (getResponse == null) {
throw new ArgumentNullException("getResponse");
}
if (getResponse.BaseObjectSearchResponse == null) {
throw new ArgumentNullException("getResponse.BaseObjectSearchResponse");
}
lock (getResponse) {
// look ahead for the type
String objectType = null;
foreach (PartialAttributeType partialAttribute in getResponse.BaseObjectSearchResponse.PartialAttributes) {
if (partialAttribute.Values.Count > 0) {
String localName = partialAttribute.Values[0].LocalName;
if (String.IsNullOrEmpty(localName)) {
continue;
}
if (localName.Equals(ObjectType)) {
objectType = partialAttribute.Values[0].InnerText;
break;
}
}
}
if (objectType == null) {
objectType = string.Empty;
}
RmResource rmResource = this.resourceTypeFactory.CreateResource(objectType);
// fill in the attribute values
foreach (PartialAttributeType partialAttribute in getResponse.BaseObjectSearchResponse.PartialAttributes) {
RmAttributeName attributeName = null;
RmAttributeValue newAttribute = null;
if (partialAttribute.Values.Count > 0) {
String localName = partialAttribute.Values[0].LocalName;
if (String.IsNullOrEmpty(localName)) {
continue;
} else {
attributeName = new RmAttributeName(localName);
}
} else {
continue;
}
if (rmResource.TryGetValue(attributeName, out newAttribute) == false) {
newAttribute = CreateRmAttributeValue(attributeName);
// PATCHED: the following line was missing
rmResource[attributeName] = newAttribute;
}
// add values to the typed list
foreach (XmlNode value in partialAttribute.Values) {
IComparable newValue = this.ConstructAttributeValue(attributeName, value.InnerText);
if (base.IsMultiValued(attributeName) == false)
newAttribute.Values.Clear();
if (attributeName.Name.Equals(ObjectType) || attributeName.Name.Equals(ObjectID))
newAttribute.Values.Clear();
newAttribute.Values.Add(newValue);
}
}
return rmResource;
}
}