public void BinaryDataList_FetchAllRecordSetKeys_WhenHasRecordSetsOnly_ShouldReturn0() { //------------Setup for test-------------------------- // BuildTargetShape var targetShape = new StringBuilder("<DataList><rs><Col1/><Col2/></rs><rec><Col4/><Col5/></rec></DataList>"); ErrorResultTO invokeErrors; TranslatorUtils tu = new TranslatorUtils(); var dl = tu.TranslateShapeToObject(targetShape, false, out invokeErrors); //------------Execute Test--------------------------- var keys = dl.FetchAllRecordSetKeys(); //------------Assert Results------------------------- Assert.AreEqual(0, invokeErrors.FetchErrors().Count); Assert.AreEqual(2, keys.Count); Assert.AreEqual("rs", keys[0]); Assert.AreEqual("rec", keys[1]); }
public void TranslatorUtils_TranslateShapeToObject_whenRsBothAndColumnsMixed_FullRSPresentInShape() { //------------Setup for test-------------------------- var translatorUtils = new TranslatorUtils(); var shape = new StringBuilder(@"<DataList> <rs Description="""" IsEditable=""True"" ColumnIODirection=""Both""> <result Description="""" IsEditable=""True"" ColumnIODirection=""Output"" /> <val Description="""" IsEditable=""True"" ColumnIODirection=""Input"" /> </rs> </DataList>"); //------------Execute Test--------------------------- ErrorResultTO invokeErrors; var dl = translatorUtils.TranslateShapeToObject(shape, false, out invokeErrors); //------------Assert Results------------------------- IBinaryDataListEntry entry; string error; dl.TryGetEntry("rs", out entry, out error); var keys = dl.FetchAllUserKeys(); Assert.AreEqual(0, invokeErrors.FetchErrors().Count); Assert.AreEqual(1, keys.Count); Assert.AreEqual("rs", keys[0]); Assert.AreEqual("result", entry.Columns[0].ColumnName); Assert.AreEqual("val", entry.Columns[1].ColumnName); }
public void CanDataListHelperCreateTargetShape() { // BuildTargetShape var targetShape = new StringBuilder("<DataList><result Description=\"\" IsEditable=\"True\" ColumnIODirection=\"Output\" /></DataList>"); ErrorResultTO invokeErrors; TranslatorUtils tu = new TranslatorUtils(); var dl = tu.TranslateShapeToObject(targetShape, false, out invokeErrors); var keys = dl.FetchAllUserKeys(); Assert.AreEqual(0, invokeErrors.FetchErrors().Count); Assert.AreEqual(1, keys.Count); Assert.AreEqual("result", keys[0]); }
public void BinaryDataList_FetchAllRecordSetKeys_WhenHasScalars_ShouldReturn0() { //------------Setup for test-------------------------- // BuildTargetShape var targetShape = new StringBuilder("<DataList><result Description=\"\" IsEditable=\"True\" ColumnIODirection=\"Output\" /></DataList>"); ErrorResultTO invokeErrors; TranslatorUtils tu = new TranslatorUtils(); var dl = tu.TranslateShapeToObject(targetShape, false, out invokeErrors); //------------Execute Test--------------------------- var keys = dl.FetchAllRecordSetKeys(); //------------Assert Results------------------------- Assert.AreEqual(0, invokeErrors.FetchErrors().Count); Assert.AreEqual(0, keys.Count); }
public IBinaryDataList ConvertTo(byte[] input, StringBuilder targetShape, out ErrorResultTO errors) { errors = new ErrorResultTO(); var payload = Encoding.UTF8.GetString(input); IBinaryDataList result = null; // build shape if(targetShape == null) { errors.AddError("Null payload or shape"); } else { ErrorResultTO invokeErrors; result = _tu.TranslateShapeToObject(targetShape, false, out invokeErrors); errors.MergeErrors(invokeErrors); // populate the shape if(payload != string.Empty) { try { string toLoad = DataListUtil.StripCrap(payload); // clean up the rubbish ;) XmlDocument xDoc = new XmlDocument(); try { xDoc.LoadXml(toLoad); } catch { // Append new root tags ;) toLoad = "<root>" + toLoad + "</root>"; xDoc.LoadXml(toLoad); } if(!string.IsNullOrEmpty(toLoad)) { if(xDoc.DocumentElement != null) { XmlNodeList children = xDoc.DocumentElement.ChildNodes; IDictionary<string, int> indexCache = new Dictionary<string, int>(); IBinaryDataListEntry entry; string error; if(children.Count > 0 && !DataListUtil.IsMsXmlBugNode(children[0].Name)) { #region Process children // spin through each element in the XML foreach(XmlNode c in children) { var hasCorrectIoDirection = true; if(c.Attributes != null) { var columnIoDirectionAttribute = c.Attributes["ColumnIODirection"]; if(columnIoDirectionAttribute != null) { var columnIoDirectionValue = columnIoDirectionAttribute.Value; var hasCorrectIoDirectionFromAttribute = columnIoDirectionValue == enDev2ColumnArgumentDirection.Output.ToString() || columnIoDirectionValue == enDev2ColumnArgumentDirection.Both.ToString(); hasCorrectIoDirection = hasCorrectIoDirectionFromAttribute; } } if(DataListUtil.IsSystemTag(c.Name) && !hasCorrectIoDirection) { continue; } // scalars and recordset fetch if(result.TryGetEntry(c.Name, out entry, out error)) { if(entry.IsRecordset) { // fetch recordset index int fetchIdx; int idx = indexCache.TryGetValue(c.Name, out fetchIdx) ? fetchIdx : 1; // process recordset XmlNodeList nl = c.ChildNodes; foreach(XmlNode subc in nl) { entry.TryPutRecordItemAtIndex(Dev2BinaryDataListFactory.CreateBinaryItem(subc.InnerXml, c.Name, subc.Name, (idx + "")), idx, out error); if(!string.IsNullOrEmpty(error)) { errors.AddError(error); } } // update this recordset index indexCache[c.Name] = ++idx; } else { entry.TryPutScalar(Dev2BinaryDataListFactory.CreateBinaryItem(c.InnerXml, c.Name), out error); if(!string.IsNullOrEmpty(error)) { errors.AddError(error); } } } else { errors.AddError(error); } } #endregion } else { var c = xDoc.DocumentElement; if(result.TryGetEntry(c.Name, out entry, out error)) { entry.TryPutScalar(Dev2BinaryDataListFactory.CreateBinaryItem(c.InnerXml, c.Name), out error); if(!string.IsNullOrEmpty(error)) { errors.AddError(error); } } } } } } catch(Exception e) { // if use passed in empty input they only wanted the shape ;) if(input.Length > 0) { errors.AddError(e.Message); } } } } return result; }
// internal to impl api methods private IBinaryDataList ConvertTo(byte[] input, StringBuilder targetShape, out ErrorResultTO errors, bool onlyMapInputs) { errors = new ErrorResultTO(); string payload = Encoding.UTF8.GetString(input); IBinaryDataList result = new BinaryDataList(); TranslatorUtils tu = new TranslatorUtils(); // build shape if(targetShape == null) { errors.AddError("Null payload or shape"); } else { ErrorResultTO invokeErrors; result = tu.TranslateShapeToObject(targetShape, true, out invokeErrors); errors.MergeErrors(invokeErrors); // populate the shape if(payload != string.Empty) { try { string toLoad = DataListUtil.StripCrap(payload); // clean up the rubish ;) XmlDocument xDoc = new XmlDocument(); // BUG 9626 - 2013.06.11 - TWR: ensure our DocumentElement toLoad = string.Format("<Tmp{0}>{1}</Tmp{0}>", Guid.NewGuid().ToString("N"), toLoad); xDoc.LoadXml(toLoad); if(xDoc.DocumentElement != null) { XmlNodeList children = xDoc.DocumentElement.ChildNodes; IDictionary<string, int> indexCache = new Dictionary<string, int>(); // BUG 9626 - 2013.06.11 - TWR: refactored for recursion TryConvert(children, result, indexCache, errors, onlyMapInputs); } // Transfer System Tags for(int i = 0; i < TranslationConstants.systemTags.Length; i++) { string key = TranslationConstants.systemTags.GetValue(i).ToString(); string query = String.Concat("//", key); XmlNode n = xDoc.SelectSingleNode(query); // try system namespace tags ;) if(n == null) { var values = "//" + DataListUtil.BuildSystemTagForDataList(key, false); query = values; n = xDoc.SelectSingleNode(query); } if(n != null && !string.IsNullOrEmpty(n.InnerXml)) { string bkey = DataListUtil.BuildSystemTagForDataList(key, false); string error; IBinaryDataListEntry sysEntry; if(result.TryGetEntry(bkey, out sysEntry, out error)) { sysEntry.TryPutScalar(Dev2BinaryDataListFactory.CreateBinaryItem(n.InnerXml, bkey), out error); } } } } catch(Exception e) { // if use passed in empty input they only wanted the shape ;) if(input.Length > 0) { errors.AddError(e.Message); } } } } return result; }
public IBinaryDataList ConvertTo(object input, StringBuilder shape, out ErrorResultTO errors) { errors = new ErrorResultTO(); TranslatorUtils tu = new TranslatorUtils(); ErrorResultTO invokeErrors; var targetDL = tu.TranslateShapeToObject(shape, false, out invokeErrors); errors.MergeErrors(invokeErrors); DataTable dbData = (input as DataTable); var rs = targetDL.FetchAllKeys(); // ensure we only have a single recordset to map too ;) if(rs != null && rs.Count != 1) { throw new Exception("DataTable translator can only map to a single recordset!"); } if(rs != null) { var rsName = rs.FirstOrDefault(); if(dbData != null) { IBinaryDataListEntry entry; // build up the columns ;) string error; if(targetDL.TryGetEntry(rsName, out entry, out error)) { if(entry.IsRecordset) { var cols = entry.Columns; IDictionary<int, string> colMapping = BuildColumnNameToIndexMap(entry.Columns, dbData.Columns, null); // now convert to binary datalist ;) int rowIdx = 1; foreach(DataRow row in dbData.Rows) { IList<IBinaryDataListItem> items = new List<IBinaryDataListItem>(cols.Count); // build up the row int idx = 0; foreach(var item in row.ItemArray) { string colName; if(colMapping.TryGetValue(idx, out colName)) { items.Add(new BinaryDataListItem(item.ToString(), rsName, colName, rowIdx)); } idx++; } // add the row ;) entry.TryPutRecordRowAt(items, rowIdx, out error); errors.AddError(error); rowIdx++; } } else { // handle a scalar coming out ;) if(dbData.Rows != null && dbData.Rows.Count == 1) { var row = dbData.Rows[0].ItemArray; // Look up the correct index from the columns ;) int pos = 0; var cols = dbData.Columns; int idx = 0; while(pos < cols.Count && idx == -1) { if(cols[pos].ColumnName == entry.Namespace) { idx = pos; } pos++; } entry.TryPutScalar(new BinaryDataListItem(row[idx].ToString(), entry.Namespace), out error); errors.AddError(error); } } } else { errors.AddError(error); } } } return targetDL; }
public IBinaryDataList ConvertTo(object input, StringBuilder shape, out ErrorResultTO errors) { errors = new ErrorResultTO(); TranslatorUtils tu = new TranslatorUtils(); ErrorResultTO invokeErrors; var targetDL = tu.TranslateShapeToObject(shape, false, out invokeErrors); errors.MergeErrors(invokeErrors); DataTable dbData = (input as DataTable); var rs = targetDL.FetchAllKeys(); // ensure we only have a single recordset to map too ;) if (rs != null && rs.Count != 1) { throw new Exception("DataTable translator can only map to a single recordset!"); } if (rs != null) { var rsName = rs.FirstOrDefault(); if (dbData != null) { IBinaryDataListEntry entry; // build up the columns ;) string error; if (targetDL.TryGetEntry(rsName, out entry, out error)) { if (entry.IsRecordset) { var cols = entry.Columns; IDictionary <int, string> colMapping = BuildColumnNameToIndexMap(entry.Columns, dbData.Columns, null); // now convert to binary datalist ;) int rowIdx = 1; foreach (DataRow row in dbData.Rows) { IList <IBinaryDataListItem> items = new List <IBinaryDataListItem>(cols.Count); // build up the row int idx = 0; foreach (var item in row.ItemArray) { string colName; if (colMapping.TryGetValue(idx, out colName)) { items.Add(new BinaryDataListItem(item.ToString(), rsName, colName, rowIdx)); } idx++; } // add the row ;) entry.TryPutRecordRowAt(items, rowIdx, out error); errors.AddError(error); rowIdx++; } } else { // handle a scalar coming out ;) if (dbData.Rows != null && dbData.Rows.Count == 1) { var row = dbData.Rows[0].ItemArray; // Look up the correct index from the columns ;) int pos = 0; var cols = dbData.Columns; int idx = 0; while (pos < cols.Count && idx == -1) { if (cols[pos].ColumnName == entry.Namespace) { idx = pos; } pos++; } entry.TryPutScalar(new BinaryDataListItem(row[idx].ToString(), entry.Namespace), out error); errors.AddError(error); } } } else { errors.AddError(error); } } } return(targetDL); }
/// <summary> /// Converts the and filter. /// </summary> /// <param name="payload">The payload.</param> /// <param name="filterShape">The filter shape.</param> /// <param name="errors">The errors.</param> /// <returns></returns> /// <exception cref="System.ArgumentNullException">payload</exception> public StringBuilder ConvertAndFilter(IBinaryDataList payload, StringBuilder filterShape, out ErrorResultTO errors) { if(payload == null) { throw new ArgumentNullException("payload"); } int keyCnt = 0; errors = new ErrorResultTO(); TranslatorUtils tu = new TranslatorUtils(); ErrorResultTO invokeErrors; IBinaryDataList targetDl = tu.TranslateShapeToObject(filterShape, false, out invokeErrors); errors.MergeErrors(invokeErrors); IList<string> itemKeys = targetDl.FetchAllUserKeys(); StringBuilder result = new StringBuilder("{"); foreach(string key in itemKeys) { IBinaryDataListEntry entry; IBinaryDataListEntry tmpEntry; string error; if(payload.TryGetEntry(key, out entry, out error) && targetDl.TryGetEntry(key, out tmpEntry, out error)) { if(entry.IsRecordset) { result.Append(ProcessRecordSet(entry, out error)); errors.AddError(error); } else { result.Append(ProcessScalar(entry)); } // wack in , for field separator ;) keyCnt++; if(keyCnt < itemKeys.Count) { result.Append(","); } } errors.AddError(error); } result.Append("}"); return result; }