} // SelfSave protected virtual void LoadOneChildFromXml(XmlNode oRoot, Type oTableType, ASrcAttribute oGroupSrcAttr) { oGroupSrcAttr = oGroupSrcAttr ?? oTableType.GetCustomAttribute <ASrcAttribute>(); Log.Debug("Parsing Experian company data into {0}...", oTableType.Name); ConstructorInfo ci = oTableType.GetConstructors().FirstOrDefault(); if (ci == null) { Log.Alert("Parsing Experian company data into {0} failed: no constructor found.", oTableType.Name); return; } // if XmlNodeList oGroupNodes = oRoot.SelectNodes(oGroupSrcAttr.GroupPath); if (oGroupNodes == null) { Log.Debug("Parsing Experian company data into {0}: no XML nodes found.", oTableType.Name); return; } // if Log.Debug( "Parsing Experian company data into {0}: {1} XML node{2} found.", oTableType.Name, oGroupNodes.Count, oGroupNodes.Count == 1 ? "" : "s" ); foreach (XmlNode oGroup in oGroupNodes) { AExperianLtdDataRow oRow = (AExperianLtdDataRow)ci.Invoke(new object[] { Log }); oRow.LoadFromXml(oGroup); if (oRow.ShouldBeSaved()) { Children.Add(oRow); } } // for each matching XML node Log.Debug("Parsing Experian company data into {0} complete.", oTableType.Name); } // LoadOneChildFromXml
} // SelfSave protected override void LoadChildrenFromXml(XmlNode oRoot) { foreach (Type oTableType in Assembly.GetExecutingAssembly().GetTypes().Where(t => t.IsSubclassOf(typeof(AExperianLtdDataRow)))) { ASrcAttribute oGroupSrcAttr = oTableType.GetCustomAttribute <ASrcAttribute>(); if (oGroupSrcAttr == null) { continue; } if (!oGroupSrcAttr.IsTopLevel) { continue; } LoadOneChildFromXml(oRoot, oTableType, oGroupSrcAttr); } // for each row type (DL 65, DL 72, etc) } // LoadChildrenFromXml
static CompanyScoreModelBuilder() { var oAttrTypes = typeof(ASrcAttribute).Assembly.GetTypes().Where(t => t.IsSubclassOf(typeof(ASrcAttribute)) && t != typeof(ASrcAttribute)); SortedDictionary <int, string> oOrder = new SortedDictionary <int, string>(); foreach (Type oType in oAttrTypes) { ConstructorInfo ci = oType.GetConstructors().FirstOrDefault(); if (ci == null) { continue; } ASrcAttribute oAttr = (ASrcAttribute)ci.Invoke(new object[ci.GetParameters().Length]); if (!oAttr.IsCompanyScoreModel) { continue; } if (!oAttr.IsTopLevel) { continue; } if (oOrder.ContainsKey(oAttr.TargetDisplayPosition)) { throw new Exception("Company score display order of " + oAttr.TargetDisplayPosition + " is specified more than once."); } oOrder[oAttr.TargetDisplayPosition] = oAttr.TargetDisplayGroup; } // for each ms_DisplayOrder = oOrder.Values.ToList(); } // static constructor
} // GetChildren public virtual CompanyScoreModelDataset ToCompanyScoreModel(CompanyScoreModelDataset oModel = null) { if (oModel == null) { oModel = new CompanyScoreModelDataset(); } ASrcAttribute oGroupSrcAttr = this.GetType().GetCustomAttribute <ASrcAttribute>(); var oMyValues = new SortedDictionary <string, CompanyScoreModelItemValues>(); var oMyMetaData = new SortedDictionary <string, DisplayMetaData>(); this.Traverse((oInstance, oPropertyInfo) => { ASrcAttribute oValueSrcAttr = oPropertyInfo.GetCustomAttribute <ASrcAttribute>(); if (oValueSrcAttr == null) { return; } if (!oValueSrcAttr.IsCompanyScoreModel) { return; } string sTargetGroupName = (oGroupSrcAttr ?? oValueSrcAttr).TargetDisplayGroup; CompanyScoreModelItemValues oValues; if (oMyValues.ContainsKey(sTargetGroupName)) { oValues = oMyValues[sTargetGroupName]; } else { oValues = new CompanyScoreModelItemValues(); oMyValues[sTargetGroupName] = oValues; oMyMetaData[sTargetGroupName] = (oGroupSrcAttr ?? oValueSrcAttr).MetaData; } // if object oValue = oPropertyInfo.GetValue(oInstance); string sDisplayName = oValueSrcAttr.TargetDisplayName; if (string.IsNullOrWhiteSpace(sDisplayName)) { sDisplayName = oPropertyInfo.Name; } string sValue = string.Empty; if (oValue != null) { if (oPropertyInfo.PropertyType == typeof(DateTime?)) { sValue = ((DateTime?)oValue).Value.ToString("MMMM d yyyy", ms_oCulture); } else if (oPropertyInfo.PropertyType == typeof(int?)) { if (oValueSrcAttr.Transformation == TransformationType.MonthsAndYears) { decimal nValue = (decimal)((int?)oValue).Value; decimal nYears = Math.Floor(nValue / 12); decimal nMonths = nValue - nYears * 12; var os = new StringBuilder(); if (nYears > 0) { os.AppendFormat("{0} year{1}", nYears, nYears == 1 ? "" : "s"); } if (nMonths > 0) { os.AppendFormat(" {0} month{1}", nMonths, nMonths == 1 ? "" : "s"); } sValue = os.ToString().Trim(); } else { sValue = oValue.ToString(); } } else if (oPropertyInfo.PropertyType == typeof(decimal?)) { decimal x = ((decimal?)oValue).Value; string sPrecision = Math.Abs(Math.Truncate(x) - x) < 0.00000001m ? "0" : "2"; string sFormat = oValueSrcAttr.Transformation == TransformationType.Money ? "C" : "G"; sValue = x.ToString(sFormat + sPrecision, ms_oCulture); } else // string { sValue = oValue.ToString(); if (oValueSrcAttr.Transformation == TransformationType.Shares) { decimal nValue = 0; bool bFound = false; foreach (char c in sValue) { bool bGood = false; switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': bFound = true; nValue = nValue * 10m + (c - '0'); goto case ' '; // !!! fall through !!! case ' ': case ',': case '\t': bGood = true; break; } // switch if (!bGood) { break; } } // for each char if (bFound) { sValue = nValue.ToString("G0", ms_oCulture); } } // if } // if sValue = oValueSrcAttr.Map(sValue); } // if if (oValues.Values.ContainsKey(sDisplayName)) { oValues.Values[sDisplayName] = Str(oValues.Values[sDisplayName] + oValueSrcAttr.DisplayPrefix + sValue); } else { oValues.Values[sDisplayName] = Str(sValue); } }); CompanyScoreModelItemValues oGroupValues = null; foreach (KeyValuePair <string, CompanyScoreModelItemValues> pair in oMyValues) { string sTargetGroupName = pair.Key; CompanyScoreModelItem oItem; if (oModel.ContainsKey(sTargetGroupName)) { oItem = oModel[sTargetGroupName]; } else { oItem = new CompanyScoreModelItem(sTargetGroupName, oMyMetaData[sTargetGroupName].ToDictionary()); oModel[sTargetGroupName] = oItem; } // if oItem.Data.Add(pair.Value); if (oGroupSrcAttr != null) { oGroupValues = pair.Value; } } // for each foreach (AExperianLtdDataRow oKid in Children) { ASrcAttribute oKidSrcAttr = oKid.GetType().GetCustomAttribute <ASrcAttribute>(); if (oKidSrcAttr == null) { continue; } if (!oKidSrcAttr.IsCompanyScoreModel) { continue; } if (oKidSrcAttr.IsTopLevel) { oKid.ToCompanyScoreModel(oModel); } else { if (oGroupValues == null) { Log.Alert("No group values were defined for children of {0}.", this.GetType()); } else { oKid.ToCompanyScoreModel(oGroupValues.Children); } } } // for each kid return(oModel); } // ToCompanyScoreModel